From: jenkins-bot Date: Tue, 12 Jul 2016 18:06:51 +0000 (+0000) Subject: Merge "Add any prior block to BlockIpComplete hook" X-Git-Tag: 1.31.0-rc.0~6393 X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=commitdiff_plain;h=52017fad77be3ca263d90a28209f2d7d7871fb51;hp=b726f0ddeb888ec79137179338174affbd061625 Merge "Add any prior block to BlockIpComplete hook" --- diff --git a/.stylelintrc b/.stylelintrc index 6b94db6722..62dbeb69ed 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -10,7 +10,7 @@ "declaration-colon-space-after": [ "always" ], "declaration-colon-space-before": [ "never" ], - "font-family-name-quotes": [ "single-unless-keyword" ], + "font-family-name-quotes": [ "always-unless-keyword" ], "font-weight-notation": [ "named-where-possible" ], "function-calc-no-unspaced-operator": true, @@ -20,7 +20,7 @@ "function-comma-space-before": [ "never" ], "function-parentheses-newline-inside": [ "never-multi-line" ], "function-parentheses-space-inside": [ "always" ], - "function-url-quotes": [ "none" ], + "function-url-quotes": [ "never" ], "function-whitespace-after": [ "always" ], } } diff --git a/Gemfile b/Gemfile index fa3a025ef0..19d2f52315 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' -gem 'mediawiki_selenium', '~> 1.7' +gem 'mediawiki_selenium', '~> 1.7', '>= 1.7.1' gem 'rake', '~> 11.1', '>= 11.1.1' gem 'rubocop', '~> 0.32.1', require: false diff --git a/Gemfile.lock b/Gemfile.lock index 2bbabd1b7c..2d6e65594e 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -34,22 +34,22 @@ GEM domain_name (~> 0.5) i18n (0.7.0) json (1.8.3) - mediawiki_api (0.5.0) + mediawiki_api (0.6.0) faraday (~> 0.9, >= 0.9.0) faraday-cookie_jar (~> 0.0, >= 0.0.6) - mediawiki_selenium (1.7.0) + mediawiki_selenium (1.7.1) cucumber (~> 1.3, >= 1.3.20) headless (~> 2.0, >= 2.1.0) json (~> 1.8, >= 1.8.1) - mediawiki_api (~> 0.5, >= 0.5.0) + mediawiki_api (~> 0.6, >= 0.6.0) page-object (~> 1.0) rest-client (~> 1.6, >= 1.6.7) rspec-core (~> 2.14, >= 2.14.4) rspec-expectations (~> 2.14, >= 2.14.4) syntax (~> 1.2, >= 1.2.0) thor (~> 0.19, >= 0.19.1) - mime-types (2.99.1) - multi_json (1.11.3) + mime-types (2.99.2) + multi_json (1.12.1) multi_test (0.1.2) multipart-post (2.0.0) netrc (0.11.0) @@ -79,11 +79,11 @@ GEM ruby-progressbar (~> 1.4) ruby-progressbar (1.7.5) rubyzip (1.2.0) - selenium-webdriver (2.53.0) + selenium-webdriver (2.53.1) childprocess (~> 0.5) rubyzip (~> 1.0) websocket (~> 1.0) - syntax (1.2.0) + syntax (1.2.1) thor (0.19.1) unf (0.1.4) unf_ext @@ -97,7 +97,7 @@ PLATFORMS ruby DEPENDENCIES - mediawiki_selenium (~> 1.7) + mediawiki_selenium (~> 1.7, >= 1.7.1) rake (~> 11.1, >= 11.1.1) rubocop (~> 0.32.1) diff --git a/HISTORY b/HISTORY index e833154827..868b21af9a 100644 --- a/HISTORY +++ b/HISTORY @@ -1,5 +1,588 @@ Change notes from older releases. For current info see RELEASE-NOTES-1.28. += MediaWiki 1.27 = + +== MediaWiki 1.27.0 == + +=== PHP version requirement in 1.27 === +As of 1.27, MediaWiki now requires PHP 5.5.9 or higher (see Compatibility +section). Additionally, the following PHP extensions are required: +* ctype +* iconv +* json +* mbstring (new requirement in 1.27) +* xml +The following PHP extensions are strongly recommended: +* openssl + +=== Configuration changes in 1.27 === +* $wgAllowMicrodataAttributes and $wgAllowRdfaAttributes were removed, + now always enabled. If you use RDFa on your wiki, you now have to explicitly + set $wgHtml5Version to 'HTML+RDFa 1.0' or 'XHTML+RDFa 1.0'. +* $wgUseLinkNamespaceDBFields was removed. +* Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and + $wgResourceLoaderMinifierMaxLineLength, because there was little value in + making the behavior configurable. The default values (`false` for the former, + 1000 for the latter) are now hard-coded. +* $wgDebugDumpSqlLength was removed (deprecated in 1.24). +* $wgDebugDBTransactions was removed (deprecated in 1.20). +* $wgUseXVO has been removed, as it provides functionality only used by + custom Wikimedia patches against Squid 2.x that probably noone uses in + production anymore. There is now $wgUseKeyHeader that provides similar + functionality but instead of the MediaWiki-specific X-Vary-Options header, + uses the draft Key header standard. +* $wgScriptExtension (and support for '.php5' entry points) was removed. See the + deprecation notice in the release notes for version 1.25 for advice on how to + preserve support for '.php5' entry points via URL rewriting. +* Password handling via the User object has been deprecated and partially + removed, pending the future introduction of AuthManager. In particular: +** expirePassword(), getPasswordExpireDate(), resetPasswordExpiration(), and + getPasswordExpired() have been removed. They were unused outside of core. +** The mPassword, mNewpassword, mNewpassTime, and mPasswordExpires fields are + now private and will be removed in the future. +** The getPassword() and getTemporaryPassword() methods now throw + BadMethodCallException and will be removed in the future. +** The ability to pass 'password' and 'newpassword' to createNew() has been + removed. The only users of it seem to have been using it to set invalid + passwords, and so shouldn't be greatly affected. +** setPassword(), setInternalPassword(), and setNewpassword() have been + deprecated, pending the introduction of AuthManager. +** User::randomPassword() is deprecated in favor of a new method + PasswordFactory::generateRandomPasswordString() +** User::getPasswordFactory() is deprecated, callers should just create a + PasswordFactory themselves. +** A new constructor, User::newSystemUser(), has been added to simplify the + creation of passwordless "system" users for logged actions. +* $wgMaxSquidPurgeTitles was removed. +* $wgAjaxWatch was removed. This is now enabled by default. +* $wgUseInstantCommons now hotlinks Commons images by default instead of + downloading originals and thumbnailing them locally. This allows wikis to save + on CPU and bandwidth while reducing time to first byte for pages, even without + a thumbnail handler. See $wgForeignFileRepos documentation for tweaks. +* (T27397) WebP is enabled by default as an uploadable filetype. +* (T48998) $wgArticlePath must now be either a full url, or start with a "/". +* $wgRateLimitLog was removed; use $wgDebugLogGroups['ratelimit'] instead. +* Deprecated API formats dbg, txt, and yaml have been removed. +* CLDRPluralRule* classes have been replaced with + wikimedia/cldr-plural-rule-parser. +* Removed $wgProfilePerHost, $wgUDPProfilerHost, $wgUDPProfilerPort, + $wgUDPProfilerFormatString, $wgStatsMethod, $wgAggregateStatsID, + $wgStatsFormatString, and $wgProfileCallTree (deprecated since 1.20). +* For proper operation of LocalIdLookup with shared user tables, ensure that + $wgSharedDB and $wgSharedTables are properly set even on the "central" wiki + that all others are sharing from and that $wgLocalDatabases is set to the + full list of sharing wikis on all those wikis. +* Massive overhaul to session handling: +** $wgSessionsInObjectCache is no longer supported and must be true, due to + MediaWiki\Session\SessionManager. $wgSessionHandler is similarly no longer + used. +** ObjectCacheSessionHandler is removed, replaced with + MediaWiki\Session\PhpSessionHandler. +** PHP session handling in general ($_SESSION, session_id(), and so on) is + deprecated. Use MediaWiki\Session\SessionManager instead. A new config + variable, $wgPHPSessionHandling, is available to cause use of $_SESSION to + issue a deprecation warning or to cause most PHP session handling to throw + exceptions. +** Deprecated UserSetCookies hook. Session-handling extensions should generally + be creating a custom subclass of CookieSessionProvider. Other extensions + messing with cookies can no longer count on user data being saved in cookies + versus other methods. +** Deprecated UserLoadFromSession hook, extensions should create a + MediaWiki\Session\SessionProvider. +** The User cannot be loaded from session until after Setup.php completes. + Attempts to do so will be ignored and the User will remain unloaded. +** CSRF tokens may be fetched from the MediaWiki\Session\Session, which uses + the MediaWiki\Session\Token class. +* MediaWiki will now auto-create users as necessary, removing the need for + extensions to do so. An 'autocreateaccount' right is added to allow + auto-creation when 'createaccount' is not granted to all users. +* Deprecated AuthPluginAutoCreate hook in favor of LocalUserCreated. +* Most cookie-handling methods in User are deprecated. +* $wgAllowAsyncCopyUploads and $CopyUploadAsyncTimeout were removed. This was an + experimental feature that has never worked. +* Login and createaccount tokens now vary by timestamp. +* LoginForm::getLoginToken() and LoginForm::getCreateaccountToken() + return a MediaWiki\Session\Token, and tokens must be checked using that + class's methods. +* $wgEnotifUseJobQ was removed and the job queue is always used. +* The functionality of the ApiSandbox extension has been merged into core. The + extension should no longer be used. +* $wgPreloadJavaScriptMwUtil was removed (deprecated in 1.26). + Extensions, skins, gadgets and scripts that use the mediawiki.util module must + express a dependency on it. +* $wgIncludeLegacyJavaScript, deprecated in MediaWiki 1.26, now defaults false. + Extensions, skins, gadgets and scripts that need the mediawiki.legacy.wikibits + module should express a dependency on it. +* Removed configuration option $wgCopyrightIcon (deprecated since 1.18). Use + $wgFooterIcons['copyright']['copyright'] instead. +* If the openssl and mcrypt PHP extensions are both unavailable, secure + session storage (used for login) will raise an exception. This exception may + be bypassed by setting $wgSessionInsecureSecrets = true. +* Massive overhaul to authentication: +** AuthPlugin and AuthPluginUser are deprecated. +** LoginForm and associated templates are deprecated. Extensions which called + static LoginForm methods should be converted into authentication providers. +** The following hooks are deprecated: +*** AbortAutoAccount (create a MediaWiki\Auth\PreAuthenticationProvider instead) +*** AbortLogin (create a MediaWiki\Auth\PreAuthenticationProvider instead) +*** AbortNewAccount (create a MediaWiki\Auth\PreAuthenticationProvider instead) +*** AddNewAccount (use LocalUserCreated instead) +*** AuthPluginSetup (create a MediaWiki\Auth\PrimaryAuthenticationProvider instead) +*** ChangePasswordForm (use AuthChangeFormFields instead, or security levels) +*** LoginUserMigrated (create a MediaWiki\Auth\PreAuthenticationProvider instead) +*** UserCreateForm (create a MediaWiki\Auth\AuthenticationProvider of some type instead) +*** UserLoginForm (create a MediaWiki\Auth\AuthenticationProvider of some type instead) +** The following hooks are removed: +*** AbortChangePassword +*** LoginPasswordResetMessage +*** PrefsPasswordAudit +** The UserLoginComplete hook will no longer be called for all logins, only for + those via the web UI. Use UserLoggedIn if you need to do something on all + logins. +** $wgRequirePasswordforEmailChange is removed. + +=== New features in 1.27 === +* $wgDataCenterUpdateStickTTL was also added. This decides how long a user + sticks to the primary DC (via cookies) after they make changes to the site. +* Added a new hook, 'UserMailerTransformContent', to transform the contents + of an email. This is similar to the EmailUser hook but applies to all mail + sent via UserMailer. +* Added a new hook, 'UserMailerTransformMessage', to transform the contents + of an emai after MIME encoding. +* Added a new hook, 'UserMailerSplitTo', to control which users have to be + emailed separately (ie. there is a single address in the To: field) so + user-specific changes to the email can be applied safely. +* $wgCdnMaxageLagged was added, which limits the CDN cache TTL + when any load balancer uses a DB that is lagged beyond the 'max lag' + setting in the relevant section of $wgLBFactoryConf. +* User::newSystemUser() may be used to simplify the creation of passwordless + "system" users for logged actions from scripts and extensions. +* Extensions can now return detailed error information via the API when + preventing user actions using 'getUserPermissionsErrors' and similar hooks + by using ApiMessage instances instead of strings for the $result value. +* $wgAPIMaxLagThreshold was added to limit bot changes when databases lag + becomes too high. +* Skins and extensions can now use FlexBox mixins (.flex-display(@display: flex) + and .flex(@grow: 1, @shrink: 1, @width: auto, @order: 1)) in Less to create + cross-browser-compatible FlexBox rules. Users will still need to add fallback + float rules or the like for compatibility with IE9- separately. +* Added MWTimestamp::getTimezoneString() which returns the localized timezone + string, if available. To localize this string, see the comments of + $wgLocaltimezone in includes/DefaultSettings.php. +* Added CentralIdLookup, a service that allows extensions needing a concept of + "central" users to get that without having to know about specific central + authentication extensions. +* $wgMaxUserDBWriteDuration added to limit huge user-generated transactions. + Regular web request transactions that takes longer than this are aborted. +* Added a new hook, 'TitleMoveCompleting', which runs before a page move is + committed. +* $wgCdnReboundPurgeDelay was added to provide secondary delayed purges of URLs + from CDN to mitigate DB replication lag and WAN cache purge lag. +* (T49162) Installer will default to setting CACHE_ACCEL as the main cache type + if it is available. +* It is now possible to patrol file uploads (both for new files and new versions + of existing files). Special:NewFiles has gained an option to filter by patrol + status. This functionality can be disabled using $wgUseFilePatrol. +* MediaWiki\Session infrastructure allows for easier use of session mechanisms + other than the usual cookies. +** SessionMetadata and SessionCheckInfo hooks allow for setting and checking + custom session metadata. +* Added MWGrants and associated configuration settings $wgGrantPermissions and + $wgGrantPermissionGroups to hold configuration for authentication features + such as OAuth that want to allow restricting the user rights a user may make + use of. +** If you're already using the OAuth extension, these new variables are + identical to (and will replace) $wgMWOAuthGrantPermissions and + $wgMWOAuthGrantPermissionGroups. +* Added MWRestrictions as a class to check restrictions on a WebRequest, e.g. + to assert that the request comes from a particular IP range. +* Added bot passwords, a rights-restricted login mechanism for API-using bots. +* Whitelisted the following HTML attributes for all elements in wikitext: + aria-describedby, aria-flowto, aria-label, aria-labelledby, aria-owns. +* Removed "presentation" restriction on the HTML role attribute in wikitext. + All values are now allowed for the role attribute. +* $wgContentHandlers now also supports callbacks to create an instance of the + appropriate ContentHandler subclass. +* Added $wgAuthenticationTokenVersion, which if non-null prevents the + user_token database field from being exposed in cookies. Setting this would + be a good idea, but will log out all current sessions. +* $wgEventRelayerConfig was added, for managing PubSub event relay configuration, + specifically for reliable CDN url purges. +* Requests have unique IDs, equal to the UNIQUE_ID environment variable (when + MediaWiki is behind Apache+mod_unique_id or something similar) or a randomly- + generated 24-character string. This request ID is used to annotate log records + and error messages. It is available client-side via mw.config.get( 'wgRequestId' ). + The request ID supplants exception IDs. Accordingly, MWExceptionHandler::getLogId() + is deprecated. +* (T33313) Add a preference for watching uploads by default, also applies + to API-based upload tools. +* $wgJpegPixelFormat was added to override chroma subsampling for JPEG image + thumbnails created via ImageMagick. Defaults to 'yuv420', providing bandwidth + savings versus the previous behavior on many files. +* MediaWiki\Auth infrastructure (called "AuthManager") allows for more flexible + configuration of multiple authentication pieces that was possible with + AuthPlugin. For example, it's now easy to plug in second-factor + authentication, or add additional checks to the login process, or to support + multiple login methods at once, or to support non-password-based login methods. +** Providers are configured via the global setting $wgAuthManagerConfig. +** A global, $wgDisableAuthManager, is temporarily available to disable + AuthManager until extensions are ready to support it. +** New hook, AuthChangeFormFields, to adjust the form fields on + AuthManager-related special pages. +** New hook, AuthManagerLoginAuthenticateAudit, for additional logging of + AuthManager-related authentication requests. +** New hook, ChangeAuthenticationDataAudit, for additional logging of + AuthManager-related authentication data changes. +** New hook, SecuritySensitiveOperationStatus, to work with the new mechanism + for requiring a recent login before taking security-sensitive operations + like changing a password. +** Two new globals, $wgChangeCredentialsBlacklist and $wgRemoveCredentialsBlacklist + can be used to prevent the web UI and the API changing certain authentication data. +* The file upload dialog (available if you install WikiEditor or VisualEditor) + can now be configured using $wgUploadDialog. + +=== External library changes in 1.27 === + +==== Upgraded external libraries ==== +* Updated oojs/oojs-ui from v0.12.12 to v0.13.3. +* Updated composer/semver from v1.0.0 to v1.2.0. +* Updated liuggio/statsd-php-client to 1.0.18. +* Updated QUnit from v1.18.0 to v1.22.0. + +==== New external libraries ==== +* Added wikimedia/base-convert v1.0.1. +* Added wikimedia/cldr-plural-rule-parser v1.0.0. +* Added wikimedia/relpath v1.0.3. +* Added wikimedia/running-stat v1.1.0. +* Added wikimedia/php-session-serializer v1.0.3. + +==== Removed and replaced external libraries ==== + +=== Bug fixes in 1.27 === +* Special:Upload will now display correct maximum allowed file size when running + under HHVM (T116347). +* (T54077) The APIEditBeforeSave hook will once again give only the content of + the section being edited, rather than the whole revision. This reverts the + change made in MediaWiki 1.22. + +=== Action API changes in 1.27 === +* Added list=allrevisions. +* generator=recentchanges now has the option to generate revids. +* ApiPageSet::setRedirectMergePolicy() was added. This allows generator + modules to define how generator data for a redirect source gets merged + into the redirect destination. +* prop=imageinfo&iiprop=uploadwarning will no longer include the possibility of + "was-deleted" warning. +* Added difftotextpst to query=revisions which preforms a pre-save transform on + the text before diffing it. +* Deprecated formats dbg, txt, and yaml have been removed. +* (T47988) The protect log event details now use new-style formatting. +* The following response properties from action=login are deprecated, and may + be removed in the future: lgtoken, cookieprefix, sessionid. Clients should + handle cookies to properly manage session state. +* action=login transparently allows login using bot passwords. Clients should + merely need to change the username and password used after setting up a bot + password. +* action=upload no longer understands statuskey, asyncdownload or leavemessage. +* Several changes when $wgDisableAuthManager is false: +** action=login is deprecated for uses other than bot passwords. +** list=users can now indicate if a missing username is creatable. +** action=createaccount is changed in a non-backwards-compatible manner. +** Added action=query&meta=authmanagerinfo. +** Added action=clientlogin to be used to log into the main account instead of + action=login. +** Added action=linkaccount. +** Added action=unlinkaccount. +** Added action=changeauthenticationdata. +** Added action=removeauthenticationdata. +** Added action=resetpassword. + +=== Action API internal changes in 1.27 === +* ApiQueryORM removed. +* The following classes have been removed: +** ApiFormatDbg +** ApiFormatTxt +** ApiFormatYaml +* ApiBase::addTokenProperties() was removed (deprecated since 1.24). +* ApiBase::getFinalPossibleErrors() was removed (deprecated since 1.24). +* ApiBase::getFinalResultProperties() was removed (deprecated since 1.24). +* ApiBase::getRequireAtLeastOneParameterErrorMessages() was removed (deprecated since 1.24). +* ApiBase::getPossibleErrors() was removed (deprecated since 1.24). +* ApiBase::getRequireMaxOneParameterErrorMessages() was removed (deprecated since 1.24). +* ApiBase::getRequireOnlyOneParameterErrorMessages() was removed (deprecated since 1.24). +* ApiBase::getResultProperties() was removed (deprecated since 1.24). +* ApiBase::getTitleOrPageIdErrorMessage() was removed (deprecated since 1.24). +* ApiBase::parseErrors() was removed (deprecated since 1.24). +* ApiQueryBase::titleToKey(), ApiQueryBase::keyToTitle() and + ApiQueryBase::keyPartToTitle() all removed (deprecated since 1.24). +* ApiQueryBase::checkRowCount() was removed (deprecated since 1.24). +* ApiQueryBase::getDirectionDescription() was removed (deprecated since 1.25). +* ApiQuery::getGenerators() was removed (deprecated since 1.21). +* ApiQuery::getModules() was removed (deprecated since 1.21). +* ApiQuery::getModuleType() was removed (deprecated since 1.21). +* ApiQuery::setGeneratorContinue() was removed (deprecated since 1.24). +* ApiMain::getModules() was removed (deprecated since 1.21). +* ApiBase::getVersion() was removed (deprecated since 1.21). +* ApiMain::getShowVersions() was removed (deprecated in 1.21). +* ApiMain::addModule() was removed (deprecated in 1.21). +* ApiMain::addFormat() was removed (deprecated in 1.21). +* ApiMain::getFormats() was removed (deprecated in 1.21). +* ApiPageSet::finishPageSetGeneration() was removed (deprecated in 1.21). +* ApiCreateAccount is deprecated, and will be removed soon. + +=== Languages updated in 1.27 === + +MediaWiki supports over 350 languages. Many localisations are updated +regularly. Below only new and removed languages are listed, as well as +changes to languages because of Phabricator reports. + +* (T113688) Change default numerals from Gurmukhi to Arabic for Punjabi locale. +* (T116020) Aliases of magic words in MessagesXx.php are sorted by usage. + +=== Other changes in 1.27 === +* Added dependency injection (DI) infrastructure, see docs/injection.txt for details. + It is planned to incrementally move MediaWiki code towards using DI, using the + service locator (SL) pattern as a stepping stone. +* ProfilerOutputUdp was removed. Note that there is a ProfilerOutputStats class. +* WikiPage::doDeleteArticleReal() and WikiPage::doDeleteArticle() now + ignore the 2nd and 3rd arguments (formerly $id and $commit). +* Removed "loaderScripts" option from ResourceLoaderFileModule class. +* Removed ORM-like wrapper added in 1.20. +* LinkCache::getGoodLinks and LinkCache::getBadLinks were removed + (deprecated in 1.26). +* WikiPage::doQuickEdit() was removed (deprecated since 1.21). +* Removed SiteObject and SiteArray classes (deprecated in 1.21). +* MessageBlobStore::getInstance() was removed (deprecated since 1.25). +* (T84937) Free external links ("autolinked" urls) will now be terminated + by   and HTML entity encodings of  , <, and >. +* (T36948) The default file revert message's timestamp is now in + $wgLocaltimezone, instead of UTC. +* The default name of the 'suppress' group page has been changed from + 'Project:Oversight' to 'Project:Suppress'. +* DatabaseBase::resultObject() is now protected (use outside Database classes + not necessary since 1.11). +* Calling ResourceLoaderFileModule::readStyleFiles() without a + ResourceLoaderContext instance is deprecated. +* ResourceLoader::getLessCompiler() now takes an optional parameter of + additional LESS variables to set for the compiler. +* wfBaseConvert() marked as deprecated, use Wikimedia\base_convert() directly + instead. +* Obsolete maintenance scripts clearCacheStats.php and showCacheStats.php + were removed. The underlying data is sent to StatsD (see $wgStatsdServer). +* Removed msg_resource_links database table and associated code. +* Removed msg_resource database table and associated code. +* Skin::getNamespaceNotice() was removed. +* wfIsConfiguredProxy() was removed (deprecated since 1.24). +* wfDebugTimer() was removed (deprecated since 1.25). +* wfIsTrustedProxy() was removed (deprecated since 1.24). +* wfGetIP() was removed (deprecated since 1.19). +* MWHookException was removed. +* OutputPage::appendSubtitle() was removed (deprecated since 1.19). +* OutputPage::loginToUse() was removed (deprecated since 1.19). +* Article::loadContent() was removed (deprecated since 1.19). +* User::editToken() was removed (deprecated since 1.19). +* Removed --force-normal option of dumpBackup.php, as it no longer served + any useful purpose since 1.22. +* The functions processOption() and processArgs() on the BackupDumper and + TextPassDumper classes have been removed. +* The maintenance/backupTextPass.inc file was deleted. You should include + maintenance/dumpTextPass.php instead. +* WikiPage::getUsedTemplates() was removed (deprecated since 1.19). +* wfEmptyMsg() was removed (deprecated since 1.18). +* OutputPage::permissionRequired() was removed (deprecated since 1.18). +* OutputPage::blockedPage() was removed (deprecated since 1.18). +* User::getSkin() was removed (deprecated since 1.18). +* OutputPage::includeJQuery() was removed (deprecated since 1.17). +* WikiPage::updateRestrictions() was removed (deprecated since 1.19). +* WikiPage::testPreSaveTransform() was removed (deprecated since 1.19). +* LogPage::logName() was removed (deprecated since 1.19). +* LogPage::logHeader() was removed (deprecated since 1.19). +* wfCheckLimits() was removed (deprecated since 1.24). +* Linker::makeKnownLinkObj() was removed (deprecated since 1.16). +* Linker::makeLinkObj() was removed (deprecated since 1.16). +* wfMsgForContentNoTrans() was removed (deprecated since 1.18). +* ChangesList::usePatrol was removed (deprecated since 1.22). +* wfMsgNoTrans() was removed (deprecated since 1.18). +* Linker::makeImageLink2 was removed (deprecated since 1.20). +* Title::userIsWatching() was removed (deprecated since 1.20). +* Removed WaitForSlave maintenance script; use SELECT MASTER_POS_WAIT() + database function directly instead. +* wfMsg() was removed (deprecated since 1.18). +* wfMsgForContent() was removed (deprecated since 1.18). +* wfMsgReal() was removed (deprecated since 1.18). +* wfMsgGetKey() was removed (deprecated since 1.18). +* wfMsgHtml() was removed (deprecated since 1.18). +* wfMsgWikiHtml() was removed (deprecated since 1.18). +* wfMsgExt() was removed (deprecated since 1.18). +* Language::armourMath() was removed (deprecated since 1.22). +* LanguageConverter::armourMath() was removed (deprecated since 1.22). +* FakeConverter::armourMath() was removed (deprecated since 1.22). +* The unused jquery.validate ResourceLoader module was removed. +* FileRepo::getRootUrl() was removed (deprecated since 1.20). +* User::generateToken() was removed (deprecated since 1.20). +* WikiPage::getRawText() was removed (deprecated since 1.21). +* ParserOutput::hasCustomDataUpdates() was removed (deprecated since 1.25). +* ParserOutput::addSecondaryDataUpdate() was removed (deprecated since 1.25). +* ParserOutput::getSecondaryDataUpdates() was removed (deprecated since 1.25). +* Gallery images with multiple caption pipes no longer concatenate them all + together but instead pick the final one, similar to image syntax. +* XML-like parser tags (such as ), when unclosed, will be left unparsed + rather than consume everything until the end of the page. +* New maintenance script resetUserEmail.php allows sysadmins to reset user emails in case + a user forgot password/account was stolen. +* wfCheckEntropy() was removed (deprecated in 1.27). +* Browser support for Internet Explorer 8 lowered from Grade A to Grade C. +* ContentHandler::supportsCategories method added. Default is true. + CategoryMembershipChangeJob updates are skipped for content that + does not support categories. +* wikidiff difference engine is no longer supported, anyone still using it are encouraged + to upgrade to wikidiff2 which is actively maintained and has better package availability. +* Database logic was removed from WatchedItem and a WatchedItemStore was created: +** WatchedItem::IGNORE_USER_RIGHTS and WatchedItem::CHECK_USER_RIGHTS were deprecated. + User::IGNORE_USER_RIGHTS and User::CHECK_USER_RIGHTS were introduced. +** WatchedItem::fromUserTitle was deprecated in favour of the constructor. +** WatchedItem::resetNotificationTimestamp was deprecated. +** WatchedItem::batchAddWatch was deprecated. +** WatchedItem::addWatch was deprecated. +** WatchedItem::removeWatch was deprecated. +** WatchedItem::isWatched was deprecated. +** WatchedItem::duplicateEntries was deprecated. +** EmailNotification::updateWatchlistTimestamp was deprecated. +** User::getWatchedItem was removed. +* Unit tests don't work with external PHPUnit anymore, Composer is now the only supported + way. Run `composer install` to install it and other dev dependencies to run unit tests. +* wl_id field added to the watchlist table. +* Revision::getRawText() was removed (deprecated since 1.21). +* WikiPage::replaceSection() was removed (deprecated since 1.21). +* Article::replaceSection() was removed (deprecated since 1.21). +* Language::getLangObj() was removed (deprecated since 1.24). +* Language::getLanguageName() was removed (deprecated since 1.20). +* Language::getLanguageNames() was removed (deprecated since 1.20). +* Language::getTranslatedLanguageNames() was removed (deprecated since 1.20). +* Language::specialPage() was removed (deprecated since 1.24). +* MediaWikiTestCase::assertException() was removed (deprecated since 1.22). +* OutputPage::getHeadItems() was removed (deprecated since 1.24). +* OutputPage::getScript() was removed (deprecated since 1.24). +* OutputPage::out() was removed (deprecated since 1.22). +* OutputPage::setAllowedModules() was removed (deprecated since 1.24). +* UserrightsPage::makeGroupNameListForLog() was removed (deprecated since 1.21). +* MediaWikiSite::newFromGlobalId() was removed (deprecated since 1.21). +* Title::newFromRedirect() was removed (deprecated since 1.21). +* Skin::commonPrintStylesheet() was removed (deprecated since 1.22). +* Skin::getCommonStylePath() was removed (deprecated since 1.24). +* Skin::newFromKey() was removed (deprecated since 1.24). +* Skin::getUsableSkins() was removed (deprecated since 1.23). +* LoadBalancer::pickRandom() was removed (deprecated in 1.21). +* Article::getUndoText() and WikiPage::getUndoText were removed (deprecated since + 1.21). +* DifferenceEngine::setText() was removed (deprecated in 1.21). +* Title::newFromRedirectArray() was removed (deprecated in 1.21). +* UserMailer::send() no longer accepts $replyto as the 5th argument and $contentType + as the 6th. These must be passed in the options array now. +* Title::newFromRedirectRecurse() was removed (deprecated in 1.21). +* Skin::accesskey was removed (deprecated since 1.21). +* Skin::blockLink was removed (deprecated since 1.21). +* Skin::buildRollbackLink was removed (deprecated since 1.21). +* Skin::emailLink was removed (deprecated since 1.21). +* Skin::formatComment was removed (deprecated since 1.21). +* Skin::formatHiddenCategories was removed (deprecated since 1.21). +* Skin::formatLinksInComment was removed (deprecated since 1.21). +* Skin::formatRevisionSize was removed (deprecated since 1.21). +* Skin::formatSize was removed (deprecated since 1.21). +* Skin::formatTemplates was removed (deprecated since 1.21). +* Skin::generateTOC was removed (deprecated since 1.21). +* Skin::getInternalLinkAttributes was removed (deprecated since 1.21). +* Skin::getInternalLinkAttributesObj was removed (deprecated since 1.21). +* Skin::getInterwikiLinkAttributes was removed (deprecated since 1.21). +* Skin::getInvalidTitleDescription was removed (deprecated since 1.21). +* Skin::getLinkColour was removed (deprecated since 1.21). +* Skin::getRevDeleteLink was removed (deprecated since 1.21). +* Skin::getRollbackEditCount was removed (deprecated since 1.21). +* Skin::makeBrokenImageLinkObj was removed (deprecated since 1.21). +* Skin::makeCommentLink was removed (deprecated since 1.21). +* Skin::makeExternalImage was removed (deprecated since 1.21). +* Skin::makeExternalLink was removed (deprecated since 1.21). +* Skin::makeHeadline was removed (deprecated since 1.21). +* Skin::makeImageLink was removed (deprecated since 1.21). +* Skin::makeMediaLinkFile was removed (deprecated since 1.21). +* Skin::makeMediaLinkObj was removed (deprecated since 1.21). +* Skin::makeSelfLinkObj was removed (deprecated since 1.21). +* Skin::makeThumbLink2 was removed (deprecated since 1.21). +* Skin::makeThumbLinkObj was removed (deprecated since 1.21). +* Skin::normaliseSpecialPage was removed (deprecated since 1.21). +* Skin::normalizeSubpageLink was removed (deprecated since 1.21). +* Skin::processResponsiveImages was removed (deprecated since 1.21). +* Skin::revComment was removed (deprecated since 1.21). +* Skin::revDeleteLink was removed (deprecated since 1.21). +* Skin::revDeleteLinkDisabled was removed (deprecated since 1.21). +* Skin::revUserLink was removed (deprecated since 1.21). +* Skin::revUserTools was removed (deprecated since 1.21). +* Skin::specialLink was removed (deprecated since 1.21). +* Skin::splitTrail was removed (deprecated since 1.21). +* Skin::titleAttrib was removed (deprecated since 1.21). +* Skin::tocIndent was removed (deprecated since 1.21). +* Skin::tocLine was removed (deprecated since 1.21). +* Skin::tocLineEnd was removed (deprecated since 1.21). +* Skin::tocList was removed (deprecated since 1.21). +* Skin::tocUnindent was removed (deprecated since 1.21). +* Skin::tooltip was removed (deprecated since 1.21). +* Skin::tooltipAndAccesskeyAttribs was removed (deprecated since 1.21). +* Skin::userTalkLink was removed (deprecated since 1.21). +* Skin::userToolLinksRedContribs was removed (deprecated since 1.21). +* wikidiff3 is now the default and only PHP diff engine. It provides improved diff + performance on complex changes. $wgExternalDiffEngine = 'wikidiff3' therefore + makes no difference now. Users are still recommended to use wikidiff2 if possible, + though. +* User::addNewUserLogEntry() was deprecated. +* User::addNewUserLogEntryAutoCreate() was deprecated. +* User::isPasswordReminderThrottled() was deprecated. +* Bot-oriented parameters to Special:UserLogin (wpCookieCheck, wpSkipCookieCheck) + were removed. +* Installer can now be customized without patching MediaWiki code, see + mw-config/overrides/README for details. + +=== Compatibility === + +MediaWiki 1.27 requires PHP 5.5.9 or later. There is experimental support for +HHVM 3.6.5 or later. + +MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but +support for them is somewhat less mature. There is experimental support for +Oracle and Microsoft SQL Server. + +The supported versions are: + +* MySQL 5.0.3 or later +* PostgreSQL 8.3 or later +* SQLite 3.3.7 or later +* Oracle 9.0.1 or later +* Microsoft SQL Server 2005 (9.00.1399) + +=== Upgrading === + +1.27 has several database changes since 1.26, and will not work without schema +updates. Note that due to changes to some very large tables like the revision +table, the schema update may take quite long (minutes on a medium sized site, +many hours on a large site). + +If upgrading from before 1.11, and you are using a wiki as a commons +repository, make sure that it is updated as well. Otherwise, errors may arise +due to database schema changes. + +If upgrading from before 1.7, you may want to run refreshLinks.php to ensure +new database fields are filled with data. + +If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to +1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed +with MediaWiki 1.21. + +Don't forget to always back up your database before upgrading! + +See the file UPGRADE for more detailed upgrade instructions. + +For notes on 1.26.x and older releases, see HISTORY. + + = MediaWiki 1.26 = == MediaWiki 1.26.2 == diff --git a/RELEASE-NOTES-1.27 b/RELEASE-NOTES-1.27 deleted file mode 100644 index 3aa5d7cce8..0000000000 --- a/RELEASE-NOTES-1.27 +++ /dev/null @@ -1,606 +0,0 @@ -== MediaWiki 1.27 == - -THIS IS NOT A RELEASE YET - -MediaWiki 1.27 is an alpha-quality branch and is not recommended for use in -production. - -=== PHP version requirement === -As of 1.27, MediaWiki now requires PHP 5.5.9 or higher. This corresponds with -HHVM 3.1. Additionally, the following PHP extensions are required: -* ctype -* iconv -* json -* mbstring (new requirement in 1.27) -* xml -The following PHP extensions are strongly recommended: -* openssl - -=== Configuration changes in 1.27 === -* $wgAllowMicrodataAttributes and $wgAllowRdfaAttributes were removed, - now always enabled. If you use RDFa on your wiki, you now have to explicitly - set $wgHtml5Version to 'HTML+RDFa 1.0' or 'XHTML+RDFa 1.0'. -* $wgUseLinkNamespaceDBFields was removed. -* Deprecated $wgResourceLoaderMinifierStatementsOnOwnLine and - $wgResourceLoaderMinifierMaxLineLength, because there was little value in - making the behavior configurable. The default values (`false` for the former, - 1000 for the latter) are now hard-coded. -* $wgDebugDumpSqlLength was removed (deprecated in 1.24). -* $wgDebugDBTransactions was removed (deprecated in 1.20). -* $wgUseXVO has been removed, as it provides functionality only used by - custom Wikimedia patches against Squid 2.x that probably noone uses in - production anymore. There is now $wgUseKeyHeader that provides similar - functionality but instead of the MediaWiki-specific X-Vary-Options header, - uses the draft Key header standard. -* $wgScriptExtension (and support for '.php5' entry points) was removed. See the - deprecation notice in the release notes for version 1.25 for advice on how to - preserve support for '.php5' entry points via URL rewriting. -* Password handling via the User object has been deprecated and partially - removed, pending the future introduction of AuthManager. In particular: -** expirePassword(), getPasswordExpireDate(), resetPasswordExpiration(), and - getPasswordExpired() have been removed. They were unused outside of core. -** The mPassword, mNewpassword, mNewpassTime, and mPasswordExpires fields are - now private and will be removed in the future. -** The getPassword() and getTemporaryPassword() methods now throw - BadMethodCallException and will be removed in the future. -** The ability to pass 'password' and 'newpassword' to createNew() has been - removed. The only users of it seem to have been using it to set invalid - passwords, and so shouldn't be greatly affected. -** setPassword(), setInternalPassword(), and setNewpassword() have been - deprecated, pending the introduction of AuthManager. -** User::randomPassword() is deprecated in favor of a new method - PasswordFactory::generateRandomPasswordString() -** User::getPasswordFactory() is deprecated, callers should just create a - PasswordFactory themselves. -** A new constructor, User::newSystemUser(), has been added to simplify the - creation of passwordless "system" users for logged actions. -* $wgMaxSquidPurgeTitles was removed. -* $wgAjaxWatch was removed. This is now enabled by default. -* $wgUseInstantCommons now hotlinks Commons images by default instead of - downloading originals and thumbnailing them locally. This allows wikis to save - on CPU and bandwidth while reducing time to first byte for pages, even without - a thumbnail handler. See $wgForeignFileRepos documentation for tweaks. -* (T27397) WebP is enabled by default as an uploadable filetype. -* (T48998) $wgArticlePath must now be either a full url, or start with a "/". -* $wgRateLimitLog was removed; use $wgDebugLogGroups['ratelimit'] instead. -* Deprecated API formats dbg, txt, and yaml have been removed. -* CLDRPluralRule* classes have been replaced with - wikimedia/cldr-plural-rule-parser. -* Removed $wgProfilePerHost, $wgUDPProfilerHost, $wgUDPProfilerPort, - $wgUDPProfilerFormatString, $wgStatsMethod, $wgAggregateStatsID, - $wgStatsFormatString, and $wgProfileCallTree (deprecated since 1.20). -* For proper operation of LocalIdLookup with shared user tables, ensure that - $wgSharedDB and $wgSharedTables are properly set even on the "central" wiki - that all others are sharing from and that $wgLocalDatabases is set to the - full list of sharing wikis on all those wikis. -* Massive overhaul to session handling: -** $wgSessionsInObjectCache is no longer supported and must be true, due to - MediaWiki\Session\SessionManager. $wgSessionHandler is similarly no longer - used. -** ObjectCacheSessionHandler is removed, replaced with - MediaWiki\Session\PhpSessionHandler. -** PHP session handling in general ($_SESSION, session_id(), and so on) is - deprecated. Use MediaWiki\Session\SessionManager instead. A new config - variable, $wgPHPSessionHandling, is available to cause use of $_SESSION to - issue a deprecation warning or to cause most PHP session handling to throw - exceptions. -** Deprecated UserSetCookies hook. Session-handling extensions should generally - be creating a custom subclass of CookieSessionProvider. Other extensions - messing with cookies can no longer count on user data being saved in cookies - versus other methods. -** Deprecated UserLoadFromSession hook, extensions should create a - MediaWiki\Session\SessionProvider. -** The User cannot be loaded from session until after Setup.php completes. - Attempts to do so will be ignored and the User will remain unloaded. -** CSRF tokens may be fetched from the MediaWiki\Session\Session, which uses - the MediaWiki\Session\Token class. -* MediaWiki will now auto-create users as necessary, removing the need for - extensions to do so. An 'autocreateaccount' right is added to allow - auto-creation when 'createaccount' is not granted to all users. -* Deprecated AuthPluginAutoCreate hook in favor of LocalUserCreated. -* Most cookie-handling methods in User are deprecated. -* $wgAllowAsyncCopyUploads and $CopyUploadAsyncTimeout were removed. This was an - experimental feature that has never worked. -* Login and createaccount tokens now vary by timestamp. -* LoginForm::getLoginToken() and LoginForm::getCreateaccountToken() - return a MediaWiki\Session\Token, and tokens must be checked using that - class's methods. -* $wgEnotifUseJobQ was removed and the job queue is always used. -* The functionality of the ApiSandbox extension has been merged into core. The - extension should no longer be used. -* $wgPreloadJavaScriptMwUtil was removed (deprecated in 1.26). - Extensions, skins, gadgets and scripts that use the mediawiki.util module must - express a dependency on it. -* $wgIncludeLegacyJavaScript, deprecated in MediaWiki 1.26, now defaults false. - Extensions, skins, gadgets and scripts that need the mediawiki.legacy.wikibits - module should express a dependency on it. -* Removed configuration option $wgCopyrightIcon (deprecated since 1.18). Use - $wgFooterIcons['copyright']['copyright'] instead. -* If the openssl and mcrypt PHP extensions are both unavailable, secure - session storage (used for login) will raise an exception. This exception may - be bypassed by setting $wgSessionInsecureSecrets = true. -* Massive overhaul to authentication: -** AuthPlugin and AuthPluginUser are deprecated. -** LoginForm and associated templates are deprecated. Extensions which called - static LoginForm methods should be converted into authentication providers. -** The following hooks are deprecated: -*** AbortAutoAccount (create a MediaWiki\Auth\PreAuthenticationProvider instead) -*** AbortLogin (create a MediaWiki\Auth\PreAuthenticationProvider instead) -*** AbortNewAccount (create a MediaWiki\Auth\PreAuthenticationProvider instead) -*** AddNewAccount (use LocalUserCreated instead) -*** AuthPluginSetup (create a MediaWiki\Auth\PrimaryAuthenticationProvider instead) -*** ChangePasswordForm (use AuthChangeFormFields instead, or security levels) -*** LoginUserMigrated (create a MediaWiki\Auth\PreAuthenticationProvider instead) -*** UserCreateForm (create a MediaWiki\Auth\AuthenticationProvider of some type instead) -*** UserLoginForm (create a MediaWiki\Auth\AuthenticationProvider of some type instead) -** The following hooks are removed: -*** AbortChangePassword -*** LoginPasswordResetMessage -*** PrefsPasswordAudit -** The UserLoginComplete hook will no longer be called for all logins, only for - those via the web UI. Use UserLoggedIn if you need to do something on all - logins. -** $wgRequirePasswordforEmailChange is removed. - -=== New features in 1.27 === -* $wgDataCenterUpdateStickTTL was also added. This decides how long a user - sticks to the primary DC (via cookies) after they make changes to the site. -* Added a new hook, 'UserMailerTransformContent', to transform the contents - of an email. This is similar to the EmailUser hook but applies to all mail - sent via UserMailer. -* Added a new hook, 'UserMailerTransformMessage', to transform the contents - of an emai after MIME encoding. -* Added a new hook, 'UserMailerSplitTo', to control which users have to be - emailed separately (ie. there is a single address in the To: field) so - user-specific changes to the email can be applied safely. -* $wgCdnMaxageLagged was added, which limits the CDN cache TTL - when any load balancer uses a DB that is lagged beyond the 'max lag' - setting in the relevant section of $wgLBFactoryConf. -* User::newSystemUser() may be used to simplify the creation of passwordless - "system" users for logged actions from scripts and extensions. -* Extensions can now return detailed error information via the API when - preventing user actions using 'getUserPermissionsErrors' and similar hooks - by using ApiMessage instances instead of strings for the $result value. -* $wgAPIMaxLagThreshold was added to limit bot changes when databases lag - becomes too high. -* Skins and extensions can now use FlexBox mixins (.flex-display(@display: flex) - and .flex(@grow: 1, @shrink: 1, @width: auto, @order: 1)) in Less to create - cross-browser-compatible FlexBox rules. Users will still need to add fallback - float rules or the like for compatibility with IE9- separately. -* Added MWTimestamp::getTimezoneString() which returns the localized timezone - string, if available. To localize this string, see the comments of - $wgLocaltimezone in includes/DefaultSettings.php. -* Added CentralIdLookup, a service that allows extensions needing a concept of - "central" users to get that without having to know about specific central - authentication extensions. -* $wgMaxUserDBWriteDuration added to limit huge user-generated transactions. - Regular web request transactions that takes longer than this are aborted. -* Added a new hook, 'TitleMoveCompleting', which runs before a page move is - committed. -* $wgCdnReboundPurgeDelay was added to provide secondary delayed purges of URLs - from CDN to mitigate DB replication lag and WAN cache purge lag. -* (T49162) Installer will default to setting CACHE_ACCEL as the main cache type - if it is available. -* It is now possible to patrol file uploads (both for new files and new versions - of existing files). Special:NewFiles has gained an option to filter by patrol - status. This functionality can be disabled using $wgUseFilePatrol. -* MediaWiki\Session infrastructure allows for easier use of session mechanisms - other than the usual cookies. -** SessionMetadata and SessionCheckInfo hooks allow for setting and checking - custom session metadata. -* Added MWGrants and associated configuration settings $wgGrantPermissions and - $wgGrantPermissionGroups to hold configuration for authentication features - such as OAuth that want to allow restricting the user rights a user may make - use of. -** If you're already using the OAuth extension, these new variables are - identical to (and will replace) $wgMWOAuthGrantPermissions and - $wgMWOAuthGrantPermissionGroups. -* Added MWRestrictions as a class to check restrictions on a WebRequest, e.g. - to assert that the request comes from a particular IP range. -* Added bot passwords, a rights-restricted login mechanism for API-using bots. -* Whitelisted the following HTML attributes for all elements in wikitext: - aria-describedby, aria-flowto, aria-label, aria-labelledby, aria-owns. -* Removed "presentation" restriction on the HTML role attribute in wikitext. - All values are now allowed for the role attribute. -* $wgContentHandlers now also supports callbacks to create an instance of the - appropriate ContentHandler subclass. -* Added $wgAuthenticationTokenVersion, which if non-null prevents the - user_token database field from being exposed in cookies. Setting this would - be a good idea, but will log out all current sessions. -* $wgEventRelayerConfig was added, for managing PubSub event relay configuration, - specifically for reliable CDN url purges. -* Requests have unique IDs, equal to the UNIQUE_ID environment variable (when - MediaWiki is behind Apache+mod_unique_id or something similar) or a randomly- - generated 24-character string. This request ID is used to annotate log records - and error messages. It is available client-side via mw.config.get( 'wgRequestId' ). - The request ID supplants exception IDs. Accordingly, MWExceptionHandler::getLogId() - is deprecated. -* (T33313) Add a preference for watching uploads by default, also applies - to API-based upload tools. -* $wgJpegPixelFormat was added to override chroma subsampling for JPEG image - thumbnails created via ImageMagick. Defaults to 'yuv420', providing bandwidth - savings versus the previous behavior on many files. -* MediaWiki\Auth infrastructure (called "AuthManager") allows for more flexible - configuration of multiple authentication pieces that was possible with - AuthPlugin. For example, it's now easy to plug in second-factor - authentication, or add additional checks to the login process, or to support - multiple login methods at once, or to support non-password-based login methods. -** Providers are configured via the global setting $wgAuthManagerConfig. -** A global, $wgDisableAuthManager, is temporarily available to disable - AuthManager until extensions are ready to support it. -** New hook, AuthChangeFormFields, to adjust the form fields on - AuthManager-related special pages. -** New hook, AuthManagerLoginAuthenticateAudit, for additional logging of - AuthManager-related authentication requests. -** New hook, ChangeAuthenticationDataAudit, for additional logging of - AuthManager-related authentication data changes. -** New hook, SecuritySensitiveOperationStatus, to work with the new mechanism - for requiring a recent login before taking security-sensitive operations - like changing a password. -** Two new globals, $wgChangeCredentialsBlacklist and $wgRemoveCredentialsBlacklist - can be used to prevent the web UI and the API changing certain authentication data. -* The file upload dialog (available if you install WikiEditor or VisualEditor) - can now be configured using $wgUploadDialog. - -=== External library changes in 1.27 === - -==== Upgraded external libraries ==== -* Updated oojs/oojs-ui from v0.12.12 to v0.13.3. -* Updated composer/semver from v1.0.0 to v1.2.0. -* Updated liuggio/statsd-php-client to 1.0.18. -* Updated QUnit from v1.18.0 to v1.22.0. - -==== New external libraries ==== -* Added wikimedia/base-convert v1.0.1. -* Added wikimedia/cldr-plural-rule-parser v1.0.0. -* Added wikimedia/relpath v1.0.3. -* Added wikimedia/running-stat v1.1.0. -* Added wikimedia/php-session-serializer v1.0.3. - -==== Removed and replaced external libraries ==== - -=== Bug fixes in 1.27 === -* Special:Upload will now display correct maximum allowed file size when running - under HHVM (T116347). - -=== Action API changes in 1.27 === -* Added list=allrevisions. -* generator=recentchanges now has the option to generate revids. -* ApiPageSet::setRedirectMergePolicy() was added. This allows generator - modules to define how generator data for a redirect source gets merged - into the redirect destination. -* prop=imageinfo&iiprop=uploadwarning will no longer include the possibility of - "was-deleted" warning. -* Added difftotextpst to query=revisions which preforms a pre-save transform on - the text before diffing it. -* Deprecated formats dbg, txt, and yaml have been removed. -* (T47988) The protect log event details now use new-style formatting. -* The following response properties from action=login are deprecated, and may - be removed in the future: lgtoken, cookieprefix, sessionid. Clients should - handle cookies to properly manage session state. -* action=login transparently allows login using bot passwords. Clients should - merely need to change the username and password used after setting up a bot - password. -* action=upload no longer understands statuskey, asyncdownload or leavemessage. -* Several changes when $wgDisableAuthManager is false: -** action=login is deprecated for uses other than bot passwords. -** list=users can now indicate if a missing username is creatable. -** action=createaccount is changed in a non-backwards-compatible manner. -** Added action=query&meta=authmanagerinfo. -** Added action=clientlogin to be used to log into the main account instead of - action=login. -** Added action=linkaccount. -** Added action=unlinkaccount. -** Added action=changeauthenticationdata. -** Added action=removeauthenticationdata. -** Added action=resetpassword. - -=== Action API internal changes in 1.27 === -* ApiQueryORM removed. -* The following classes have been removed: -** ApiFormatDbg -** ApiFormatTxt -** ApiFormatYaml -* ApiBase::addTokenProperties() was removed (deprecated since 1.24). -* ApiBase::getFinalPossibleErrors() was removed (deprecated since 1.24). -* ApiBase::getFinalResultProperties() was removed (deprecated since 1.24). -* ApiBase::getRequireAtLeastOneParameterErrorMessages() was removed (deprecated since 1.24). -* ApiBase::getPossibleErrors() was removed (deprecated since 1.24). -* ApiBase::getRequireMaxOneParameterErrorMessages() was removed (deprecated since 1.24). -* ApiBase::getRequireOnlyOneParameterErrorMessages() was removed (deprecated since 1.24). -* ApiBase::getResultProperties() was removed (deprecated since 1.24). -* ApiBase::getTitleOrPageIdErrorMessage() was removed (deprecated since 1.24). -* ApiBase::parseErrors() was removed (deprecated since 1.24). -* ApiQueryBase::titleToKey(), ApiQueryBase::keyToTitle() and - ApiQueryBase::keyPartToTitle() all removed (deprecated since 1.24). -* ApiQueryBase::checkRowCount() was removed (deprecated since 1.24). -* ApiQueryBase::getDirectionDescription() was removed (deprecated since 1.25). -* ApiQuery::getGenerators() was removed (deprecated since 1.21). -* ApiQuery::getModules() was removed (deprecated since 1.21). -* ApiQuery::getModuleType() was removed (deprecated since 1.21). -* ApiQuery::setGeneratorContinue() was removed (deprecated since 1.24). -* ApiMain::getModules() was removed (deprecated since 1.21). -* ApiBase::getVersion() was removed (deprecated since 1.21). -* ApiMain::getShowVersions() was removed (deprecated in 1.21). -* ApiMain::addModule() was removed (deprecated in 1.21). -* ApiMain::addFormat() was removed (deprecated in 1.21). -* ApiMain::getFormats() was removed (deprecated in 1.21). -* ApiPageSet::finishPageSetGeneration() was removed (deprecated in 1.21). -* ApiCreateAccount is deprecated, and will be removed soon. - -=== Languages updated in 1.27 === - -MediaWiki supports over 350 languages. Many localisations are updated -regularly. Below only new and removed languages are listed, as well as -changes to languages because of Phabricator reports. - -* (T113688) Change default numerals from Gurmukhi to Arabic for Punjabi locale. -* (T116020) Aliases of magic words in MessagesXx.php are sorted by usage. - -=== Other changes in 1.27 === -* Added dependency injection (DI) infrastructure, see docs/injection.txt for details. - It is planned to incrementally move MediaWiki code towards using DI, using the - service locator (SL) pattern as a stepping stone. -* ProfilerOutputUdp was removed. Note that there is a ProfilerOutputStats class. -* WikiPage::doDeleteArticleReal() and WikiPage::doDeleteArticle() now - ignore the 2nd and 3rd arguments (formerly $id and $commit). -* Removed "loaderScripts" option from ResourceLoaderFileModule class. -* Removed ORM-like wrapper added in 1.20. -* LinkCache::getGoodLinks and LinkCache::getBadLinks were removed - (deprecated in 1.26). -* WikiPage::doQuickEdit() was removed (deprecated since 1.21). -* Removed SiteObject and SiteArray classes (deprecated in 1.21). -* MessageBlobStore::getInstance() was removed (deprecated since 1.25). -* (T84937) Free external links ("autolinked" urls) will now be terminated - by   and HTML entity encodings of  , <, and >. -* (T36948) The default file revert message's timestamp is now in - $wgLocaltimezone, instead of UTC. -* The default name of the 'suppress' group page has been changed from - 'Project:Oversight' to 'Project:Suppress'. -* DatabaseBase::resultObject() is now protected (use outside Database classes - not necessary since 1.11). -* Calling ResourceLoaderFileModule::readStyleFiles() without a - ResourceLoaderContext instance is deprecated. -* ResourceLoader::getLessCompiler() now takes an optional parameter of - additional LESS variables to set for the compiler. -* wfBaseConvert() marked as deprecated, use Wikimedia\base_convert() directly - instead. -* Obsolete maintenance scripts clearCacheStats.php and showCacheStats.php - were removed. The underlying data is sent to StatsD (see $wgStatsdServer). -* Removed msg_resource_links database table and associated code. -* Removed msg_resource database table and associated code. -* Skin::getNamespaceNotice() was removed. -* wfIsConfiguredProxy() was removed (deprecated since 1.24). -* wfDebugTimer() was removed (deprecated since 1.25). -* wfIsTrustedProxy() was removed (deprecated since 1.24). -* wfGetIP() was removed (deprecated since 1.19). -* MWHookException was removed. -* OutputPage::appendSubtitle() was removed (deprecated since 1.19). -* OutputPage::loginToUse() was removed (deprecated since 1.19). -* Article::loadContent() was removed (deprecated since 1.19). -* User::editToken() was removed (deprecated since 1.19). -* Removed --force-normal option of dumpBackup.php, as it no longer served - any useful purpose since 1.22. -* The functions processOption() and processArgs() on the BackupDumper and - TextPassDumper classes have been removed. -* The maintenance/backupTextPass.inc file was deleted. You should include - maintenance/dumpTextPass.php instead. -* WikiPage::getUsedTemplates() was removed (deprecated since 1.19). -* wfEmptyMsg() was removed (deprecated since 1.18). -* OutputPage::permissionRequired() was removed (deprecated since 1.18). -* OutputPage::blockedPage() was removed (deprecated since 1.18). -* User::getSkin() was removed (deprecated since 1.18). -* OutputPage::includeJQuery() was removed (deprecated since 1.17). -* WikiPage::updateRestrictions() was removed (deprecated since 1.19). -* WikiPage::testPreSaveTransform() was removed (deprecated since 1.19). -* LogPage::logName() was removed (deprecated since 1.19). -* LogPage::logHeader() was removed (deprecated since 1.19). -* wfCheckLimits() was removed (deprecated since 1.24). -* Linker::makeKnownLinkObj() was removed (deprecated since 1.16). -* Linker::makeLinkObj() was removed (deprecated since 1.16). -* wfMsgForContentNoTrans() was removed (deprecated since 1.18). -* ChangesList::usePatrol was removed (deprecated since 1.22). -* wfMsgNoTrans() was removed (deprecated since 1.18). -* Linker::makeImageLink2 was removed (deprecated since 1.20). -* Title::userIsWatching() was removed (deprecated since 1.20). -* Removed WaitForSlave maintenance script; use SELECT MASTER_POS_WAIT() - database function directly instead. -* wfMsg() was removed (deprecated since 1.18). -* wfMsgForContent() was removed (deprecated since 1.18). -* wfMsgReal() was removed (deprecated since 1.18). -* wfMsgGetKey() was removed (deprecated since 1.18). -* wfMsgHtml() was removed (deprecated since 1.18). -* wfMsgWikiHtml() was removed (deprecated since 1.18). -* wfMsgExt() was removed (deprecated since 1.18). -* Language::armourMath() was removed (deprecated since 1.22). -* LanguageConverter::armourMath() was removed (deprecated since 1.22). -* FakeConverter::armourMath() was removed (deprecated since 1.22). -* The unused jquery.validate ResourceLoader module was removed. -* FileRepo::getRootUrl() was removed (deprecated since 1.20). -* User::generateToken() was removed (deprecated since 1.20). -* WikiPage::getRawText() was removed (deprecated since 1.21). -* ParserOutput::hasCustomDataUpdates() was removed (deprecated since 1.25). -* ParserOutput::addSecondaryDataUpdate() was removed (deprecated since 1.25). -* ParserOutput::getSecondaryDataUpdates() was removed (deprecated since 1.25). -* Gallery images with multiple caption pipes no longer concatenate them all - together but instead pick the final one, similar to image syntax. -* XML-like parser tags (such as ), when unclosed, will be left unparsed - rather than consume everything until the end of the page. -* New maintenance script resetUserEmail.php allows sysadmins to reset user emails in case - a user forgot password/account was stolen. -* wfCheckEntropy() was removed (deprecated in 1.27). -* Browser support for Internet Explorer 8 lowered from Grade A to Grade C. -* ContentHandler::supportsCategories method added. Default is true. - CategoryMembershipChangeJob updates are skipped for content that - does not support categories. -* wikidiff difference engine is no longer supported, anyone still using it are encouraged - to upgrade to wikidiff2 which is actively maintained and has better package availability. -* Database logic was removed from WatchedItem and a WatchedItemStore was created: -** WatchedItem::IGNORE_USER_RIGHTS and WatchedItem::CHECK_USER_RIGHTS were deprecated. - User::IGNORE_USER_RIGHTS and User::CHECK_USER_RIGHTS were introduced. -** WatchedItem::fromUserTitle was deprecated in favour of the constructor. -** WatchedItem::resetNotificationTimestamp was deprecated. -** WatchedItem::batchAddWatch was deprecated. -** WatchedItem::addWatch was deprecated. -** WatchedItem::removeWatch was deprecated. -** WatchedItem::isWatched was deprecated. -** WatchedItem::duplicateEntries was deprecated. -** EmailNotification::updateWatchlistTimestamp was deprecated. -** User::getWatchedItem was removed. -* Unit tests don't work with external PHPUnit anymore, Composer is now the only supported - way. Run `composer install` to install it and other dev dependencies to run unit tests. -* wl_id field added to the watchlist table. -* Revision::getRawText() was removed (deprecated since 1.21). -* WikiPage::replaceSection() was removed (deprecated since 1.21). -* Article::replaceSection() was removed (deprecated since 1.21). -* Language::getLangObj() was removed (deprecated since 1.24). -* Language::getLanguageName() was removed (deprecated since 1.20). -* Language::getLanguageNames() was removed (deprecated since 1.20). -* Language::getTranslatedLanguageNames() was removed (deprecated since 1.20). -* Language::specialPage() was removed (deprecated since 1.24). -* MediaWikiTestCase::assertException() was removed (deprecated since 1.22). -* OutputPage::getHeadItems() was removed (deprecated since 1.24). -* OutputPage::getScript() was removed (deprecated since 1.24). -* OutputPage::out() was removed (deprecated since 1.22). -* OutputPage::setAllowedModules() was removed (deprecated since 1.24). -* UserrightsPage::makeGroupNameListForLog() was removed (deprecated since 1.21). -* MediaWikiSite::newFromGlobalId() was removed (deprecated since 1.21). -* Title::newFromRedirect() was removed (deprecated since 1.21). -* Skin::commonPrintStylesheet() was removed (deprecated since 1.22). -* Skin::getCommonStylePath() was removed (deprecated since 1.24). -* Skin::newFromKey() was removed (deprecated since 1.24). -* Skin::getUsableSkins() was removed (deprecated since 1.23). -* LoadBalancer::pickRandom() was removed (deprecated in 1.21). -* Article::getUndoText() and WikiPage::getUndoText were removed (deprecated since - 1.21). -* DifferenceEngine::setText() was removed (deprecated in 1.21). -* Title::newFromRedirectArray() was removed (deprecated in 1.21). -* UserMailer::send() no longer accepts $replyto as the 5th argument and $contentType - as the 6th. These must be passed in the options array now. -* Title::newFromRedirectRecurse() was removed (deprecated in 1.21). -* Skin::accesskey was removed (deprecated since 1.21). -* Skin::blockLink was removed (deprecated since 1.21). -* Skin::buildRollbackLink was removed (deprecated since 1.21). -* Skin::emailLink was removed (deprecated since 1.21). -* Skin::formatComment was removed (deprecated since 1.21). -* Skin::formatHiddenCategories was removed (deprecated since 1.21). -* Skin::formatLinksInComment was removed (deprecated since 1.21). -* Skin::formatRevisionSize was removed (deprecated since 1.21). -* Skin::formatSize was removed (deprecated since 1.21). -* Skin::formatTemplates was removed (deprecated since 1.21). -* Skin::generateTOC was removed (deprecated since 1.21). -* Skin::getInternalLinkAttributes was removed (deprecated since 1.21). -* Skin::getInternalLinkAttributesObj was removed (deprecated since 1.21). -* Skin::getInterwikiLinkAttributes was removed (deprecated since 1.21). -* Skin::getInvalidTitleDescription was removed (deprecated since 1.21). -* Skin::getLinkColour was removed (deprecated since 1.21). -* Skin::getRevDeleteLink was removed (deprecated since 1.21). -* Skin::getRollbackEditCount was removed (deprecated since 1.21). -* Skin::makeBrokenImageLinkObj was removed (deprecated since 1.21). -* Skin::makeCommentLink was removed (deprecated since 1.21). -* Skin::makeExternalImage was removed (deprecated since 1.21). -* Skin::makeExternalLink was removed (deprecated since 1.21). -* Skin::makeHeadline was removed (deprecated since 1.21). -* Skin::makeImageLink was removed (deprecated since 1.21). -* Skin::makeMediaLinkFile was removed (deprecated since 1.21). -* Skin::makeMediaLinkObj was removed (deprecated since 1.21). -* Skin::makeSelfLinkObj was removed (deprecated since 1.21). -* Skin::makeThumbLink2 was removed (deprecated since 1.21). -* Skin::makeThumbLinkObj was removed (deprecated since 1.21). -* Skin::normaliseSpecialPage was removed (deprecated since 1.21). -* Skin::normalizeSubpageLink was removed (deprecated since 1.21). -* Skin::processResponsiveImages was removed (deprecated since 1.21). -* Skin::revComment was removed (deprecated since 1.21). -* Skin::revDeleteLink was removed (deprecated since 1.21). -* Skin::revDeleteLinkDisabled was removed (deprecated since 1.21). -* Skin::revUserLink was removed (deprecated since 1.21). -* Skin::revUserTools was removed (deprecated since 1.21). -* Skin::specialLink was removed (deprecated since 1.21). -* Skin::splitTrail was removed (deprecated since 1.21). -* Skin::titleAttrib was removed (deprecated since 1.21). -* Skin::tocIndent was removed (deprecated since 1.21). -* Skin::tocLine was removed (deprecated since 1.21). -* Skin::tocLineEnd was removed (deprecated since 1.21). -* Skin::tocList was removed (deprecated since 1.21). -* Skin::tocUnindent was removed (deprecated since 1.21). -* Skin::tooltip was removed (deprecated since 1.21). -* Skin::tooltipAndAccesskeyAttribs was removed (deprecated since 1.21). -* Skin::userTalkLink was removed (deprecated since 1.21). -* Skin::userToolLinksRedContribs was removed (deprecated since 1.21). -* wikidiff3 is now the default and only PHP diff engine. It provides improved diff - performance on complex changes. $wgExternalDiffEngine = 'wikidiff3' therefore - makes no difference now. Users are still recommended to use wikidiff2 if possible, - though. -* User::addNewUserLogEntry() was deprecated. -* User::addNewUserLogEntryAutoCreate() was deprecated. -* User::isPasswordReminderThrottled() was deprecated. -* Bot-oriented parameters to Special:UserLogin (wpCookieCheck, wpSkipCookieCheck) - were removed. -* Installer can now be customized without patching MediaWiki code, see - mw-config/overrides/README for details. - -== Compatibility == - -MediaWiki 1.27 requires PHP 5.5.9 or later. There is experimental support for -HHVM 3.6.5 or later. - -MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but -support for them is somewhat less mature. There is experimental support for -Oracle and Microsoft SQL Server. - -The supported versions are: - -* MySQL 5.0.3 or later -* PostgreSQL 8.3 or later -* SQLite 3.3.7 or later -* Oracle 9.0.1 or later -* Microsoft SQL Server 2005 (9.00.1399) - -== Upgrading == - -1.27 has several database changes since 1.26, and will not work without schema -updates. Note that due to changes to some very large tables like the revision -table, the schema update may take quite long (minutes on a medium sized site, -many hours on a large site). - -If upgrading from before 1.11, and you are using a wiki as a commons -repository, make sure that it is updated as well. Otherwise, errors may arise -due to database schema changes. - -If upgrading from before 1.7, you may want to run refreshLinks.php to ensure -new database fields are filled with data. - -If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to -1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed -with MediaWiki 1.21. - -Don't forget to always back up your database before upgrading! - -See the file UPGRADE for more detailed upgrade instructions. - -For notes on 1.26.x and older releases, see HISTORY. - -== Online documentation == - -Documentation for both end-users and site administrators is available on -MediaWiki.org, and is covered under the GNU Free Documentation License (except -for pages that explicitly state that their contents are in the public domain): - - https://www.mediawiki.org/wiki/Documentation - -== Mailing list == - -A mailing list is available for MediaWiki user support and discussion: - - https://lists.wikimedia.org/mailman/listinfo/mediawiki-l - -A low-traffic announcements-only list is also available: - - https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce - -It's highly recommended that you sign up for one of these lists if you're -going to run a public MediaWiki, so you can be notified of security fixes. - -== IRC help == - -There's usually someone online in #mediawiki on irc.freenode.net. diff --git a/RELEASE-NOTES-1.28 b/RELEASE-NOTES-1.28 index 0e423d296c..6ee962f9ff 100644 --- a/RELEASE-NOTES-1.28 +++ b/RELEASE-NOTES-1.28 @@ -13,10 +13,19 @@ production. is configurable via $wgSessionPbkdf2Iterations. * Upload dialog's file upload log comment can now be configured separately for local and foreign uploads. +* $wgForeignUploadTargets now defaults to `[ 'local' ]`, where `'local'` + signifies local uploads. A value of `[]` (empty array) now means that + no upload targets are allowed, effectively disabling the upload dialog. === New features in 1.28 === * User::isBot() method for checking if an account is a bot role account. +* Added a new 'slideshow' mode for galleries. * Added a new hook, 'UserIsBot', to aid in determining if a user is a bot. +* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better + interact with API parsing. +* Added a new hook, 'UploadVerifyUpload', which can be used to reject a file + upload. Unlike 'UploadVerifyFile' it provides information about upload comment + and the file description page, but does not run for uploads to stash. === External library changes in 1.28 === @@ -32,6 +41,8 @@ production. === Action API changes in 1.28 === === Action API internal changes in 1.28 === +* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better + interact with ApiParse and ApiExpandTemplates. === Languages updated in 1.28 === @@ -39,8 +50,15 @@ MediaWiki supports over 350 languages. Many localisations are updated regularly. Below only new and removed languages are listed, as well as changes to languages because of Phabricator reports. +* (T137411) ban (Balinese), thanks to translators Adi Mayndra, Andru, + BASAbali, M. Adiputra, Naval Scene, Nemo bis, NoiX180, and 아라. + === Other changes in 1.28 === * (T128697) Improved handling of large diffs. +* [BREAKING CHANGE] $wgExtendedLoginCookies has been removed. You can + use or update a custom session provider if needed. +* Deprecated APIEditBeforeSave hook in favor of EditFilterMergedContent. +* The 'UploadVerification' hook is deprecated. Use 'UploadVerifyFile' instead. == Compatibility == diff --git a/autoload.php b/autoload.php index f40cc89434..d82d6993c6 100644 --- a/autoload.php +++ b/autoload.php @@ -21,6 +21,7 @@ $wgAutoloadLocalClasses = [ 'ApiAuthManagerHelper' => __DIR__ . '/includes/api/ApiAuthManagerHelper.php', 'ApiBase' => __DIR__ . '/includes/api/ApiBase.php', 'ApiBlock' => __DIR__ . '/includes/api/ApiBlock.php', + 'ApiCSPReport' => __DIR__ . '/includes/api/ApiCSPReport.php', 'ApiChangeAuthenticationData' => __DIR__ . '/includes/api/ApiChangeAuthenticationData.php', 'ApiCheckToken' => __DIR__ . '/includes/api/ApiCheckToken.php', 'ApiClearHasMsg' => __DIR__ . '/includes/api/ApiClearHasMsg.php', @@ -388,6 +389,7 @@ $wgAutoloadLocalClasses = [ 'DumpPipeOutput' => __DIR__ . '/includes/export/DumpPipeOutput.php', 'DumpRenderer' => __DIR__ . '/maintenance/renderDump.php', 'DumpRev' => __DIR__ . '/maintenance/storage/dumpRev.php', + 'DumpStringOutput' => __DIR__ . '/includes/export/DumpStringOutput.php', 'DuplicateJob' => __DIR__ . '/includes/jobqueue/jobs/DuplicateJob.php', 'EditAction' => __DIR__ . '/includes/actions/EditAction.php', 'EditCLI' => __DIR__ . '/maintenance/edit.php', @@ -607,6 +609,7 @@ $wgAutoloadLocalClasses = [ 'InstallerSessionProvider' => __DIR__ . '/includes/installer/InstallerSessionProvider.php', 'Interwiki' => __DIR__ . '/includes/interwiki/Interwiki.php', 'InvalidPassword' => __DIR__ . '/includes/password/InvalidPassword.php', + 'InvalidateUserSesssions' => __DIR__ . '/maintenance/invalidateUserSessions.php', 'IteratorDecorator' => __DIR__ . '/includes/utils/iterators/IteratorDecorator.php', 'IuConverter' => __DIR__ . '/languages/classes/LanguageIu.php', 'JSCompilerContext' => __DIR__ . '/includes/libs/jsminplus.php', @@ -791,7 +794,6 @@ $wgAutoloadLocalClasses = [ 'MediaTransformOutput' => __DIR__ . '/includes/media/MediaTransformOutput.php', 'MediaWiki' => __DIR__ . '/includes/MediaWiki.php', 'MediaWikiI18N' => __DIR__ . '/includes/skins/MediaWikiI18N.php', - 'MediaWikiPageLinkRenderer' => __DIR__ . '/includes/title/MediaWikiPageLinkRenderer.php', 'MediaWikiSite' => __DIR__ . '/includes/site/MediaWikiSite.php', 'MediaWikiTitleCodec' => __DIR__ . '/includes/title/MediaWikiTitleCodec.php', 'MediaWikiVersionFetcher' => __DIR__ . '/includes/MediaWikiVersionFetcher.php', @@ -878,7 +880,14 @@ $wgAutoloadLocalClasses = [ 'MediaWiki\\Session\\Token' => __DIR__ . '/includes/session/Token.php', 'MediaWiki\\Session\\UserInfo' => __DIR__ . '/includes/session/UserInfo.php', 'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php', + 'MediaWiki\\Tidy\\BalanceActiveFormattingElements' => __DIR__ . '/includes/tidy/Balancer.php', + 'MediaWiki\\Tidy\\BalanceElement' => __DIR__ . '/includes/tidy/Balancer.php', + 'MediaWiki\\Tidy\\BalanceMarker' => __DIR__ . '/includes/tidy/Balancer.php', + 'MediaWiki\\Tidy\\BalanceSets' => __DIR__ . '/includes/tidy/Balancer.php', + 'MediaWiki\\Tidy\\BalanceStack' => __DIR__ . '/includes/tidy/Balancer.php', + 'MediaWiki\\Tidy\\Balancer' => __DIR__ . '/includes/tidy/Balancer.php', 'MediaWiki\\Tidy\\Html5Depurate' => __DIR__ . '/includes/tidy/Html5Depurate.php', + 'MediaWiki\\Tidy\\Html5Internal' => __DIR__ . '/includes/tidy/Html5Internal.php', 'MediaWiki\\Tidy\\RaggettBase' => __DIR__ . '/includes/tidy/RaggettBase.php', 'MediaWiki\\Tidy\\RaggettExternal' => __DIR__ . '/includes/tidy/RaggettExternal.php', 'MediaWiki\\Tidy\\RaggettInternalHHVM' => __DIR__ . '/includes/tidy/RaggettInternalHHVM.php', @@ -955,6 +964,7 @@ $wgAutoloadLocalClasses = [ 'NukePage' => __DIR__ . '/maintenance/nukePage.php', 'NullFileJournal' => __DIR__ . '/includes/filebackend/filejournal/FileJournal.php', 'NullFileOp' => __DIR__ . '/includes/filebackend/FileOp.php', + 'NullIndexField' => __DIR__ . '/includes/search/NullIndexField.php', 'NullJob' => __DIR__ . '/includes/jobqueue/jobs/NullJob.php', 'NullLockManager' => __DIR__ . '/includes/filebackend/lockmanager/LockManager.php', 'NullRepo' => __DIR__ . '/includes/filerepo/NullRepo.php', @@ -1004,7 +1014,6 @@ $wgAutoloadLocalClasses = [ 'PageArchive' => __DIR__ . '/includes/specials/SpecialUndelete.php', 'PageExists' => __DIR__ . '/maintenance/pageExists.php', 'PageLangLogFormatter' => __DIR__ . '/includes/logging/PageLangLogFormatter.php', - 'PageLinkRenderer' => __DIR__ . '/includes/title/PageLinkRenderer.php', 'PageProps' => __DIR__ . '/includes/PageProps.php', 'PageQueryPage' => __DIR__ . '/includes/specialpage/PageQueryPage.php', 'Pager' => __DIR__ . '/includes/pager/Pager.php', @@ -1092,6 +1101,7 @@ $wgAutoloadLocalClasses = [ 'RCDatabaseLogEntry' => __DIR__ . '/includes/logging/LogEntry.php', 'RCFeedEngine' => __DIR__ . '/includes/rcfeed/RCFeedEngine.php', 'RCFeedFormatter' => __DIR__ . '/includes/rcfeed/RCFeedFormatter.php', + 'RESTBagOStuff' => __DIR__ . '/includes/libs/objectcache/RESTBagOStuff.php', 'RSSFeed' => __DIR__ . '/includes/Feed.php', 'RandomPage' => __DIR__ . '/includes/specials/SpecialRandompage.php', 'RangeDifference' => __DIR__ . '/includes/diff/DiffEngine.php', @@ -1148,6 +1158,7 @@ $wgAutoloadLocalClasses = [ 'ResourceLoaderOOUIImageModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderOOUIImageModule.php', 'ResourceLoaderRawFileModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderRawFileModule.php', 'ResourceLoaderSiteModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteModule.php', + 'ResourceLoaderSiteStylesModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSiteStylesModule.php', 'ResourceLoaderSkinModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSkinModule.php', 'ResourceLoaderSpecialCharacterDataModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderSpecialCharacterDataModule.php', 'ResourceLoaderStartUpModule' => __DIR__ . '/includes/resourceloader/ResourceLoaderStartUpModule.php', @@ -1173,6 +1184,7 @@ $wgAutoloadLocalClasses = [ 'RevDelLogList' => __DIR__ . '/includes/revisiondelete/RevDelLogList.php', 'RevDelRevisionItem' => __DIR__ . '/includes/revisiondelete/RevDelRevisionItem.php', 'RevDelRevisionList' => __DIR__ . '/includes/revisiondelete/RevDelRevisionList.php', + 'ReverseArrayIterator' => __DIR__ . '/includes/libs/ReverseArrayIterator.php', 'ReverseChronologicalPager' => __DIR__ . '/includes/pager/ReverseChronologicalPager.php', 'RevertAction' => __DIR__ . '/includes/actions/RevertAction.php', 'Revision' => __DIR__ . '/includes/Revision.php', @@ -1207,6 +1219,8 @@ $wgAutoloadLocalClasses = [ 'SearchEngineFactory' => __DIR__ . '/includes/search/SearchEngineFactory.php', 'SearchExactMatchRescorer' => __DIR__ . '/includes/search/SearchExactMatchRescorer.php', 'SearchHighlighter' => __DIR__ . '/includes/search/SearchHighlighter.php', + 'SearchIndexField' => __DIR__ . '/includes/search/SearchIndexField.php', + 'SearchIndexFieldDefinition' => __DIR__ . '/includes/search/SearchIndexFieldDefinition.php', 'SearchMssql' => __DIR__ . '/includes/search/SearchMssql.php', 'SearchMySQL' => __DIR__ . '/includes/search/SearchMySQL.php', 'SearchNearMatchResultSet' => __DIR__ . '/includes/search/SearchNearMatchResultSet.php', @@ -1246,6 +1260,7 @@ $wgAutoloadLocalClasses = [ 'SkinFallback' => __DIR__ . '/includes/skins/SkinFallback.php', 'SkinFallbackTemplate' => __DIR__ . '/includes/skins/SkinFallbackTemplate.php', 'SkinTemplate' => __DIR__ . '/includes/skins/SkinTemplate.php', + 'SlideshowImageGallery' => __DIR__ . '/includes/gallery/SlideshowImageGallery.php', 'SpecialActiveUsers' => __DIR__ . '/includes/specials/SpecialActiveusers.php', 'SpecialAllMessages' => __DIR__ . '/includes/specials/SpecialAllMessages.php', 'SpecialAllMyUploads' => __DIR__ . '/includes/specials/SpecialMyRedirectPages.php', @@ -1486,6 +1501,7 @@ $wgAutoloadLocalClasses = [ 'WantedTemplatesPage' => __DIR__ . '/includes/specials/SpecialWantedtemplates.php', 'WatchAction' => __DIR__ . '/includes/actions/WatchAction.php', 'WatchedItem' => __DIR__ . '/includes/WatchedItem.php', + 'WatchedItemQueryService' => __DIR__ . '/includes/WatchedItemQueryService.php', 'WatchedItemStore' => __DIR__ . '/includes/WatchedItemStore.php', 'WatchlistCleanup' => __DIR__ . '/maintenance/cleanupWatchlist.php', 'WebInstaller' => __DIR__ . '/includes/installer/WebInstaller.php', diff --git a/composer.json b/composer.json index a2614490c0..63b5c5c111 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,7 @@ "wiki": "https://www.mediawiki.org/" }, "require": { - "composer/semver": "1.4.0", + "composer/semver": "1.4.1", "cssjanus/cssjanus": "1.1.2", "ext-ctype": "*", "ext-iconv": "*", @@ -25,7 +25,7 @@ "ext-xml": "*", "liuggio/statsd-php-client": "1.0.18", "mediawiki/at-ease": "1.1.0", - "oojs/oojs-ui": "0.17.4", + "oojs/oojs-ui": "0.17.5", "oyejorge/less.php": "1.7.0.10", "php": ">=5.5.9", "psr/log": "1.0.0", @@ -40,7 +40,7 @@ "wikimedia/relpath": "1.0.3", "wikimedia/running-stat": "1.1.0", "wikimedia/utfnormal": "1.0.3", - "wikimedia/wrappedstring": "2.0.0", + "wikimedia/wrappedstring": "2.1.1", "zordius/lightncandy": "0.23" }, "require-dev": { diff --git a/docs/extension.schema.json b/docs/extension.schema.json index 1d2b2f0568..3235c95146 100644 --- a/docs/extension.schema.json +++ b/docs/extension.schema.json @@ -415,7 +415,7 @@ }, "group": { "type": "string", - "description": "Group which this module should be loaded together with" + "description": "Group with which this module should be loaded" }, "position": { "type": "string", @@ -438,6 +438,48 @@ } } }, + { + "description": "A ResourceLoaderWikiModule definition", + "additionalProperties": false, + "properties": { + "class": { + "enum": ["ResourceLoaderWikiModule"] + }, + "group": { + "type": "string", + "description": "Group with which this module should be loaded" + }, + "position": { + "type": "string", + "description": "Position on the page to load this module at", + "enum": [ + "bottom", + "top" + ] + }, + "targets": { + "type": ["string", "array"], + "description": "ResourceLoader target the module can run on", + "items": { + "type": "string" + } + }, + "scripts": { + "type": "array", + "description": "A list of on-wiki pages containing JavaScript that should be loaded", + "items": { + "type": "string" + } + }, + "styles": { + "type": "array", + "description": "A list of on-wiki pages containing CSS that should be loaded", + "items": { + "type": "string" + } + } + } + }, { "description": "A ResourceLoaderImageModule definition", "additionalProperties": false, @@ -500,10 +542,6 @@ "type": "object", "description": "ResourceLoader LESS variables" }, - "ResourceLoaderLESSImportPaths": { - "type": "object", - "description": "ResourceLoader import paths" - }, "ConfigRegistry": { "type": "object", "description": "Registry of factory functions to create Config objects" @@ -535,6 +573,14 @@ "type": "object", "description": "Central ID lookup providers" }, + "ChangeCredentialsBlacklist": { + "type": "object", + "description": "AuthenticationRequest classes which can only be used internally for credentials change" + }, + "RemoveCredentialsBlacklist": { + "type": "object", + "description": "AuthenticationRequest classes which can only be used internally for credentials removal" + }, "namespaces": { "type": "array", "description": "Method to add extra namespaces", @@ -630,6 +676,29 @@ } } }, + "GrantPermissions": { + "type": "object", + "description": "Map of permissions granted to authorized consumers to their bundles, called 'grants'", + "patternProperties": { + "^[a-z]+$": { + "type": "object", + "patternProperties": { + "^[a-z]+$": { + "type": "boolean" + } + } + } + } + }, + "GrantPermissionGroups": { + "type": "object", + "description": "Map of grants to their UI grouping", + "patternProperties": { + "^[a-z]+$": { + "type": "string" + } + } + }, "ImplicitGroups": { "type": "array", "description": "Implicit groups" diff --git a/docs/hooks.txt b/docs/hooks.txt index 9f5c4c48e6..2b3116d7b5 100644 --- a/docs/hooks.txt +++ b/docs/hooks.txt @@ -371,12 +371,17 @@ $user: Current user &$message: API usage message to die with, as a message key or array as accepted by ApiBase::dieUsageMsg. -'APIEditBeforeSave': Before saving a page with api.php?action=edit, after +'APIEditBeforeSave': DEPRECATED! Use EditFilterMergedContent instead. +Before saving a page with api.php?action=edit, after processing request parameters. Return false to let the request fail, returning an error message or an tag if $resultArr was filled. Unlike for example 'EditFilterMergedContent' this also being run on undo. +Since MediaWiki 1.25, 'EditFilterMergedContent' can also return error details +for the API and it's recommended to use it instead of this hook. $editPage: the EditPage object -$text: the new text of the article (has yet to be saved) +$text: the text passed to the API. Note that this includes only the single + section for section edit, and is not necessarily the final text in case of + automatically resolved edit conflicts. &$resultArr: data in this array will be added to the API result 'ApiFeedContributions::feedItem': Called to convert the result of ContribsPager @@ -439,6 +444,15 @@ an exception is thrown during API action execution. $apiMain: Calling ApiMain instance. $e: Exception object. +'ApiMakeParserOptions': Called from ApiParse and ApiExpandTemplates to allow +extensions to adjust the ParserOptions before parsing. +$options: ParserOptions object +$title: Title to be parsed +$params: Parameter array for the API module +$module: API module (which is also a ContextSource) +&$reset: Set to a ScopedCallback used to reset any hooks after the parse is done. +&$suppressCache: Set true if cache should be suppressed. + 'ApiOpenSearchSuggest': Called when constructing the OpenSearch results. Hooks can alter or append to the array. &$results: array with integer keys to associative arrays. Keys in associative @@ -669,6 +683,10 @@ $oldPageID: the page ID of the revision when archived (may be null) revisions of an article. $title: Title object of the article $ids: Ids to set the visibility for +$visibilityChangeMap: Map of revision id to oldBits and newBits. This array can be + examined to determine exactly what visibility bits have changed for each + revision. This array is of the form + [id => ['oldBits' => $oldBits, 'newBits' => $newBits], ... ] 'ArticleRollbackComplete': After an article rollback is completed. $wikiPage: the WikiPage that was edited @@ -916,6 +934,7 @@ $wikiPage: WikiPage that was added 'CategoryAfterPageRemoved': After a page is removed from a category. $category: Category that page was removed from $wikiPage: WikiPage that was removed +$id: the page ID (original ID in case of page deletions) 'CategoryPageView': Before viewing a categorypage in CategoryPage::view. &$catpage: CategoryPage instance @@ -1347,6 +1366,7 @@ $changesList: EnhancedChangesList object &$data: An array with all the components that will be joined in order to create the line $block: An array of RecentChange objects in that block $rc: The RecentChange object for this line +&$classes: An array of classes to change 'EnhancedChangesListModifyBlockLineData': to alter data used to build a non-grouped recent change line in EnhancedChangesList. @@ -1838,7 +1858,7 @@ $file: the File object or false if broken link &$attribs: the attributes to be applied &$ret: the value to return if your hook returns false -'LinkRendererBegin': +'HtmlPageLinkRendererBegin': Used when generating internal and interwiki links in LinkRenderer, before processing starts. Return false to skip default processing and return $ret. @@ -1854,7 +1874,7 @@ $target: the LinkTarget that the link is pointing to in associative array form, with keys and values unescaped. &$ret: the value to return if your hook returns false. -'LinkRendererEnd': +'HtmlPageLinkRendererEnd': Used when generating internal and interwiki links in LinkRenderer, just before the function returns a value. If you return true, an element with HTML attributes $attribs and contents $html will be returned. If you @@ -2399,6 +2419,8 @@ that tests continue to run properly. $page: the WikiPage of the candidate edit $content: the Content object of the candidate edit $output: the ParserOutput result of the candidate edit +$summary: the change summary of the candidate edit +$user: the User considering the edit 'PasswordPoliciesForUser': Alter the effective password policy for a user. $user: User object whose policy you are modifying @@ -2530,7 +2552,7 @@ $context: (IContextSource) The RequestContext the skin is being created for. flagged to lack same-origin security. Return false to indicate the lack. Note if the "somehow" involves HTTP headers, you'll probably need to make sure the header is varied on. -WebRequest $request: The request. +$request: The WebRequest object. 'ResetPasswordExpiration': Allow extensions to set a default password expiration $user: The user having their password expiration reset @@ -2860,6 +2882,12 @@ $id: User id number, only provided for backwards-compatibility $user: User object representing user contributions are being fetched for $sp: SpecialPage instance, providing context +'SpecialContributions::formatRow::flags': Called before rendering a +Special:Contributions row. +$context: IContextSource object +$row: Revision information from the database +&$flags: List of flags on this row + 'SpecialContributions::getForm::filters': Called with a list of filters to render on Special:Contributions. $sp: SpecialContributions object, for context @@ -2990,9 +3018,9 @@ $t: title object searched for canceled and a normal search will be performed. Returning true without setting $url does a standard redirect to $title. Setting $url redirects to the specified URL. -$term - The string the user searched for -$title - The title the 'go' feature has decided to forward the user to -&$url - Initially null, hook subscribers can set this to specify the final url to redirect to +$term: The string the user searched for +$title: The title the 'go' feature has decided to forward the user to +&$url: Initially null, hook subscribers can set this to specify the final url to redirect to 'SpecialSearchNogomatch': Called when user clicked the "Go" button but the target doesn't exist. @@ -3262,8 +3290,8 @@ added to the descriptor &$radio: Boolean, if source type should be shown as radio button $selectedSourceType: The selected source type -'UploadVerification': Additional chances to reject an uploaded file. Consider -using UploadVerifyFile instead. +'UploadVerification': DEPRECATED! Use UploadVerifyFile instead. +Additional chances to reject an uploaded file. $saveName: (string) destination file name $tempName: (string) filesystem path to the temporary file for checks &$error: (string) output: message key for message to show if upload canceled by @@ -3275,9 +3303,23 @@ in most cases over UploadVerification. $upload: (object) an instance of UploadBase, with all info about the upload $mime: (string) The uploaded file's MIME type, as detected by MediaWiki. Handlers will typically only apply for specific MIME types. -&$error: (object) output: true if the file is valid. Otherwise, an indexed array - representing the problem with the file, where the first element is the message - key and the remaining elements are used as parameters to the message. +&$error: (object) output: true if the file is valid. Otherwise, set this to the reason + in the form of array( messagename, param1, param2, ... ) or a MessageSpecifier + instance (you might want to use ApiMessage to provide machine-readable details + for the API). + +'UploadVerifyUpload': Upload verification, based on both file properties like +MIME type (same as UploadVerifyFile) and the information entered by the user +(upload comment, file page contents etc.). +$upload: (object) An instance of UploadBase, with all info about the upload +$user: (object) An instance of User, the user uploading this file +$props: (array) File properties, as returned by FSFile::getPropsFromPath() +$comment: (string) Upload log comment (also used as edit summary) +$pageText: (string) File description page text (only used for new uploads) +&$error: output: If the file upload should be prevented, set this to the reason + in the form of array( messagename, param1, param2, ... ) or a MessageSpecifier + instance (you might want to use ApiMessage to provide machine-readable details + for the API). 'UserIsBot': when determining whether a user is a bot account $user: the user @@ -3380,6 +3422,7 @@ $title: Title of the page in question &$user: User object $ip: User's IP address &$blocked: Whether the user is blocked, to be modified by the hook +&$block: The Block object, to be modified by the hook 'UserIsEveryoneAllowed': Check if all users are allowed some user right; return false if a UserGetRights hook might remove the named right. diff --git a/includes/DefaultSettings.php b/includes/DefaultSettings.php index dc0b60c462..f3c50739f0 100644 --- a/includes/DefaultSettings.php +++ b/includes/DefaultSettings.php @@ -284,10 +284,10 @@ $wgLogo = false; * * @par Example: * @code - * $wgLogoHD = array( + * $wgLogoHD = [ * "1.5x" => "path/to/1.5x_version.png", * "2x" => "path/to/2x_version.png" - * ); + * ]; * @endcode * * @since 1.25 @@ -529,11 +529,12 @@ $wgUseInstantCommons = false; * Array of foreign file repo names (set in $wgForeignFileRepos above) that * are allowable upload targets. These wikis must have some method of * authentication (i.e. CentralAuth), and be CORS-enabled for this wiki. + * The string 'local' signifies the default local file repository. * * Example: - * $wgForeignUploadTargets = array( 'shared' ); + * $wgForeignUploadTargets = [ 'shared' ]; */ -$wgForeignUploadTargets = []; +$wgForeignUploadTargets = [ 'local' ]; /** * Configuration for file uploads using the embeddable upload dialog @@ -754,10 +755,10 @@ $wgCopyUploadTimeout = false; * * @par Example: * @code - * $wgMaxUploadSize = array( + * $wgMaxUploadSize = [ * '*' => 250 * 1024, * 'url' => 500 * 1024, - * ); + * ]; * @endcode * Sets the maximum for all uploads to 250 kB except for upload-by-url, which * will have a maximum of 500 kB. @@ -1162,9 +1163,9 @@ $wgMaxAnimatedGifArea = 1.25e7; * @par Example: * @code * // PNG is lossless, but inefficient for photos - * $wgTiffThumbnailType = array( 'png', 'image/png' ); + * $wgTiffThumbnailType = [ 'png', 'image/png' ]; * // JPEG is good for photos, but has no transparency support. Bad for diagrams. - * $wgTiffThumbnailType = array( 'jpg', 'image/jpeg' ); + * $wgTiffThumbnailType = [ 'jpg', 'image/jpeg' ]; * @endcode */ $wgTiffThumbnailType = false; @@ -1320,7 +1321,7 @@ $wgTrivialMimeDetection = false; /** * Additional XML types we can allow via MIME-detection. - * array = ( 'rootElement' => 'associatedMimeType' ) + * array = [ 'rootElement' => 'associatedMimeType' ] */ $wgXMLMimeTypes = [ 'http://www.w3.org/2000/svg:svg' => 'image/svg+xml', @@ -1377,7 +1378,7 @@ $wgThumbnailBuckets = null; * needs in order to be used as the reference for a given thumbnail. For example, with the * following buckets: * - * $wgThumbnailBuckets = array ( 128, 256, 512 ); + * $wgThumbnailBuckets = [ 128, 256, 512 ]; * * and a distance of 50: * @@ -1443,7 +1444,7 @@ $wgGalleryOptions = [ 'imagesPerRow' => 0, // Default number of images per-row in the gallery. 0 -> Adapt to screensize 'imageWidth' => 120, // Width of the cells containing images in galleries (in "px") 'imageHeight' => 120, // Height of the cells containing images in galleries (in "px") - 'captionLength' => 25, // Length of caption to truncate (in characters) + 'captionLength' => 25, // Length to truncate filename to in caption when using "showfilename" 'showBytes' => true, // Show the filesize in bytes in categories 'mode' => 'traditional', ]; @@ -1623,14 +1624,14 @@ $wgPasswordExpireGrace = 3600 * 24 * 7; // 7 days * Default to false or fill an array : * * @code - * $wgSMTP = array( + * $wgSMTP = [ * 'host' => 'SMTP domain', * 'IDHost' => 'domain for MessageID', * 'port' => '25', * 'auth' => [true|false], * 'username' => [SMTP username], * 'password' => [SMTP password], - * ); + * ]; * @endcode */ $wgSMTP = false; @@ -2067,7 +2068,7 @@ $wgCompressRevisions = false; * * Short names of ExternalStore classes may be specified in an array here: * @code - * $wgExternalStores = array("http","file","custom")... + * $wgExternalStores = [ "http","file","custom" ]... * @endcode * * CAUTION: Access to database might lead to code execution @@ -2080,9 +2081,9 @@ $wgExternalStores = []; * @par Example: * Create a cluster named 'cluster1' containing three servers: * @code - * $wgExternalServers = array( - * 'cluster1' => array( 'srv28', 'srv29', 'srv30' ) - * ); + * $wgExternalServers = [ + * 'cluster1' => [ 'srv28', 'srv29', 'srv30' ] + * ]; * @endcode * * Used by LBFactorySimple, may be ignored if $wgLBFactoryConf is set to @@ -2099,7 +2100,7 @@ $wgExternalServers = []; * * @par Example: * @code - * $wgDefaultExternalStore = array( 'DB://cluster1', 'DB://cluster2' ); + * $wgDefaultExternalStore = [ 'DB://cluster1', 'DB://cluster2' ]; * @endcode * * @var array @@ -2550,12 +2551,6 @@ $wgSidebarCacheExpiry = 86400; */ $wgUseGzip = false; -/** - * Whether MediaWiki should send an ETag header. Seems to cause - * broken behavior with Squid 2.6, see bug 7098. - */ -$wgUseETag = false; - /** * Clock skew or the one-second resolution of time() can occasionally cause cache * problems when the user requests two pages within a short period of time. This @@ -2743,16 +2738,16 @@ $wgSquidPurgeUseHostHeader = true; * @par Example configuration to send purges for upload.wikimedia.org to one * multicast group and all other purges to another: * @code - * $wgHTCPRouting = array( - * '|^https?://upload\.wikimedia\.org|' => array( + * $wgHTCPRouting = [ + * '|^https?://upload\.wikimedia\.org|' => [ * 'host' => '239.128.0.113', * 'port' => 4827, - * ), - * '' => array( + * ], + * '' => [ * 'host' => '239.128.0.112', * 'port' => 4827, - * ), - * ); + * ], + * ]; * @endcode * * You can also pass an array of hosts to send purges too. This is useful when @@ -2761,16 +2756,16 @@ $wgSquidPurgeUseHostHeader = true; * * @par Example of sending purges to multiple hosts: * @code - * $wgHTCPRouting = array( - * '' => array( + * $wgHTCPRouting = [ + * '' => [ * // Purges to text caches using multicast - * array( 'host' => '239.128.0.114', 'port' => '4827' ), + * [ 'host' => '239.128.0.114', 'port' => '4827' ], * // Purges to a hardcoded list of caches - * array( 'host' => '10.88.66.1', 'port' => '4827' ), - * array( 'host' => '10.88.66.2', 'port' => '4827' ), - * array( 'host' => '10.88.66.3', 'port' => '4827' ), - * ), - * ); + * [ 'host' => '10.88.66.1', 'port' => '4827' ], + * [ 'host' => '10.88.66.2', 'port' => '4827' ], + * [ 'host' => '10.88.66.3', 'port' => '4827' ], + * ], + * ]; * @endcode * * @since 1.22 @@ -3093,7 +3088,7 @@ $wgLoginLanguageSelector = false; * To allow language-specific main page and community * portal: * @code - * $wgForceUIMsgAsContentMsg = array( 'mainpage', 'portal-url' ); + * $wgForceUIMsgAsContentMsg = [ 'mainpage', 'portal-url' ]; * @endcode */ $wgForceUIMsgAsContentMsg = []; @@ -3463,13 +3458,13 @@ $wgMangleFlashPolicy = true; * * @par Example: * @code - * $wgResourceModules['ext.myExtension'] = array( + * $wgResourceModules['ext.myExtension'] = [ * 'scripts' => 'myExtension.js', * 'styles' => 'myExtension.css', - * 'dependencies' => array( 'jquery.cookie', 'jquery.tabIndex' ), + * 'dependencies' => [ 'jquery.cookie', 'jquery.tabIndex' ], * 'localBasePath' => __DIR__, * 'remoteExtPath' => 'MyExtension', - * ); + * ]; * @endcode */ $wgResourceModules = []; @@ -3484,27 +3479,27 @@ $wgResourceModules = []; * * @par Example: * @code - * $wgResourceModules['bar'] = array( + * $wgResourceModules['bar'] = [ * 'scripts' => 'resources/bar/bar.js', * 'styles' => 'resources/bar/main.css', - * ); + * ]; * - * $wgResourceModuleSkinStyles['foo'] = array( + * $wgResourceModuleSkinStyles['foo'] = [ * 'bar' => 'skins/Foo/bar.css', - * ); + * ]; * @endcode * * This is mostly equivalent to: * * @par Equivalent: * @code - * $wgResourceModules['bar'] = array( + * $wgResourceModules['bar'] = [ * 'scripts' => 'resources/bar/bar.js', * 'styles' => 'resources/bar/main.css', - * 'skinStyles' => array( + * 'skinStyles' => [ * 'foo' => skins/Foo/bar.css', - * ), - * ); + * ], + * ]; * @endcode * * If the module already defines its own entry in `skinStyles` for a given skin, then @@ -3515,34 +3510,34 @@ $wgResourceModules = []; * * @par Example: * @code - * $wgResourceModules['bar'] = array( + * $wgResourceModules['bar'] = [ * 'scripts' => 'resources/bar/bar.js', * 'styles' => 'resources/bar/basic.css', - * 'skinStyles' => array( - * 'default' => 'resources/bar/additional.css', - * ), - * ); + * 'skinStyles' => [ + * 'default' => 'resources/bar/additional.css', + * ], + * ]; * // Note the '+' character: - * $wgResourceModuleSkinStyles['foo'] = array( + * $wgResourceModuleSkinStyles['foo'] = [ * '+bar' => 'skins/Foo/bar.css', - * ); + * ]; * @endcode * * This is mostly equivalent to: * * @par Equivalent: * @code - * $wgResourceModules['bar'] = array( + * $wgResourceModules['bar'] = [ * 'scripts' => 'resources/bar/bar.js', * 'styles' => 'resources/bar/basic.css', - * 'skinStyles' => array( + * 'skinStyles' => [ * 'default' => 'resources/bar/additional.css', - * 'foo' => array( + * 'foo' => [ * 'resources/bar/additional.css', * 'skins/Foo/bar.css', - * ), - * ), - * ); + * ], + * ], + * ]; * @endcode * * In other words, as a module author, use the `styles` list for stylesheets that may not be @@ -3554,12 +3549,12 @@ $wgResourceModules = []; * * @par Example: * @code - * $wgResourceModuleSkinStyles['foo'] = array( + * $wgResourceModuleSkinStyles['foo'] = [ * 'bar' => 'bar.css', * 'quux' => 'quux.css', * 'remoteSkinPath' => 'Foo', * 'localBasePath' => __DIR__, - * ); + * ]; * @endcode */ $wgResourceModuleSkinStyles = []; @@ -3716,11 +3711,11 @@ $wgResourceLoaderValidateStaticJS = false; * * @par Example: * @code - * $wgResourceLoaderLESSVars = array( + * $wgResourceLoaderLESSVars = [ * 'baseFontSize' => '1em', * 'smallFontSize' => '0.75em', * 'WikimediaBlue' => '#006699', - * ); + * ]; * @endcode * @since 1.22 */ @@ -3818,12 +3813,12 @@ $wgMetaNamespaceTalk = false; * * @par Example: * @code - * $wgExtraNamespaces = array( + * $wgExtraNamespaces = [ * 100 => "Hilfe", * 101 => "Hilfe_Diskussion", * 102 => "Aide", * 103 => "Discussion_Aide" - * ); + * ]; * @endcode * * @todo Add a note about maintenance/namespaceDupes.php @@ -3850,10 +3845,10 @@ $wgExtraGenderNamespaces = []; * * @par Example: * @code - * $wgNamespaceAliases = array( + * $wgNamespaceAliases = [ * 'Wikipedian' => NS_USER, * 'Help' => 100, - * ); + * ]; * @endcode */ $wgNamespaceAliases = []; @@ -4180,7 +4175,7 @@ $wgAllowExternalImages = false; * @par Examples: * @code * $wgAllowExternalImagesFrom = 'http://127.0.0.1/'; - * $wgAllowExternalImagesFrom = array( 'http://127.0.0.1/', 'http://example.com' ); + * $wgAllowExternalImagesFrom = [ 'http://127.0.0.1/', 'http://example.com' ]; * @endcode */ $wgAllowExternalImagesFrom = ''; @@ -4221,6 +4216,8 @@ $wgAllowImageTag = false; * - RaggettInternalHHVM: Use the limited-functionality HHVM extension * - RaggettInternalPHP: Use the PECL extension * - RaggettExternal: Shell out to an external binary (tidyBin) + * - Html5Depurate: Use external Depurate service + * - Html5Internal: Use the built-in HTML5 balancer * * - tidyConfigFile: Path to configuration file for any of the Raggett drivers * - debugComment: True to add a comment to the output with warning messages @@ -4302,8 +4299,7 @@ $wgNoFollowNsExceptions = []; * (or any subdomains) will not be set to rel="nofollow" regardless of the * value of $wgNoFollowLinks. For instance: * - * $wgNoFollowDomainExceptions = array( 'en.wikipedia.org', 'wiktionary.org', - * 'mediawiki.org' ); + * $wgNoFollowDomainExceptions = [ 'en.wikipedia.org', 'wiktionary.org', 'mediawiki.org' ]; * * This would add rel="nofollow" to links to de.wikipedia.org, but not * en.wikipedia.org, wiktionary.org, en.wiktionary.org, us.en.wikipedia.org, @@ -4690,14 +4686,14 @@ $wgPasswordDefault = 'pbkdf2'; * * An advanced example: * @code - * $wgPasswordConfig['bcrypt-peppered'] = array( + * $wgPasswordConfig['bcrypt-peppered'] = [ * 'class' => 'EncryptedPassword', * 'underlying' => 'bcrypt', - * 'secrets' => array(), + * 'secrets' => [], * 'cipher' => MCRYPT_RIJNDAEL_256, * 'mode' => MCRYPT_MODE_CBC, * 'cost' => 5, - * ); + * ]; * @endcode * * @since 1.24 @@ -4986,7 +4982,7 @@ $wgWhitelistRead = false; * @par Example: * To whitelist [[Main Page]]: * @code - * $wgWhitelistReadRegexp = array( "/Main Page/" ); + * $wgWhitelistReadRegexp = [ "/Main Page/" ]; * @endcode * * @note Unless ^ and/or $ is specified, a regular expression might match @@ -4996,7 +4992,7 @@ $wgWhitelistRead = false; * @par Example: * To allow reading any page starting with 'User' regardless of the case: * @code - * $wgWhitelistReadRegexp = array( "@^UsEr.*@i" ); + * $wgWhitelistReadRegexp = [ "@^UsEr.*@i" ]; * @endcode * Will allow both [[User is banned]] and [[User:JohnDoe]] * @@ -5031,7 +5027,7 @@ $wgHideIdentifiableRedirects = true; * combined with the permissions of all groups that a given user is listed * in in the user_groups table. * - * Note: Don't set $wgGroupPermissions = array(); unless you know what you're + * Note: Don't set $wgGroupPermissions = []; unless you know what you're * doing! This will wipe all permissions, and may mean that your users are * unable to perform certain essential tasks or access new functionality * when new permissions are introduced and default grants established. @@ -5197,13 +5193,13 @@ $wgImplicitGroups = [ '*', 'user', 'autoconfirmed' ]; * @par Example: * To allow sysops to add themselves to the "bot" group: * @code - * $wgGroupsAddToSelf = array( 'sysop' => array( 'bot' ) ); + * $wgGroupsAddToSelf = [ 'sysop' => [ 'bot' ] ]; * @endcode * * @par Example: * Implicit groups may be used for the source group, for instance: * @code - * $wgGroupsRemoveFromSelf = array( '*' => true ); + * $wgGroupsRemoveFromSelf = [ '*' => true ]; * @endcode * This allows users in the '*' group (i.e. any user) to remove themselves from * any group that they happen to be in. @@ -5321,18 +5317,18 @@ $wgAutoConfirmCount = 0; * @todo Redocument $wgAutopromote * * The format is - * array( '&' or '|' or '^' or '!', cond1, cond2, ... ) + * [ '&' or '|' or '^' or '!', cond1, cond2, ... ] * where cond1, cond2, ... are themselves conditions; *OR* * APCOND_EMAILCONFIRMED, *OR* - * array( APCOND_EMAILCONFIRMED ), *OR* - * array( APCOND_EDITCOUNT, number of edits ), *OR* - * array( APCOND_AGE, seconds since registration ), *OR* - * array( APCOND_INGROUPS, group1, group2, ... ), *OR* - * array( APCOND_ISIP, ip ), *OR* - * array( APCOND_IPINRANGE, range ), *OR* - * array( APCOND_AGE_FROM_EDIT, seconds since first edit ), *OR* - * array( APCOND_BLOCKED ), *OR* - * array( APCOND_ISBOT ), *OR* + * [ APCOND_EMAILCONFIRMED ], *OR* + * [ APCOND_EDITCOUNT, number of edits ], *OR* + * [ APCOND_AGE, seconds since registration ], *OR* + * [ APCOND_INGROUPS, group1, group2, ... ], *OR* + * [ APCOND_ISIP, ip ], *OR* + * [ APCOND_IPINRANGE, range ], *OR* + * [ APCOND_AGE_FROM_EDIT, seconds since first edit ], *OR* + * [ APCOND_BLOCKED ], *OR* + * [ APCOND_ISBOT ], *OR* * similar constructs defined by extensions. * * If $wgEmailAuthentication is off, APCOND_EMAILCONFIRMED will be true for any @@ -5353,7 +5349,7 @@ $wgAutopromote = [ * * The format is: * @code - * array( event => criteria, ... ) + * [ event => criteria, ... ] * @endcode * Where event is either: * - 'onEdit' (when user edits) @@ -5384,15 +5380,15 @@ $wgAutopromoteOnceLogInRC = true; * @endcode * Bureaucrats can only remove bots and sysops: * @code - * $wgRemoveGroups['bureaucrat'] = array( 'bot', 'sysop' ); + * $wgRemoveGroups['bureaucrat'] = [ 'bot', 'sysop' ]; * @endcode * Sysops can make bots: * @code - * $wgAddGroups['sysop'] = array( 'bot' ); + * $wgAddGroups['sysop'] = [ 'bot' ]; * @endcode * Sysops can disable other sysops in an emergency, and disable bots: * @code - * $wgRemoveGroups['sysop'] = array( 'sysop', 'bot' ); + * $wgRemoveGroups['sysop'] = [ 'sysop', 'bot' ]; * @endcode */ $wgAddGroups = []; @@ -5463,15 +5459,15 @@ $wgEnableDnsBlacklist = false; * * @par Example: * @code - * $wgDnsBlacklistUrls = array( + * $wgDnsBlacklistUrls = [ * // String containing URL * 'http.dnsbl.sorbs.net.', * // Array with URL and key, for services that require a key - * array( 'dnsbl.httpbl.net.', 'mykey' ), + * [ 'dnsbl.httpbl.net.', 'mykey' ], * // Array with just the URL. While this works, it is recommended that you * // just use a string as shown above - * array( 'opm.tornevall.org.' ) - * ); + * [ 'opm.tornevall.org.' ] + * ]; * @endcode * * @note You should end the domain name with a . to avoid searching your @@ -5503,21 +5499,21 @@ $wgApplyIpBlocksToXff = false; * @par Example: * To set a generic maximum of 4 hits in 60 seconds: * @code - * $wgRateLimits = array( 4, 60 ); + * $wgRateLimits = [ 4, 60 ]; * @endcode * * @par Example: * You could also limit per action and then type of users. * @code - * $wgRateLimits = array( - * 'edit' => array( - * 'anon' => array( x, y ), // any and all anonymous edits (aggregate) - * 'user' => array( x, y ), // each logged-in user - * 'newbie' => array( x, y ), // each new autoconfirmed accounts; overrides 'user' - * 'ip' => array( x, y ), // each anon and recent account - * 'subnet' => array( x, y ), // ... within a /24 subnet in IPv4 or /64 in IPv6 - * ) - * ) + * $wgRateLimits = [ + * 'edit' => [ + * 'anon' => [ x, y ], // any and all anonymous edits (aggregate) + * 'user' => [ x, y ], // each logged-in user + * 'newbie' => [ x, y ], // each new autoconfirmed accounts; overrides 'user' + * 'ip' => [ x, y ], // each anon and recent account + * 'subnet' => [ x, y ], // ... within a /24 subnet in IPv4 or /64 in IPv6 + * ] + * ] * @endcode * * @warning Requires that $wgMainCacheType is set to something persistent @@ -5642,7 +5638,6 @@ $wgGrantPermissions = []; $wgGrantPermissions['basic']['autoconfirmed'] = true; $wgGrantPermissions['basic']['autopatrol'] = true; -$wgGrantPermissions['basic']['autoreview'] = true; $wgGrantPermissions['basic']['editsemiprotected'] = true; $wgGrantPermissions['basic']['ipblock-exempt'] = true; $wgGrantPermissions['basic']['nominornewtalk'] = true; @@ -5650,7 +5645,6 @@ $wgGrantPermissions['basic']['patrolmarks'] = true; $wgGrantPermissions['basic']['purge'] = true; $wgGrantPermissions['basic']['read'] = true; $wgGrantPermissions['basic']['skipcaptcha'] = true; -$wgGrantPermissions['basic']['torunblocked'] = true; $wgGrantPermissions['basic']['writeapi'] = true; $wgGrantPermissions['highvolume']['bot'] = true; @@ -5818,14 +5812,6 @@ $wgProxyList = []; */ $wgCookieExpiration = 180 * 86400; -/** - * The identifiers of the login cookies that can have their lifetimes - * extended independently of all other login cookies. - * - * @var string[] - */ -$wgExtendedLoginCookies = [ 'UserID', 'Token' ]; - /** * Default login cookie lifetime, in seconds. Setting * $wgExtendLoginCookieExpiration to null will use $wgCookieExpiration to @@ -5982,6 +5968,12 @@ $wgTrxProfilerLimits = [ 'writes' => 0, 'readQueryTime' => 5 ], + // Deferred updates that run after HTTP response is sent + 'PostSend' => [ + 'readQueryTime' => 5, + 'writeQueryTime' => 1, + 'maxAffected' => 500 + ], // Background job runner 'JobRunner' => [ 'readQueryTime' => 30, @@ -6018,11 +6010,11 @@ $wgTrxProfilerLimits = [ * * @par Advanced example: * @code - * $wgDebugLogGroups['memcached'] = array( + * $wgDebugLogGroups['memcached'] = [ * 'destination' => '/var/log/mediawiki/memcached.log', * 'sample' => 1000, // log 1 message out of every 1,000. * 'level' => \Psr\Log\LogLevel::WARNING - * ); + * ]; * @endcode */ $wgDebugLogGroups = []; @@ -6041,7 +6033,7 @@ $wgDebugLogGroups = []; * * @par To completely disable logging: * @code - * $wgMWLoggerDefaultSpi = array( 'class' => '\\MediaWiki\\Logger\\NullSpi' ); + * $wgMWLoggerDefaultSpi = [ 'class' => '\\MediaWiki\\Logger\\NullSpi' ]; * @endcode * * @since 1.25 @@ -6351,10 +6343,10 @@ $wgSitemapNamespaces = false; * This should be a map of namespace IDs to priority * @par Example: * @code - * $wgSitemapNamespacesPriorities = array( + * $wgSitemapNamespacesPriorities = [ * NS_USER => '0.9', * NS_HELP => '0.0', - * ); + * ]; * @endcode */ $wgSitemapNamespacesPriorities = false; @@ -6561,18 +6553,18 @@ $wgRCLinkDays = [ 1, 3, 7, 14, 30 ]; * The JSON-specific options are: * * 'channel' -- if set, the 'channel' parameter is also set in JSON values. * - * @example $wgRCFeeds['example'] = array( + * @example $wgRCFeeds['example'] = [ * 'formatter' => 'JSONRCFeedFormatter', * 'uri' => "udp://localhost:1336", * 'add_interwiki_prefix' => false, * 'omit_bots' => true, - * ); - * @example $wgRCFeeds['exampleirc'] = array( + * ]; + * @example $wgRCFeeds['exampleirc'] = [ * 'formatter' => 'IRCColourfulRCFeedFormatter', * 'uri' => "udp://localhost:1338", * 'add_interwiki_prefix' => false, * 'omit_bots' => true, - * ); + * ]; * @since 1.22 */ $wgRCFeeds = []; @@ -6734,7 +6726,7 @@ $wgUnwatchedPageThreshold = false; * * To register a new one: * @code - * $wgRecentChangesFlags['flag'] => array( + * $wgRecentChangesFlags['flag'] => [ * // message for the letter displayed next to rows on changes lists * 'letter' => 'letter-msg', * // message for the tooltip of the letter @@ -6747,7 +6739,7 @@ $wgUnwatchedPageThreshold = false; * // will set the top-level flag if any line contains the flag, 'all' will * // only be set if all lines contain the flag. * 'grouping' => 'any', - * ); + * ]; * @endcode * * @since 1.22 @@ -6853,11 +6845,11 @@ $wgShowCreditsIfMax = true; * subprojects on the interwiki map of the target wiki, or a mix of the two, * e.g. * @code - * $wgImportSources = array( - * 'wikipedia' => array( 'cs', 'en', 'fr', 'zh' ), + * $wgImportSources = [ + * 'wikipedia' => [ 'cs', 'en', 'fr', 'zh' ], * 'wikispecies', - * 'wikia' => array( 'animanga', 'brickipedia', 'desserts' ), - * ); + * 'wikia' => [ 'animanga', 'brickipedia', 'desserts' ], + * ]; * @endcode * * If you have a very complex import sources setup, you can lazy-load it using @@ -6985,11 +6977,11 @@ $wgExtensionMessagesFiles = []; * * @par Complex example: * @code - * $wgMessagesDirs['Example'] = array( + * $wgMessagesDirs['Example'] = [ * __DIR__ . '/lib/ve/i18n', * __DIR__ . '/lib/oojs-ui/i18n', * __DIR__ . '/i18n', - * ) + * ] * @endcode * @since 1.23 */ @@ -7059,18 +7051,18 @@ $wgAutoloadAttemptLowercase = true; * All but 'name', 'path' and 'author' can be omitted. * * @code - * $wgExtensionCredits[$type][] = array( + * $wgExtensionCredits[$type][] = [ * 'path' => __FILE__, * 'name' => 'Example extension', * 'namemsg' => 'exampleextension-name', - * 'author' => array( + * 'author' => [ * 'Foo Barstein', - * ), + * ], * 'version' => '1.9.0', * 'url' => 'http://example.org/example-extension/', * 'descriptionmsg' => 'exampleextension-desc', * 'license-name' => 'GPL-2.0+', - * ); + * ]; * @endcode * * The extensions are listed on Special:Version. This page also looks for a file @@ -7129,11 +7121,11 @@ $wgAuth = null; * @endcode * - A function with some data: * @code - * $wgHooks['event_name'][] = array( $function, $data ); + * $wgHooks['event_name'][] = [ $function, $data ]; * @endcode * - A an object method: * @code - * $wgHooks['event_name'][] = array( $object, 'method' ); + * $wgHooks['event_name'][] = [ $object, 'method' ]; * @endcode * - A closure: * @code @@ -7258,7 +7250,7 @@ $wgSpecialPageCacheUpdates = [ * Hooks that are used for outputting exceptions. Format is: * $wgExceptionHooks[] = $funcname * or: - * $wgExceptionHooks[] = array( $class, $funcname ) + * $wgExceptionHooks[] = [ $class, $funcname ] * Hooks should return strings or false */ $wgExceptionHooks = []; @@ -7374,10 +7366,7 @@ $wgLogRestrictions = [ * * @par Example: * @code - * $wgFilterLogTypes = array( - * 'move' => true, - * 'import' => false, - * ); + * $wgFilterLogTypes = [ 'move' => true, 'import' => false ]; * @endcode * * Will display show/hide links for the move and import logs. Move logs will be @@ -7661,7 +7650,7 @@ $wgDefaultRobotPolicy = 'index,follow'; * * @par Example: * @code - * $wgNamespaceRobotPolicies = array( NS_TALK => 'noindex' ); + * $wgNamespaceRobotPolicies = [ NS_TALK => 'noindex' ]; * @endcode */ $wgNamespaceRobotPolicies = []; @@ -7673,23 +7662,23 @@ $wgNamespaceRobotPolicies = []; * * @par Example: * @code - * $wgArticleRobotPolicies = array( + * $wgArticleRobotPolicies = [ * 'Main Page' => 'noindex,follow', * 'User:Bob' => 'index,follow', - * ); + * ]; * @endcode * * @par Example that DOES NOT WORK because the names are not canonical text * forms: * @code - * $wgArticleRobotPolicies = array( + * $wgArticleRobotPolicies = [ * # Underscore, not space! * 'Main_Page' => 'noindex,follow', * # "Project", not the actual project name! * 'Project:X' => 'index,follow', * # Needs to be "Abc", not "abc" (unless $wgCapitalLinks is false for that namespace)! * 'abc' => 'noindex,nofollow' - * ); + * ]; * @endcode */ $wgArticleRobotPolicies = []; @@ -7701,7 +7690,7 @@ $wgArticleRobotPolicies = []; * * @par Example: * @code - * $wgExemptFromUserRobotsControl = array( NS_MAIN, NS_TALK, NS_PROJECT ); + * $wgExemptFromUserRobotsControl = [ NS_MAIN, NS_TALK, NS_PROJECT ]; * @endcode */ $wgExemptFromUserRobotsControl = null; @@ -7770,14 +7759,14 @@ $wgDebugAPI = false; * * @code * $wgAPIModules['foo'] = 'ApiFoo'; - * $wgAPIModules['bar'] = array( + * $wgAPIModules['bar'] = [ * 'class' => 'ApiBar', * 'factory' => function( $main, $name ) { ... } - * ); - * $wgAPIModules['xyzzy'] = array( + * ]; + * $wgAPIModules['xyzzy'] = [ * 'class' => 'ApiXyzzy', - * 'factory' => array( 'XyzzyFactory', 'newApiModule' ) - * ); + * 'factory' => [ 'XyzzyFactory', 'newApiModule' ] + * ]; * @endcode * * Extension modules may override the core modules. @@ -7907,12 +7896,12 @@ $wgAjaxEditStash = true; * * @par Example: * @code - * $wgCrossSiteAJAXdomains = array( + * $wgCrossSiteAJAXdomains = [ * 'www.mediawiki.org', * '*.wikipedia.org', * '*.wikimedia.org', * '*.wiktionary.org', - * ); + * ]; * @endcode */ $wgCrossSiteAJAXdomains = []; @@ -8072,10 +8061,9 @@ $wgUpdateRowsPerQuery = 100; /** * Name of the external diff engine to use. Supported values: - * * false: default PHP implementation - * * 'wikidiff2': Wikimedia's fast difference engine implemented as a PHP/HHVM module - * * 'wikidiff' and 'wikidiff3' are treated as false for backwards compatibility - * * any other string is treated as a path to external diff executable + * * string: path to an external diff executable + * * false: wikidiff2 PHP/HHVM module if installed, otherwise the default PHP implementation + * * 'wikidiff', 'wikidiff2', and 'wikidiff3' are treated as false for backwards compatibility */ $wgExternalDiffEngine = false; @@ -8129,13 +8117,13 @@ $wgRedirectOnLogin = null; * * @par Example: * @code - * $wgPoolCounterConf = array( 'ArticleView' => array( + * $wgPoolCounterConf = [ 'ArticleView' => [ * 'class' => 'PoolCounter_Client', * 'timeout' => 15, // wait timeout in seconds * 'workers' => 5, // maximum number of active threads in each pool * 'maxqueue' => 50, // maximum number of total threads in each pool * ... any extension-specific options... - * ); + * ]; * @endcode */ $wgPoolCounterConf = null; @@ -8282,11 +8270,11 @@ $wgPageLanguageUseDB = false; * * Example config for Parsoid: * - * $wgVirtualRestConfig['modules']['parsoid'] = array( + * $wgVirtualRestConfig['modules']['parsoid'] = [ * 'url' => 'http://localhost:8000', * 'prefix' => 'enwiki', * 'domain' => 'en.wikipedia.org', - * ); + * ]; * * @var array * @since 1.25 diff --git a/includes/EditPage.php b/includes/EditPage.php index f2403fe222..9c7ccdf1e4 100644 --- a/includes/EditPage.php +++ b/includes/EditPage.php @@ -335,6 +335,9 @@ class EditPage { /** @var string */ public $edittime = ''; + /** @var integer */ + private $editRevId = null; + /** @var string */ public $section = ''; @@ -839,6 +842,7 @@ class EditPage { $this->sectiontitle = preg_replace( '/^\s*=+\s*(.*?)\s*=+\s*$/', '$1', $this->sectiontitle ); $this->edittime = $request->getVal( 'wpEdittime' ); + $this->editRevId = $request->getIntOrNull( 'editRevId' ); $this->starttime = $request->getVal( 'wpStarttime' ); $undidRev = $request->getInt( 'wpUndidRevision' ); @@ -935,6 +939,7 @@ class EditPage { $this->summary = ''; $this->sectiontitle = ''; $this->edittime = ''; + $this->editRevId = null; $this->starttime = wfTimestampNow(); $this->edit = false; $this->preview = false; @@ -1020,6 +1025,7 @@ class EditPage { function initialiseForm() { global $wgUser; $this->edittime = $this->page->getTimestamp(); + $this->editRevId = $this->page->getLatest(); $content = $this->getContentObject( false ); # TODO: track content object?! if ( $content === false ) { @@ -1862,10 +1868,14 @@ class EditPage { $this->page->clear(); # Force reload of dates, etc. $timestamp = $this->page->getTimestamp(); + $latest = $this->page->getLatest(); wfDebug( "timestamp: {$timestamp}, edittime: {$this->edittime}\n" ); - if ( $timestamp != $this->edittime ) { + // Check editRevId if set, which handles same-second timestamp collisions + if ( $timestamp != $this->edittime + || ( $this->editRevId !== null && $this->editRevId != $latest ) + ) { $this->isConflict = true; if ( $this->section == 'new' ) { if ( $this->page->getUserText() == $wgUser->getName() && @@ -1905,14 +1915,24 @@ class EditPage { if ( $this->isConflict ) { wfDebug( __METHOD__ . ": conflict! getting section '{$this->section}' for time '{$this->edittime}'" - . " (article time '{$timestamp}')\n" ); - - $content = $this->page->replaceSectionContent( - $this->section, - $textbox_content, - $sectionTitle, - $this->edittime - ); + . " (id '{$this->editRevId}') (article time '{$timestamp}')\n" ); + // @TODO: replaceSectionAtRev() with base ID (not prior current) for ?oldid=X case + // ...or disable section editing for non-current revisions (not exposed anyway). + if ( $this->editRevId !== null ) { + $content = $this->page->replaceSectionAtRev( + $this->section, + $textbox_content, + $sectionTitle, + $this->editRevId + ); + } else { + $content = $this->page->replaceSectionContent( + $this->section, + $textbox_content, + $sectionTitle, + $this->edittime + ); + } } else { wfDebug( __METHOD__ . ": getting section '{$this->section}'\n" ); $content = $this->page->replaceSectionContent( @@ -2172,8 +2192,9 @@ class EditPage { function getBaseRevision() { if ( !$this->mBaseRevision ) { $db = wfGetDB( DB_MASTER ); - $this->mBaseRevision = Revision::loadFromTimestamp( - $db, $this->mTitle, $this->edittime ); + $this->mBaseRevision = $this->editRevId + ? Revision::newFromId( $this->editRevId, Revision::READ_LATEST ) + : Revision::loadFromTimestamp( $db, $this->mTitle, $this->edittime ); } return $this->mBaseRevision; } @@ -2242,10 +2263,6 @@ class EditPage { $wgOut->addModules( 'mediawiki.action.edit.editWarning' ); } - if ( $wgAjaxEditStash ) { - $wgOut->addModules( 'mediawiki.action.edit.stash' ); - } - # Enabled article-related sidebar, toplinks, etc. $wgOut->setArticleRelated( true ); @@ -2273,7 +2290,10 @@ class EditPage { $wgOut->setPageTitle( wfMessage( $msg, $displayTitle ) ); # Transmit the name of the message to JavaScript for live preview # Keep Resources.php/mediawiki.action.edit.preview in sync with the possible keys - $wgOut->addJsConfigVars( 'wgEditMessage', $msg ); + $wgOut->addJsConfigVars( [ + 'wgEditMessage' => $msg, + 'wgAjaxEditStash' => $wgAjaxEditStash, + ] ); } /** @@ -2690,6 +2710,18 @@ class EditPage { } } + // Set a hidden field so JS knows what edit form mode we are in + if ( $this->isConflict ) { + $mode = 'conflict'; + } elseif ( $this->preview ) { + $mode = 'preview'; + } elseif ( $this->diff ) { + $mode = 'diff'; + } else { + $mode = 'text'; + } + $wgOut->addHTML( Html::hidden( 'mode', $mode, [ 'id' => 'mw-edit-mode' ] ) ); + // Marker for detecting truncated form data. This must be the last // parameter sent in order to be of use, so do not move me. $wgOut->addHTML( Html::hidden( 'wpUltimateParam', true ) ); @@ -2745,7 +2777,7 @@ class EditPage { if ( $this->isConflict ) { $wgOut->wrapWikiMsg( "
\n$1\n
", 'explainconflict' ); - $this->edittime = $this->page->getTimestamp(); + $this->editRevId = $this->page->getLatest(); } else { if ( $this->section != '' && !$this->isSectionEditSupported() ) { // We use $this->section to much before this and getVal('wgSection') directly in other places @@ -3052,6 +3084,7 @@ class EditPage { + HTML @@ -3260,10 +3293,15 @@ HTML } $textboxContent = $this->toEditContent( $this->textbox1 ); - - $newContent = $this->page->replaceSectionContent( - $this->section, $textboxContent, - $this->summary, $this->edittime ); + if ( $this->editRevId !== null ) { + $newContent = $this->page->replaceSectionAtRev( + $this->section, $textboxContent, $this->summary, $this->editRevId + ); + } else { + $newContent = $this->page->replaceSectionContent( + $this->section, $textboxContent, $this->summary, $this->edittime + ); + } if ( $newContent ) { ContentHandler::runLegacyHooks( 'EditPageGetDiffText', [ $this, &$newContent ] ); @@ -3475,6 +3513,14 @@ HTML if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$this, &$wgOut ] ) ) { $stats = $wgOut->getContext()->getStats(); $stats->increment( 'edit.failures.conflict' ); + if ( $this->mTitle->isTalkPage() ) { + $stats->increment( 'edit.failures.conflict.byType.talk' ); + } else { + $stats->increment( 'edit.failures.conflict.byType.subject' ); + } + if ( $this->mTitle->getNamespace() === NS_PROJECT ) { + $stats->increment( 'edit.failures.conflict.byNamespace.project' ); + } $wgOut->wrapWikiMsg( '

$1

', "yourdiff" ); @@ -3602,8 +3648,8 @@ HTML * @return string */ function getPreviewText() { - global $wgOut, $wgUser, $wgRawHtml, $wgLang; - global $wgAllowUserCss, $wgAllowUserJs, $wgAjaxEditStash; + global $wgOut, $wgRawHtml, $wgLang; + global $wgAllowUserCss, $wgAllowUserJs; $stats = $wgOut->getContext()->getStats(); @@ -3656,10 +3702,6 @@ HTML $note = wfMessage( 'previewnote' )->plain() . ' ' . $continueEditing; } - $parserOptions = $this->page->makeParserOptions( $this->mArticle->getContext() ); - $parserOptions->setIsPreview( true ); - $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' ); - # don't parse non-wikitext pages, show message about preview if ( $this->mTitle->isCssJsSubpage() || $this->mTitle->isCssOrJsPage() ) { if ( $this->mTitle->isCssJsSubpage() ) { @@ -3703,27 +3745,9 @@ HTML ContentHandler::runLegacyHooks( 'EditPageGetPreviewText', $hook_args ); Hooks::run( 'EditPageGetPreviewContent', $hook_args ); - $parserOptions->enableLimitReport(); - - # For CSS/JS pages, we should have called the ShowRawCssJs hook here. - # But it's now deprecated, so never mind - - $pstContent = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions ); - $scopedCallback = $parserOptions->setupFakeRevision( - $this->mTitle, $pstContent, $wgUser ); - $parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions ); - - # Try to stash the edit for the final submission step - # @todo: different date format preferences cause cache misses - if ( $wgAjaxEditStash ) { - ApiStashEdit::stashEditFromPreview( - $this->getArticle(), $content, $pstContent, - $parserOutput, $parserOptions, $parserOptions, wfTimestampNow() - ); - } - - $parserOutput->setEditSectionTokens( false ); // no section edit links - $previewHTML = $parserOutput->getText(); + $parserResult = $this->doPreviewParse( $content ); + $parserOutput = $parserResult['parserOutput']; + $previewHTML = $parserResult['html']; $this->mParserOutput = $parserOutput; $wgOut->addParserOutputMetadata( $parserOutput ); @@ -3731,7 +3755,6 @@ HTML $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() ); } - ScopedCallback::consume( $scopedCallback ); } catch ( MWContentSerializationException $ex ) { $m = wfMessage( 'content-failed-to-parse', @@ -3762,6 +3785,41 @@ HTML return $previewhead . $previewHTML . $this->previewTextAfterContent; } + /** + * Get parser options for a preview + * @return ParserOptions + */ + protected function getPreviewParserOptions() { + $parserOptions = $this->page->makeParserOptions( $this->mArticle->getContext() ); + $parserOptions->setIsPreview( true ); + $parserOptions->setIsSectionPreview( !is_null( $this->section ) && $this->section !== '' ); + $parserOptions->enableLimitReport(); + return $parserOptions; + } + + /** + * Parse the page for a preview. Subclasses may override this class, in order + * to parse with different options, or to otherwise modify the preview HTML. + * + * @param Content @content The page content + * @return Associative array with keys: + * - parserOutput: The ParserOutput object + * - html: The HTML to be displayed + */ + protected function doPreviewParse( Content $content ) { + global $wgUser; + $parserOptions = $this->getPreviewParserOptions(); + $pstContent = $content->preSaveTransform( $this->mTitle, $wgUser, $parserOptions ); + $scopedCallback = $parserOptions->setupFakeRevision( + $this->mTitle, $pstContent, $wgUser ); + $parserOutput = $pstContent->getParserOutput( $this->mTitle, null, $parserOptions ); + ScopedCallback::consume( $scopedCallback ); + $parserOutput->setEditSectionTokens( false ); // no section edit links + return [ + 'parserOutput' => $parserOutput, + 'html' => $parserOutput->getText() ]; + } + /** * @return array */ diff --git a/includes/GlobalFunctions.php b/includes/GlobalFunctions.php index d5c6553958..66e244082e 100644 --- a/includes/GlobalFunctions.php +++ b/includes/GlobalFunctions.php @@ -2499,14 +2499,6 @@ function wfShellExec( $cmd, &$retval = null, $environ = [], $eintr = defined( 'SOCKET_EINTR' ) ? SOCKET_EINTR : 4; $eintrMessage = "stream_select(): unable to select [$eintr]"; - // Build a table mapping resource IDs to pipe FDs to work around a - // PHP 5.3 issue in which stream_select() does not preserve array keys - // . - $fds = []; - foreach ( $pipes as $fd => $pipe ) { - $fds[(int)$pipe] = $fd; - } - $running = true; $timeout = null; $numReadyPipes = 0; @@ -2539,9 +2531,8 @@ function wfShellExec( $cmd, &$retval = null, $environ = [], break; } } - foreach ( $readyPipes as $pipe ) { + foreach ( $readyPipes as $fd => $pipe ) { $block = fread( $pipe, 65536 ); - $fd = $fds[(int)$pipe]; if ( $block === '' ) { // End of file fclose( $pipes[$fd] ); diff --git a/includes/ListToggle.php b/includes/ListToggle.php index 4733dfb714..2c87b8bac0 100644 --- a/includes/ListToggle.php +++ b/includes/ListToggle.php @@ -41,6 +41,7 @@ class ListToggle { private function checkboxLink( $checkboxType ) { return Html::element( + // CSS classes: mw-checkbox-all, mw-checkbox-none, mw-checkbox-invert 'a', [ 'href' => '#', 'class' => 'mw-checkbox-' . $checkboxType ], $this->output->msg( 'checkbox-' . $checkboxType )->text() ); diff --git a/includes/MediaWiki.php b/includes/MediaWiki.php index ee03f020a8..21857b9e13 100644 --- a/includes/MediaWiki.php +++ b/includes/MediaWiki.php @@ -764,9 +764,13 @@ class MediaWiki { // Assure deferred updates are not in the main transaction wfGetLBFactory()->commitMasterChanges( __METHOD__ ); - // Ignore things like master queries/connections on GET requests - // as long as they are in deferred updates (which catch errors). - Profiler::instance()->getTransactionProfiler()->resetExpectations(); + // Loosen DB query expectations since the HTTP client is unblocked + $trxProfiler = Profiler::instance()->getTransactionProfiler(); + $trxProfiler->resetExpectations(); + $trxProfiler->setExpectations( + $this->config->get( 'TrxProfilerLimits' )['PostSend'], + __METHOD__ + ); // Do any deferred jobs DeferredUpdates::doUpdates( 'enqueue' ); diff --git a/includes/MediaWikiServices.php b/includes/MediaWikiServices.php index 6613db1602..ff292cfb61 100644 --- a/includes/MediaWikiServices.php +++ b/includes/MediaWikiServices.php @@ -23,6 +23,7 @@ use SearchEngineFactory; use SiteLookup; use SiteStore; use WatchedItemStore; +use WatchedItemQueryService; use SkinFactory; use TitleFormatter; use TitleParser; @@ -502,6 +503,14 @@ class MediaWikiServices extends ServiceContainer { return $this->getService( 'WatchedItemStore' ); } + /** + * @since 1.28 + * @return WatchedItemQueryService + */ + public function getWatchedItemQueryService() { + return $this->getService( 'WatchedItemQueryService' ); + } + /** * @since 1.28 * @return GenderCache diff --git a/includes/Message.php b/includes/Message.php index 712d3f17fb..2c979dedd0 100644 --- a/includes/Message.php +++ b/includes/Message.php @@ -402,8 +402,8 @@ class Message implements MessageSpecifier, Serializable { $value = array_shift( $params ); } - if ( $value instanceof RawMessage ) { - $message = new RawMessage( $value->getKey(), $value->getParams() ); + if ( $value instanceof Message ) { // Message, RawMessage, ApiMessage, etc + $message = clone( $value ); } elseif ( $value instanceof MessageSpecifier ) { $message = new Message( $value ); } elseif ( is_string( $value ) ) { @@ -802,10 +802,13 @@ class Message implements MessageSpecifier, Serializable { $string = $this->fetchMessage(); if ( $string === false ) { - if ( $this->format === 'plain' || $this->format === 'text' ) { - return '<' . $this->key . '>'; - } - return '<' . htmlspecialchars( $this->key ) . '>'; + // Err on the side of safety, ensure that the output + // is always html safe in the event the message key is + // missing, since in that case its highly likely the + // message key is user-controlled. + // '⧼' is used instead of '<' to side-step any + // double-escaping issues. + return '⧼' . htmlspecialchars( $this->key ) . '⧽'; } # Replace $* with a list of parameters for &uselang=qqx. diff --git a/includes/OutputPage.php b/includes/OutputPage.php index ad7c97603b..15b70c8324 100644 --- a/includes/OutputPage.php +++ b/includes/OutputPage.php @@ -104,22 +104,11 @@ class OutputPage extends ContextSource { protected $mStatusCode; /** - * @var string Variable mLastModified and mEtag are used for sending cache control. + * @var string Used for sending cache control. * The whole caching system should probably be moved into its own class. */ protected $mLastModified = ''; - /** - * Contains an HTTP Entity Tags (see RFC 2616 section 3.13) which is used - * as a unique identifier for the content. It is later used by the client - * to compare its cached version with the server version. Client sends - * headers If-Match and If-None-Match containing its locally cached ETAG value. - * - * To get more information, you will have to look at HTTP/1.1 protocol which - * is properly described in RFC 2616 : http://tools.ietf.org/html/rfc2616 - */ - private $mETag = false; - /** @var array */ protected $mCategoryLinks = []; @@ -694,12 +683,10 @@ class OutputPage extends ContextSource { } /** - * Set the value of the ETag HTTP header, only used if $wgUseETag is true - * - * @param string $tag Value of "ETag" header + * @deprecated since 1.28 Obsolete - wgUseETag experiment was removed. + * @param string $tag */ - function setETag( $tag ) { - $this->mETag = $tag; + public function setETag( $tag ) { } /** @@ -2156,9 +2143,6 @@ class OutputPage extends ContextSource { public function sendCacheControl() { $response = $this->getRequest()->response(); $config = $this->getConfig(); - if ( $config->get( 'UseETag' ) && $this->mETag ) { - $response->header( "ETag: $this->mETag" ); - } $this->addVaryHeader( 'Cookie' ); $this->addAcceptLanguage(); @@ -3659,7 +3643,7 @@ class OutputPage extends ContextSource { $moduleStyles = $this->getModuleStyles(); // Per-site custom styles - $moduleStyles[] = 'site'; + $moduleStyles[] = 'site.styles'; $moduleStyles[] = 'noscript'; // Per-user custom styles @@ -3694,7 +3678,7 @@ class OutputPage extends ContextSource { if ( !$module ) { continue; } - if ( $name === 'site' ) { + if ( $name === 'site.styles' ) { // HACK: The site module shouldn't be fragmented with a cache group and // http request. But in order to ensure its styles are separated and after the // ResourceLoaderDynamicStyles marker, pretend it is in a group called 'site'. diff --git a/includes/PHPVersionCheck.php b/includes/PHPVersionCheck.php index ab8aada836..018c6f83dc 100644 --- a/includes/PHPVersionCheck.php +++ b/includes/PHPVersionCheck.php @@ -45,6 +45,29 @@ function wfEntryPointCheck( $entryPoint ) { // @codingStandardsIgnoreEnd wfMissingVendorError( $entryPoint, $mwVersion ); } + + // List of functions and their associated PHP extension to check for + // @codingStandardsIgnoreStart Generic.Arrays.DisallowLongArraySyntax + $extensions = array( + 'mb_substr' => 'mbstring', + 'utf8_encode' => 'xml', + 'ctype_digit' => 'ctype', + 'json_decode' => 'json', + 'iconv' => 'iconv', + ); + // List of extensions we're missing + $missingExtensions = array(); + // @codingStandardsIgnoreEnd + + foreach ( $extensions as $function => $extension ) { + if ( !function_exists( $function ) ) { + $missingExtensions[] = $extension; + } + } + + if ( $missingExtensions ) { + wfMissingExtensions( $entryPoint, $mwVersion, $missingExtensions ); + } } /** @@ -107,7 +130,7 @@ function wfGenericError( $type, $mwVersion, $title, $shortText, $longText, $long padding: 2em; text-align: center; } - p, img, h1, h2 { + p, img, h1, h2, ul { text-align: left; margin: 0.5em 0 1em; } @@ -201,3 +224,38 @@ HTML; wfGenericError( $type, $mwVersion, 'External dependencies', $shortText, $longText, $longHtml ); } + +/** + * Display an error for a PHP extension not existing. + * + * @param string $type See wfGenericError + * @param string $mwVersion See wfGenericError + * @param array $missingExts The extensions we're missing + */ +function wfMissingExtensions( $type, $mwVersion, $missingExts ) { + $shortText = "Installing some PHP extensions is required."; + + $missingExtText = ''; + $missingExtHtml = ''; + $baseUrl = 'https://secure.php.net'; + foreach ( $missingExts as $ext ) { + $missingExtText .= " * $ext <$baseUrl/$ext>\n"; + $missingExtHtml .= "
  • $ext " + . "(more information)
  • "; + } + + $cliText = "Error: Missing one or more required components of PHP.\n" + . "You are missing a required extension to PHP that MediaWiki needs.\n" + . "Please install:\n" . $missingExtText; + + $longHtml = << + $missingExtHtml + +HTML; + + wfGenericError( $type, $mwVersion, 'Required components', $shortText, + $cliText, $longHtml ); +} diff --git a/includes/PHPVersionError.php b/includes/PHPVersionError.php deleted file mode 100644 index 9fbcf8955b..0000000000 --- a/includes/PHPVersionError.php +++ /dev/null @@ -1,26 +0,0 @@ -mId = $id; + $this->mId = (int)$id; + } + + /** + * Set the user ID/name + * + * This should only be used for proposed revisions that turn out to be null edits + * + * @since 1.28 + * @param integer $id User ID + * @param string $name User name + */ + public function setUserIdAndName( $id, $name ) { + $this->mUser = (int)$id; + $this->mUserText = $name; + $this->mOrigUserText = $name; } /** diff --git a/includes/Sanitizer.php b/includes/Sanitizer.php index d321e9f0c9..8f1fc99fcd 100644 --- a/includes/Sanitizer.php +++ b/includes/Sanitizer.php @@ -381,14 +381,17 @@ class Sanitizer { 'kbd', 'samp', 'data', 'time', 'mark' ]; $htmlsingle = [ - 'br', 'wbr', 'hr', 'li', 'dt', 'dd' - ]; - $htmlsingleonly = [ # Elements that cannot have close tags - 'br', 'wbr', 'hr' + 'br', 'wbr', 'hr', 'li', 'dt', 'dd', 'meta', 'link' ]; - $htmlsingle[] = $htmlsingleonly[] = 'meta'; - $htmlsingle[] = $htmlsingleonly[] = 'link'; + # Elements that cannot have close tags. This is (not coincidentally) + # also the list of tags for which the HTML 5 parsing algorithm + # requires you to "acknowledge the token's self-closing flag", i.e. + # a self-closing tag like
    is not an HTML 5 parse error only + # for this list. + $htmlsingleonly = [ + 'br', 'wbr', 'hr', 'meta', 'link' + ]; $htmlnest = [ # Tags that can be nested--?? 'table', 'tr', 'td', 'th', 'div', 'blockquote', 'ol', 'ul', @@ -450,10 +453,14 @@ class Sanitizer { * @param array|bool $args Arguments for the processing callback * @param array $extratags For any extra tags to include * @param array $removetags For any tags (default or extra) to exclude + * @param callable $warnCallback (Deprecated) Callback allowing the + * addition of a tracking category when bad input is encountered. + * DO NOT ADD NEW PARAMETERS AFTER $warnCallback, since it will be + * removed shortly. * @return string */ public static function removeHTMLtags( $text, $processCallback = null, - $args = [], $extratags = [], $removetags = [] + $args = [], $extratags = [], $removetags = [], $warnCallback = null ) { extract( self::getRecognizedTagData( $extratags, $removetags ) ); @@ -540,6 +547,14 @@ class Sanitizer { $badtag = true; #  Is it a self closed htmlpair ? (bug 5487) } elseif ( $brace == '/>' && isset( $htmlpairs[$t] ) ) { + // Eventually we'll just remove the self-closing + // slash, in order to be consistent with HTML5 + // semantics. + // $brace = '>'; + // For now, let's just warn authors to clean up. + if ( is_callable( $warnCallback ) ) { + call_user_func_array( $warnCallback, [ 'deprecated-self-close-category' ] ); + } $badtag = true; } elseif ( isset( $htmlsingleonly[$t] ) ) { # Hack to force empty tag for unclosable elements @@ -604,12 +619,29 @@ class Sanitizer { call_user_func_array( $processCallback, [ &$params, $args ] ); } + if ( $brace == '/>' && !( isset( $htmlsingle[$t] ) || isset( $htmlsingleonly[$t] ) ) ) { + // Eventually we'll just remove the self-closing + // slash, in order to be consistent with HTML5 + // semantics. + // $brace = '>'; + // For now, let's just warn authors to clean up. + if ( is_callable( $warnCallback ) ) { + call_user_func_array( $warnCallback, [ 'deprecated-self-close-category' ] ); + } + } if ( !Sanitizer::validateTag( $params, $t ) ) { $badtag = true; } $newparams = Sanitizer::fixTagAttributes( $params, $t ); if ( !$badtag ) { + if ( $brace === '/>' && !isset( $htmlsingleonly[$t] ) ) { + # Interpret self-closing tags as empty tags even when + # HTML 5 would interpret them as start tags. Such input + # is commonly seen on Wikimedia wikis with this intention. + $brace = ">"; + } + $rest = str_replace( '>', '>', $rest ); $text .= "<$slash$t$newparams$brace$rest"; continue; @@ -1028,12 +1060,14 @@ class Sanitizer { * - Double attributes are discarded * - Unsafe style attributes are discarded * - Prepends space if there are attributes. + * - (Optionally) Sorts attributes by name. * * @param string $text * @param string $element + * @param bool $sorted Whether to sort the attributes (default: false) * @return string */ - static function fixTagAttributes( $text, $element ) { + static function fixTagAttributes( $text, $element, $sorted = false ) { if ( trim( $text ) == '' ) { return ''; } @@ -1041,6 +1075,10 @@ class Sanitizer { $decoded = Sanitizer::decodeTagAttributes( $text ); $stripped = Sanitizer::validateTagAttributes( $decoded, $element ); + if ( $sorted ) { + ksort( $stripped ); + } + return Sanitizer::safeEncodeTagAttributes( $stripped ); } diff --git a/includes/ServiceWiring.php b/includes/ServiceWiring.php index 338f306fed..9ee4236079 100644 --- a/includes/ServiceWiring.php +++ b/includes/ServiceWiring.php @@ -61,9 +61,6 @@ return [ 'SiteStore' => function( MediaWikiServices $services ) { $rawSiteStore = new DBSiteStore( $services->getDBLoadBalancer() ); - $rawSiteStore->setLanguageCodeMapping( - $services->getMainConfig()->get( 'DummyLanguageCodes' ) ?: [] - ); // TODO: replace wfGetCache with a CacheFactory service. // TODO: replace wfIsHHVM with a capabilities service. @@ -157,6 +154,10 @@ return [ return $store; }, + 'WatchedItemQueryService' => function( MediaWikiServices $services ) { + return new WatchedItemQueryService( $services->getDBLoadBalancer() ); + }, + 'LinkCache' => function( MediaWikiServices $services ) { return new LinkCache( $services->getTitleFormatter() diff --git a/includes/Setup.php b/includes/Setup.php index 2c78061750..cb1bd716bf 100644 --- a/includes/Setup.php +++ b/includes/Setup.php @@ -45,6 +45,8 @@ if ( !isset( $wgVersion ) ) { die( 1 ); } +mb_internal_encoding( 'UTF-8' ); + // Set various default paths sensibly... $ps_default = Profiler::instance()->scopedProfileIn( $fname . '-defaults' ); @@ -688,7 +690,9 @@ wfDebugLog( 'caches', ', WAN: ' . $wgMainWANCache . ', stash: ' . $wgMainStash . ', message: ' . get_class( $messageMemc ) . - ', parser: ' . get_class( $parserMemc ) ); + ', parser: ' . get_class( $parserMemc ) . + ', session: ' . get_class( ObjectCache::getInstance( $wgSessionCacheType ) ) +); Profiler::instance()->scopedProfileOut( $ps_memcached ); diff --git a/includes/Title.php b/includes/Title.php index 4555f16d9b..f291a69b9e 100644 --- a/includes/Title.php +++ b/includes/Title.php @@ -4371,7 +4371,6 @@ class Title implements LinkTarget { $conds = $this->pageCond(); $dbw->onTransactionIdle( function () use ( $dbw, $conds, $method, $purgeTime ) { $dbTimestamp = $dbw->timestamp( $purgeTime ?: time() ); - $dbw->update( 'page', [ 'page_touched' => $dbTimestamp ], diff --git a/includes/WatchedItemQueryService.php b/includes/WatchedItemQueryService.php new file mode 100644 index 0000000000..3dcd30f006 --- /dev/null +++ b/includes/WatchedItemQueryService.php @@ -0,0 +1,634 @@ +loadBalancer = $loadBalancer; + } + + /** + * @return DatabaseBase + * @throws MWException + */ + private function getConnection() { + return $this->loadBalancer->getConnection( DB_SLAVE, [ 'watchlist' ] ); + } + + /** + * @param DatabaseBase $connection + * @throws MWException + */ + private function reuseConnection( DatabaseBase $connection ) { + $this->loadBalancer->reuseConnection( $connection ); + } + + /** + * @param User $user + * @param array $options Allowed keys: + * 'includeFields' => string[] RecentChange fields to be included in the result, + * self::INCLUDE_* constants should be used + * 'filters' => string[] optional filters to narrow down resulted items + * 'namespaceIds' => int[] optional namespace IDs to filter by + * (defaults to all namespaces) + * 'allRevisions' => bool return multiple revisions of the same page if true, + * only the most recent if false (default) + * 'rcTypes' => int[] which types of RecentChanges to include + * (defaults to all types), allowed values: RC_EDIT, RC_NEW, + * RC_LOG, RC_EXTERNAL, RC_CATEGORIZE + * 'onlyByUser' => string only list changes by a specified user + * 'notByUser' => string do not incluide changes by a specified user + * 'dir' => string in which direction to enumerate, accepted values: + * - DIR_OLDER list newest first + * - DIR_NEWER list oldest first + * 'start' => string (format accepted by wfTimestamp) requires 'dir' option, + * timestamp to start enumerating from + * 'end' => string (format accepted by wfTimestamp) requires 'dir' option, + * timestamp to end enumerating + * 'startFrom' => [ string $rcTimestamp, int $rcId ] requires 'dir' option, + * return items starting from the RecentChange specified by this, + * $rcTimestamp should be in the format accepted by wfTimestamp + * 'watchlistOwner' => User user whose watchlist items should be listed if different + * than the one specified with $user param, + * requires 'watchlistOwnerToken' option + * 'watchlistOwnerToken' => string a watchlist token used to access another user's + * watchlist, used with 'watchlistOwnerToken' option + * 'limit' => int maximum numbers of items to return + * 'usedInGenerator' => bool include only RecentChange id field required by the + * generator ('rc_cur_id' or 'rc_this_oldid') if true, or all + * id fields ('rc_cur_id', 'rc_this_oldid', 'rc_last_oldid') + * if false (default) + * @return array of pairs ( WatchedItem $watchedItem, string[] $recentChangeInfo ), + * where $recentChangeInfo contains the following keys: + * - 'rc_id', + * - 'rc_namespace', + * - 'rc_title', + * - 'rc_timestamp', + * - 'rc_type', + * - 'rc_deleted', + * Additional keys could be added by specifying the 'includeFields' option + */ + public function getWatchedItemsWithRecentChangeInfo( User $user, array $options = [] ) { + $options += [ + 'includeFields' => [], + 'namespaceIds' => [], + 'filters' => [], + 'allRevisions' => false, + 'usedInGenerator' => false + ]; + + Assert::parameter( + !isset( $options['rcTypes'] ) + || !array_diff( $options['rcTypes'], [ RC_EDIT, RC_NEW, RC_LOG, RC_EXTERNAL, RC_CATEGORIZE ] ), + '$options[\'rcTypes\']', + 'must be an array containing only: RC_EDIT, RC_NEW, RC_LOG, RC_EXTERNAL and/or RC_CATEGORIZE' + ); + Assert::parameter( + !isset( $options['dir'] ) || in_array( $options['dir'], [ self::DIR_OLDER, self::DIR_NEWER ] ), + '$options[\'dir\']', + 'must be DIR_OLDER or DIR_NEWER' + ); + Assert::parameter( + !isset( $options['start'] ) && !isset( $options['end'] ) && !isset( $options['startFrom'] ) + || isset( $options['dir'] ), + '$options[\'dir\']', + 'must be provided when providing any of options: start, end, startFrom' + ); + Assert::parameter( + !isset( $options['startFrom'] ) + || ( is_array( $options['startFrom'] ) && count( $options['startFrom'] ) === 2 ), + '$options[\'startFrom\']', + 'must be a two-element array' + ); + if ( array_key_exists( 'watchlistOwner', $options ) ) { + Assert::parameterType( + User::class, + $options['watchlistOwner'], + '$options[\'watchlistOwner\']' + ); + Assert::parameter( + isset( $options['watchlistOwnerToken'] ), + '$options[\'watchlistOwnerToken\']', + 'must be provided when providing watchlistOwner option' + ); + } + + $tables = [ 'recentchanges', 'watchlist' ]; + if ( !$options['allRevisions'] ) { + $tables[] = 'page'; + } + + $db = $this->getConnection(); + + $fields = $this->getWatchedItemsWithRCInfoQueryFields( $options ); + $conds = $this->getWatchedItemsWithRCInfoQueryConds( $db, $user, $options ); + $dbOptions = $this->getWatchedItemsWithRCInfoQueryDbOptions( $options ); + $joinConds = $this->getWatchedItemsWithRCInfoQueryJoinConds( $options ); + + $res = $db->select( + $tables, + $fields, + $conds, + __METHOD__, + $dbOptions, + $joinConds + ); + + $this->reuseConnection( $db ); + + $items = []; + foreach ( $res as $row ) { + $items[] = [ + new WatchedItem( + $user, + new TitleValue( (int)$row->rc_namespace, $row->rc_title ), + $row->wl_notificationtimestamp + ), + $this->getRecentChangeFieldsFromRow( $row ) + ]; + } + + return $items; + } + + /** + * For simple listing of user's watchlist items, see WatchedItemStore::getWatchedItemsForUser + * + * @param User $user + * @param array $options Allowed keys: + * 'sort' => string optional sorting by namespace ID and title + * one of the self::SORT_* constants + * 'namespaceIds' => int[] optional namespace IDs to filter by (defaults to all namespaces) + * 'limit' => int maximum number of items to return + * 'filter' => string optional filter, one of the self::FILTER_* contants + * 'from' => LinkTarget requires 'sort' key, only return items starting from + * those related to the link target + * 'until' => LinkTarget requires 'sort' key, only return items until + * those related to the link target + * 'startFrom' => LinkTarget requires 'sort' key, only return items starting from + * those related to the link target, allows to skip some link targets + * specified using the form option + * @return WatchedItem[] + */ + public function getWatchedItemsForUser( User $user, array $options = [] ) { + if ( $user->isAnon() ) { + // TODO: should this just return an empty array or rather complain loud at this point + // as e.g. ApiBase::getWatchlistUser does? + return []; + } + + $options += [ 'namespaceIds' => [] ]; + + Assert::parameter( + !isset( $options['sort'] ) || in_array( $options['sort'], [ self::SORT_ASC, self::SORT_DESC ] ), + '$options[\'sort\']', + 'must be SORT_ASC or SORT_DESC' + ); + Assert::parameter( + !isset( $options['filter'] ) || in_array( + $options['filter'], [ self::FILTER_CHANGED, self::FILTER_NOT_CHANGED ] + ), + '$options[\'filter\']', + 'must be FILTER_CHANGED or FILTER_NOT_CHANGED' + ); + Assert::parameter( + !isset( $options['from'] ) && !isset( $options['until'] ) && !isset( $options['startFrom'] ) + || isset( $options['sort'] ), + '$options[\'sort\']', + 'must be provided if any of "from", "until", "startFrom" options is provided' + ); + + $db = $this->getConnection(); + + $conds = $this->getWatchedItemsForUserQueryConds( $db, $user, $options ); + $dbOptions = $this->getWatchedItemsForUserQueryDbOptions( $options ); + + $res = $db->select( + 'watchlist', + [ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ], + $conds, + __METHOD__, + $dbOptions + ); + + $this->reuseConnection( $db ); + + $watchedItems = []; + foreach ( $res as $row ) { + // todo these could all be cached at some point? + $watchedItems[] = new WatchedItem( + $user, + new TitleValue( (int)$row->wl_namespace, $row->wl_title ), + $row->wl_notificationtimestamp + ); + } + + return $watchedItems; + } + + private function getRecentChangeFieldsFromRow( stdClass $row ) { + // This can be simplified to single array_filter call filtering by key value, + // once we stop supporting PHP 5.5 + $allFields = get_object_vars( $row ); + $rcKeys = array_filter( + array_keys( $allFields ), + function( $key ) { + return substr( $key, 0, 3 ) === 'rc_'; + } + ); + return array_intersect_key( $allFields, array_flip( $rcKeys ) ); + } + + private function getWatchedItemsWithRCInfoQueryFields( array $options ) { + $fields = [ + 'rc_id', + 'rc_namespace', + 'rc_title', + 'rc_timestamp', + 'rc_type', + 'rc_deleted', + 'wl_notificationtimestamp' + ]; + + $rcIdFields = [ + 'rc_cur_id', + 'rc_this_oldid', + 'rc_last_oldid', + ]; + if ( $options['usedInGenerator'] ) { + if ( $options['allRevisions'] ) { + $rcIdFields = [ 'rc_this_oldid' ]; + } else { + $rcIdFields = [ 'rc_cur_id' ]; + } + } + $fields = array_merge( $fields, $rcIdFields ); + + if ( in_array( self::INCLUDE_FLAGS, $options['includeFields'] ) ) { + $fields = array_merge( $fields, [ 'rc_type', 'rc_minor', 'rc_bot' ] ); + } + if ( in_array( self::INCLUDE_USER, $options['includeFields'] ) ) { + $fields[] = 'rc_user_text'; + } + if ( in_array( self::INCLUDE_USER_ID, $options['includeFields'] ) ) { + $fields[] = 'rc_user'; + } + if ( in_array( self::INCLUDE_COMMENT, $options['includeFields'] ) ) { + $fields[] = 'rc_comment'; + } + if ( in_array( self::INCLUDE_PATROL_INFO, $options['includeFields'] ) ) { + $fields = array_merge( $fields, [ 'rc_patrolled', 'rc_log_type' ] ); + } + if ( in_array( self::INCLUDE_SIZES, $options['includeFields'] ) ) { + $fields = array_merge( $fields, [ 'rc_old_len', 'rc_new_len' ] ); + } + if ( in_array( self::INCLUDE_LOG_INFO, $options['includeFields'] ) ) { + $fields = array_merge( $fields, [ 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ] ); + } + + return $fields; + } + + private function getWatchedItemsWithRCInfoQueryConds( + DatabaseBase $db, + User $user, + array $options + ) { + $watchlistOwnerId = $this->getWatchlistOwnerId( $user, $options ); + $conds = [ 'wl_user' => $watchlistOwnerId ]; + + if ( !$options['allRevisions'] ) { + $conds[] = $db->makeList( + [ 'rc_this_oldid=page_latest', 'rc_type=' . RC_LOG ], + LIST_OR + ); + } + + if ( $options['namespaceIds'] ) { + $conds['wl_namespace'] = array_map( 'intval', $options['namespaceIds'] ); + } + + if ( array_key_exists( 'rcTypes', $options ) ) { + $conds['rc_type'] = array_map( 'intval', $options['rcTypes'] ); + } + + $conds = array_merge( + $conds, + $this->getWatchedItemsWithRCInfoQueryFilterConds( $user, $options ) + ); + + $conds = array_merge( $conds, $this->getStartEndConds( $db, $options ) ); + + if ( !isset( $options['start'] ) && !isset( $options['end'] ) ) { + if ( $db->getType() === 'mysql' ) { + // This is an index optimization for mysql + $conds[] = "rc_timestamp > ''"; + } + } + + $conds = array_merge( $conds, $this->getUserRelatedConds( $db, $user, $options ) ); + + $deletedPageLogCond = $this->getExtraDeletedPageLogEntryRelatedCond( $db, $user ); + if ( $deletedPageLogCond ) { + $conds[] = $deletedPageLogCond; + } + + if ( array_key_exists( 'startFrom', $options ) ) { + $conds[] = $this->getStartFromConds( $db, $options ); + } + + return $conds; + } + + private function getWatchlistOwnerId( User $user, array $options ) { + if ( array_key_exists( 'watchlistOwner', $options ) ) { + /** @var User $watchlistOwner */ + $watchlistOwner = $options['watchlistOwner']; + $ownersToken = $watchlistOwner->getOption( 'watchlisttoken' ); + $token = $options['watchlistOwnerToken']; + if ( $ownersToken == '' || !hash_equals( $ownersToken, $token ) ) { + throw new UsageException( + 'Incorrect watchlist token provided -- please set a correct token in Special:Preferences', + 'bad_wltoken' + ); + } + return $watchlistOwner->getId(); + } + return $user->getId(); + } + + private function getWatchedItemsWithRCInfoQueryFilterConds( User $user, array $options ) { + $conds = []; + + if ( in_array( self::FILTER_MINOR, $options['filters'] ) ) { + $conds[] = 'rc_minor != 0'; + } elseif ( in_array( self::FILTER_NOT_MINOR, $options['filters'] ) ) { + $conds[] = 'rc_minor = 0'; + } + + if ( in_array( self::FILTER_BOT, $options['filters'] ) ) { + $conds[] = 'rc_bot != 0'; + } elseif ( in_array( self::FILTER_NOT_BOT, $options['filters'] ) ) { + $conds[] = 'rc_bot = 0'; + } + + if ( in_array( self::FILTER_ANON, $options['filters'] ) ) { + $conds[] = 'rc_user = 0'; + } elseif ( in_array( self::FILTER_NOT_ANON, $options['filters'] ) ) { + $conds[] = 'rc_user != 0'; + } + + if ( $user->useRCPatrol() || $user->useNPPatrol() ) { + // TODO: not sure if this should simply ignore patrolled filters if user does not have the patrol + // right, or maybe rather fail loud at this point, same as e.g. ApiQueryWatchlist does? + if ( in_array( self::FILTER_PATROLLED, $options['filters'] ) ) { + $conds[] = 'rc_patrolled != 0'; + } elseif ( in_array( self::FILTER_NOT_PATROLLED, $options['filters'] ) ) { + $conds[] = 'rc_patrolled = 0'; + } + } + + if ( in_array( self::FILTER_UNREAD, $options['filters'] ) ) { + $conds[] = 'rc_timestamp >= wl_notificationtimestamp'; + } elseif ( in_array( self::FILTER_NOT_UNREAD, $options['filters'] ) ) { + // TODO: should this be changed to use Database::makeList? + $conds[] = 'wl_notificationtimestamp IS NULL OR rc_timestamp < wl_notificationtimestamp'; + } + + return $conds; + } + + private function getStartEndConds( DatabaseBase $db, array $options ) { + if ( !isset( $options['start'] ) && ! isset( $options['end'] ) ) { + return []; + } + + $conds = []; + + if ( isset( $options['start'] ) ) { + $after = $options['dir'] === self::DIR_OLDER ? '<=' : '>='; + $conds[] = 'rc_timestamp ' . $after . ' ' . $db->addQuotes( $options['start'] ); + } + if ( isset( $options['end'] ) ) { + $before = $options['dir'] === self::DIR_OLDER ? '>=' : '<='; + $conds[] = 'rc_timestamp ' . $before . ' ' . $db->addQuotes( $options['end'] ); + } + + return $conds; + } + + private function getUserRelatedConds( DatabaseBase $db, User $user, array $options ) { + if ( !array_key_exists( 'onlyByUser', $options ) && !array_key_exists( 'notByUser', $options ) ) { + return []; + } + + $conds = []; + + if ( array_key_exists( 'onlyByUser', $options ) ) { + $conds['rc_user_text'] = $options['onlyByUser']; + } elseif ( array_key_exists( 'notByUser', $options ) ) { + $conds[] = 'rc_user_text != ' . $db->addQuotes( $options['notByUser'] ); + } + + // Avoid brute force searches (bug 17342) + $bitmask = 0; + if ( !$user->isAllowed( 'deletedhistory' ) ) { + $bitmask = Revision::DELETED_USER; + } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) { + $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED; + } + if ( $bitmask ) { + $conds[] = $db->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask"; + } + + return $conds; + } + + private function getExtraDeletedPageLogEntryRelatedCond( DatabaseBase $db, User $user ) { + // LogPage::DELETED_ACTION hides the affected page, too. So hide those + // entirely from the watchlist, or someone could guess the title. + $bitmask = 0; + if ( !$user->isAllowed( 'deletedhistory' ) ) { + $bitmask = LogPage::DELETED_ACTION; + } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) { + $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED; + } + if ( $bitmask ) { + return $db->makeList( [ + 'rc_type != ' . RC_LOG, + $db->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask", + ], LIST_OR ); + } + return ''; + } + + private function getStartFromConds( DatabaseBase $db, array $options ) { + $op = $options['dir'] === self::DIR_OLDER ? '<' : '>'; + list( $rcTimestamp, $rcId ) = $options['startFrom']; + $rcTimestamp = $db->addQuotes( $db->timestamp( $rcTimestamp ) ); + $rcId = (int)$rcId; + return $db->makeList( + [ + "rc_timestamp $op $rcTimestamp", + $db->makeList( + [ + "rc_timestamp = $rcTimestamp", + "rc_id $op= $rcId" + ], + LIST_AND + ) + ], + LIST_OR + ); + } + + private function getWatchedItemsForUserQueryConds( DatabaseBase $db, User $user, array $options ) { + $conds = [ 'wl_user' => $user->getId() ]; + if ( $options['namespaceIds'] ) { + $conds['wl_namespace'] = array_map( 'intval', $options['namespaceIds'] ); + } + if ( isset( $options['filter'] ) ) { + $filter = $options['filter']; + if ( $filter === self::FILTER_CHANGED ) { + $conds[] = 'wl_notificationtimestamp IS NOT NULL'; + } else { + $conds[] = 'wl_notificationtimestamp IS NULL'; + } + } + + if ( isset( $options['from'] ) ) { + $op = $options['sort'] === self::SORT_ASC ? '>' : '<'; + $conds[] = $this->getFromUntilTargetConds( $db, $options['from'], $op ); + } + if ( isset( $options['until'] ) ) { + $op = $options['sort'] === self::SORT_ASC ? '<' : '>'; + $conds[] = $this->getFromUntilTargetConds( $db, $options['until'], $op ); + } + if ( isset( $options['startFrom'] ) ) { + $op = $options['sort'] === self::SORT_ASC ? '>' : '<'; + $conds[] = $this->getFromUntilTargetConds( $db, $options['startFrom'], $op ); + } + + return $conds; + } + + /** + * Creates a query condition part for getting only items before or after the given link target + * (while ordering using $sort mode) + * + * @param DatabaseBase $db + * @param LinkTarget $target + * @param string $op comparison operator to use in the conditions + * @return string + */ + private function getFromUntilTargetConds( DatabaseBase $db, LinkTarget $target, $op ) { + return $db->makeList( + [ + "wl_namespace $op " . $target->getNamespace(), + $db->makeList( + [ + 'wl_namespace = ' . $target->getNamespace(), + "wl_title $op= " . $db->addQuotes( $target->getDBkey() ) + ], + LIST_AND + ) + ], + LIST_OR + ); + } + + private function getWatchedItemsWithRCInfoQueryDbOptions( array $options ) { + $dbOptions = []; + + if ( array_key_exists( 'dir', $options ) ) { + $sort = $options['dir'] === self::DIR_OLDER ? ' DESC' : ''; + $dbOptions['ORDER BY'] = [ 'rc_timestamp' . $sort, 'rc_id' . $sort ]; + } + + if ( array_key_exists( 'limit', $options ) ) { + $dbOptions['LIMIT'] = (int)$options['limit']; + } + + return $dbOptions; + } + + private function getWatchedItemsForUserQueryDbOptions( array $options ) { + $dbOptions = []; + if ( array_key_exists( 'sort', $options ) ) { + $dbOptions['ORDER BY'] = [ + "wl_namespace {$options['sort']}", + "wl_title {$options['sort']}" + ]; + if ( count( $options['namespaceIds'] ) === 1 ) { + $dbOptions['ORDER BY'] = "wl_title {$options['sort']}"; + } + } + if ( array_key_exists( 'limit', $options ) ) { + $dbOptions['LIMIT'] = (int)$options['limit']; + } + return $dbOptions; + } + + private function getWatchedItemsWithRCInfoQueryJoinConds( array $options ) { + $joinConds = [ + 'watchlist' => [ 'INNER JOIN', + [ + 'wl_namespace=rc_namespace', + 'wl_title=rc_title' + ] + ] + ]; + if ( !$options['allRevisions'] ) { + $joinConds['page'] = [ 'LEFT JOIN', 'rc_cur_id=page_id' ]; + } + return $joinConds; + } + +} diff --git a/includes/WebResponse.php b/includes/WebResponse.php index 458c2079e4..90b76e3327 100644 --- a/includes/WebResponse.php +++ b/includes/WebResponse.php @@ -89,26 +89,12 @@ class WebResponse { * path: string, cookie path ($wgCookiePath) * secure: bool, secure attribute ($wgCookieSecure) * httpOnly: bool, httpOnly attribute ($wgCookieHttpOnly) - * raw: bool, if true uses PHP's setrawcookie() instead of setcookie() - * For backwards compatibility, if $options is not an array then it and - * the following two parameters will be interpreted as values for - * 'prefix', 'domain', and 'secure' * @since 1.22 Replaced $prefix, $domain, and $forceSecure with $options */ public function setCookie( $name, $value, $expire = 0, $options = [] ) { global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain; global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly; - if ( !is_array( $options ) ) { - // Backwards compatibility - $options = [ 'prefix' => $options ]; - if ( func_num_args() >= 5 ) { - $options['domain'] = func_get_arg( 4 ); - } - if ( func_num_args() >= 6 ) { - $options['secure'] = func_get_arg( 5 ); - } - } $options = array_filter( $options, function ( $a ) { return $a !== null; } ) + [ @@ -268,16 +254,6 @@ class FauxResponse extends WebResponse { global $wgCookiePath, $wgCookiePrefix, $wgCookieDomain; global $wgCookieSecure, $wgCookieExpiration, $wgCookieHttpOnly; - if ( !is_array( $options ) ) { - // Backwards compatibility - $options = [ 'prefix' => $options ]; - if ( func_num_args() >= 5 ) { - $options['domain'] = func_get_arg( 4 ); - } - if ( func_num_args() >= 6 ) { - $options['secure'] = func_get_arg( 5 ); - } - } $options = array_filter( $options, function ( $a ) { return $a !== null; } ) + [ diff --git a/includes/actions/Action.php b/includes/actions/Action.php index 84bf16ee8f..f06f828204 100644 --- a/includes/actions/Action.php +++ b/includes/actions/Action.php @@ -88,7 +88,7 @@ abstract class Action { * @since 1.17 * @param string $action * @param Page $page - * @param IContextSource $context + * @param IContextSource|null $context * @return Action|bool|null False if the action is disabled, null * if it is not recognised */ @@ -264,7 +264,7 @@ abstract class Action { * Only public since 1.21 * * @param Page $page - * @param IContextSource $context + * @param IContextSource|null $context */ public function __construct( Page $page, IContextSource $context = null ) { if ( $context === null ) { diff --git a/includes/actions/HistoryAction.php b/includes/actions/HistoryAction.php index 5ec10e6aff..0df372efa3 100644 --- a/includes/actions/HistoryAction.php +++ b/includes/actions/HistoryAction.php @@ -116,6 +116,10 @@ class HistoryAction extends FormlessAction { // Setup page variables. $out->setFeedAppendQuery( 'action=history' ); $out->addModules( 'mediawiki.action.history' ); + $out->addModuleStyles( [ + 'mediawiki.action.history.styles', + 'mediawiki.special.changeslist', + ] ); if ( $config->get( 'UseMediaWikiUIEverywhere' ) ) { $out = $this->getOutput(); $out->addModuleStyles( [ diff --git a/includes/api/ApiAMCreateAccount.php b/includes/api/ApiAMCreateAccount.php index 0a4b6dc214..52a79513b4 100644 --- a/includes/api/ApiAMCreateAccount.php +++ b/includes/api/ApiAMCreateAccount.php @@ -21,7 +21,6 @@ */ use MediaWiki\Auth\AuthManager; -use MediaWiki\Auth\AuthenticationRequest; use MediaWiki\Auth\AuthenticationResponse; /** diff --git a/includes/api/ApiBase.php b/includes/api/ApiBase.php index 639f6be0b8..3e57e8997a 100644 --- a/includes/api/ApiBase.php +++ b/includes/api/ApiBase.php @@ -2093,7 +2093,7 @@ abstract class ApiBase extends ContextSource { /** * Output the error message related to a certain array - * @param array|string $error Element of a getUserPermissionsErrors()-style array + * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array * @throws UsageException always */ public function dieUsageMsg( $error ) { @@ -2110,7 +2110,7 @@ abstract class ApiBase extends ContextSource { /** * Will only set a warning instead of failing if the global $wgDebugAPI * is set to true. Otherwise behaves exactly as dieUsageMsg(). - * @param array|string $error Element of a getUserPermissionsErrors()-style array + * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array * @throws UsageException * @since 1.21 */ @@ -2143,32 +2143,38 @@ abstract class ApiBase extends ContextSource { /** * Return the error message related to a certain array - * @param array $error Element of a getUserPermissionsErrors()-style array + * @param array|string|MessageSpecifier $error Element of a getUserPermissionsErrors()-style array * @return array('code' => code, 'info' => info) */ public function parseMsg( $error ) { - $error = (array)$error; // It seems strings sometimes make their way in here - $key = array_shift( $error ); - - // Check whether the error array was nested - // array( array( , ), array( , ) ) - if ( is_array( $key ) ) { - $error = $key; - $key = array_shift( $error ); + // Check whether someone passed the whole array, instead of one element as + // documented. This breaks if it's actually an array of fallback keys, but + // that's long-standing misbehavior introduced in r87627 to incorrectly + // fix T30797. + if ( is_array( $error ) ) { + $first = reset( $error ); + if ( is_array( $first ) ) { + wfDebug( __METHOD__ . ' was passed an array of arrays. ' . wfGetAllCallers( 5 ) ); + $error = $first; + } } - if ( $key instanceof IApiMessage ) { + $msg = Message::newFromSpecifier( $error ); + + if ( $msg instanceof IApiMessage ) { return [ - 'code' => $key->getApiCode(), - 'info' => $key->inLanguage( 'en' )->useDatabase( false )->text(), - 'data' => $key->getApiData() + 'code' => $msg->getApiCode(), + 'info' => $msg->inLanguage( 'en' )->useDatabase( false )->text(), + 'data' => $msg->getApiData() ]; } + $key = $msg->getKey(); if ( isset( self::$messageMap[$key] ) ) { + $params = $msg->getParams(); return [ - 'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $error ), - 'info' => wfMsgReplaceArgs( self::$messageMap[$key]['info'], $error ) + 'code' => wfMsgReplaceArgs( self::$messageMap[$key]['code'], $params ), + 'info' => wfMsgReplaceArgs( self::$messageMap[$key]['info'], $params ) ]; } diff --git a/includes/api/ApiCSPReport.php b/includes/api/ApiCSPReport.php new file mode 100644 index 0000000000..5271996080 --- /dev/null +++ b/includes/api/ApiCSPReport.php @@ -0,0 +1,224 @@ +getParameter( 'reportonly' ); + $logname = $reportOnly ? 'csp-report-only' : 'csp'; + $this->log = LoggerFactory::getInstance( $logname ); + $userAgent = $this->getRequest()->getHeader( 'user-agent' ); + + $this->verifyPostBodyOk(); + $report = $this->getReport(); + $flags = $this->getFlags( $report ); + + $warningText = $this->generateLogLine( $flags, $report ); + $this->logReport( $flags, $warningText, [ + // XXX Is it ok to put untrusted data into log?? + 'csp-report' => $report, + 'method' => __METHOD__, + 'user' => $this->getUser()->getName(), + 'user-agent' => $userAgent, + 'source' => $this->getParameter( 'source' ), + ] ); + $this->getResult()->addValue( null, $this->getModuleName(), 'success' ); + } + + /** + * Log CSP report, with a different severity depending on $flags + * @param $flags Array Flags for this report + * @param $logLine String text of log entry + * @param $context Array logging context + */ + private function logReport( $flags, $logLine, $context ) { + if ( in_array( 'false-positive', $flags ) ) { + // These reports probably don't matter much + $this->log->debug( $logLine, $context ); + } else { + // Normal report. + $this->log->warning( $logLine, $context ); + } + } + + /** + * Get extra notes about the report. + * + * @param $report Array The CSP report + * @return Array + */ + private function getFlags( $report ) { + $reportOnly = $this->getParameter( 'reportonly' ); + $userAgent = $this->getRequest()->getHeader( 'user-agent' ); + $source = $this->getParameter( 'source' ); + + $flags = []; + if ( $source !== 'internal' ) { + $flags[] = 'source=' . $source; + } + if ( $reportOnly ) { + $flags[] = 'report-only'; + } + return $flags; + } + + /** + * Output an api error if post body is obviously not OK. + */ + private function verifyPostBodyOk() { + $req = $this->getRequest(); + $contentType = $req->getHeader( 'content-type' ); + if ( $contentType !== 'application/json' + && $contentType !=='application/csp-report' + ) { + $this->error( 'wrongformat', __METHOD__ ); + } + if ( $req->getHeader( 'content-length' ) > self::MAX_POST_SIZE ) { + $this->error( 'toobig', __METHOD__ ); + } + } + + /** + * Get the report from post body and turn into associative array. + * + * @return Array + */ + private function getReport() { + $postBody = $this->getRequest()->getRawInput(); + if ( strlen( $postBody ) > self::MAX_POST_SIZE ) { + // paranoia, already checked content-length earlier. + $this->error( 'toobig', __METHOD__ ); + } + $status = FormatJson::parse( $postBody, FormatJson::FORCE_ASSOC ); + if ( !$status->isGood() ) { + list( $code, ) = $this->getErrorFromStatus( $status ); + $this->error( $code, __METHOD__ ); + } + + $report = $status->getValue(); + + if ( !isset( $report['csp-report'] ) ) { + $this->error( 'missingkey', __METHOD__ ); + } + return $report['csp-report']; + } + + /** + * Get text of log line. + * + * @param $flags Array of additional markers for this report + * @param $report Array the csp report + * @return String Text to put in log + */ + private function generateLogLine( $flags, $report ) { + $flagText = ''; + if ( $flags ) { + $flagText = '[' . implode( $flags, ', ' ) . ']'; + } + + $blockedFile = isset( $report['blocked-uri'] ) ? $report['blocked-uri'] : 'n/a'; + $page = isset( $report['document-uri'] ) ? $report['document-uri'] : 'n/a'; + $line = isset( $report['line-number'] ) ? ':' . $report['line-number'] : ''; + $warningText = $flagText . + ' Received CSP report: <' . $blockedFile . + '> blocked from being loaded on <' . $page . '>' . $line; + return $warningText; + } + + /** + * Stop processing the request, and output/log an error + * + * @param $code String error code + * @param $method String method that made error + * @throws UsageException Always + */ + private function error( $code, $method ) { + $this->log->info( 'Error reading CSP report: ' . $code, [ + 'method' => $method, + 'user-agent' => $this->getRequest()->getHeader( 'user-agent' ) + ] ); + // 500 so it shows up in browser's developer console. + $this->dieUsage( "Error processing CSP report: $code", 'cspreport-' . $code, 500 ); + } + + public function getAllowedParams() { + return [ + 'reportonly' => [ + ApiBase::PARAM_TYPE => 'boolean', + ApiBase::PARAM_DFLT => false + ], + 'source' => [ + ApiBase::PARAM_TYPE => 'string', + ApiBase::PARAM_DFLT => 'internal', + ApiBase::PARAM_REQUIRED => false + ] + ]; + } + + public function mustBePosted() { + return true; + } + + public function isWriteMode() { + return false; + } + + /** + * Mark as internal. This isn't meant to be used by normal api users + */ + public function isInternal() { + return true; + } + + /** + * Even if you don't have read rights, we still want your report. + */ + public function isReadMode() { + return false; + } + + /** + * Doesn't touch db, so max lag should be rather irrelavent. + * + * Also, this makes sure that reports aren't lost during lag events. + */ + public function shouldCheckMaxLag() { + return false; + } +} diff --git a/includes/api/ApiClientLogin.php b/includes/api/ApiClientLogin.php index cffccb15b5..8e5a3c747c 100644 --- a/includes/api/ApiClientLogin.php +++ b/includes/api/ApiClientLogin.php @@ -21,7 +21,6 @@ */ use MediaWiki\Auth\AuthManager; -use MediaWiki\Auth\AuthenticationRequest; use MediaWiki\Auth\AuthenticationResponse; use MediaWiki\Auth\CreateFromLoginAuthenticationRequest; diff --git a/includes/api/ApiEditPage.php b/includes/api/ApiEditPage.php index 08aba9482e..00daba94b5 100644 --- a/includes/api/ApiEditPage.php +++ b/includes/api/ApiEditPage.php @@ -398,39 +398,11 @@ class ApiEditPage extends ApiBase { $ep->importFormData( $req ); $content = $ep->textbox1; - // The following is needed to give the hook the full content of the - // new revision rather than just the current section. (Bug 52077) - if ( !is_null( $params['section'] ) && - $contentHandler->supportsSections() && $titleObj->exists() - ) { - // If sectiontitle is set, use it, otherwise use the summary as the section title (for - // backwards compatibility with old forms/bots). - if ( $ep->sectiontitle !== '' ) { - $sectionTitle = $ep->sectiontitle; - } else { - $sectionTitle = $ep->summary; - } - - $contentObj = $contentHandler->unserializeContent( $content, $contentFormat ); - - $fullContentObj = $articleObject->replaceSectionContent( - $params['section'], - $contentObj, - $sectionTitle - ); - if ( $fullContentObj ) { - $content = $fullContentObj->serialize( $contentFormat ); - } else { - // This most likely means we have an edit conflict which means that the edit - // wont succeed anyway. - $this->dieUsageMsg( 'editconflict' ); - } - } - // Run hooks // Handle APIEditBeforeSave parameters $r = []; - if ( !Hooks::run( 'APIEditBeforeSave', [ $ep, $content, &$r ] ) ) { + // Deprecated in favour of EditFilterMergedContent + if ( !Hooks::run( 'APIEditBeforeSave', [ $ep, $content, &$r ], '1.28' ) ) { if ( count( $r ) ) { $r['result'] = 'Failure'; $apiResult->addValue( null, $this->getModuleName(), $r ); diff --git a/includes/api/ApiExpandTemplates.php b/includes/api/ApiExpandTemplates.php index 286fe887c3..48e7698147 100644 --- a/includes/api/ApiExpandTemplates.php +++ b/includes/api/ApiExpandTemplates.php @@ -77,6 +77,11 @@ class ApiExpandTemplates extends ApiBase { $options->setRemoveComments( false ); } + $reset = null; + $suppressCache = false; + Hooks::run( 'ApiMakeParserOptions', + [ $options, $title_obj, $params, $this, &$reset, &$suppressCache ] ); + $retval = []; if ( isset( $prop['parsetree'] ) || $params['generatexml'] ) { diff --git a/includes/api/ApiHelp.php b/includes/api/ApiHelp.php index 0f0fbdc564..a3bb6a2a50 100644 --- a/includes/api/ApiHelp.php +++ b/includes/api/ApiHelp.php @@ -100,8 +100,10 @@ class ApiHelp extends ApiBase { } $out = $context->getOutput(); - $out->addModuleStyles( 'mediawiki.hlist' ); - $out->addModuleStyles( 'mediawiki.apihelp' ); + $out->addModuleStyles( [ + 'mediawiki.hlist', + 'mediawiki.apihelp', + ] ); if ( !empty( $options['toc'] ) ) { $out->addModules( 'mediawiki.toc' ); } diff --git a/includes/api/ApiLinkAccount.php b/includes/api/ApiLinkAccount.php index 14347d81d0..1017607ce6 100644 --- a/includes/api/ApiLinkAccount.php +++ b/includes/api/ApiLinkAccount.php @@ -21,7 +21,6 @@ */ use MediaWiki\Auth\AuthManager; -use MediaWiki\Auth\AuthenticationRequest; use MediaWiki\Auth\AuthenticationResponse; /** diff --git a/includes/api/ApiMain.php b/includes/api/ApiMain.php index ce9587f399..592df534da 100644 --- a/includes/api/ApiMain.php +++ b/includes/api/ApiMain.php @@ -71,6 +71,7 @@ class ApiMain extends ApiBase { 'compare' => 'ApiComparePages', 'tokens' => 'ApiTokens', 'checktoken' => 'ApiCheckToken', + 'cspreport' => 'ApiCSPReport', // Write modules 'purge' => 'ApiPurge', @@ -137,7 +138,9 @@ class ApiMain extends ApiBase { */ private $mPrinter; - private $mModuleMgr, $mResult, $mErrorFormatter, $mContinuationManager; + private $mModuleMgr, $mResult, $mErrorFormatter; + /** @var ApiContinuationManager|null */ + private $mContinuationManager; private $mAction; private $mEnableWrite; private $mInternalMode, $mSquidMaxage; @@ -171,22 +174,53 @@ class ApiMain extends ApiBase { if ( isset( $request ) ) { $this->getContext()->setRequest( $request ); + } else { + $request = $this->getRequest(); } - $this->mInternalMode = ( $this->getRequest() instanceof FauxRequest ); + $this->mInternalMode = ( $request instanceof FauxRequest ); // Special handling for the main module: $parent === $this parent::__construct( $this, $this->mInternalMode ? 'main_int' : 'main' ); + $config = $this->getConfig(); + if ( !$this->mInternalMode ) { - // Impose module restrictions. - // If the current user cannot read, - // Remove all modules other than login - global $wgUser; + // Log if a request with a non-whitelisted Origin header is seen + // with session cookies. + $originHeader = $request->getHeader( 'Origin' ); + if ( $originHeader === false ) { + $origins = []; + } else { + $originHeader = trim( $originHeader ); + $origins = preg_split( '/\s+/', $originHeader ); + } + $sessionCookies = array_intersect( + array_keys( $_COOKIE ), + MediaWiki\Session\SessionManager::singleton()->getVaryCookies() + ); + if ( $origins && $sessionCookies && ( + count( $origins ) !== 1 || !self::matchOrigin( + $origins[0], + $config->get( 'CrossSiteAJAXdomains' ), + $config->get( 'CrossSiteAJAXdomainExceptions' ) + ) + ) ) { + MediaWiki\Logger\LoggerFactory::getInstance( 'cors' )->warning( + 'Non-whitelisted CORS request with session cookies', [ + 'origin' => $originHeader, + 'cookies' => $sessionCookies, + 'ip' => $request->getIP(), + 'userAgent' => $this->getUserAgent(), + 'wiki' => wfWikiID(), + ] + ); + } + // If we're in a mode that breaks the same-origin policy, strip + // user credentials for security. if ( $this->lacksSameOriginSecurity() ) { - // If we're in a mode that breaks the same-origin policy, strip - // user credentials for security. + global $wgUser; wfDebug( "API: stripping user credentials when the same-origin policy is not applied\n" ); $wgUser = new User(); $this->getContext()->setUser( $wgUser ); @@ -211,7 +245,6 @@ class ApiMain extends ApiBase { } } - $config = $this->getConfig(); $this->mModuleMgr = new ApiModuleManager( $this ); $this->mModuleMgr->addModules( self::$Modules, 'action' ); $this->mModuleMgr->addModules( $config->get( 'APIModules' ), 'action' ); @@ -265,6 +298,12 @@ class ApiMain extends ApiBase { return true; } + // Anonymous CORS + if ( $request->getVal( 'origin' ) === '*' ) { + $this->lacksSameOriginSecurity = true; + return true; + } + // Header to be used from XMLHTTPRequest when the request might // otherwise be used for XSS. if ( $request->getHeader( 'Treat-as-Untrusted' ) !== false ) { @@ -611,31 +650,49 @@ class ApiMain extends ApiBase { $request = $this->getRequest(); $response = $request->response(); - // Origin: header is a space-separated list of origins, check all of them - $originHeader = $request->getHeader( 'Origin' ); - if ( $originHeader === false ) { - $origins = []; + $matchOrigin = false; + $allowTiming = false; + $varyOrigin = true; + + if ( $originParam === '*' ) { + // Request for anonymous CORS + $matchOrigin = true; + $allowOrigin = '*'; + $allowCredentials = 'false'; + $varyOrigin = false; // No need to vary } else { - $originHeader = trim( $originHeader ); - $origins = preg_split( '/\s+/', $originHeader ); - } + // Non-anonymous CORS, check we allow the domain - if ( !in_array( $originParam, $origins ) ) { - // origin parameter set but incorrect - // Send a 403 response - $response->statusHeader( 403 ); - $response->header( 'Cache-Control: no-cache' ); - echo "'origin' parameter does not match Origin header\n"; + // Origin: header is a space-separated list of origins, check all of them + $originHeader = $request->getHeader( 'Origin' ); + if ( $originHeader === false ) { + $origins = []; + } else { + $originHeader = trim( $originHeader ); + $origins = preg_split( '/\s+/', $originHeader ); + } - return false; - } + if ( !in_array( $originParam, $origins ) ) { + // origin parameter set but incorrect + // Send a 403 response + $response->statusHeader( 403 ); + $response->header( 'Cache-Control: no-cache' ); + echo "'origin' parameter does not match Origin header\n"; - $config = $this->getConfig(); - $matchOrigin = count( $origins ) === 1 && self::matchOrigin( - $originParam, - $config->get( 'CrossSiteAJAXdomains' ), - $config->get( 'CrossSiteAJAXdomainExceptions' ) - ); + return false; + } + + $config = $this->getConfig(); + $matchOrigin = count( $origins ) === 1 && self::matchOrigin( + $originParam, + $config->get( 'CrossSiteAJAXdomains' ), + $config->get( 'CrossSiteAJAXdomainExceptions' ) + ); + + $allowOrigin = $originHeader; + $allowCredentials = 'true'; + $allowTiming = $originHeader; + } if ( $matchOrigin ) { $requestedMethod = $request->getHeader( 'Access-Control-Request-Method' ); @@ -659,10 +716,12 @@ class ApiMain extends ApiBase { $response->header( 'Access-Control-Allow-Methods: POST, GET' ); } - $response->header( "Access-Control-Allow-Origin: $originHeader" ); - $response->header( 'Access-Control-Allow-Credentials: true' ); + $response->header( "Access-Control-Allow-Origin: $allowOrigin" ); + $response->header( "Access-Control-Allow-Credentials: $allowCredentials" ); // http://www.w3.org/TR/resource-timing/#timing-allow-origin - $response->header( "Timing-Allow-Origin: $originHeader" ); + if ( $allowTiming !== false ) { + $response->header( "Timing-Allow-Origin: $allowTiming" ); + } if ( !$preflight ) { $response->header( @@ -671,7 +730,10 @@ class ApiMain extends ApiBase { } } - $this->getOutput()->addVaryHeader( 'Origin' ); + if ( $varyOrigin ) { + $this->getOutput()->addVaryHeader( 'Origin' ); + } + return true; } @@ -1901,6 +1963,14 @@ class UsageException extends MWException { parent::__construct( $message, $code ); $this->mCodestr = $codestr; $this->mExtraData = $extradata; + + // This should never happen, so throw an exception about it that will + // hopefully get logged with a backtrace (T138585) + if ( !is_string( $codestr ) || $codestr === '' ) { + throw new InvalidArgumentException( 'Invalid $codestr, was ' . + ( $codestr === '' ? 'empty string' : gettype( $codestr ) ) + ); + } } /** diff --git a/includes/api/ApiParse.php b/includes/api/ApiParse.php index fe418e3b0b..3e66cadbee 100644 --- a/includes/api/ApiParse.php +++ b/includes/api/ApiParse.php @@ -109,13 +109,13 @@ class ApiParse extends ApiBase { $titleObj = $rev->getTitle(); $wgTitle = $titleObj; $pageObj = WikiPage::factory( $titleObj ); - $popts = $this->makeParserOptions( $pageObj, $params ); + list( $popts, $reset, $suppressCache ) = $this->makeParserOptions( $pageObj, $params ); // If for some reason the "oldid" is actually the current revision, it may be cached // Deliberately comparing $pageObj->getLatest() with $rev->getId(), rather than // checking $rev->isCurrent(), because $pageObj is what actually ends up being used, // and if its ->getLatest() is outdated, $rev->isCurrent() won't tell us that. - if ( $rev->getId() == $pageObj->getLatest() ) { + if ( !$suppressCache && $rev->getId() == $pageObj->getLatest() ) { // May get from/save to parser cache $p_result = $this->getParsedContent( $pageObj, $popts, $pageid, isset( $prop['wikitext'] ) ); @@ -167,12 +167,12 @@ class ApiParse extends ApiBase { $oldid = $pageObj->getLatest(); } - $popts = $this->makeParserOptions( $pageObj, $params ); + list( $popts, $reset, $suppressCache ) = $this->makeParserOptions( $pageObj, $params ); // Don't pollute the parser cache when setting options that aren't // in ParserOptions::optionsHash() /// @todo: This should be handled closer to the actual cache instead of here, see T110269 - $suppressCache = + $suppressCache = $suppressCache || $params['disablepp'] || $params['disablelimitreport'] || $params['preview'] || @@ -202,7 +202,7 @@ class ApiParse extends ApiBase { $pageObj = $article->getPage(); } - $popts = $this->makeParserOptions( $pageObj, $params ); + list( $popts, $reset ) = $this->makeParserOptions( $pageObj, $params ); $textProvided = !is_null( $text ); if ( !$textProvided ) { @@ -346,22 +346,27 @@ class ApiParse extends ApiBase { } if ( isset( $prop['headitems'] ) || isset( $prop['headhtml'] ) ) { - $context = $this->getContext(); + $context = new DerivativeContext( $this->getContext() ); $context->setTitle( $titleObj ); - $context->getOutput()->addParserOutputMetadata( $p_result ); + $context->setWikiPage( $pageObj ); + + // We need an OutputPage tied to $context, not to the + // RequestContext at the root of the stack. + $output = new OutputPage( $context ); + $output->addParserOutputMetadata( $p_result ); if ( isset( $prop['headitems'] ) ) { $headItems = $this->formatHeadItems( $p_result->getHeadItems() ); - $css = $this->formatCss( $context->getOutput()->buildCssLinksArray() ); + $css = $this->formatCss( $output->buildCssLinksArray() ); - $scripts = [ $context->getOutput()->getHeadScripts() ]; + $scripts = [ $output->getHeadScripts() ]; $result_array['headitems'] = array_merge( $headItems, $css, $scripts ); } if ( isset( $prop['headhtml'] ) ) { - $result_array['headhtml'] = $context->getOutput()->headElement( $context->getSkin() ); + $result_array['headhtml'] = $output->headElement( $context->getSkin() ); $result_array[ApiResult::META_BC_SUBELEMENTS][] = 'headhtml'; } } @@ -470,10 +475,9 @@ class ApiParse extends ApiBase { * @param WikiPage $pageObj * @param array $params * - * @return ParserOptions + * @return array [ ParserOptions, ScopedCallback, bool $suppressCache ] */ protected function makeParserOptions( WikiPage $pageObj, array $params ) { - $popts = $pageObj->makeParserOptions( $this->getContext() ); $popts->enableLimitReport( !$params['disablepp'] && !$params['disablelimitreport'] ); $popts->setIsPreview( $params['preview'] || $params['sectionpreview'] ); @@ -483,7 +487,12 @@ class ApiParse extends ApiBase { $popts->setTidy( false ); } - return $popts; + $reset = null; + $suppressCache = false; + Hooks::run( 'ApiMakeParserOptions', + [ $popts, $pageObj->getTitle(), $params, $this, &$reset, &$suppressCache ] ); + + return [ $popts, $reset, $suppressCache ]; } /** diff --git a/includes/api/ApiQuery.php b/includes/api/ApiQuery.php index ed4d373a7c..1e912561bc 100644 --- a/includes/api/ApiQuery.php +++ b/includes/api/ApiQuery.php @@ -443,16 +443,14 @@ class ApiQuery extends ApiBase { } $exporter = new WikiExporter( $this->getDB() ); - // WikiExporter writes to stdout, so catch its - // output with an ob - ob_start(); + $sink = new DumpStringOutput; + $exporter->setOutputSink( $sink ); $exporter->openStream(); foreach ( $exportTitles as $title ) { $exporter->pageByTitle( $title ); } $exporter->closeStream(); - $exportxml = ob_get_contents(); - ob_end_clean(); + $exportxml = $sink->getOutput(); // Don't check the size of exported stuff // It's not continuable, so it would cause more diff --git a/includes/api/ApiQueryPrefixSearch.php b/includes/api/ApiQueryPrefixSearch.php index 46538e0eb1..39b0212578 100644 --- a/includes/api/ApiQueryPrefixSearch.php +++ b/includes/api/ApiQueryPrefixSearch.php @@ -1,5 +1,4 @@ hasInterwikiResults() ) { - foreach ( $matches->getInterwikiResults() as $matches ) { - $matches = $matches->getInterwikiResults(); + foreach ( $matches->getInterwikiResults() as $interwikiMatches ) { $hasInterwikiResults = true; // Include number of results if requested if ( $resultPageSet === null && isset( $searchInfo['totalhits'] ) ) { - $totalhits += $matches->getTotalHits(); + $totalhits += $interwikiMatches->getTotalHits(); } - $result = $matches->next(); + $result = $interwikiMatches->next(); while ( $result ) { $title = $result->getTitle(); @@ -267,7 +266,7 @@ class ApiQuerySearch extends ApiQueryGeneratorBase { $titles[] = $title; } - $result = $matches->next(); + $result = $interwikiMatches->next(); } } if ( $totalhits !== null ) { diff --git a/includes/api/ApiQuerySiteinfo.php b/includes/api/ApiQuerySiteinfo.php index 590a71265e..97042afe15 100644 --- a/includes/api/ApiQuerySiteinfo.php +++ b/includes/api/ApiQuerySiteinfo.php @@ -181,6 +181,10 @@ class ApiQuerySiteinfo extends ApiQueryBase { $data['legaltitlechars'] = Title::legalChars(); $data['invalidusernamechars'] = $config->get( 'InvalidUsernameCharacters' ); + $data['allunicodefixes'] = (bool)$config->get( 'AllUnicodeFixes' ); + $data['fixarabicunicode'] = (bool)$config->get( 'FixArabicUnicode' ); + $data['fixmalayalamunicode'] = (bool)$config->get( 'FixMalayalamUnicode' ); + global $IP; $git = SpecialVersion::getGitHeadSha1( $IP ); if ( $git ) { @@ -221,6 +225,8 @@ class ApiQuerySiteinfo extends ApiQueryBase { } $data['writeapi'] = (bool)$config->get( 'EnableWriteAPI' ); + $data['maxarticlesize'] = $config->get( 'MaxArticleSize' ) * 1024; + $tz = $config->get( 'Localtimezone' ); $offset = $config->get( 'LocalTZoffset' ); if ( is_null( $tz ) ) { diff --git a/includes/api/ApiQueryWatchlist.php b/includes/api/ApiQueryWatchlist.php index db2cf86714..e2599d1d8e 100644 --- a/includes/api/ApiQueryWatchlist.php +++ b/includes/api/ApiQueryWatchlist.php @@ -24,6 +24,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * This query action allows clients to retrieve a list of recently modified pages * that are part of the logged-in user's watchlist. @@ -85,96 +87,59 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { } } - $this->addFields( [ - 'rc_id', - 'rc_namespace', - 'rc_title', - 'rc_timestamp', - 'rc_type', - 'rc_deleted', - ] ); + $options = [ + 'dir' => $params['dir'] === 'older' + ? WatchedItemQueryService::DIR_OLDER + : WatchedItemQueryService::DIR_NEWER, + ]; if ( is_null( $resultPageSet ) ) { - $this->addFields( [ - 'rc_cur_id', - 'rc_this_oldid', - 'rc_last_oldid', - ] ); - - $this->addFieldsIf( [ 'rc_type', 'rc_minor', 'rc_bot' ], $this->fld_flags ); - $this->addFieldsIf( 'rc_user', $this->fld_user || $this->fld_userid ); - $this->addFieldsIf( 'rc_user_text', $this->fld_user ); - $this->addFieldsIf( 'rc_comment', $this->fld_comment || $this->fld_parsedcomment ); - $this->addFieldsIf( [ 'rc_patrolled', 'rc_log_type' ], $this->fld_patrol ); - $this->addFieldsIf( [ 'rc_old_len', 'rc_new_len' ], $this->fld_sizes ); - $this->addFieldsIf( 'wl_notificationtimestamp', $this->fld_notificationtimestamp ); - $this->addFieldsIf( - [ 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ], - $this->fld_loginfo - ); - } elseif ( $params['allrev'] ) { - $this->addFields( 'rc_this_oldid' ); + $options['includeFields'] = $this->getFieldsToInclude(); } else { - $this->addFields( 'rc_cur_id' ); + $options['usedInGenerator'] = true; } - $this->addTables( [ - 'recentchanges', - 'watchlist', - ] ); - - $userId = $wlowner->getId(); - $this->addJoinConds( [ 'watchlist' => [ 'INNER JOIN', - [ - 'wl_user' => $userId, - 'wl_namespace=rc_namespace', - 'wl_title=rc_title' - ] - ] ] ); - - $db = $this->getDB(); - - $this->addTimestampWhereRange( 'rc_timestamp', $params['dir'], - $params['start'], $params['end'] ); - // Include in ORDER BY for uniqueness - $this->addWhereRange( 'rc_id', $params['dir'], null, null ); + if ( $params['start'] ) { + $options['start'] = $params['start']; + } + if ( $params['end'] ) { + $options['end'] = $params['end']; + } if ( !is_null( $params['continue'] ) ) { $cont = explode( '|', $params['continue'] ); $this->dieContinueUsageIf( count( $cont ) != 2 ); - $op = ( $params['dir'] === 'newer' ? '>' : '<' ); - $continueTimestamp = $db->addQuotes( $db->timestamp( $cont[0] ) ); + $continueTimestamp = $cont[0]; $continueId = (int)$cont[1]; $this->dieContinueUsageIf( $continueId != $cont[1] ); - $this->addWhere( "rc_timestamp $op $continueTimestamp OR " . - "(rc_timestamp = $continueTimestamp AND " . - "rc_id $op= $continueId)" - ); + $options['startFrom'] = [ $continueTimestamp, $continueId ]; } - $this->addWhereFld( 'wl_namespace', $params['namespace'] ); + if ( $wlowner !== $user ) { + $options['watchlistOwner'] = $wlowner; + $options['watchlistOwnerToken'] = $params['token']; + } - if ( !$params['allrev'] ) { - $this->addTables( 'page' ); - $this->addJoinConds( [ 'page' => [ 'LEFT JOIN', 'rc_cur_id=page_id' ] ] ); - $this->addWhere( 'rc_this_oldid=page_latest OR rc_type=' . RC_LOG ); + if ( !is_null( $params['namespace'] ) ) { + $options['namespaceIds'] = $params['namespace']; + } + + if ( $params['allrev'] ) { + $options['allRevisions'] = true; } if ( !is_null( $params['show'] ) ) { $show = array_flip( $params['show'] ); /* Check for conflicting parameters. */ - if ( ( isset( $show['minor'] ) && isset( $show['!minor'] ) ) - || ( isset( $show['bot'] ) && isset( $show['!bot'] ) ) - || ( isset( $show['anon'] ) && isset( $show['!anon'] ) ) - || ( isset( $show['patrolled'] ) && isset( $show['!patrolled'] ) ) - || ( isset( $show['unread'] ) && isset( $show['!unread'] ) ) - ) { + if ( $this->showParamsConflicting( $show ) ) { $this->dieUsageMsg( 'show' ); } // Check permissions. - if ( isset( $show['patrolled'] ) || isset( $show['!patrolled'] ) ) { + if ( isset( $show[WatchedItemQueryService::FILTER_PATROLLED] ) + || isset( $show[WatchedItemQueryService::FILTER_NOT_PATROLLED] ) + ) { if ( !$user->useRCPatrol() && !$user->useNPPatrol() ) { $this->dieUsage( 'You need the patrol right to request the patrolled flag', @@ -183,25 +148,12 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { } } - /* Add additional conditions to query depending upon parameters. */ - $this->addWhereIf( 'rc_minor = 0', isset( $show['!minor'] ) ); - $this->addWhereIf( 'rc_minor != 0', isset( $show['minor'] ) ); - $this->addWhereIf( 'rc_bot = 0', isset( $show['!bot'] ) ); - $this->addWhereIf( 'rc_bot != 0', isset( $show['bot'] ) ); - $this->addWhereIf( 'rc_user = 0', isset( $show['anon'] ) ); - $this->addWhereIf( 'rc_user != 0', isset( $show['!anon'] ) ); - $this->addWhereIf( 'rc_patrolled = 0', isset( $show['!patrolled'] ) ); - $this->addWhereIf( 'rc_patrolled != 0', isset( $show['patrolled'] ) ); - $this->addWhereIf( 'rc_timestamp >= wl_notificationtimestamp', isset( $show['unread'] ) ); - $this->addWhereIf( - 'wl_notificationtimestamp IS NULL OR rc_timestamp < wl_notificationtimestamp', - isset( $show['!unread'] ) - ); + $options['filters'] = array_keys( $show ); } if ( !is_null( $params['type'] ) ) { try { - $this->addWhereFld( 'rc_type', RecentChange::parseToRCType( $params['type'] ) ); + $options['rcTypes'] = RecentChange::parseToRCType( $params['type'] ); } catch ( Exception $e ) { ApiBase::dieDebug( __METHOD__, $e->getMessage() ); } @@ -211,74 +163,46 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { $this->dieUsage( 'user and excludeuser cannot be used together', 'user-excludeuser' ); } if ( !is_null( $params['user'] ) ) { - $this->addWhereFld( 'rc_user_text', $params['user'] ); + $options['onlyByUser'] = $params['user']; } if ( !is_null( $params['excludeuser'] ) ) { - $this->addWhere( 'rc_user_text != ' . $db->addQuotes( $params['excludeuser'] ) ); + $options['notByUser'] = $params['excludeuser']; } - // This is an index optimization for mysql, as done in the Special:Watchlist page - $this->addWhereIf( - "rc_timestamp > ''", - !isset( $params['start'] ) && !isset( $params['end'] ) && $db->getType() == 'mysql' - ); - - // Paranoia: avoid brute force searches (bug 17342) - if ( !is_null( $params['user'] ) || !is_null( $params['excludeuser'] ) ) { - if ( !$user->isAllowed( 'deletedhistory' ) ) { - $bitmask = Revision::DELETED_USER; - } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) { - $bitmask = Revision::DELETED_USER | Revision::DELETED_RESTRICTED; - } else { - $bitmask = 0; - } - if ( $bitmask ) { - $this->addWhere( $this->getDB()->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask" ); - } - } - - // LogPage::DELETED_ACTION hides the affected page, too. So hide those - // entirely from the watchlist, or someone could guess the title. - if ( !$user->isAllowed( 'deletedhistory' ) ) { - $bitmask = LogPage::DELETED_ACTION; - } elseif ( !$user->isAllowedAny( 'suppressrevision', 'viewsuppressed' ) ) { - $bitmask = LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED; - } else { - $bitmask = 0; - } - if ( $bitmask ) { - $this->addWhere( $this->getDB()->makeList( [ - 'rc_type != ' . RC_LOG, - $this->getDB()->bitAnd( 'rc_deleted', $bitmask ) . " != $bitmask", - ], LIST_OR ) ); - } - - $this->addOption( 'LIMIT', $params['limit'] + 1 ); + $options['limit'] = $params['limit'] + 1; $ids = []; $count = 0; - $res = $this->select( __METHOD__ ); + $watchedItemQuery = MediaWikiServices::getInstance()->getWatchedItemQueryService(); + $items = $watchedItemQuery->getWatchedItemsWithRecentChangeInfo( $wlowner, $options ); - foreach ( $res as $row ) { + foreach ( $items as list ( $watchedItem, $recentChangeInfo ) ) { + /** @var WatchedItem $watchedItem */ if ( ++$count > $params['limit'] ) { // We've reached the one extra which shows that there are // additional pages to be had. Stop here... - $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" ); + $this->setContinueEnumParameter( + 'continue', + $recentChangeInfo['rc_timestamp'] . '|' . $recentChangeInfo['rc_id'] + ); break; } if ( is_null( $resultPageSet ) ) { - $vals = $this->extractRowInfo( $row ); + $vals = $this->extractOutputData( $watchedItem, $recentChangeInfo ); $fit = $this->getResult()->addValue( [ 'query', $this->getModuleName() ], null, $vals ); if ( !$fit ) { - $this->setContinueEnumParameter( 'continue', "$row->rc_timestamp|$row->rc_id" ); + $this->setContinueEnumParameter( + 'continue', + $recentChangeInfo['rc_timestamp'] . '|' . $recentChangeInfo['rc_id'] + ); break; } } else { if ( $params['allrev'] ) { - $ids[] = intval( $row->rc_this_oldid ); + $ids[] = intval( $recentChangeInfo['rc_this_oldid'] ); } else { - $ids[] = intval( $row->rc_cur_id ); + $ids[] = intval( $recentChangeInfo['rc_cur_id'] ); } } } @@ -295,56 +219,106 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { } } - private function extractRowInfo( $row ) { + private function getFieldsToInclude() { + $includeFields = []; + if ( $this->fld_flags ) { + $includeFields[] = WatchedItemQueryService::INCLUDE_FLAGS; + } + if ( $this->fld_user || $this->fld_userid ) { + $includeFields[] = WatchedItemQueryService::INCLUDE_USER_ID; + } + if ( $this->fld_user ) { + $includeFields[] = WatchedItemQueryService::INCLUDE_USER; + } + if ( $this->fld_comment || $this->fld_parsedcomment ) { + $includeFields[] = WatchedItemQueryService::INCLUDE_COMMENT; + } + if ( $this->fld_patrol ) { + $includeFields[] = WatchedItemQueryService::INCLUDE_PATROL_INFO; + } + if ( $this->fld_sizes ) { + $includeFields[] = WatchedItemQueryService::INCLUDE_SIZES; + } + if ( $this->fld_loginfo ) { + $includeFields[] = WatchedItemQueryService::INCLUDE_LOG_INFO; + } + return $includeFields; + } + + private function showParamsConflicting( array $show ) { + return ( isset( $show[WatchedItemQueryService::FILTER_MINOR] ) + && isset( $show[WatchedItemQueryService::FILTER_NOT_MINOR] ) ) + || ( isset( $show[WatchedItemQueryService::FILTER_BOT] ) + && isset( $show[WatchedItemQueryService::FILTER_NOT_BOT] ) ) + || ( isset( $show[WatchedItemQueryService::FILTER_ANON] ) + && isset( $show[WatchedItemQueryService::FILTER_NOT_ANON] ) ) + || ( isset( $show[WatchedItemQueryService::FILTER_PATROLLED] ) + && isset( $show[WatchedItemQueryService::FILTER_NOT_PATROLLED] ) ) + || ( isset( $show[WatchedItemQueryService::FILTER_UNREAD] ) + && isset( $show[WatchedItemQueryService::FILTER_NOT_UNREAD] ) ); + } + + private function extractOutputData( WatchedItem $watchedItem, array $recentChangeInfo ) { /* Determine the title of the page that has been changed. */ - $title = Title::makeTitle( $row->rc_namespace, $row->rc_title ); + $title = Title::makeTitle( + $watchedItem->getLinkTarget()->getNamespace(), + $watchedItem->getLinkTarget()->getDBkey() + ); $user = $this->getUser(); /* Our output data. */ $vals = []; - $type = intval( $row->rc_type ); + $type = intval( $recentChangeInfo['rc_type'] ); $vals['type'] = RecentChange::parseFromRCType( $type ); $anyHidden = false; /* Create a new entry in the result for the title. */ if ( $this->fld_title || $this->fld_ids ) { // These should already have been filtered out of the query, but just in case. - if ( $type === RC_LOG && ( $row->rc_deleted & LogPage::DELETED_ACTION ) ) { + if ( $type === RC_LOG && ( $recentChangeInfo['rc_deleted'] & LogPage::DELETED_ACTION ) ) { $vals['actionhidden'] = true; $anyHidden = true; } if ( $type !== RC_LOG || - LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user ) + LogEventsList::userCanBitfield( + $recentChangeInfo['rc_deleted'], + LogPage::DELETED_ACTION, + $user + ) ) { if ( $this->fld_title ) { ApiQueryBase::addTitleInfo( $vals, $title ); } if ( $this->fld_ids ) { - $vals['pageid'] = intval( $row->rc_cur_id ); - $vals['revid'] = intval( $row->rc_this_oldid ); - $vals['old_revid'] = intval( $row->rc_last_oldid ); + $vals['pageid'] = intval( $recentChangeInfo['rc_cur_id'] ); + $vals['revid'] = intval( $recentChangeInfo['rc_this_oldid'] ); + $vals['old_revid'] = intval( $recentChangeInfo['rc_last_oldid'] ); } } } /* Add user data and 'anon' flag, if user is anonymous. */ if ( $this->fld_user || $this->fld_userid ) { - if ( $row->rc_deleted & Revision::DELETED_USER ) { + if ( $recentChangeInfo['rc_deleted'] & Revision::DELETED_USER ) { $vals['userhidden'] = true; $anyHidden = true; } - if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_USER, $user ) ) { + if ( Revision::userCanBitfield( + $recentChangeInfo['rc_deleted'], + Revision::DELETED_USER, + $user + ) ) { if ( $this->fld_userid ) { - $vals['userid'] = (int)$row->rc_user; + $vals['userid'] = (int)$recentChangeInfo['rc_user']; // for backwards compatibility - $vals['user'] = (int)$row->rc_user; + $vals['user'] = (int)$recentChangeInfo['rc_user']; } if ( $this->fld_user ) { - $vals['user'] = $row->rc_user_text; + $vals['user'] = $recentChangeInfo['rc_user_text']; } - if ( !$row->rc_user ) { + if ( !$recentChangeInfo['rc_user'] ) { $vals['anon'] = true; } } @@ -352,65 +326,73 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { /* Add flags, such as new, minor, bot. */ if ( $this->fld_flags ) { - $vals['bot'] = (bool)$row->rc_bot; - $vals['new'] = $row->rc_type == RC_NEW; - $vals['minor'] = (bool)$row->rc_minor; + $vals['bot'] = (bool)$recentChangeInfo['rc_bot']; + $vals['new'] = $recentChangeInfo['rc_type'] == RC_NEW; + $vals['minor'] = (bool)$recentChangeInfo['rc_minor']; } /* Add sizes of each revision. (Only available on 1.10+) */ if ( $this->fld_sizes ) { - $vals['oldlen'] = intval( $row->rc_old_len ); - $vals['newlen'] = intval( $row->rc_new_len ); + $vals['oldlen'] = intval( $recentChangeInfo['rc_old_len'] ); + $vals['newlen'] = intval( $recentChangeInfo['rc_new_len'] ); } /* Add the timestamp. */ if ( $this->fld_timestamp ) { - $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $row->rc_timestamp ); + $vals['timestamp'] = wfTimestamp( TS_ISO_8601, $recentChangeInfo['rc_timestamp'] ); } if ( $this->fld_notificationtimestamp ) { - $vals['notificationtimestamp'] = ( $row->wl_notificationtimestamp == null ) + $vals['notificationtimestamp'] = ( $watchedItem->getNotificationTimestamp() == null ) ? '' - : wfTimestamp( TS_ISO_8601, $row->wl_notificationtimestamp ); + : wfTimestamp( TS_ISO_8601, $watchedItem->getNotificationTimestamp() ); } /* Add edit summary / log summary. */ if ( $this->fld_comment || $this->fld_parsedcomment ) { - if ( $row->rc_deleted & Revision::DELETED_COMMENT ) { + if ( $recentChangeInfo['rc_deleted'] & Revision::DELETED_COMMENT ) { $vals['commenthidden'] = true; $anyHidden = true; } - if ( Revision::userCanBitfield( $row->rc_deleted, Revision::DELETED_COMMENT, $user ) ) { - if ( $this->fld_comment && isset( $row->rc_comment ) ) { - $vals['comment'] = $row->rc_comment; + if ( Revision::userCanBitfield( + $recentChangeInfo['rc_deleted'], + Revision::DELETED_COMMENT, + $user + ) ) { + if ( $this->fld_comment && isset( $recentChangeInfo['rc_comment'] ) ) { + $vals['comment'] = $recentChangeInfo['rc_comment']; } - if ( $this->fld_parsedcomment && isset( $row->rc_comment ) ) { - $vals['parsedcomment'] = Linker::formatComment( $row->rc_comment, $title ); + if ( $this->fld_parsedcomment && isset( $recentChangeInfo['rc_comment'] ) ) { + $vals['parsedcomment'] = Linker::formatComment( $recentChangeInfo['rc_comment'], $title ); } } } /* Add the patrolled flag */ if ( $this->fld_patrol ) { - $vals['patrolled'] = $row->rc_patrolled == 1; - $vals['unpatrolled'] = ChangesList::isUnpatrolled( $row, $user ); + $vals['patrolled'] = $recentChangeInfo['rc_patrolled'] == 1; + $vals['unpatrolled'] = ChangesList::isUnpatrolled( (object)$recentChangeInfo, $user ); } - if ( $this->fld_loginfo && $row->rc_type == RC_LOG ) { - if ( $row->rc_deleted & LogPage::DELETED_ACTION ) { + if ( $this->fld_loginfo && $recentChangeInfo['rc_type'] == RC_LOG ) { + if ( $recentChangeInfo['rc_deleted'] & LogPage::DELETED_ACTION ) { $vals['actionhidden'] = true; $anyHidden = true; } - if ( LogEventsList::userCanBitfield( $row->rc_deleted, LogPage::DELETED_ACTION, $user ) ) { - $vals['logid'] = intval( $row->rc_logid ); - $vals['logtype'] = $row->rc_log_type; - $vals['logaction'] = $row->rc_log_action; - $vals['logparams'] = LogFormatter::newFromRow( $row )->formatParametersForApi(); + if ( LogEventsList::userCanBitfield( + $recentChangeInfo['rc_deleted'], + LogPage::DELETED_ACTION, + $user + ) ) { + $vals['logid'] = intval( $recentChangeInfo['rc_logid'] ); + $vals['logtype'] = $recentChangeInfo['rc_log_type']; + $vals['logaction'] = $recentChangeInfo['rc_log_action']; + $vals['logparams'] = LogFormatter::newFromRow( $recentChangeInfo )->formatParametersForApi(); } } - if ( $anyHidden && ( $row->rc_deleted & Revision::DELETED_RESTRICTED ) ) { + if ( $anyHidden && ( $recentChangeInfo['rc_deleted'] & Revision::DELETED_RESTRICTED ) ) { $vals['suppressed'] = true; } @@ -473,16 +455,16 @@ class ApiQueryWatchlist extends ApiQueryGeneratorBase { 'show' => [ ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => [ - 'minor', - '!minor', - 'bot', - '!bot', - 'anon', - '!anon', - 'patrolled', - '!patrolled', - 'unread', - '!unread', + WatchedItemQueryService::FILTER_MINOR, + WatchedItemQueryService::FILTER_NOT_MINOR, + WatchedItemQueryService::FILTER_BOT, + WatchedItemQueryService::FILTER_NOT_BOT, + WatchedItemQueryService::FILTER_ANON, + WatchedItemQueryService::FILTER_NOT_ANON, + WatchedItemQueryService::FILTER_PATROLLED, + WatchedItemQueryService::FILTER_NOT_PATROLLED, + WatchedItemQueryService::FILTER_UNREAD, + WatchedItemQueryService::FILTER_NOT_UNREAD, ] ], 'type' => [ diff --git a/includes/api/ApiQueryWatchlistRaw.php b/includes/api/ApiQueryWatchlistRaw.php index 742f8f54ba..806861e800 100644 --- a/includes/api/ApiQueryWatchlistRaw.php +++ b/includes/api/ApiQueryWatchlistRaw.php @@ -24,6 +24,8 @@ * @file */ +use MediaWiki\MediaWikiServices; + /** * This query action allows clients to retrieve a list of pages * on the logged-in user's watchlist. @@ -49,95 +51,78 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase { * @return void */ private function run( $resultPageSet = null ) { - $this->selectNamedDB( 'watchlist', DB_SLAVE, 'watchlist' ); - $params = $this->extractRequestParams(); $user = $this->getWatchlistUser( $params ); $prop = array_flip( (array)$params['prop'] ); $show = array_flip( (array)$params['show'] ); - if ( isset( $show['changed'] ) && isset( $show['!changed'] ) ) { + if ( isset( $show[WatchedItemQueryService::FILTER_CHANGED] ) + && isset( $show[WatchedItemQueryService::FILTER_NOT_CHANGED] ) + ) { $this->dieUsageMsg( 'show' ); } - $this->addTables( 'watchlist' ); - $this->addFields( [ 'wl_namespace', 'wl_title' ] ); - $this->addFieldsIf( 'wl_notificationtimestamp', isset( $prop['changed'] ) ); - $this->addWhereFld( 'wl_user', $user->getId() ); - $this->addWhereFld( 'wl_namespace', $params['namespace'] ); - $this->addWhereIf( 'wl_notificationtimestamp IS NOT NULL', isset( $show['changed'] ) ); - $this->addWhereIf( 'wl_notificationtimestamp IS NULL', isset( $show['!changed'] ) ); + $options = []; + if ( $params['namespace'] ) { + $options['namespaceIds'] = $params['namespace']; + } + if ( isset( $show[WatchedItemQueryService::FILTER_CHANGED] ) ) { + $options['filter'] = WatchedItemQueryService::FILTER_CHANGED; + } + if ( isset( $show[WatchedItemQueryService::FILTER_NOT_CHANGED] ) ) { + $options['filter'] = WatchedItemQueryService::FILTER_NOT_CHANGED; + } if ( isset( $params['continue'] ) ) { $cont = explode( '|', $params['continue'] ); $this->dieContinueUsageIf( count( $cont ) != 2 ); $ns = intval( $cont[0] ); $this->dieContinueUsageIf( strval( $ns ) !== $cont[0] ); - $title = $this->getDB()->addQuotes( $cont[1] ); - $op = $params['dir'] == 'ascending' ? '>' : '<'; - $this->addWhere( - "wl_namespace $op $ns OR " . - "(wl_namespace = $ns AND " . - "wl_title $op= $title)" - ); + $title = $cont[1]; + $options['startFrom'] = new TitleValue( $ns, $title ); } if ( isset( $params['fromtitle'] ) ) { list( $ns, $title ) = $this->prefixedTitlePartToKey( $params['fromtitle'] ); - $title = $this->getDB()->addQuotes( $title ); - $op = $params['dir'] == 'ascending' ? '>' : '<'; - $this->addWhere( - "wl_namespace $op $ns OR " . - "(wl_namespace = $ns AND " . - "wl_title $op= $title)" - ); + $options['from'] = new TitleValue( $ns, $title ); } if ( isset( $params['totitle'] ) ) { list( $ns, $title ) = $this->prefixedTitlePartToKey( $params['totitle'] ); - $title = $this->getDB()->addQuotes( $title ); - $op = $params['dir'] == 'ascending' ? '<' : '>'; // Reversed from above! - $this->addWhere( - "wl_namespace $op $ns OR " . - "(wl_namespace = $ns AND " . - "wl_title $op= $title)" - ); + $options['until'] = new TitleValue( $ns, $title ); } - $sort = ( $params['dir'] == 'descending' ? ' DESC' : '' ); - // Don't ORDER BY wl_namespace if it's constant in the WHERE clause - if ( count( $params['namespace'] ) == 1 ) { - $this->addOption( 'ORDER BY', 'wl_title' . $sort ); - } else { - $this->addOption( 'ORDER BY', [ - 'wl_namespace' . $sort, - 'wl_title' . $sort - ] ); + $options['sort'] = WatchedItemStore::SORT_ASC; + if ( $params['dir'] === 'descending' ) { + $options['sort'] = WatchedItemStore::SORT_DESC; } - $this->addOption( 'LIMIT', $params['limit'] + 1 ); - $res = $this->select( __METHOD__ ); + $options['limit'] = $params['limit'] + 1; $titles = []; $count = 0; - foreach ( $res as $row ) { + $items = MediaWikiServices::getInstance()->getWatchedItemQueryService() + ->getWatchedItemsForUser( $user, $options ); + foreach ( $items as $item ) { + $ns = $item->getLinkTarget()->getNamespace(); + $dbKey = $item->getLinkTarget()->getDBkey(); if ( ++$count > $params['limit'] ) { // We've reached the one extra which shows that there are // additional pages to be had. Stop here... - $this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' . $row->wl_title ); + $this->setContinueEnumParameter( 'continue', $ns . '|' . $dbKey ); break; } - $t = Title::makeTitle( $row->wl_namespace, $row->wl_title ); + $t = Title::makeTitle( $ns, $dbKey ); if ( is_null( $resultPageSet ) ) { $vals = []; ApiQueryBase::addTitleInfo( $vals, $t ); - if ( isset( $prop['changed'] ) && !is_null( $row->wl_notificationtimestamp ) ) { - $vals['changed'] = wfTimestamp( TS_ISO_8601, $row->wl_notificationtimestamp ); + if ( isset( $prop['changed'] ) && !is_null( $item->getNotificationTimestamp() ) ) { + $vals['changed'] = wfTimestamp( TS_ISO_8601, $item->getNotificationTimestamp() ); } $fit = $this->getResult()->addValue( $this->getModuleName(), null, $vals ); if ( !$fit ) { - $this->setContinueEnumParameter( 'continue', $row->wl_namespace . '|' . $row->wl_title ); + $this->setContinueEnumParameter( 'continue', $ns . '|' . $dbKey ); break; } } else { @@ -177,8 +162,8 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase { 'show' => [ ApiBase::PARAM_ISMULTI => true, ApiBase::PARAM_TYPE => [ - 'changed', - '!changed', + WatchedItemQueryService::FILTER_CHANGED, + WatchedItemQueryService::FILTER_NOT_CHANGED ] ], 'owner' => [ @@ -193,7 +178,6 @@ class ApiQueryWatchlistRaw extends ApiQueryGeneratorBase { 'ascending', 'descending' ], - ApiBase::PARAM_HELP_MSG => 'api-help-param-direction', ], 'fromtitle' => [ ApiBase::PARAM_TYPE => 'string' diff --git a/includes/api/ApiStashEdit.php b/includes/api/ApiStashEdit.php index 814a111ee4..446a98cf83 100644 --- a/includes/api/ApiStashEdit.php +++ b/includes/api/ApiStashEdit.php @@ -122,7 +122,7 @@ class ApiStashEdit extends ApiBase { if ( $user->pingLimiter( 'stashedit' ) ) { $status = 'ratelimited'; } elseif ( $dbw->lock( $key, __METHOD__, 1 ) ) { - $status = self::parseAndStash( $page, $content, $user ); + $status = self::parseAndStash( $page, $content, $user, $params['summary'] ); $dbw->unlock( $key, __METHOD__ ); } else { $status = 'busy'; @@ -135,12 +135,13 @@ class ApiStashEdit extends ApiBase { /** * @param WikiPage $page - * @param Content $content + * @param Content $content Edit content * @param User $user + * @param string $summary Edit summary * @return integer ApiStashEdit::ERROR_* constant * @since 1.25 */ - public static function parseAndStash( WikiPage $page, Content $content, User $user ) { + public static function parseAndStash( WikiPage $page, Content $content, User $user, $summary ) { $cache = ObjectCache::getLocalClusterInstance(); $logger = LoggerFactory::getInstance( 'StashEdit' ); @@ -152,9 +153,10 @@ class ApiStashEdit extends ApiBase { $key = self::getStashKey( $title, $content, $user ); // Let extensions add ParserOutput metadata or warm other caches - Hooks::run( 'ParserOutputStashForEdit', [ $page, $content, $editInfo->output ] ); + Hooks::run( 'ParserOutputStashForEdit', + [ $page, $content, $editInfo->output, $summary, $user ] ); - list( $stashInfo, $ttl ) = self::buildStashValue( + list( $stashInfo, $ttl, $code ) = self::buildStashValue( $editInfo->pstContent, $editInfo->output, $editInfo->timestamp, @@ -171,7 +173,7 @@ class ApiStashEdit extends ApiBase { return self::ERROR_CACHE; } } else { - $logger->info( "Uncacheable parser output for key '$key' ('$title')." ); + $logger->info( "Uncacheable parser output for key '$key' ('$title') [$code]." ); return self::ERROR_UNCACHEABLE; } } @@ -179,77 +181,6 @@ class ApiStashEdit extends ApiBase { return self::ERROR_PARSE; } - /** - * Attempt to cache PST content and corresponding parser output in passing - * - * This method can be called when the output was already generated for other - * reasons. Parsing should not be done just to call this method, however. - * $pstOpts must be that of the user doing the edit preview. If $pOpts does - * not match the options of WikiPage::makeParserOptions( 'canonical' ), this - * will do nothing. Provided the values are cacheable, they will be stored - * in memcached so that final edit submission might make use of them. - * - * @param Page|Article|WikiPage $page Page title - * @param Content $content Proposed page content - * @param Content $pstContent The result of preSaveTransform() on $content - * @param ParserOutput $pOut The result of getParserOutput() on $pstContent - * @param ParserOptions $pstOpts Options for $pstContent (MUST be for prospective author) - * @param ParserOptions $pOpts Options for $pOut - * @param string $timestamp TS_MW timestamp of parser output generation - * @return bool Success - */ - public static function stashEditFromPreview( - Page $page, Content $content, Content $pstContent, ParserOutput $pOut, - ParserOptions $pstOpts, ParserOptions $pOpts, $timestamp - ) { - $cache = ObjectCache::getLocalClusterInstance(); - $logger = LoggerFactory::getInstance( 'StashEdit' ); - - // getIsPreview() controls parser function behavior that references things - // like user/revision that don't exists yet. The user/text should already - // be set correctly by callers, just double check the preview flag. - if ( !$pOpts->getIsPreview() ) { - return false; // sanity - } elseif ( $pOpts->getIsSectionPreview() ) { - return false; // short-circuit (need the full content) - } - - // PST parser options are for the user (handles signatures, etc...) - $user = $pstOpts->getUser(); - // Get a key based on the source text, format, and user preferences - $title = $page->getTitle(); - $key = self::getStashKey( $title, $content, $user ); - - // Parser output options must match cannonical options. - // Treat some options as matching that are different but don't matter. - $canonicalPOpts = $page->makeParserOptions( 'canonical' ); - $canonicalPOpts->setIsPreview( true ); // force match - $canonicalPOpts->setTimestamp( $pOpts->getTimestamp() ); // force match - if ( !$pOpts->matches( $canonicalPOpts ) ) { - $logger->info( "Uncacheable preview output for key '$key' ('$title') [options]." ); - return false; - } - - // Set the time the output was generated - $pOut->setCacheTime( wfTimestampNow() ); - - // Build a value to cache with a proper TTL - list( $stashInfo, $ttl ) = self::buildStashValue( $pstContent, $pOut, $timestamp, $user ); - if ( !$stashInfo ) { - $logger->info( "Uncacheable parser output for key '$key' ('$title') [rev/TTL]." ); - return false; - } - - $ok = $cache->set( $key, $stashInfo, $ttl ); - if ( !$ok ) { - $logger->error( "Failed to cache preview parser output for key '$key' ('$title')." ); - } else { - $logger->debug( "Cached preview output for key '$key'." ); - } - - return $ok; - } - /** * Check that a prepared edit is in cache and still up-to-date * @@ -303,27 +234,37 @@ class ApiStashEdit extends ApiBase { $age = time() - wfTimestamp( TS_UNIX, $editInfo->output->getCacheTime() ); if ( $age <= self::PRESUME_FRESH_TTL_SEC ) { + // Assume nothing changed in this time $stats->increment( 'editstash.cache_hits.presumed_fresh' ); $logger->debug( "Timestamp-based cache hit for key '$key' (age: $age sec)." ); - return $editInfo; // assume nothing changed } elseif ( isset( $editInfo->edits ) && $editInfo->edits === $user->getEditCount() ) { // Logged-in user made no local upload/template edits in the meantime $stats->increment( 'editstash.cache_hits.presumed_fresh' ); $logger->debug( "Edit count based cache hit for key '$key' (age: $age sec)." ); - return $editInfo; } elseif ( $user->isAnon() && self::lastEditTime( $user ) < $editInfo->output->getCacheTime() ) { // Logged-out user made no local upload/template edits in the meantime $stats->increment( 'editstash.cache_hits.presumed_fresh' ); $logger->debug( "Edit check based cache hit for key '$key' (age: $age sec)." ); - return $editInfo; + } else { + // User may have changed included content + $editInfo = false; } - $stats->increment( 'editstash.cache_misses.proven_stale' ); - $logger->info( "Stale cache for key '$key'; old key with outside edits. (age: $age sec)" ); + if ( !$editInfo ) { + $stats->increment( 'editstash.cache_misses.proven_stale' ); + $logger->info( "Stale cache for key '$key'; old key with outside edits. (age: $age sec)" ); + } elseif ( $editInfo->output->getFlag( 'vary-revision' ) ) { + // This can be used for the initial parse, e.g. for filters or doEditContent(), + // but a second parse will be triggered in doEditUpdates(). This is not optimal. + $logger->info( "Cache for key '$key' ('$title') has vary_revision." ); + } elseif ( $editInfo->output->getFlag( 'vary-revision-id' ) ) { + // Similar to the above if we didn't guess the ID correctly. + $logger->info( "Cache for key '$key' ('$title') has vary_revision_id." ); + } - return false; + return $editInfo; } /** @@ -376,7 +317,7 @@ class ApiStashEdit extends ApiBase { * @param ParserOutput $parserOutput * @param string $timestamp TS_MW * @param User $user - * @return array (stash info array, TTL in seconds) or (null, 0) + * @return array (stash info array, TTL in seconds, info code) or (null, 0, info code) */ private static function buildStashValue( Content $pstContent, ParserOutput $parserOutput, $timestamp, User $user @@ -385,19 +326,19 @@ class ApiStashEdit extends ApiBase { // Put an upper limit on the TTL for sanity to avoid extreme template/file staleness. $since = time() - wfTimestamp( TS_UNIX, $parserOutput->getTimestamp() ); $ttl = min( $parserOutput->getCacheExpiry() - $since, self::MAX_CACHE_TTL ); - - if ( $ttl > 0 && !$parserOutput->getFlag( 'vary-revision' ) ) { - // Only store what is actually needed - $stashInfo = (object)[ - 'pstContent' => $pstContent, - 'output' => $parserOutput, - 'timestamp' => $timestamp, - 'edits' => $user->getEditCount() - ]; - return [ $stashInfo, $ttl ]; + if ( $ttl <= 0 ) { + return [ null, 0, 'no_ttl' ]; } - return [ null, 0 ]; + // Only store what is actually needed + $stashInfo = (object)[ + 'pstContent' => $pstContent, + 'output' => $parserOutput, + 'timestamp' => $timestamp, + 'edits' => $user->getEditCount() + ]; + + return [ $stashInfo, $ttl, 'ok' ]; } public function getAllowedParams() { @@ -416,6 +357,9 @@ class ApiStashEdit extends ApiBase { ApiBase::PARAM_TYPE => 'text', ApiBase::PARAM_REQUIRED => true ], + 'summary' => [ + ApiBase::PARAM_TYPE => 'string', + ], 'contentmodel' => [ ApiBase::PARAM_TYPE => ContentHandler::getContentModels(), ApiBase::PARAM_REQUIRED => true diff --git a/includes/api/ApiUpload.php b/includes/api/ApiUpload.php index 0a79aa496f..95659e59c7 100644 --- a/includes/api/ApiUpload.php +++ b/includes/api/ApiUpload.php @@ -347,12 +347,13 @@ class ApiUpload extends ApiBase { * Throw an error that the user can recover from by providing a better * value for $parameter * - * @param array $error Error array suitable for passing to dieUsageMsg() + * @param array|string|MessageSpecifier $error Error suitable for passing to dieUsageMsg() * @param string $parameter Parameter that needs revising * @param array $data Optional extra data to pass to the user + * @param string $code Error code to use if the error is unknown * @throws UsageException */ - private function dieRecoverableError( $error, $parameter, $data = [] ) { + private function dieRecoverableError( $error, $parameter, $data = [], $code = 'unknownerror' ) { try { $data['filekey'] = $this->performStash(); $data['sessionkey'] = $data['filekey']; @@ -365,6 +366,9 @@ class ApiUpload extends ApiBase { if ( isset( $parsed['data'] ) ) { $data = array_merge( $data, $parsed['data'] ); } + if ( $parsed['code'] === 'unknownerror' ) { + $parsed['code'] = $code; + } $this->dieUsage( $parsed['info'], $parsed['code'], 0, $data ); } @@ -563,12 +567,28 @@ class ApiUpload extends ApiBase { $this->dieUsage( $msg, 'filetype-banned', 0, $extradata ); break; case UploadBase::VERIFICATION_ERROR: - $params = $verification['details']; - $key = array_shift( $params ); - $msg = $this->msg( $key, $params )->inLanguage( 'en' )->useDatabase( false )->text(); - ApiResult::setIndexedTagName( $verification['details'], 'detail' ); - $this->dieUsage( "This file did not pass file verification: $msg", 'verification-error', - 0, [ 'details' => $verification['details'] ] ); + $parsed = $this->parseMsg( $verification['details'] ); + $info = "This file did not pass file verification: {$parsed['info']}"; + if ( $verification['details'][0] instanceof IApiMessage ) { + $code = $parsed['code']; + } else { + // For backwards-compatibility, all of the errors from UploadBase::verifyFile() are + // reported as 'verification-error', and the real error code is reported in 'details'. + $code = 'verification-error'; + } + if ( $verification['details'][0] instanceof IApiMessage ) { + $msg = $verification['details'][0]; + $details = array_merge( [ $msg->getKey() ], $msg->getParams() ); + } else { + $details = $verification['details']; + } + ApiResult::setIndexedTagName( $details, 'detail' ); + $data = [ 'details' => $details ]; + if ( isset( $parsed['data'] ) ) { + $data = array_merge( $data, $parsed['data'] ); + } + + $this->dieUsage( $info, $code, 0, $data ); break; case UploadBase::HOOK_ABORTED: if ( is_array( $verification['error'] ) ) { @@ -754,9 +774,14 @@ class ApiUpload extends ApiBase { $this->mParams['text'], $watch, $this->getUser(), $this->mParams['tags'] ); if ( !$status->isGood() ) { - $error = $status->getErrorsArray(); - ApiResult::setIndexedTagName( $error, 'error' ); - $this->dieUsage( 'An internal error occurred', 'internal-error', 0, $error ); + // Is there really no better way to do this? + $errors = $status->getErrorsByType( 'error' ); + $msg = array_merge( [ $errors[0]['message'] ], $errors[0]['params'] ); + $data = $status->getErrorsArray(); + ApiResult::setIndexedTagName( $data, 'error' ); + // For backwards-compatibility, we use the 'internal-error' fallback key and merge $data + // into the root of the response (rather than something sane like [ 'details' => $data ]). + $this->dieRecoverableError( $msg, null, $data, 'internal-error' ); } $result['result'] = 'Success'; } diff --git a/includes/api/i18n/ca.json b/includes/api/i18n/ca.json index 837e3f9920..987231f234 100644 --- a/includes/api/i18n/ca.json +++ b/includes/api/i18n/ca.json @@ -9,7 +9,9 @@ "Fitoschido" ] }, + "apihelp-main-param-action": "Quina acció realitzar.", "apihelp-main-param-format": "El format de la sortida.", + "apihelp-main-param-curtimestamp": "Inclou la marca horària actual en el resultat.", "apihelp-block-description": "Bloca un usuari.", "apihelp-block-param-reason": "Raó del blocatge.", "apihelp-block-param-nocreate": "Evita la creació de comptes.", diff --git a/includes/api/i18n/ce.json b/includes/api/i18n/ce.json index 45d05769e4..fa7c460ed3 100644 --- a/includes/api/i18n/ce.json +++ b/includes/api/i18n/ce.json @@ -15,6 +15,7 @@ "apihelp-emailuser-param-subject": "Хьедаран корта.", "apihelp-emailuser-param-text": "Кехатан чулацам", "apihelp-expandtemplates-param-title": "АгӀонан корта.", + "apihelp-feedrecentchanges-param-hideminor": "Къайладаха жима нисдарш.", "apihelp-feedrecentchanges-param-tagfilter": "Тегийн луьттург.", "apihelp-login-example-login": "ЧугӀо", "apihelp-logout-description": "ЧугӀой сессийн хаамаш дӀацӀанбе.", diff --git a/includes/api/i18n/cs.json b/includes/api/i18n/cs.json index fbddc8d8bf..8437abbc12 100644 --- a/includes/api/i18n/cs.json +++ b/includes/api/i18n/cs.json @@ -9,7 +9,8 @@ "Utar", "Macofe", "Danny B.", - "LordMsz" + "LordMsz", + "Dvorapa" ] }, "apihelp-main-description": "
    \n* [[mw:API:Main_page|Dokumentace]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api E-mailová konference]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Oznámení k API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Chyby a požadavky]\n
    \nStav: Všechny funkce uvedené na této stránce by měly fungovat, ale API se stále aktivně vyvíjí a může se kdykoli změnit. Upozornění na změny získáte přihlášením se k [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ e-mailové konferenci mediawiki-api-announce].\n\nChybné požadavky: Pokud jsou do API zaslány chybné požadavky, bude vrácena HTTP hlavička s klíčem „MediaWiki-API-Error“ a hodnota této hlavičky a chybový kód budou nastaveny na stejnou hodnotu. Více informací najdete [[mw:API:Errors_and_warnings|v dokumentaci]].\n\nTestování: Pro jednoduché testování požadavků na API zkuste [[Special:ApiSandbox]].", @@ -74,7 +75,7 @@ "apihelp-edit-param-text": "Obsah stránky.", "apihelp-edit-param-minor": "Malá editace.", "apihelp-edit-param-notminor": "Nemalá editace.", - "apihelp-edit-param-bot": "Označit tuto editaci jako editaci bota.", + "apihelp-edit-param-bot": "Označit tuto editaci jako editaci robota.", "apihelp-edit-param-createonly": "Needitovat stránku, pokud již existuje.", "apihelp-edit-param-nocreate": "Pokud stránka neexistuje, vrátit chybu.", "apihelp-edit-param-watch": "Přidat stránku na seznam sledovaných.", @@ -100,6 +101,7 @@ "apihelp-feedcontributions-param-deletedonly": "Zobrazit pouze smazané příspěvky.", "apihelp-feedcontributions-param-toponly": "Zobrazit pouze ty editace, které jsou aktuální revize.", "apihelp-feedcontributions-param-newonly": "Zobrazit pouze ty editace, které vytvořily stránku.", + "apihelp-feedcontributions-param-hideminor": "Skrýt malé editace.", "apihelp-feedcontributions-param-showsizediff": "Zobrazit rozdíl velikosti mezi revizemi.", "apihelp-feedrecentchanges-param-namespace": "Jmenný prostor, na který mají být výsledky omezeny.", "apihelp-feedrecentchanges-param-from": "Zobrazit změny od", @@ -224,6 +226,7 @@ "apihelp-query+usercontribs-example-user": "Zobrazit příspěvky uživatele Příklad", "apihelp-query+watchlistraw-description": "Získat všechny stránky, které jsou aktuálním uživatelem sledovány.", "apihelp-query+watchlistraw-example-simple": "Seznam sledovaných stránek uživatele.", + "apihelp-stashedit-param-summary": "Změnit shrnutí.", "apihelp-unblock-param-user": "Uživatel, IP adresa nebo záběr IP adres k odblokování. Nelze použít dohromady s $1id.", "apihelp-watch-example-watch": "Sledovat stránku Main Page.", "apihelp-watch-example-generator": "Zobrazit prvních několik stránek z hlavního jmenného prostoru.", diff --git a/includes/api/i18n/da.json b/includes/api/i18n/da.json new file mode 100644 index 0000000000..bbb981bbc0 --- /dev/null +++ b/includes/api/i18n/da.json @@ -0,0 +1,8 @@ +{ + "@metadata": { + "authors": [ + "Sarrus" + ] + }, + "apihelp-feedrecentchanges-param-hideminor": "Skjul mindre ændringer." +} diff --git a/includes/api/i18n/de.json b/includes/api/i18n/de.json index 8c6a71f9bd..ff4b499368 100644 --- a/includes/api/i18n/de.json +++ b/includes/api/i18n/de.json @@ -149,6 +149,7 @@ "apihelp-feedcontributions-param-deletedonly": "Nur gelöschte Beiträge anzeigen.", "apihelp-feedcontributions-param-toponly": "Nur aktuelle Versionen anzeigen.", "apihelp-feedcontributions-param-newonly": "Nur Seitenerstellungen anzeigen.", + "apihelp-feedcontributions-param-hideminor": "Blendet Kleinigkeiten aus.", "apihelp-feedcontributions-param-showsizediff": "Zeigt den Größenunterschied zwischen Versionen an.", "apihelp-feedcontributions-example-simple": "Beiträge für die Benutzer Beispiel zurückgeben", "apihelp-feedrecentchanges-description": "Gibt einen Letzte-Änderungen-Feed zurück.", @@ -766,6 +767,7 @@ "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1-Prüfsumme (Basis 16) der Version.", "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "Inhaltsmodell-Kennung der Version.", "apihelp-query+revisions+base-paramvalue-prop-content": "Text der Version.", + "apihelp-query+revisions+base-paramvalue-prop-tags": "Markierungen für die Version.", "apihelp-query+search-param-what": "Welcher Suchtyp ausgeführt werden soll.", "apihelp-query+search-param-info": "Welche Metadaten zurückgegeben werden sollen.", "apihelp-query+search-param-prop": "Eigenschaften zur Rückgabe:", @@ -777,9 +779,13 @@ "apihelp-query+siteinfo-example-simple": "Websiteinformationen abrufen", "apihelp-query+tags-description": "Änderungs-Tags auflisten.", "apihelp-query+tags-param-prop": "Zurückzugebende Eigenschaften:", + "apihelp-query+tags-paramvalue-prop-name": "Ergänzt den Namen der Markierung.", + "apihelp-query+tags-paramvalue-prop-displayname": "Ergänzt die Systemnachricht für die Markierung.", + "apihelp-query+tags-paramvalue-prop-description": "Ergänzt die Beschreibung der Markierung.", "apihelp-query+tags-example-simple": "Verfügbare Tags auflisten", "apihelp-query+templates-param-dir": "Die Auflistungsrichtung.", "apihelp-query+transcludedin-param-prop": "Zurückzugebende Eigenschaften:", + "apihelp-query+transcludedin-paramvalue-prop-pageid": "Seitenkennung jeder Seite.", "apihelp-query+usercontribs-description": "Alle Bearbeitungen von einem Benutzer abrufen.", "apihelp-query+usercontribs-param-limit": "Die maximale Anzahl der zurückzugebenden Beiträge.", "apihelp-query+usercontribs-param-start": "Der zurückzugebende Start-Zeitstempel.", diff --git a/includes/api/i18n/diq.json b/includes/api/i18n/diq.json index 1ab1bc5254..7892efacbf 100644 --- a/includes/api/i18n/diq.json +++ b/includes/api/i18n/diq.json @@ -7,8 +7,15 @@ ] }, "apihelp-block-description": "Enê karberi bloqe ke", + "apihelp-block-param-reason": "Sebeba Bloqey", + "apihelp-block-param-nocreate": "Hesab viraştişi bloqe ke.", + "apihelp-checktoken-param-token": "Jetona test ke", + "apihelp-createaccount-description": "Yew Hesabê karberi yo newe vıraze", "apihelp-createaccount-param-name": "Nameyê karberi.", + "apihelp-createaccount-param-email": "E-postay karberi (keyfi)", + "apihelp-createaccount-param-realname": "Namey karberi yo raştay (keyfi)", "apihelp-delete-description": "Pele bestere.", + "apihelp-delete-example-simple": "Main Page besternê.", "apihelp-disabled-description": "Eno modul aktiv niyo.", "apihelp-edit-description": "Vıraze û pelan bıvurne.", "apihelp-edit-param-text": "Zerreki pele", @@ -23,6 +30,10 @@ "apihelp-emailuser-param-ccme": "Yew kopyaya nê posteyi mı rê bırışe.", "apihelp-expandtemplates-param-title": "Sernameyê pele.", "apihelp-expandtemplates-param-text": "Wikimetıni açarnê.", + "apihelp-expandtemplates-paramvalue-prop-wikitext": "Herabıyaye wikimetin", + "apihelp-feedcontributions-param-feedformat": "Formata warikerdışi", + "apihelp-feedcontributions-param-hideminor": "Vuryayışanê werdiyan bınımne", + "apihelp-feedcontributions-param-showsizediff": "Goreyê ebati ferqê versiyoni bıasne.", "apihelp-feedrecentchanges-param-hideminor": "Vurnayışanê qıckekan bınımne.", "apihelp-feedrecentchanges-param-hidebots": "Vurnayışanê botan bınımne.", "apihelp-feedrecentchanges-param-hideanons": "Vurnayışanê karberanê anoniman bınımne.", @@ -30,9 +41,19 @@ "apihelp-feedrecentchanges-param-tagfilter": "Filtrey etiketi", "apihelp-feedrecentchanges-example-simple": "Vurnayışê peyênan bıvin", "apihelp-feedrecentchanges-example-30days": "Peyni vurnayışanê 30 raco bımosne", + "apihelp-filerevert-param-comment": "Mışewre bar ke", "apihelp-login-param-name": "Nameyê karberi.", "apihelp-login-param-password": "Parola.", "apihelp-login-param-domain": "Domain (optional).", "apihelp-login-example-login": "Dekew.", - "apihelp-move-description": "Yew pele bere." + "apihelp-mergehistory-description": "Verorê pela yew ke", + "apihelp-move-description": "Yew pele bere.", + "apihelp-move-param-noredirect": "Hetenayış mevıraz", + "apihelp-options-example-reset": "Terciha pêron reset ke", + "apihelp-options-example-change": "Tercihanê skin u hideminor bıvurnê", + "apihelp-parse-example-page": "Peler analiz ke", + "apihelp-parse-example-text": "Wikimetini analiz ke", + "apihelp-parse-example-summary": "Xulasay analiz ke", + "apihelp-query+alllinks-paramvalue-prop-title": "Sernamey rê link dek", + "apihelp-query+blocks-example-simple": "Listey bloqeyan" } diff --git a/includes/api/i18n/en.json b/includes/api/i18n/en.json index 82a83496c6..a8f02787ad 100644 --- a/includes/api/i18n/en.json +++ b/includes/api/i18n/en.json @@ -16,7 +16,7 @@ "apihelp-main-param-requestid": "Any value given here will be included in the response. May be used to distinguish requests.", "apihelp-main-param-servedby": "Include the hostname that served the request in the results.", "apihelp-main-param-curtimestamp": "Include the current timestamp in the result.", - "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 https://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-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).\n\nFor authenticated requests, this must match one of the origins in the Origin header exactly, so it has to be set to something like https://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, the Access-Control-Allow-Origin and Access-Control-Allow-Credentials headers will be set.\n\nFor non-authenticated requests, specify the value *. This will cause the Access-Control-Allow-Origin header to be set, but Access-Control-Allow-Credentials will be false and all user-specific data will be restricted.", "apihelp-main-param-uselang": "Language to use for message translations. [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] with siprop=languages returns a list of language codes, or specify user to use the current user's language preference, or specify content to use this wiki's content language.", "apihelp-block-description": "Block a user.", @@ -73,7 +73,9 @@ "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-cspreport-description": "Used by browsers to report violations of the Content Security Policy. This module should never be used, except when used automatically by a CSP compliant web browser.", + "apihelp-cspreport-param-reportonly": "Mark as being a report from a monitoring policy, not an enforced policy", + "apihelp-cspreport-param-source": "What generated the CSP header that triggered this report", "apihelp-delete-description": "Delete a page.", "apihelp-delete-param-title": "Title of the page to delete. Cannot be used together with $1pageid.", "apihelp-delete-param-pageid": "Page ID of the page to delete. Cannot be used together with $1title.", @@ -1291,6 +1293,7 @@ "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-param-dir": "The direction in which to list.", "apihelp-query+watchlistraw-param-fromtitle": "Title (with namespace prefix) to begin enumerating from.", "apihelp-query+watchlistraw-param-totitle": "Title (with namespace prefix) to stop enumerating at.", "apihelp-query+watchlistraw-example-simple": "List pages on the current user's watchlist.", @@ -1350,6 +1353,7 @@ "apihelp-stashedit-param-contentmodel": "Content model of the new content.", "apihelp-stashedit-param-contentformat": "Content serialization format used for the input text.", "apihelp-stashedit-param-baserevid": "Revision ID of the base revision.", + "apihelp-stashedit-param-summary": "Change summary.", "apihelp-tag-description": "Add or remove change tags from individual revisions or log entries.", "apihelp-tag-param-rcid": "One or more recent changes IDs from which to add or remove the tag.", diff --git a/includes/api/i18n/es.json b/includes/api/i18n/es.json index 10f6c7f537..8b612df4d6 100644 --- a/includes/api/i18n/es.json +++ b/includes/api/i18n/es.json @@ -21,7 +21,8 @@ "Mgpena", "Rubentl134", "2axterix2", - "Dgstranz" + "Dgstranz", + "Copper12" ] }, "apihelp-main-description": "
    \n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correos]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API de anuncios]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n
    \nEstado: Todas las características que se muestran en esta página debería funcionar, pero la API aún está en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\nSolicitudes erróneas: Cuando se envían solicitudes erróneas a la API, se envía un encabezado HTTP con la clave \"MediaWiki-API-Error\" y ambos valores, del encabezado y el código de error, se establecerán en el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].\n\nPruebas: para facilitar las pruebas de solicitudes a la API, consulta [[Special:ApiSandbox]].", @@ -50,6 +51,8 @@ "apihelp-block-param-watchuser": "Vigilar las páginas de usuario y de discusión del usuario o de la dirección IP.", "apihelp-block-example-ip-simple": "Bloquear la dirección IP 192.0.2.5 durante 3 días por el motivo First strike.", "apihelp-block-example-user-complex": "Bloquear al usuario Vandal indefinidamente con el motivo Vandalism y evitar que se cree nuevas cuentas o envíe correos.", + "apihelp-changeauthenticationdata-description": "Cambiar los datos de autentificación para el usuario actual.", + "apihelp-changeauthenticationdata-example-password": "Intento para cambiar la contraseña del usuario actual a ExamplePassword.", "apihelp-checktoken-description": "Comprueba la validez de una ficha desde [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Tipo de ficha a probar.", "apihelp-checktoken-param-token": "Ficha a probar.", @@ -57,6 +60,8 @@ "apihelp-checktoken-example-simple": "Probar la validez de una ficha csrf.", "apihelp-clearhasmsg-description": "Limpia la marca hasmsg del usuario actual.", "apihelp-clearhasmsg-example-1": "Limpiar la marca hasmsg del usuario actual.", + "apihelp-clientlogin-description": "Entrar en wiki usando el flujo interactivo.", + "apihelp-clientlogin-example-login": "Comenzar el proceso para iniciar sesión en el wiki como usuario Example con la contraseña ExamplePassword.", "apihelp-compare-description": "Obtener la diferencia entre 2 páginas.\n\nSe debe pasar un número de revisión, un título de página o una ID tanto desde \"de\" hasta \"a\".", "apihelp-compare-param-fromtitle": "Primer título para comparar", "apihelp-compare-param-fromid": "ID de la primera página a comparar.", @@ -77,6 +82,7 @@ "apihelp-createaccount-param-language": "Código de idioma a establecer como predeterminado para el usuario (opcional, predeterminado al contenido del idioma).", "apihelp-createaccount-example-pass": "Crear usuario testuser con la contraseña test123.", "apihelp-createaccount-example-mail": "Crear usuario testmailuser y enviar una contraseña generada aleatoriamente.", + "apihelp-cspreport-param-source": "Qué generó la cabecera CSP que provocó este informe", "apihelp-delete-description": "Borrar una página.", "apihelp-delete-param-title": "Título de la página a eliminar. No se puede utilizar junto a $1pageid.", "apihelp-delete-param-pageid": "ID de la página a eliminar. No se puede utilizar junto a $1title.", @@ -99,6 +105,8 @@ "apihelp-edit-param-minor": "Edición menor.", "apihelp-edit-param-notminor": "Edición no menor.", "apihelp-edit-param-bot": "Marcar esta edición como de bot.", + "apihelp-edit-param-basetimestamp": "Marca de tiempo de la revisión base, usada para detectar conflictos de edición. Se puede obtener mediante [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]", + "apihelp-edit-param-starttimestamp": "Marca de tiempo de cuando empezó el proceso de edición, usada para detectar conflictos de edición. Se puede obtener un valor apropiado usando [[Special:ApiHelp/main|curtimestamp]] cuando comiences el proceso de edición (por ejemplo, al cargar el contenido de la página por editar).", "apihelp-edit-param-recreate": "Reemplazar los errores acerca de la página de haber sido eliminados en el ínterin.", "apihelp-edit-param-createonly": "No editar la página si ya existe.", "apihelp-edit-param-nocreate": "Producir un error si la página no existe.", @@ -144,6 +152,7 @@ "apihelp-feedcontributions-param-deletedonly": "Mostrar solo las contribuciones borradas.", "apihelp-feedcontributions-param-toponly": "Mostrar solo ediciones que son últimas revisiones.", "apihelp-feedcontributions-param-newonly": "Mostrar solo ediciones que son creaciones de páginas.", + "apihelp-feedcontributions-param-hideminor": "Ocultar ediciones menores.", "apihelp-feedcontributions-param-showsizediff": "Mostrar la diferencia de tamaño entre revisiones.", "apihelp-feedcontributions-example-simple": "Devolver las contribuciones del usuario Example.", "apihelp-feedrecentchanges-description": "Devuelve un canal de cambios recientes.", @@ -288,6 +297,7 @@ "apihelp-parse-paramvalue-prop-limitreporthtml": "Da la versión HTML del informe del límite. No da datos si $1disablelimitreport está establecido.", "apihelp-parse-param-effectivelanglinks": "Incluye enlaces de idiomas proporcionados por las extensiones (para utilizar con $1prop=langlinks).", "apihelp-parse-param-disablepp": "Usa $1disablelimitreport en su lugar.", + "apihelp-parse-param-disableeditsection": "Omitir los enlaces de edición de sección de la salida del analizador.", "apihelp-parse-param-preview": "Analizar en modo de vista previa.", "apihelp-parse-param-sectionpreview": "Analizar sección en modo de vista previa (también activa el modo de vista previa).", "apihelp-parse-param-disabletoc": "Omitir la tabla de contenidos en la salida.", @@ -360,6 +370,7 @@ "apihelp-query+allfileusages-example-unique-generator": "Recupera los títulos de todos los archivos y marca los faltantes.", "apihelp-query+allfileusages-example-generator": "Recupera las páginas que contienen los archivos.", "apihelp-query+allimages-description": "Enumerar todas las imágenes secuencialmente.", + "apihelp-query+allimages-param-sort": "Propiedad por la que realizar la ordenación.", "apihelp-query+allimages-param-from": "El título de la imagen para comenzar la enumeración. Solo puede utilizarse con $1sort=name.", "apihelp-query+allimages-param-to": "El título de la imagen para detener la enumeración. Solo puede utilizarse con $1sort=name.", "apihelp-query+allimages-param-start": "El sello de tiempo para comenzar la enumeración. Solo puede utilizarse con $1sort=timestamp.", @@ -405,6 +416,7 @@ "apihelp-query+allpages-example-B": "Mostrar una lista de páginas que empiecen con la letra B.", "apihelp-query+allpages-example-generator": "Mostrar información acerca de 4 páginas que empiecen por la letra T.", "apihelp-query+allpages-example-generator-revisions": "Mostrar el contenido de las 2 primeras páginas que no redirijan y empiecen por Re.", + "apihelp-query+allredirects-description": "Obtener la lista de todas las redirecciones a un espacio de nombres.", "apihelp-query+allredirects-param-prefix": "Buscar todas las páginas de destino que empiecen con este valor.", "apihelp-query+allredirects-param-prop": "Qué piezas de información incluir:", "apihelp-query+allredirects-paramvalue-prop-title": "Añade el título de la redirección.", @@ -416,9 +428,12 @@ "apihelp-query+allrevisions-example-user": "Listar las últimas 50 contribuciones del usuario Example.", "apihelp-query+allrevisions-example-ns-main": "Listar las primeras 50 revisiones en el espacio de nombres principal.", "apihelp-query+mystashedfiles-param-limit": "Cuántos archivos obtener.", + "apihelp-query+alltransclusions-param-from": "El título de la transclusión por la que empezar la enumeración.", + "apihelp-query+alltransclusions-param-to": "El título de la transclusión por la que terminar la enumeración.", "apihelp-query+alltransclusions-param-prefix": "Buscar todos los títulos transcluidos que comiencen con este valor.", "apihelp-query+alltransclusions-param-prop": "Qué piezas de información incluir:", "apihelp-query+alltransclusions-paramvalue-prop-title": "Añade el título de la transclusión.", + "apihelp-query+alltransclusions-param-limit": "Número de elementos que se desea obtener.", "apihelp-query+alltransclusions-example-unique": "Listar títulos transcluidos de forma única.", "apihelp-query+alltransclusions-example-unique-generator": "Obtiene todos los títulos transcluidos, marcando los que faltan.", "apihelp-query+allusers-description": "Enumerar todos los usuarios registrados.", @@ -455,6 +470,8 @@ "apihelp-query+categorymembers-paramvalue-prop-ids": "Añade el identificador de página.", "apihelp-query+categorymembers-paramvalue-prop-title": "Agrega el título y el identificador del espacio de nombres de la página.", "apihelp-query+categorymembers-paramvalue-prop-type": "Añade el tipo en el que se categorizó la página (page, subcat or file).", + "apihelp-query+categorymembers-param-sort": "Propiedad por la que realizar la ordenación.", + "apihelp-query+categorymembers-param-dir": "Dirección en la que desea ordenar.", "apihelp-query+categorymembers-param-startsortkey": "Utilizar $1starthexsortkey en su lugar.", "apihelp-query+categorymembers-param-endsortkey": "Utilizar $1endhexsortkey en su lugar.", "apihelp-query+categorymembers-example-simple": "Obtener las primeras 10 páginas en Category:Physics.", @@ -727,6 +744,7 @@ "apihelp-query+watchlist-paramvalue-type-log": "Entradas del registro.", "apihelp-query+watchlistraw-param-prop": "Qué propiedades adicionales se obtendrán:", "apihelp-query+watchlistraw-param-show": "Sólo listar los elementos que cumplen estos criterios.", + "apihelp-query+watchlistraw-param-dir": "La dirección en la que se listará.", "apihelp-query+watchlistraw-param-fromtitle": "Título (con el prefijo de espacio de nombres) desde el que se empezará a enumerar.", "apihelp-query+watchlistraw-param-totitle": "Título (con el prefijo de espacio de nombres) desde el que se dejará de enumerar.", "apihelp-query+watchlistraw-example-simple": "Listar las páginas de la lista de seguimiento del usuario actual.", @@ -742,6 +760,7 @@ "apihelp-stashedit-param-contentmodel": "Modelo del contenido nuevo.", "apihelp-stashedit-param-contentformat": "Formato de serialización de contenido utilizado para el texto de entrada.", "apihelp-stashedit-param-baserevid": "Identificador de la revisión de base.", + "apihelp-stashedit-param-summary": "Resumen de cambios.", "apihelp-tag-param-logid": "Uno o más identificadores de entradas del registro a los que agregar o eliminar la etiqueta.", "apihelp-tag-param-reason": "Motivo del cambio.", "apihelp-tag-example-rev": "Añadir la etiqueta vandalism al identificador de revisión 123 sin especificar un motivo", diff --git a/includes/api/i18n/fa.json b/includes/api/i18n/fa.json index a4295833d0..4780ecd2a9 100644 --- a/includes/api/i18n/fa.json +++ b/includes/api/i18n/fa.json @@ -13,12 +13,17 @@ "Macofe", "Huji", "Ladsgroup", - "Freshman404" + "Freshman404", + "Alifakoor" ] }, "apihelp-main-description": "
    \n* [[mw:API:Main_page|مستندات]]\n* [[mw:API:FAQ|پرسش‌های متداول]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api فهرست پست الکترونیکی]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce اعلانات رابط برنامه‌نویسی کاربردی]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R ایرادها و درخواست‌ها]\n
    \n\nوضعیت: تمام ویژگی‌هایی که در این صفحه نمایش یافته‌اند باید کار بکنند، ولی رابط برنامه‌نویسی کاربردی کماکان در حال توسعه است، و ممکن است در هر زمان تغییر بکند. به عضویت [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ فهرست پست الکترونیکی mediawiki-api-announce] در بیایید تا از تغییرات باخبر شوید.\n\nدرخواست‌های معیوب: وقتی درخواست‌های معیوب به رابط برنامه‌نویسی کاربردی فرستاده شوند، یک سرایند اچ‌تی‌تی‌پی با کلید «MediaWiki-API-Erorr» فرستاده می‌شود و بعد هم مقدار سرایند و هم کد خطای بازگردانده شده هر دو به یک مقدار نسبت داده می‌شوند. برای اطلاعات بیشتر [[mw:API:Errors_and_warnings|API: Errors and warnings]] را ببینید.\n\nآزمایش: برای انجام درخواست‌های API آزمایشی [[Special:ApiSandbox]] را ببینید.", "apihelp-main-param-action": "کدام عملیات را انجام دهد.", "apihelp-main-param-format": "فرمت خروجی.", + "apihelp-main-param-smaxage": "تنظيم s-maxage سرآیند کنترل حافضهٔ نهان HTTP بر اين تعداد ثانيه.", + "apihelp-main-param-maxage": "تنظيم s-maxage سرآیند کنترل حافضهٔ نهان HTTP بر اين تعداد ثانيه.\nخطاها هيچگاه در حافظهٔ نهان قرار نمی‌گيرند.", + "apihelp-main-param-requestid": "هر مقداری که در اینجا وارد شود در پاسخ گنجانده می‌شود. ممکن است برای تمايز بين درخواست‌ها بکار رود.", + "apihelp-main-param-servedby": "نام ميزبانی که درخواست را سرويس داده در نتايج گنجانده شود.", "apihelp-main-param-curtimestamp": "برچسب زمان کنونی را در نتیجه قرار دهید.", "apihelp-block-description": "بستن کاربر", "apihelp-block-param-user": "نام کاربری، آدرس آی پی یا محدوده آی پی موردنظر شما برای بستن.", @@ -32,11 +37,16 @@ "apihelp-block-param-reblock": "اگر کاربر پیش از این مسدود شده‌است، مسدود موجود را بازنویسی کن.", "apihelp-block-param-watchuser": "صفحه‌های کاربر و بحث کاربر نشانی آی‌پی یا کاربر را پی‌گیری کنید.", "apihelp-block-example-ip-simple": "آی‌پی ۱۹۲٫۰٫۲٫۵ را برای سه روز همراه دلیل برخورد اول ببندید", + "apihelp-block-example-user-complex": "بستن کاربرخرابکار به شکل نامحدود به علت خرابکاری، همچنين جلوگيری از ايجاد حساب جديد و ارسال ايميل.", + "apihelp-changeauthenticationdata-description": "تغيير اطلاعات احراز هويت برای کاربر فعلی", + "apihelp-changeauthenticationdata-example-password": "تلاش برای تغيير گذرواژه فعلی کاربر به نمونهٔ گذرواژه.", + "apihelp-checktoken-param-type": "نوع توکنی که دارد آزمایش می‌شود.", "apihelp-checktoken-param-token": "توکن برای تست", "apihelp-checktoken-param-maxtokenage": "حداکثر عمر توکن به ثانیه.", "apihelp-checktoken-example-simple": "تست اعتبار یک توکن csrf", "apihelp-clearhasmsg-description": "پرچم hasmsg را برای کاربر جاری پاک کن.", "apihelp-clearhasmsg-example-1": "پاک‌کردن پرچم hasmsg برای کاربر جاری", + "apihelp-clientlogin-example-login": "شروع فرآیند ورود به ويکی به عنوان کاربر نمونه با گذرواژهٔ نمونهٔ گذرواژه", "apihelp-compare-description": "تفاوت بین ۲ صفحه را بیابید.\n\nشما باید یک شماره بازبینی، یک عنوان صفحه، یا یک شناسه صفحه برای هر دو «از» و «به» مشخص کنید.", "apihelp-compare-param-fromtitle": "عنوان اول برای مقایسه.", "apihelp-compare-param-fromid": "شناسه صفحه اول برای مقایسه.", @@ -216,6 +226,12 @@ "apihelp-query+allpages-param-minsize": "محدودکردن به صفحه‌هایی که همراه دست کم این تعداد بایت است.", "apihelp-query+allpages-param-limit": "میزان کل صفحه‌ها برای بازگرداندن.", "apihelp-query+allredirects-param-limit": "تعداد آیتم‌ها برای بازگرداندن.", + "apihelp-query+allusers-paramvalue-prop-editcount": "شمار ويرایش کاربر را می‌افزايد", + "apihelp-query+allusers-paramvalue-prop-registration": "زمان ثبت نام کاربر را در صورت وجود می‌افزايد (ممکن است خالی باشد)", + "apihelp-query+allusers-param-limit": "تعداد کل نام‌های کاربری برای بازگرداندن.", + "apihelp-query+allusers-param-witheditsonly": "فقط کاربرانی را که ويرایش داشته اند ليست کن", + "apihelp-query+allusers-param-activeusers": "فقط کاربرانی را ليست کن که در $1 روز گذشته فعاليت داشته‌اند", + "apihelp-query+authmanagerinfo-description": "بازیابی اطلاعات در مورد وضعيت فعلی احراز هويت", "apihelp-query+backlinks-example-simple": "نمایش پیوندها به Main page.", "apihelp-query+blocks-example-simple": "فهرست بسته‌شده‌ها", "apihelp-query+categories-param-show": "کدام نوع رده‌ها نمایش داده‌شود.", @@ -225,6 +241,9 @@ "apihelp-query+categorymembers-param-sort": "خصوصیت برای مرتب‌سازی", "apihelp-query+categorymembers-param-dir": "جهت مرتب شدن", "apihelp-query+categorymembers-param-startsortkey": "جایش از $1starthexsortkey استفاده کنید.", + "apihelp-query+deletedrevs-param-namespace": "فقط صفحات ین فضای نام را فهرست کن.", + "apihelp-query+deletedrevs-param-limit": "حداکثر تعداد بازنگری‌هايي که فهرست شوند.", + "apihelp-query+imageinfo-param-end": "زمان توقف فهرست کردن.", "apihelp-query+imageinfo-param-urlheight": "مشابه $1urlwidth.", "apihelp-query+info-description": "دریافت اطلاعات سادهٔ صفحه.", "apihelp-query+iwbacklinks-param-prefix": "پیشوند میان‌ویکی.", @@ -252,5 +271,7 @@ "apihelp-upload-param-ignorewarnings": "چشم‌پوشی از همهٔ هشدارها.", "apihelp-userrights-param-user": "نام کاربری.", "api-help-param-deprecated": "توصیه.", + "api-help-param-limit": "بيش از $1 مجاز نيست", + "api-help-param-limit2": "بيش از $1 (برای ربات‌ها $2) مجاز نيست", "api-credits-header": "اعتبار" } diff --git a/includes/api/i18n/fr.json b/includes/api/i18n/fr.json index fa8aa03577..a10c48690a 100644 --- a/includes/api/i18n/fr.json +++ b/includes/api/i18n/fr.json @@ -75,7 +75,7 @@ "apihelp-compare-param-torev": "Seconde révision à comparer.", "apihelp-compare-example-1": "Créer une différence entre les révisions 1 et 2", "apihelp-createaccount-description": "Créer un nouveau compte utilisateur.", - "apihelp-createaccount-param-preservestate": "Si [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] renvoyé true pour hasprimarypreservedstate, les demandes marquées comme primary-required doivent être omises. Si elle a retourné une valeur non vide pour preservedusername, ce nom d'utilisateur doit être utilisé pour le paramètre username.", + "apihelp-createaccount-param-preservestate": "Si [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] a retourné true pour hasprimarypreservedstate, les demandes marquées comme primary-required doivent être omises. Si elle a retourné une valeur non vide pour preservedusername, ce nom d'utilisateur doit être utilisé pour le paramètre username.", "apihelp-createaccount-example-create": "Commencer le processus de création d’un utilisateur Exemple avec le mot de passe ExempleMotDePasse.", "apihelp-createaccount-param-name": "Nom d’utilisateur.", "apihelp-createaccount-param-password": "Mot de passe (ignoré si $1mailpassword est défini).", @@ -88,6 +88,9 @@ "apihelp-createaccount-param-language": "Code de langue à mettre par défaut pour l’utilisateur (facultatif, par défaut langue du contenu).", "apihelp-createaccount-example-pass": "Créer l’utilisateur testuser avec le mot de passe test123.", "apihelp-createaccount-example-mail": "Créer l’utilisateur testmailuser et envoyer par courriel un mot de passe généré aléatoirement.", + "apihelp-cspreport-description": "Utilisé par les navigateurs pour signaler les violations de la politique de confidentialité du contenu. Ce module ne devrait jamais être utilisé, sauf quand il est utilisé automatiquement par un navigateur web compatible avec CSP.", + "apihelp-cspreport-param-reportonly": "Marquer comme étant un rapport d’une politique de surveillance, et non une politique exigée", + "apihelp-cspreport-param-source": "Ce qui a généré l’entête CSP qui a déclenché ce rapport", "apihelp-delete-description": "Supprimer une page.", "apihelp-delete-param-title": "Titre de la page que vous voulez supprimer. Impossible de l’utiliser avec $1pageid.", "apihelp-delete-param-pageid": "ID de la page que vous voulez supprimer. Impossible à utiliser avec $1title.", @@ -164,6 +167,7 @@ "apihelp-feedcontributions-param-deletedonly": "Afficher uniquement les contributions supprimées.", "apihelp-feedcontributions-param-toponly": "Afficher uniquement les modifications qui sont les dernières révisions.", "apihelp-feedcontributions-param-newonly": "Afficher uniquement les modifications qui sont des créations de page.", + "apihelp-feedcontributions-param-hideminor": "Masquer les modifications mineures.", "apihelp-feedcontributions-param-showsizediff": "Afficher la différence de taille entre les révisions.", "apihelp-feedcontributions-example-simple": "Renvoyer les contributions de l'utilisateur Exemple.", "apihelp-feedrecentchanges-description": "Renvoie un fil de modifications récentes.", @@ -1216,6 +1220,7 @@ "apihelp-query+watchlistraw-param-show": "Lister uniquement les éléments correspondant à ces critères.", "apihelp-query+watchlistraw-param-owner": "Utilisé avec $1token pour accéder à la liste de suivi d’un autre utilisateur.", "apihelp-query+watchlistraw-param-token": "Un jeton de sécurité (disponible dans les [[Special:Preferences#mw-prefsection-watchlist|préférences]] de l’utilisateur) pour permettre l’accès à la liste de suivi d’un autre utilisateur.", + "apihelp-query+watchlistraw-param-dir": "Le sens dans lequel lister.", "apihelp-query+watchlistraw-param-fromtitle": "Démarrer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :", "apihelp-query+watchlistraw-param-totitle": "Terminer l'énumération avec ce Titre (inclure le préfixe d'espace de noms) :", "apihelp-query+watchlistraw-example-simple": "Lister les pages dans la liste de suivi de l’utilisateur actuel", @@ -1268,6 +1273,7 @@ "apihelp-stashedit-param-contentmodel": "Modèle de contenu du nouveau contenu.", "apihelp-stashedit-param-contentformat": "Format de sérialisation de contenu utilisé pour le texte saisi.", "apihelp-stashedit-param-baserevid": "ID de révision de la révision de base.", + "apihelp-stashedit-param-summary": "Résumé du changement", "apihelp-tag-description": "Ajouter ou enlever des balises de modification aux révisions ou ou aux entrées de journal individuelles.", "apihelp-tag-param-rcid": "Un ou plus IDs de modification récente à partir desquels ajouter ou supprimer la balise.", "apihelp-tag-param-revid": "Un ou plus IDs de révision à partir desquels ajouter ou supprimer la balise.", diff --git a/includes/api/i18n/gl.json b/includes/api/i18n/gl.json index a7ecabd63a..2e0cbc9b69 100644 --- a/includes/api/i18n/gl.json +++ b/includes/api/i18n/gl.json @@ -72,6 +72,8 @@ "apihelp-createaccount-param-language": "Código de lingua para usar como defecto polo usuario (de xeito opcional, usarase a lingua por defecto)", "apihelp-createaccount-example-pass": "Crear usuario testuser con contrasinal test123.", "apihelp-createaccount-example-mail": "Crear usuario testmailuser\"testmailuser\" e enviar por correo electrónico un contrasinal xenerado de forma aleatoria.", + "apihelp-cspreport-description": "Usado polos navegadores para informar de violacións da política de confidencialidade de contido. Este módulo non debe se usado nunca, excepto cando é usado automaticamente por un navegador web compatible con CSP.", + "apihelp-cspreport-param-source": "Que xerou a cabeceira CSP que lanzou este informe", "apihelp-delete-description": "Borrar a páxina.", "apihelp-delete-param-title": "Título da páxina a eliminar. Non pode usarse xunto con $1pageid.", "apihelp-delete-param-pageid": "Identificador da páxina a eliminar. Non pode usarse xunto con $1title.", @@ -148,6 +150,7 @@ "apihelp-feedcontributions-param-deletedonly": "Mostrar só as contribuciones eliminadas.", "apihelp-feedcontributions-param-toponly": "Mostrar só as edicións que que son as ultimas revisións.", "apihelp-feedcontributions-param-newonly": "Mostrar só as edicións que crearon páxinas.", + "apihelp-feedcontributions-param-hideminor": "Ocultar edicións menores.", "apihelp-feedcontributions-param-showsizediff": "Mostrar diferenza de tamaño entre edicións.", "apihelp-feedcontributions-example-simple": "Mostrar as contribucións do usuario Example.", "apihelp-feedrecentchanges-description": "Devolve un ficheiro de cambios recentes.", @@ -1200,6 +1203,7 @@ "apihelp-query+watchlistraw-param-show": "Só listar os elementos que cumplen estos criterios.", "apihelp-query+watchlistraw-param-owner": "Usado con $1token para acceder á lista de páxinas de vixiancia doutro usuario.", "apihelp-query+watchlistraw-param-token": "Identificador de seguridade (dispoñible nas [[Special:Preferences#mw-prefsection-watchlist|preferencias]] de usuario) para permitir o acceso a outros á súa páxina de vixiancia.", + "apihelp-query+watchlistraw-param-dir": "Dirección na cal listar.", "apihelp-query+watchlistraw-param-fromtitle": "Título (co prefixo de espazo de nomes) dende o que comezar a enumerar.", "apihelp-query+watchlistraw-param-totitle": "Título (co prefixo de espazo de nomes) no que rematar de enumerar.", "apihelp-query+watchlistraw-example-simple": "Listar páxinas na lista de vixiancia do usuario actual.", @@ -1252,6 +1256,7 @@ "apihelp-stashedit-param-contentmodel": "Modelo de contido para o novo contido.", "apihelp-stashedit-param-contentformat": "Formato de serialización de contido utilizado para o texto de entrada.", "apihelp-stashedit-param-baserevid": "Identificador da revisión da revisión de base.", + "apihelp-stashedit-param-summary": "Resumo do cambio.", "apihelp-tag-description": "Engadir ou eliminar etiquetas de cambio de revisións individuais ou entradas de rexistro.", "apihelp-tag-param-rcid": "Identificadores de un ou máis cambios recentes nos que engadir ou eliminar a etiqueta.", "apihelp-tag-param-revid": "Identificadores de unha ou máis revisións nas que engadir ou eliminar a etiqueta.", diff --git a/includes/api/i18n/he.json b/includes/api/i18n/he.json index c85a62b8c7..2a39745cbb 100644 --- a/includes/api/i18n/he.json +++ b/includes/api/i18n/he.json @@ -74,6 +74,9 @@ "apihelp-createaccount-param-language": "קוד השפה שיוגדר כבררת המחדל למשתמש (רשות, בררת המחדל היא שפת התוכן).", "apihelp-createaccount-example-pass": "יצירת המשתמש testuser עם הססמה test123.", "apihelp-createaccount-example-mail": "יצירת המשתמש testmailuser ושליחת ססמה שיוצרה אקראית בדוא״ל.", + "apihelp-cspreport-description": "משמש דפדפנים לדיווח הפרות של מדיניות אבטחת תוכן. המודול הזה לעולם לא ישמש אלא אם הוא משמש עם דפדפן תומך CSP.", + "apihelp-cspreport-param-reportonly": "לסמן בתור דיווח ממדיניות מנטרת, לא מדיניות כפויה", + "apihelp-cspreport-param-source": "מה ייצר את כותרת ה־CSP שייצרה את הדו״ח הזה", "apihelp-delete-description": "מחיקת דף.", "apihelp-delete-param-title": "כותרת העמוד למחיקה. לא ניתן להשתמש בשילוב עם $1pageid.", "apihelp-delete-param-pageid": "מס׳ הזיהוי של העמוד למחיקה. לא ניתן להשתמש בשילוב עם $1title.", @@ -140,7 +143,7 @@ "apihelp-expandtemplates-param-includecomments": "האם לכלול הערות HTML בפלט.", "apihelp-expandtemplates-param-generatexml": "יצירת עץ פענוח XML (מוחלף ב־$1prop=parsetree).", "apihelp-expandtemplates-example-simple": "להרחיב את קוד הוויקי {{Project:Sandbox}}.", - "apihelp-feedcontributions-description": "החזרת הזנת תרומות משתמש.", + "apihelp-feedcontributions-description": "להחזיר הזנת תרומות משתמש.", "apihelp-feedcontributions-param-feedformat": "תסדיר ההזנה.", "apihelp-feedcontributions-param-user": "לקבל תרומות של אילו משמשים.", "apihelp-feedcontributions-param-namespace": "לפי איזה מרחב שם לסנן את התרומות.", @@ -150,6 +153,7 @@ "apihelp-feedcontributions-param-deletedonly": "הצגת תרומות שנמחקו בלבד.", "apihelp-feedcontributions-param-toponly": "הצגת עריכות שהן הגרסה העדכנית ביותר בלבד.", "apihelp-feedcontributions-param-newonly": "להציג רק עריכות שהן יצירות דפים.", + "apihelp-feedcontributions-param-hideminor": "להסתיר עריכות משניות.", "apihelp-feedcontributions-param-showsizediff": "להציג את ההבדל בגודל בין גרסאות.", "apihelp-feedcontributions-example-simple": "החזרת תרומות עבור המשתמש Example.", "apihelp-feedrecentchanges-description": "להחזיר הזנת שינויים אחרונים.", @@ -418,8 +422,8 @@ "apihelp-query+allimages-param-start": "מאיזה חותם־זמן להתחיל למנות. יכול לשמש רק עם $1sort=timestamp.", "apihelp-query+allimages-param-end": "באיזה חותם זמן להפסיק לרשום. אפשר להשתמש בזה רק עם $1sort=timestamp.", "apihelp-query+allimages-param-prefix": "חיפוש כל שמות התמונות שמתחילים בערך הזה. יכול לשמש רק עם $1sort=name.", - "apihelp-query+allimages-param-minsize": "להגביל לתמונות עם מספר כזה של בתים לפחות.", - "apihelp-query+allimages-param-maxsize": "להגביל לתמונות עם מספר כזה לכל היותר של בתים.", + "apihelp-query+allimages-param-minsize": "להגביל לתמונות עם מספר כזה של בייטים לפחות.", + "apihelp-query+allimages-param-maxsize": "להגביל לתמונות עם מספר כזה לכל היותר של בייטים.", "apihelp-query+allimages-param-sha1": "גיבוב SHA1 של תמונה. דריסת $1sha1base36.", "apihelp-query+allimages-param-sha1base36": "גיבוב SHA1 של התמונה בבסיס 36 (הבסיס בו נעשה שימוש במדיה־ויקי).", "apihelp-query+allimages-param-user": "להחזיר רק קבצים שהועלו על־ידי המשתמש הזה. יכול לשמש רק עם $1sort=timestamp. לא יכול לשמש יחד עם $1filterbots.", @@ -467,8 +471,8 @@ "apihelp-query+allpages-param-prefix": "חיפוש כל שמות הדפים שמתחילים בערך הזה.", "apihelp-query+allpages-param-namespace": "איזה מרחב שם למנות.", "apihelp-query+allpages-param-filterredir": "אילו דפים לרשום.", - "apihelp-query+allpages-param-minsize": "להגביל לדפים עם מספר כזה לפחות של בתים.", - "apihelp-query+allpages-param-maxsize": "להגביל לדפים שיש בהם לכל היותר מספר כזה של בתים.", + "apihelp-query+allpages-param-minsize": "להגביל לדפים עם מספר כזה לפחות של בייטים.", + "apihelp-query+allpages-param-maxsize": "להגביל לדפים שיש בהם לכל היותר מספר כזה של בייטים.", "apihelp-query+allpages-param-prtype": "להגביל רק לדפים מוגנים.", "apihelp-query+allpages-param-prlevel": "לסנו הגנות לפי רמת ההגנה (חייב לשמש עם $1prtype= parameter).", "apihelp-query+allpages-param-prfiltercascade": "לסנן הגנות לפי דירוגיות (לא תקף כאשר $1prtype אינו מוגדר).", @@ -650,7 +654,7 @@ "apihelp-query+deletedrevs-param-excludeuser": "לא לרשום גרסאות מאת המשתמש הזה.", "apihelp-query+deletedrevs-param-namespace": "לרשום רק דפים במרחב השם הזה.", "apihelp-query+deletedrevs-param-limit": "המספר המרבי של הגרסאות שיירשם.", - "apihelp-query+deletedrevs-param-prop": "אילו מאפיינים לקבל:\n;revid:הוספת מזהה הגרסה של הגרסה המחוקה.\n;parentid:הוספת מזהה הגרסה של הגרסה הקודמת של הדף.\n;user:הוספת המשתמש שעשה את הגרסה.\n;userid:הוספת מזהה המשתמש שעשה את הגרסה.\n;comment:הוספת ההערה על הגרסה.\n;parsedcomment:הוספת ההערה המפוענחת על הגרסה.\n;minor:מתייג אם הגרסה משנית.\n;len:מוסיף את האורך (בבתים) של הגרסה.\n;sha1:הוספת ה־SHA-1 (בסיס 16) של הגרסה.\n;content:הוספת התוכן של הגרסה.\n;token:מיושן. נותן אסימון עריכה.\n;tags:תגים עבור הגרסה.", + "apihelp-query+deletedrevs-param-prop": "אילו מאפיינים לקבל:\n;revid:הוספת מזהה הגרסה של הגרסה המחוקה.\n;parentid:הוספת מזהה הגרסה של הגרסה הקודמת של הדף.\n;user:הוספת המשתמש שעשה את הגרסה.\n;userid:הוספת מזהה המשתמש שעשה את הגרסה.\n;comment:הוספת ההערה על הגרסה.\n;parsedcomment:הוספת ההערה המפוענחת על הגרסה.\n;minor:מתייג אם הגרסה משנית.\n;len:מוסיף את האורך (בבייטים) של הגרסה.\n;sha1:הוספת ה־SHA-1 (בסיס 16) של הגרסה.\n;content:הוספת התוכן של הגרסה.\n;token:מיושן. נותן אסימון עריכה.\n;tags:תגים עבור הגרסה.", "apihelp-query+deletedrevs-example-mode1": "רשימת כל הגרסאות המחוקות של הדפים Main Page ו־Talk:Main Page, עם תוכן (mode 1).", "apihelp-query+deletedrevs-example-mode2": "רשימת 50 העריכות המחוקות האחרונות של Bob‏ (mode 2).", "apihelp-query+deletedrevs-example-mode3-main": "רשימת 50 הגרסאות המחוקות הראשונות במרחב הראשי (mode 3).", @@ -700,7 +704,7 @@ "apihelp-query+filearchive-paramvalue-prop-sha1": "הוספת גיבוב SHA-1 עבור התמונה.", "apihelp-query+filearchive-paramvalue-prop-timestamp": "הוספת חותם־זמן לגרסה המועלית.", "apihelp-query+filearchive-paramvalue-prop-user": "הוספת המשתמש שהעלה על גרסת התמונה.", - "apihelp-query+filearchive-paramvalue-prop-size": "הוספת הגודל של התמונה בבתים והגובה, הרוחב ומניין הדפים (אם מתאים).", + "apihelp-query+filearchive-paramvalue-prop-size": "הוספת הגודל של התמונה בבייטים והגובה, הרוחב ומניין הדפים (אם מתאים).", "apihelp-query+filearchive-paramvalue-prop-dimensions": "כינוי ל־size.", "apihelp-query+filearchive-paramvalue-prop-description": "הוספת תיאור לגרסת התמונה.", "apihelp-query+filearchive-paramvalue-prop-parseddescription": "פענוח התיאור של הגרסה.", @@ -732,7 +736,7 @@ "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "פענוח ההערה על גרסה.", "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "הוספת הכותרת הקנונית של הקובץ.", "apihelp-query+imageinfo-paramvalue-prop-url": "מתן URL לקובץ ולדף התיאור.", - "apihelp-query+imageinfo-paramvalue-prop-size": "הוספת הגודל של הקובץ בבתים והגובה, הרוחב ומניין הדפים (אם זה מתאים).", + "apihelp-query+imageinfo-paramvalue-prop-size": "הוספת הגודל של הקובץ בבייטים והגובה, הרוחב ומניין הדפים (אם זה מתאים).", "apihelp-query+imageinfo-paramvalue-prop-dimensions": "כינוי ל־size.", "apihelp-query+imageinfo-paramvalue-prop-sha1": "הוספת גיבוב SHA-1 עבור הקובץ.", "apihelp-query+imageinfo-paramvalue-prop-mime": "הוספת סוג ה־MIME של הקובץ.", @@ -938,7 +942,7 @@ "apihelp-query+recentchanges-paramvalue-prop-timestamp": "הוספת חותם־זמן של העריכה.", "apihelp-query+recentchanges-paramvalue-prop-title": "הוספת שם הדף של העריכה.", "apihelp-query+recentchanges-paramvalue-prop-ids": "הוספת מזהה הדף, מזהה שינויים אחרונים, והמזהה הגרסה החדשה והישנה.", - "apihelp-query+recentchanges-paramvalue-prop-sizes": "הוספת אורך הדף החדש והישן בבתים.", + "apihelp-query+recentchanges-paramvalue-prop-sizes": "הוספת אורך הדף החדש והישן בבייטים.", "apihelp-query+recentchanges-paramvalue-prop-redirect": "מתייג שהדף הוא הפניה.", "apihelp-query+recentchanges-paramvalue-prop-patrolled": "מתייג עריכה בת־בדיקה בתור בדוקה או בלתי־בדוקה.", "apihelp-query+recentchanges-paramvalue-prop-loginfo": "הוספת מידע יומן (זהה יומן, סוג יומן וכו') לעיולי יומן.", @@ -984,7 +988,7 @@ "apihelp-query+revisions+base-paramvalue-prop-timestamp": "חותם־הזמן של הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-user": "המתמש שעשה את הגרסה", "apihelp-query+revisions+base-paramvalue-prop-userid": "מזהה המשתמש של יוצר הגרסה.", - "apihelp-query+revisions+base-paramvalue-prop-size": "אורך (בבתים) של הגרסה.", + "apihelp-query+revisions+base-paramvalue-prop-size": "אורך (בבייטים) של הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-sha1": "SHA-1 (בבסיס 16) של הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "מזהה מודל התוכן של הגרסה.", "apihelp-query+revisions+base-paramvalue-prop-comment": "הערה מאת המשתמש על הגרסה.", @@ -1008,7 +1012,7 @@ "apihelp-query+search-param-info": "אילו מטא־נתונים להחזיר.", "apihelp-query+search-param-prop": "אילו מאפיינים להחזיר:", "apihelp-query+search-param-qiprofile": "באיזה פרופיל בלתי־תלוי בשאילתה להשתמש (משפיע על אלגוריתם הדירוג).", - "apihelp-query+search-paramvalue-prop-size": "הוספת גודל הדף בבתים.", + "apihelp-query+search-paramvalue-prop-size": "הוספת גודל הדף בבייטים.", "apihelp-query+search-paramvalue-prop-wordcount": "הוספת מניין המילים של הדף.", "apihelp-query+search-paramvalue-prop-timestamp": "הוספת חותם־הזמן של העריכה האחרונה של הדף.", "apihelp-query+search-paramvalue-prop-snippet": "הוספת קטע קצר מפוענח מהדף.", @@ -1202,6 +1206,7 @@ "apihelp-query+watchlistraw-param-show": "לרשום רק פריטים שעונים על אמות המידה האלו.", "apihelp-query+watchlistraw-param-owner": "משמש יחד עם $1token לגישה לרשימת מעקב של משתמש אחר.", "apihelp-query+watchlistraw-param-token": "אסימון אבטחה (זמין ב־[[Special:Preferences#mw-prefsection-watchlist|העדפות]]) שמאפשר לגשת לרשימת מעקב של משתמש אחר.", + "apihelp-query+watchlistraw-param-dir": "באיזה כיוון לרשום.", "apihelp-query+watchlistraw-param-fromtitle": "מאיזו כותרת (עם תחילית מרחב שם) להתחיל למנות.", "apihelp-query+watchlistraw-param-totitle": "באיזו כותרת (עם תחילית מרחב שם) להפסיק למנות.", "apihelp-query+watchlistraw-example-simple": "לרשום דפים ברשימת המעקב של המשתמש הנוכחי.", @@ -1254,6 +1259,7 @@ "apihelp-stashedit-param-contentmodel": "מודל התוכן של התוכן החדש.", "apihelp-stashedit-param-contentformat": "תסדיר הסדרת תוכן עבור טקסט הקלט.", "apihelp-stashedit-param-baserevid": "מזהה גסה של גרסת הבסיס.", + "apihelp-stashedit-param-summary": "לשנות תקציר.", "apihelp-tag-description": "הוספת או הסרה של תגים מגרסאות בודדות או עיולי יומן בודדים.", "apihelp-tag-param-rcid": "מזהה שינוי אחרון אחד או יותר שתג יתווסף אליו או יוסר ממנו.", "apihelp-tag-param-revid": "מזהה גרסה אחד או יותר שתג יתווסף אליה או יוסר ממנה.", @@ -1299,7 +1305,7 @@ "apihelp-upload-param-sessionkey": "אותו דבר כמו $1filekey, מושאר לצור תאימות אחורה.", "apihelp-upload-param-stash": "אם זה מוגדר, השרת יסליק זמנית את הקובץ במקום להוסיף אותו למאגר.", "apihelp-upload-param-filesize": "גודל הקובץ של כל ההעלאה.", - "apihelp-upload-param-offset": "היסט החתיכה בבתים.", + "apihelp-upload-param-offset": "היסט החתיכה בבייטים.", "apihelp-upload-param-chunk": "תוכן החתיכה.", "apihelp-upload-param-async": "להפוך פעולות קבצים גדולות לאסינכרוניות כשאפשר.", "apihelp-upload-param-checkstatus": "לאחזר רק מצב העלאה עבור מפתח הקובץ שניתן.", diff --git a/includes/api/i18n/ia.json b/includes/api/i18n/ia.json index 147a832a73..0f8a9ad79f 100644 --- a/includes/api/i18n/ia.json +++ b/includes/api/i18n/ia.json @@ -4,6 +4,7 @@ "McDutchie" ] }, + "apihelp-main-description": "
    \n* [[mw:API:Main_page|Documentation]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Listas de diffusion]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annuncios sur le API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bugs & demandas]\n
    \nStato: Tote le functiones monstrate in iste pagina deberea functionar, sed le API es ancora in disveloppamento active e pote cambiar a omne momento. Subscribe te al [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de diffusion mediawiki-api-announce] pro esser informate de actualisationes.\n\nRequestas erronee: Quando requestas erronee se invia al API, un capite HTTP essera inviate con le clave \"MediaWiki-API-Error\". Le valor de iste capite e le codice de error reinviate essera identic. Pro plus information vide [[mw:API:Errors_and_warnings|API: Errores e avisos]].\n\nTests: Pro facilitar le test de requestas API, vide [[Special:ApiSandbox]].", "apihelp-main-param-action": "Qual action exequer.", "apihelp-main-param-format": "Le formato del resultato.", "apihelp-main-param-maxlag": "Le latentia maximal pote esser usate quando MediaWiki es installate in un cluster de base de datos replicate. Pro evitar actiones que causa additional latentia de replication de sito, iste parametro pote facer le cliente attender usque le latentia de replication es minus que le valor specificate. In caso de latentia excessive, le codice de error maxlag es retornate con un message como Attende $host: $lag secundas de latentia.
    Vide [[mw:Manual:Maxlag_parameter|Manual: Maxlag parameter]] pro plus information.", @@ -13,18 +14,43 @@ "apihelp-main-param-requestid": "Omne valor fornite hic essera includite in le responsa. Pote esser usate pro distinguer requestas.", "apihelp-main-param-servedby": "Includer in le resultato le nomine del host que ha servite le requesta.", "apihelp-main-param-curtimestamp": "Includer le data e hora actual in le resultato.", - "apihelp-main-param-origin": "Quando acceder al API usante un requesta AJAX inter-dominios (CORS), mitte isto al dominio de origine. Isto debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST). Isto debe corresponder exactemente a un del origines in le capite Origin:, dunque illo debe esser mittite a qualcusa como http://ia.wikipedia.org o https://meta.wikimedia.org. Si iste parametro non corresponde al capite Origin:, un responsa 403 essera retornate. Si iste parametro corresponde al capite Origin: e le origine es in le lista blanc, un capite Access-Control-Allow-Origin essera inserite.", - "apihelp-main-param-uselang": "Lingua a usar pro traductiones de messages. Un lista de codices pote esser obtenite ab [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] con siprop=languages, o specifica \"user\" pro usar le preferentia de lingua del usator actual, o specifica \"content\" pro usar le lingua de contento de iste wiki.", + "apihelp-main-param-origin": "Quando se accede al API usante un requesta AJAX inter-dominios (CORS), mitte le dominio de origine in iste parametro. Illo debe esser includite in omne requesta pre-flight, e dunque debe facer parte del URI del requesta (e non del corpore POST). Illo debe corresponder exactemente a un del origines in le capite Origin, dunque debe esser mittite a qualcosa como http://ia.wikipedia.org o https://meta.wikimedia.org. Si iste parametro non corresponde al capite Origin, un responsa 403 essera retornate. Si iste parametro corresponde al capite Origin e le origine es in le lista blanc, un capite Access-Control-Allow-Origin essera inserite.", + "apihelp-main-param-uselang": "Lingua a usar pro traductiones de messages [[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]] con siprop=languages retorna un lista de codices de lingua, o specifica user pro usar le preferentia de lingua del usator actual, o specifica content pro usar le lingua de contento de iste wiki.", "apihelp-block-description": "Blocar un usator.", "apihelp-block-param-user": "Nomine de usator, adresse IP o intervallo IP que tu vole blocar.", - "apihelp-block-param-expiry": "Tempore de expiration. Pote esser relative (p.ex. \"5 months\" o \"2 weeks\") o absolute (p.ex. \"2014-09-18T12:34:56Z\"). Si es mittite a \"infinite\", \"indefinite\" o \"never\", le blocada nunquam expirara.", + "apihelp-block-param-expiry": "Tempore de expiration. Pote esser relative (p.ex. 5 months o 2 weeks<.kbd>) o absolute (p.ex. 2014-09-18T12:34:56Z). Si es mittite a infinite, indefinite o never, le blocada nunquam expirara.", "apihelp-block-param-reason": "Motivo del blocada.", "apihelp-block-param-anononly": "Blocar solmente usatores anonyme (i.e. disactivar modificationes anonyme pro iste adresse IP).", "apihelp-block-param-nocreate": "Impedir le creation de contos.", "apihelp-block-param-autoblock": "Blocar automaticamente le adresse IP usate le plus recentemente, e omne IPs successive desde le quales ille/-a tenta facer modificationes.", - "apihelp-block-param-noemail": "Impedir que le usator invia e-mail per le wiki. (Require le derecto \"blockemail\").", + "apihelp-block-param-noemail": "Impedir que le usator invia e-mail per le wiki. (Require le derecto blockemail).", + "apihelp-block-param-hidename": "Celar le nomine de usator in le registro de blocadas. (Require le derecto hideuser.)", + "apihelp-block-param-allowusertalk": "Permitter que le usator modifica su proprie pagina de discussion (depende de [[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]).", + "apihelp-block-param-reblock": "Si le usator es jam blocate, superscriber le blocada existente.", + "apihelp-block-param-watchuser": "Observar le paginas de usator e discussion del usator o del adresse IP.", + "apihelp-block-example-ip-simple": "Blocar le adresse IP 192.0.2.5 pro tres dies con le motivo Prime advertimento.", + "apihelp-block-example-user-complex": "Blocar le usator Vandalo pro tempore indeterminate con le motivo Vandalismo, e impedir le creation de nove contos e le invio de e-mail.", + "apihelp-changeauthenticationdata-description": "Cambiar le datos de authentication pro le usator actual.", + "apihelp-changeauthenticationdata-example-password": "Tentar de cambiar le contrasigno del usator actual a ExemploDeContrasigno.", + "apihelp-checktoken-description": "Verificar le validitate de un indicio ab [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Typo de indicio a testar.", "apihelp-checktoken-param-token": "Indicio a testar.", + "apihelp-checktoken-param-maxtokenage": "Etate maxime permittite pro le indicio, in secundas.", + "apihelp-checktoken-example-simple": "Testar le validitate de un indicio csrf.", + "apihelp-clearhasmsg-description": "Cancella le signal hasmsg pro le usator actual.", + "apihelp-clearhasmsg-example-1": "Cancellar le signal hasmsg pro le usator actual.", + "apihelp-clientlogin-description": "Aperir session in le wiki usante le fluxo interactive.", + "apihelp-clientlogin-example-login": "Comenciar le processo de aperir session in le wiki como le usator Exemplo con le contrasigno ExemploDeContrasigno.", + "apihelp-clientlogin-example-login2": "Continuar a aperir session post un responsa UI pro authentication bifactorial, forniente un OATHToken de 987654.", + "apihelp-compare-description": "Obtener le differentia inter duo paginas.\n\nEs necessari indicar un numero de version, un titulo de pagina o un ID de pagina, e pro \"from\" e pro \"to\".", + "apihelp-compare-param-fromtitle": "Prime titulo a comparar.", + "apihelp-compare-param-fromid": "Prime ID de pagina comparar.", + "apihelp-compare-param-fromrev": "Prime version a comparar.", + "apihelp-compare-param-totitle": "Secunde titulo a comparar.", + "apihelp-compare-param-toid": "Secunde ID de pagina a comparar.", + "apihelp-compare-param-torev": "Secunde version a comparar.", + "apihelp-compare-example-1": "Crear un diff inter version 1 e 2.", + "apihelp-createaccount-description": "Crear un nove conto de usator.", "apihelp-createaccount-param-name": "Nomine de usator.", "apihelp-query+prefixsearch-param-profile": "Le profilo de recerca a usar.", "apihelp-query+revisions-example-first5-not-localhost": "Obtener le prime 5 versiones del \"Pagina principal\" que non ha essite facite per le usator anonyme \"127.0.0.1\"", diff --git a/includes/api/i18n/it.json b/includes/api/i18n/it.json index 54373a4b5f..6a2f836951 100644 --- a/includes/api/i18n/it.json +++ b/includes/api/i18n/it.json @@ -13,7 +13,9 @@ "Nemo bis", "JackLantern", "Urielejh", - "Matteocng" + "Matteocng", + "Einreiher", + "Mpiva" ] }, "apihelp-main-description": "
    \n* [[mw:API:Main_page|Documentazione]] (in inglese)\n* [[mw:API:FAQ|FAQ]] (in inglese)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Mailing list]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Annunci sull'API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Bug & richieste]\n
    \nStato: tutte le funzioni e caratteristiche mostrate su questa pagina dovrebbero funzionare, ma le API sono ancora in fase attiva di sviluppo, e potrebbero cambiare in qualsiasi momento. Iscriviti alla [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la mailing list sugli annunci delle API MediaWiki] per essere informato sugli aggiornamenti.\n\nIstruzioni sbagliate: quando vengono impartite alle API delle istruzioni sbagliate, un'intestazione HTTP verrà inviata col messaggio \"MediaWiki-API-Error\" e, sia il valore dell'intestazione, sia il codice d'errore, verranno impostati con lo stesso valore. Per maggiori informazioni leggi [[mw:API:Errors_and_warnings|API:Errori ed avvertimenti]] (in inglese).\n\nTest: per testare facilmente le richieste API, vedi [[Special:ApiSandbox]].", @@ -119,11 +121,13 @@ "apihelp-feedcontributions-param-deletedonly": "Mostra solo i contribuiti cancellati.", "apihelp-feedcontributions-param-toponly": "Mostra solo i contributi che sono le ultime versioni per la pagina.", "apihelp-feedcontributions-param-newonly": "Visualizza solo le modifiche che sono creazioni di pagina.", + "apihelp-feedcontributions-param-hideminor": "Nascondi le modifiche minori.", "apihelp-feedcontributions-param-showsizediff": "Mostra la differenza di dimensioni tra le versioni.", "apihelp-feedcontributions-example-simple": "Restituisce contributi per l'utente Example.", "apihelp-feedrecentchanges-param-feedformat": "Il formato del feed.", "apihelp-feedrecentchanges-param-namespace": "Namespace a cui limitare i risultati.", "apihelp-feedrecentchanges-param-associated": "Includi namespace associato (discussione o principale)", + "apihelp-feedrecentchanges-param-days": "Intervallo di giorni per i quali limitare i risultati.", "apihelp-feedrecentchanges-param-limit": "Numero massimo di risultati da restituire.", "apihelp-feedrecentchanges-param-from": "Mostra i cambiamenti da allora.", "apihelp-feedrecentchanges-param-hideminor": "Nascondi le modifiche minori.", @@ -132,18 +136,24 @@ "apihelp-feedrecentchanges-param-hideliu": "Nascondi le modifiche apportate dagli utenti registrati.", "apihelp-feedrecentchanges-param-hidepatrolled": "Nascondi modifiche verificate.", "apihelp-feedrecentchanges-param-hidemyself": "Nasconde le modifiche effettuate dall'utente attuale.", + "apihelp-feedrecentchanges-param-hidecategorization": "Nascondi le variazioni di appartenenza alle categorie.", "apihelp-feedrecentchanges-param-tagfilter": "Filtra per etichetta.", "apihelp-feedrecentchanges-param-target": "Mostra solo le modifiche alle pagine collegate da questa pagina.", "apihelp-feedrecentchanges-param-showlinkedto": "Mostra solo le modifiche alle pagine collegate a quella specificata.", + "apihelp-feedrecentchanges-param-categories": "Mostra solo le variazioni sulle pagine di tutte queste categorie.", + "apihelp-feedrecentchanges-param-categories_any": "Mostra invece solo le variazioni sulle pagine in una qualunque categoria.", "apihelp-feedrecentchanges-example-simple": "Mostra le ultime modifiche.", "apihelp-feedrecentchanges-example-30days": "Mostra le modifiche degli ultimi 30 giorni.", "apihelp-feedwatchlist-param-feedformat": "Il formato del feed.", + "apihelp-feedwatchlist-param-hours": "Elenca le pagine modificate entro queste ultime ore.", "apihelp-feedwatchlist-param-linktosections": "Collega direttamente alla sezione modificata, se possibile.", + "apihelp-feedwatchlist-example-all6hrs": "Mostra tutte le modifiche alle pagine osservate nelle ultime 6 ore.", "apihelp-filerevert-description": "Ripristina un file ad una versione precedente.", "apihelp-filerevert-param-filename": "Nome del file di destinazione, senza il prefisso 'File:'.", "apihelp-filerevert-param-comment": "Commento sul caricamento.", "apihelp-filerevert-param-archivename": "Nome dell'archivio della versione da ripristinare.", "apihelp-filerevert-example-revert": "Ripristina Wiki.png alla versione del 2011-03-05T15:27:40Z.", + "apihelp-help-description": "Mostra la guida per i moduli specificati.", "apihelp-help-param-toc": "Includi un indice nell'output HTML.", "apihelp-help-example-main": "Aiuto per il modulo principale.", "apihelp-help-example-submodules": "Aiuto per action=query e tutti i suoi sotto-moduli.", @@ -558,6 +568,7 @@ "apihelp-query+watchlistraw-param-limit": "Numero totale di risultati da restituire per ogni richiesta.", "apihelp-query+watchlistraw-param-prop": "Quali proprietà aggiuntive ottenere:", "apihelp-query+watchlistraw-paramvalue-prop-changed": "Aggiunge data e ora dell'ultima notifica all'utente riguardo la modifica.", + "apihelp-query+watchlistraw-param-dir": "La direzione in cui elencare.", "apihelp-query+watchlistraw-param-fromtitle": "Il titolo (con prefisso namespace) da cui iniziare l'elenco.", "apihelp-query+watchlistraw-param-totitle": "Il titolo (con prefisso namespace) al quale interrompere l'elenco.", "apihelp-query+watchlistraw-example-simple": "Elenca le pagine fra gli osservati speciali dell'utente attuale.", @@ -580,6 +591,7 @@ "apihelp-stashedit-param-sectiontitle": "Il titolo per una nuova sezione.", "apihelp-stashedit-param-text": "Contenuto della pagina.", "apihelp-stashedit-param-contentmodel": "Modello di contenuto dei nuovi contenuti.", + "apihelp-stashedit-param-summary": "Oggetto della modifica.", "apihelp-tag-param-reason": "Motivo per la modifica.", "apihelp-tokens-param-type": "Tipi di token da richiedere.", "apihelp-tokens-example-edit": "Recupera un token di modifica (il predefinito).", @@ -649,7 +661,7 @@ "api-help-authmanagerhelper-messageformat": "Formato da utilizzare per per la restituzione dei messaggi.", "api-help-authmanagerhelper-preservestate": "Conserva lo stato da un precedente tentativo di accesso non riuscito, se possibile.", "api-help-authmanagerhelper-returnurl": "URL di ritorno per i flussi di autenticazione di terze parti, deve essere assoluto. E' necessario fornirlo, oppure va fornito $1continue.\n\nAlla ricezione di una risposta REDIRECT, in genere si apre un browser o una vista web all'URL specificato redirecttarget per un flusso di autenticazione di terze parti. Quando questo è completato, la terza parte invierà il browser o la vista web a questo URL. Dovresti estrarre qualsiasi parametro POST o della richiesta dall'URL e passarli come un request $1continue a questo modulo API.", - "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta UI o REDIRECT. E' necessario fornire questo oppure $1returnurl.", + "api-help-authmanagerhelper-continue": "Questa richiesta è una continuazione dopo una precedente risposta UI o REDIRECT. È necessario fornirlo, oppure fornire $1returnurl.", "api-help-authmanagerhelper-additional-params": "Questo modulo accetta parametri aggiuntivi a seconda delle richieste di autenticazione disponibili. Utilizza [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] con amirequestsfor=$1 (o una precedente risposta da questo modulo, se applicabile) per determinare le richieste disponibili e i campi usati da queste.", "api-credits-header": "Crediti" } diff --git a/includes/api/i18n/ja.json b/includes/api/i18n/ja.json index d6596b1ffb..e0eef1cf31 100644 --- a/includes/api/i18n/ja.json +++ b/includes/api/i18n/ja.json @@ -512,6 +512,7 @@ "apihelp-query+deletedrevisions-param-excludeuser": "この利用者による版を一覧表示しない。", "apihelp-query+deletedrevisions-example-titles": "ページ Main Page および Talk:Main Page の削除された版とその内容を一覧表示する。", "apihelp-query+deletedrevisions-example-revids": "削除された版 123456 に関する情報を一覧表示する。", + "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|モード}}: $2", "apihelp-query+deletedrevs-param-start": "列挙の始点となるタイムスタンプ。", "apihelp-query+deletedrevs-param-end": "列挙の終点となるタイムスタンプ。", "apihelp-query+deletedrevs-param-from": "列挙の始点となるページ名。", @@ -823,6 +824,7 @@ "apihelp-query+watchlistraw-description": "現在の利用者のウォッチリストにあるすべてのページを取得します。", "apihelp-query+watchlistraw-param-namespace": "この名前空間に含まれるページのみを一覧表示します。", "apihelp-query+watchlistraw-param-prop": "追加で取得するプロパティ:", + "apihelp-query+watchlistraw-param-dir": "一覧表示する方向。", "apihelp-query+watchlistraw-example-generator": "現在の利用者のウォッチリスト上のページに関する情報を取得する。", "apihelp-revisiondelete-description": "版の削除および復元を行います。", "apihelp-revisiondelete-param-reason": "削除または復元の理由。", diff --git a/includes/api/i18n/ko.json b/includes/api/i18n/ko.json index a3a2db4953..371347b43f 100644 --- a/includes/api/i18n/ko.json +++ b/includes/api/i18n/ko.json @@ -12,10 +12,11 @@ "Revi", "Yearning", "Priviet", - "Ykhwong" + "Ykhwong", + "Jonghaya" ] }, - "apihelp-main-description": "
    \n* [[mw:API:Main_page|설명문서]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 알림 사항]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청]\n
    \n상태: 이 페이지에 보여지는 모든 기능은 정상적으로 작동하지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 변경될 수 있습니다. 업데이트 공지를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n잘못된 요청: API에 잘못된 요청이 전송되면 HTTP 헤더에서 \"MediaWiki-API-Error\" 키를 보내고, 헤더 값과 오류 코드가 같게 설정됩니다. 자세한 정보에 대해서는 [[mw:API:Errors_and_warnings|API:오류와 경고]]를 참조하십시오.\n\n테스트하기: API 요청을 테스트의 편의를 위해, [[Special:ApiSandbox]]를 보세요.", + "apihelp-main-description": "
    \n* [[mw:API:Main_page|설명문서]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 알림 사항]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청]\n
    \n상태: 이 페이지에 보이는 모든 기능은 정상적으로 작동하지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 변경될 수 있습니다. 업데이트 공지를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n잘못된 요청: API에 잘못된 요청이 전송되면 \"MediaWiki-API-Error\" 키가 포함된 HTTP 헤더가 전송되며 반환되는 헤더와 오류 코드의 값은 동일한 값으로 설정됩니다. 자세한 정보에 대해서는 [[mw:API:Errors_and_warnings|API:오류와 경고]]를 참조하십시오.\n\n테스트하기: API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.", "apihelp-main-param-action": "수행할 동작", "apihelp-main-param-format": "출력값의 형식.", "apihelp-main-param-maxlag": "최대 랙은 미디어위키가 데이터베이스 복제된 클러스터에 설치되었을 때 사용될 수 있습니다. 특정한 행동이 사이트 복제 랙을 유발할 때, 이 변수는 클라이언트가 복제 랙이 설정된 숫자 아래로 내려갈 때까지 기다리도록 지시합니다. 과도한 랙의 경우, maxlag 오류 코드와 Waiting for $host: $lag seconds lagged 메시지가 제공됩니다.
    [[mw:Manual:Maxlag_parameter|매뉴얼: Maxlag 변수]] 에서 더 많은 정보를 얻을 수 있습니다.", @@ -37,14 +38,19 @@ "apihelp-block-param-allowusertalk": "자신의 토론 문서를 편집할 수 있도록 허용합니다. ([[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]] 값에 따라 다름)", "apihelp-block-param-reblock": "사용자가 이미 차단된 경우, 기존 차단 설정을 바꿉니다.", "apihelp-block-param-watchuser": "해당 사용자 또는 IP 주소의 사용자 문서 및 토론 문서를 주시합니다.", - "apihelp-block-example-ip-simple": "IP 192.0.2.5에 대해 First strike라는 이유로 3일간 차단하기", + "apihelp-block-example-ip-simple": "IP 192.0.2.5에 대해 First strike라는 이유로 3일 간 차단하기", "apihelp-block-example-user-complex": "사용자 Vandal을 Vandalism이라는 이유로 무기한 차단하며 계정 생성 및 이메일 발송을 막기", + "apihelp-changeauthenticationdata-description": "현재 사용자의 인증 데이터를 변경합니다.", + "apihelp-changeauthenticationdata-example-password": "현재 사용자의 비밀번호를 ExamplePassword로 변경하는 것을 시도합니다.", + "apihelp-checktoken-description": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]의 토큰의 유효성을 확인합니다.", "apihelp-checktoken-param-type": "테스트되는 토큰의 종류.", "apihelp-checktoken-param-token": "테스트할 토큰", "apihelp-checktoken-param-maxtokenage": "초로 계산된 토큰의 최대 나이.", "apihelp-checktoken-example-simple": "csrf 토큰의 유효성을 테스트합니다.", "apihelp-clearhasmsg-description": "현재 사용자의 hasmsg 플래그를 비웁니다.", "apihelp-clearhasmsg-example-1": "현재 계정의 hasmsg 플래그를 삭제합니다.", + "apihelp-clientlogin-description": "상호작용 플로우를 이용하여 위키에 로그인합니다.", + "apihelp-clientlogin-example-login": "사용자 Example, 비밀번호 ExamplePassword로 위키 로그인 과정을 시작합니다.", "apihelp-compare-description": "두 문서 간의 차이를 가져옵니다.\n\n대상이 되는 두 문서의 판 번호나 문서 제목 또는 문서 ID를 지정해야 합니다.", "apihelp-compare-param-fromtitle": "비교할 첫 이름.", "apihelp-compare-param-fromid": "비교할 첫 문서 ID.", @@ -54,6 +60,7 @@ "apihelp-compare-param-torev": "비교할 두 번째 판.", "apihelp-compare-example-1": "판 1과 2의 차이를 생성합니다.", "apihelp-createaccount-description": "새 사용자 계정을 만듭니다.", + "apihelp-createaccount-example-create": "비밀번호 ExamplePassword로 된 사용자 Example의 생성 과정을 시작합니다.", "apihelp-createaccount-param-name": "사용자 이름", "apihelp-createaccount-param-password": "비밀번호입니다. ($1mailpassword가 설정되어 있으면 무시됩니다)", "apihelp-createaccount-param-domain": "외부 인증의 도메인 (선택적)", @@ -62,9 +69,11 @@ "apihelp-createaccount-param-realname": "사용자 실명 (선택).", "apihelp-createaccount-param-mailpassword": "아무 값이든 존재한다면, 랜덤 비밀번호가 이메일로 전송됩니다.", "apihelp-createaccount-param-reason": "선택적인, 기록에 남을 계정을 만드는 이유", + "apihelp-createaccount-param-language": "사용자에게 기본으로 설정할 언어 코드. (선택 사항, 기본값으로는 본문의 언어입니다)", "apihelp-createaccount-example-pass": "사용자 testuser를 만들고 비밀번호를 test123으로 설정합니다.", "apihelp-createaccount-example-mail": "사용자 testmailuser를 만들고 자동 생성된 비밀번호를 이메일로 보냅니다.", "apihelp-delete-description": "문서 삭제", + "apihelp-delete-param-title": "삭제할 문서의 제목. $1pageid과 함께 사용할 수 없습니다.", "apihelp-delete-param-pageid": "삭제할 문서의 ID. $1title과 함께 사용할 수 없습니다.", "apihelp-delete-param-reason": "삭제의 이유. 설정하지 않으면 자동 생성되는 이유를 사용합니다.", "apihelp-delete-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.", @@ -72,12 +81,15 @@ "apihelp-delete-example-simple": "Main Page를 삭제합니다.", "apihelp-disabled-description": "이 모듈은 해제되었습니다.", "apihelp-edit-description": "문서를 만들고 편집합니다.", + "apihelp-edit-param-section": "문단 번호입니다. 0은 최상위 문단, new는 새 문단입니다.", "apihelp-edit-param-sectiontitle": "새 문단을 위한 제목.", "apihelp-edit-param-text": "문서 내용.", "apihelp-edit-param-summary": "편집 요약. 또한 $1section=new 및 $1sectiontitle이 설정되어 있지 않을 때 문단 제목.", + "apihelp-edit-param-tags": "이 판에 적용할 태그를 변경합니다.", "apihelp-edit-param-minor": "사소한 편집.", "apihelp-edit-param-notminor": "사소하지 않은 편집.", "apihelp-edit-param-bot": "이 편집을 봇으로 표시.", + "apihelp-edit-param-createonly": "이 페이지가 이미 존재하면 편집하지 않습니다.", "apihelp-edit-param-nocreate": "페이지가 존재하지 않으면 오류를 출력합니다.", "apihelp-edit-param-watch": "문서를 현재 사용자의 주시문서 목록에 추가합니다.", "apihelp-edit-param-unwatch": "문서를 현재 사용자의 주시문서 목록에서 제거합니다.", @@ -95,30 +107,54 @@ "apihelp-expandtemplates-param-text": "변환할 위키텍스트.", "apihelp-expandtemplates-paramvalue-prop-wikitext": "확장된 위키텍스트.", "apihelp-expandtemplates-paramvalue-prop-parsetree": "입력값의 XML 파서 트리.", + "apihelp-expandtemplates-param-includecomments": "출력에 HTML 주석을 포함할 것인지의 여부.", + "apihelp-expandtemplates-param-generatexml": "XML 구문 분석 트리를 생성합니다. ($1prop=parsetree로 대체함)", + "apihelp-expandtemplates-example-simple": "위키텍스트 {{Project:Sandbox}}를 확장합니다.", "apihelp-feedcontributions-description": "사용자 기여 피드를 반환합니다.", "apihelp-feedcontributions-param-feedformat": "피드 포맷.", "apihelp-feedcontributions-param-user": "기여를 읽을 사용자 이름.", "apihelp-feedcontributions-param-namespace": "기여를 분류할 이름공간", "apihelp-feedcontributions-param-deletedonly": "삭제된 기여만 봅니다.", "apihelp-feedcontributions-param-toponly": "최신 판인 편집만 봅니다.", + "apihelp-feedcontributions-param-newonly": "새 글인 편집만 봅니다.", + "apihelp-feedcontributions-param-hideminor": "사소한 편집을 숨깁니다.", + "apihelp-feedcontributions-param-showsizediff": "판 사이의 크기 차이를 보여줍니다.", + "apihelp-feedrecentchanges-description": "최근 바뀜 피드를 반환합니다.", "apihelp-feedrecentchanges-param-feedformat": "피드 포맷.", + "apihelp-feedrecentchanges-param-namespace": "결과를 제한할 이름공간.", "apihelp-feedrecentchanges-param-invert": "선택한 항목을 제외한 모든 이름공간.", + "apihelp-feedrecentchanges-param-associated": "관련 (토론 또는 일반) 이름공간을 포함합니다.", + "apihelp-feedrecentchanges-param-limit": "반환할 결과의 최대 수.", + "apihelp-feedrecentchanges-param-from": "이후의 변경 사항을 보여줍니다.", "apihelp-feedrecentchanges-param-hideminor": "사소한 편집을 숨깁니다.", "apihelp-feedrecentchanges-param-hidebots": "봇의 편집을 숨깁니다.", "apihelp-feedrecentchanges-param-hideanons": "익명 사용자의 편집을 숨깁니다.", "apihelp-feedrecentchanges-param-hideliu": "등록된 사용자의 편집을 숨깁니다.", "apihelp-feedrecentchanges-param-hidepatrolled": "검토된 편집을 숨깁니다.", + "apihelp-feedrecentchanges-param-hidemyself": "현재 사용자가 변경한 사항을 숨깁니다.", "apihelp-feedrecentchanges-param-tagfilter": "태그로 분류", "apihelp-feedrecentchanges-example-simple": "최근 바뀜을 봅니다.", "apihelp-feedrecentchanges-example-30days": "30일간의 최근 바뀜을 봅니다.", + "apihelp-feedwatchlist-description": "주시문서 목록 피드를 반환합니다.", + "apihelp-feedwatchlist-param-feedformat": "피드 포맷.", + "apihelp-feedwatchlist-example-default": "주시문서 목록 피드를 보여줍니다.", "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.", "apihelp-filerevert-example-revert": "Wiki.png를 2011-03-05T15:27:40Z 판으로 되돌립니다.", + "apihelp-help-description": "지정된 모듈의 도움말을 보여줍니다.", "apihelp-help-param-helpformat": "도움말 출력 포맷.", + "apihelp-help-example-recursive": "모든 도움말을 한 페이지로 모읍니다.", + "apihelp-imagerotate-description": "하나 이상의 그림을 회전합니다.", + "apihelp-imagerotate-param-rotation": "시계 방향으로 회전할 그림의 각도.", "apihelp-import-param-xml": "업로드한 XML 파일.", "apihelp-login-param-name": "계정 이름.", "apihelp-login-param-password": "비밀번호.", "apihelp-login-param-domain": "도메인 (선택).", + "apihelp-login-param-token": "처음 요청에서 로그인 토큰을 취득했습니다.", + "apihelp-login-example-gettoken": "로그인 토큰을 검색합니다.", "apihelp-login-example-login": "로그인.", + "apihelp-logout-description": "로그아웃하고 세션 데이터를 지웁니다.", + "apihelp-logout-example-logout": "현재 사용자를 로그아웃합니다.", + "apihelp-mergehistory-description": "문서 역사를 합칩니다.", "apihelp-mergehistory-param-reason": "문서 병합 이유.", "apihelp-move-description": "문서 이동하기.", "apihelp-move-param-reason": "제목을 변경하는 이유", @@ -131,28 +167,290 @@ "apihelp-opensearch-description": "OpenSearch 프로토콜을 이용하여 위키 검색하기", "apihelp-opensearch-param-search": "문자열 검색", "apihelp-opensearch-param-limit": "반환할 결과의 최대 수", + "apihelp-opensearch-param-namespace": "검색할 이름공간.", "apihelp-opensearch-param-format": "출력 포맷.", "apihelp-options-param-reset": "사이트 기본으로 설정 초기화", "apihelp-options-example-reset": "모든 설정 초기화", + "apihelp-paraminfo-description": "API 모듈의 정보를 가져옵니다.", "apihelp-paraminfo-param-helpformat": "도움말 문자열 포맷.", + "apihelp-parse-param-summary": "구문 분석할 요약입니다.", + "apihelp-parse-paramvalue-prop-categorieshtml": "분류의 HTML 버전을 제공합니다.", + "apihelp-parse-paramvalue-prop-links": "구문 분석된 위키텍스트의 내부 링크를 제공합니다.", + "apihelp-parse-paramvalue-prop-templates": "구문 분석된 위키텍스트의 틀을 제공합니다.", + "apihelp-parse-paramvalue-prop-images": "구문 분석된 위키텍스트의 그림을 제공합니다.", + "apihelp-parse-paramvalue-prop-externallinks": "구문 분석된 위키텍스트의 외부 링크를 제공합니다.", + "apihelp-parse-paramvalue-prop-sections": "구문 분석된 위키텍스트의 문단을 제공합니다.", + "apihelp-parse-paramvalue-prop-revid": "구문 분석된 페이지의 판 ID를 추가합니다.", + "apihelp-parse-paramvalue-prop-displaytitle": "구문 분석된 위키텍스트의 제목을 추가합니다.", + "apihelp-parse-paramvalue-prop-iwlinks": "구문 분석된 위키텍스트의 인터위키 링크를 제공합니다.", + "apihelp-parse-paramvalue-prop-wikitext": "구문 분석된 위키텍스트 원문을 제공합니다.", + "apihelp-parse-paramvalue-prop-properties": "구문 분석된 위키텍스트에 정의된 다양한 속성을 제공합니다.", + "apihelp-parse-param-disablelimitreport": "파서 출력에서 제한 보고서(\"NewPP limit report\")를 제외합니다.", + "apihelp-parse-param-disablepp": "$1disablelimitreport를 대신 사용합니다.", + "apihelp-parse-param-disableeditsection": "파서 출력에서 문단 편집 링크를 제외합니다.", + "apihelp-parse-param-disabletidy": "파서 출력에서 HTML 정리(예: tidy)를 수행하지 않습니다.", + "apihelp-parse-param-preview": "미리 보기 모드에서 구문 분석을 합니다.", + "apihelp-parse-param-sectionpreview": "문단 미리 보기 모드에서 구문 분석을 합니다. (미리 보기 모드도 활성화함)", + "apihelp-parse-param-disabletoc": "출력에서 목차를 제외합니다.", + "apihelp-parse-example-page": "페이지의 구문을 분석합니다.", + "apihelp-parse-example-text": "위키텍스트의 구문을 분석합니다.", + "apihelp-parse-example-summary": "요약을 구문 분석합니다.", + "apihelp-protect-description": "문서의 보호 수준을 변경합니다.", "apihelp-protect-param-reason": "보호 또는 보호 해제의 이유.", "apihelp-protect-example-protect": "문서 보호", + "apihelp-purge-param-forcelinkupdate": "링크 테이블을 업데이트합니다.", + "apihelp-query+allcategories-description": "모든 분류를 열거합니다.", + "apihelp-query+allcategories-param-prefix": "이 값으로 시작하는 모든 분류 제목을 검색합니다.", + "apihelp-query+allcategories-param-dir": "정렬 방향.", + "apihelp-query+allcategories-param-limit": "반환할 분류의 갯수입니다.", + "apihelp-query+allcategories-param-prop": "얻고자 하는 속성:", + "apihelp-query+allcategories-paramvalue-prop-size": "페이지 수를 분류에 추가합니다.", + "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "$3user와 함께 사용할 수 없습니다.", + "apihelp-query+alldeletedrevisions-param-prefix": "이 값으로 시작하는 모든 문서 제목을 검색합니다.", + "apihelp-query+alldeletedrevisions-param-tag": "이 태그로 태그된 판만을 나열합니다.", + "apihelp-query+alldeletedrevisions-param-user": "이 사용자에 대한 판만 나열합니다.", + "apihelp-query+alldeletedrevisions-param-excludeuser": "이 사용자에 대한 판을 나열하지 않습니다.", + "apihelp-query+alldeletedrevisions-param-namespace": "이 이름공간의 문서만 나열합니다.", + "apihelp-query+allfileusages-paramvalue-prop-title": "파일의 제목을 추가합니다.", + "apihelp-query+allfileusages-param-limit": "반환할 총 항목 수입니다.", + "apihelp-query+allfileusages-example-unique": "고유한 파일 제목을 나열합니다.", + "apihelp-query+allfileusages-example-unique-generator": "모든 파일 제목을 가져오되, 존재하지 않는 항목을 표시합니다.", + "apihelp-query+allfileusages-example-generator": "파일을 포함하는 문서를 가져옵니다.", + "apihelp-query+allimages-description": "모든 그림을 순차적으로 열거합니다.", + "apihelp-query+alllinks-paramvalue-prop-title": "링크의 제목을 추가합니다.", + "apihelp-query+alllinks-param-namespace": "열거할 이름공간.", + "apihelp-query+alllinks-param-limit": "반환할 총 항목 수입니다.", + "apihelp-query+allmessages-description": "이 사이트에서 반환할 메시지.", "apihelp-query+allmessages-example-ipb": "ipb-로 시작하는 메시지를 보입니다.", + "apihelp-query+allpages-param-namespace": "열거할 이름공간.", + "apihelp-query+allredirects-paramvalue-prop-title": "넘겨주기의 제목을 추가합니다.", + "apihelp-query+allredirects-param-namespace": "열거할 이름공간.", + "apihelp-query+allredirects-param-limit": "반환할 총 항목 수입니다.", "apihelp-query+allrevisions-description": "모든 판 표시.", + "apihelp-query+mystashedfiles-param-limit": "가져올 파일의 갯수.", + "apihelp-query+alltransclusions-param-prop": "포함할 정보:", + "apihelp-query+alltransclusions-param-namespace": "열거할 이름공간.", + "apihelp-query+alltransclusions-param-limit": "반환할 총 항목 수입니다.", + "apihelp-query+allusers-description": "등록된 모든 사용자를 열거합니다.", + "apihelp-query+allusers-param-dir": "정렬 방향.", + "apihelp-query+allusers-param-prop": "포함할 정보:", + "apihelp-query+allusers-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.", + "apihelp-query+allusers-param-witheditsonly": "편집을 한 사용자만 나열합니다.", + "apihelp-query+allusers-example-Y": "Y로 시작하는 사용자를 나열합니다.", + "apihelp-query+authmanagerinfo-description": "현재의 인증 상태에 대한 정보를 검색합니다.", + "apihelp-query+backlinks-param-namespace": "열거할 이름공간.", + "apihelp-query+blocks-description": "차단된 모든 사용자와 IP 주소를 나열합니다.", + "apihelp-query+blocks-param-start": "나열을 시작할 타임스탬프", + "apihelp-query+blocks-param-end": "나열을 끝낼 타임스탬프", + "apihelp-query+blocks-param-ids": "나열할 차단 ID 목록 (선택 사항).", + "apihelp-query+blocks-param-users": "검색할 사용자 목록 (선택 사항).", + "apihelp-query+blocks-param-prop": "얻고자 하는 속성:", + "apihelp-query+blocks-paramvalue-prop-user": "차단된 사용자의 사용자 이름을 추가합니다.", + "apihelp-query+blocks-paramvalue-prop-userid": "차단된 사용자의 사용자 ID를 추가합니다.", + "apihelp-query+blocks-paramvalue-prop-by": "차단을 수행하는 사용자의 사용자 이름을 추가합니다.", + "apihelp-query+blocks-paramvalue-prop-byid": "차단을 수행하는 사용자의 사용자 ID를 추가합니다.", + "apihelp-query+blocks-paramvalue-prop-timestamp": "차단된 시점의 타임스탬프를 추가합니다.", + "apihelp-query+blocks-paramvalue-prop-expiry": "차단 만료 시점의 타임스탬프를 추가합니다.", + "apihelp-query+blocks-paramvalue-prop-reason": "차단 이유를 추가합니다.", + "apihelp-query+blocks-paramvalue-prop-range": "차단에 영향을 받는 IP 주소 대역을 추가합니다.", + "apihelp-query+categories-param-limit": "반환할 분류의 갯수입니다.", + "apihelp-query+categorymembers-paramvalue-prop-ids": "페이지 ID를 추가합니다.", + "apihelp-query+categorymembers-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.", + "apihelp-query+categorymembers-paramvalue-prop-timestamp": "문서가 포함된 시기의 타임스탬프를 추가합니다.", + "apihelp-query+categorymembers-param-limit": "반환할 문서의 최대 수입니다.", + "apihelp-query+categorymembers-param-startsortkey": "$1starthexsortkey를 대신 사용해 주십시오.", + "apihelp-query+categorymembers-param-endsortkey": "$1endhexsortkey를 대신 사용해 주십시오.", + "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|모드|모드}}: $2", + "apihelp-query+deletedrevs-param-start": "나열을 시작할 타임스탬프", + "apihelp-query+deletedrevs-param-end": "나열을 끝낼 타임스탬프", + "apihelp-query+deletedrevs-param-limit": "나열할 판의 최대 양.", + "apihelp-query+disabled-description": "이 쿼리 모듈은 비활성화되었습니다.", + "apihelp-query+duplicatefiles-description": "해시 값 기반으로 주어진 파일들 중 중복된 모든 파일을 나열합니다.", + "apihelp-query+duplicatefiles-param-limit": "반환할 중복 파일의 수.", + "apihelp-query+embeddedin-param-namespace": "열거할 이름공간.", + "apihelp-query+extlinks-param-limit": "반환할 링크의 수.", + "apihelp-query+exturlusage-param-prop": "포함할 정보:", + "apihelp-query+exturlusage-paramvalue-prop-ids": "문서의 ID를 추가합니다.", + "apihelp-query+exturlusage-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.", + "apihelp-query+exturlusage-paramvalue-prop-url": "문서에 사용된 URL을 추가합니다.", + "apihelp-query+exturlusage-param-namespace": "열거할 문서 이름공간.", + "apihelp-query+exturlusage-param-limit": "반환할 문서 수.", + "apihelp-query+filearchive-description": "삭제된 모든 파일을 순서대로 열거합니다.", + "apihelp-query+filearchive-paramvalue-prop-sha1": "그림에 대한 SHA-1 해시를 추가합니다.", + "apihelp-query+filearchive-paramvalue-prop-user": "그림 판을 올린 사용자를 추가합니다.", + "apihelp-query+filearchive-paramvalue-prop-description": "그림 판의 설명을 추가합니다.", + "apihelp-query+filearchive-paramvalue-prop-mime": "그림의 MIME를 추가합니다.", + "apihelp-query+filearchive-paramvalue-prop-mediatype": "그림의 미디어 유형을 추가합니다.", + "apihelp-query+filearchive-paramvalue-prop-metadata": "그림의 버전에 대한 Exif 메타데이터를 나열합니다.", + "apihelp-query+filearchive-example-simple": "삭제된 모든 파일의 목록을 표시합니다.", + "apihelp-query+filerepoinfo-description": "위키에 구성된 그림 저장소에 대한 메타 정보를 반환합니다.", + "apihelp-query+filerepoinfo-example-simple": "파일 저장소의 정보를 가져옵니다.", + "apihelp-query+fileusage-param-prop": "얻고자 하는 속성:", + "apihelp-query+fileusage-paramvalue-prop-pageid": "각 문서의 페이지 ID.", + "apihelp-query+fileusage-paramvalue-prop-title": "각 문서의 제목.", + "apihelp-query+fileusage-paramvalue-prop-redirect": "문서가 넘겨주기이면 표시합니다.", + "apihelp-query+fileusage-param-namespace": "이 이름공간의 문서만 포함합니다.", + "apihelp-query+fileusage-param-limit": "반환할 항목 수.", + "apihelp-query+fileusage-param-show": "이 기준을 충족하는 항목만 표시합니다:\n;redirect:넘겨주기만 표시합니다.\n;!redirect:넘겨주기가 아닌 항목만 표시합니다.", + "apihelp-query+imageinfo-paramvalue-prop-timestamp": "업로드된 판에 대한 타임스탬프를 추가합니다.", + "apihelp-query+imageinfo-paramvalue-prop-sha1": "파일에 대한 SHA-1 해시를 추가합니다.", + "apihelp-query+imageinfo-paramvalue-prop-mediatype": "파일의 미디어 유형을 추가합니다.", + "apihelp-query+imageinfo-param-urlheight": "$1urlwidth와 유사합니다.", + "apihelp-query+imageinfo-example-simple": "[[:File:Albert Einstein Head.jpg]]의 현재 판에 대한 정보를 가져옵니다.", + "apihelp-query+imageinfo-example-dated": "2008년 및 그 이후의 [[:File:Test.jpg]]의 판에 대한 정보를 가져옵니다.", + "apihelp-query+images-param-limit": "반환할 파일 수.", + "apihelp-query+imageusage-param-namespace": "열거할 이름공간.", + "apihelp-query+imageusage-example-generator": "[[:File:Albert Einstein Head.jpg]]를 이용하여 페이지의 정보를 가져옵니다.", + "apihelp-query+info-description": "기본 페이지 정보를 가져옵니다.", + "apihelp-query+info-param-prop": "얻고자 하는 추가 속성:", + "apihelp-query+info-paramvalue-prop-protection": "각 문서의 보호 수준을 나열합니다.", + "apihelp-query+info-paramvalue-prop-readable": "사용자가 이 문서를 읽을 수 있는지의 여부.", + "apihelp-query+iwbacklinks-param-prefix": "인터위키의 접두사.", + "apihelp-query+iwbacklinks-param-title": "검색할 인터위키 링크. $1blprefix와 함께 사용해야 합니다.", + "apihelp-query+iwbacklinks-param-limit": "반활한 총 문서 수.", + "apihelp-query+iwbacklinks-param-prop": "얻고자 하는 속성:", + "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "인터위키의 접두사를 추가합니다.", + "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "인터위키의 제목을 추가합니다.", + "apihelp-query+iwlinks-paramvalue-prop-url": "전체 URL을 추가합니다.", + "apihelp-query+langbacklinks-param-lang": "언어 링크의 언어.", + "apihelp-query+langbacklinks-paramvalue-prop-lllang": "언어 링크의 언어 코드를 추가합니다.", + "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "언어 링크의 제목을 추가합니다.", + "apihelp-query+langlinks-paramvalue-prop-url": "전체 URL을 추가합니다.", + "apihelp-query+langlinks-param-lang": "이 언어 코드의 언어 링크만 반환합니다.", + "apihelp-query+linkshere-paramvalue-prop-pageid": "각 문서의 페이지 ID.", + "apihelp-query+linkshere-paramvalue-prop-title": "각 문서의 제목.", + "apihelp-query+linkshere-param-namespace": "이 이름공간의 문서만 포함합니다.", + "apihelp-query+linkshere-param-limit": "반환할 항목 수.", + "apihelp-query+linkshere-param-show": "이 기준을 충족하는 항목만 표시합니다:\n;redirect:넘겨주기만 표시합니다.\n;!redirect:넘겨주기가 아닌 항목만 표시합니다.", + "apihelp-query+logevents-paramvalue-prop-ids": "로그 이벤트의 ID를 추가합니다.", + "apihelp-query+logevents-paramvalue-prop-type": "로그 이벤트의 유형을 추가합니다.", + "apihelp-query+pagepropnames-param-limit": "반환할 이름의 최대 수.", + "apihelp-query+pageswithprop-param-prop": "포함할 정보:", + "apihelp-query+pageswithprop-paramvalue-prop-ids": "페이지 ID를 추가합니다.", + "apihelp-query+pageswithprop-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.", "apihelp-query+pageswithprop-param-limit": "나타낼 문서의 최대 수입니다.", "apihelp-query+pageswithprop-param-dir": "정렬 순서", "apihelp-query+prefixsearch-param-search": "문자열 검색", + "apihelp-query+prefixsearch-param-namespace": "검색할 이름공간.", + "apihelp-query+prefixsearch-param-limit": "반환할 결과의 최대 수", + "apihelp-query+prefixsearch-param-profile": "검색 프로파일 사용", + "apihelp-query+protectedtitles-paramvalue-prop-level": "보호 수준을 추가합니다.", + "apihelp-query+recentchanges-param-prop": "추가 정보를 포함합니다:", + "apihelp-query+recentchanges-paramvalue-prop-user": "편집에 임할 사용자를 추가하고 IP인 경우 태그합니다.", + "apihelp-query+recentchanges-paramvalue-prop-userid": "편집에 임할 사용자를 추가합니다.", + "apihelp-query+recentchanges-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.", + "apihelp-query+revisions+base-paramvalue-prop-size": "판의 길이. (바이트)", + "apihelp-query+revisions+base-paramvalue-prop-sha1": "판의 SHA-1 (base 16).", + "apihelp-query+revisions+base-paramvalue-prop-contentmodel": "판의 콘텐츠 모델 ID.", + "apihelp-query+revisions+base-paramvalue-prop-content": "판의 텍스트.", + "apihelp-query+revisions+base-paramvalue-prop-tags": "판의 태그.", + "apihelp-query+search-param-qiprofile": "쿼리 독립적인 프로파일 사용(순위 알고리즘에 영향있음)", + "apihelp-query+search-paramvalue-prop-size": "바이트 단위로 문서의 크기를 추가합니다.", + "apihelp-query+search-paramvalue-prop-wordcount": "문서의 낱말 수를 추가합니다.", + "apihelp-query+search-paramvalue-prop-timestamp": "문서가 마지막으로 편집된 시기의 타임스탬프를 추가합니다.", + "apihelp-query+search-example-simple": "meaning을 검색합니다.", + "apihelp-query+search-example-text": "meaning의 텍스트를 검색합니다.", + "apihelp-query+siteinfo-param-prop": "가져올 정보:", + "apihelp-query+siteinfo-paramvalue-prop-general": "전반적인 시스템 정보.", + "apihelp-query+siteinfo-paramvalue-prop-statistics": "사이트 통계를 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-interwikimap": "인터위키 맵을 반환합니다. ($1inlanguagecode를 사용하여 필터링 및 지역화 선택 가능)", + "apihelp-query+siteinfo-paramvalue-prop-usergroups": "사용자 그룹 및 관련 권한을 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-libraries": "위키에 설치된 라이브러리를 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-extensions": "위키에 설치된 확장 기능을 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-fileextensions": "업로드가 허용된 파일 확장자(파일 종류)의 목록을 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-rightsinfo": "이용 가능한 경우 위키 권한 (라이선스) 정보를 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-restrictions": "이용 가능한 제한 (보호) 종류의 정보를 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-languages": "미디어위키가 지원하는 언어 목록을 반환합니다. ($1inlanguagecode를 사용하여 지역화 선택 가능)", + "apihelp-query+siteinfo-paramvalue-prop-skins": "사용 중인 모든 스킨의 목록을 반환합니다. ($1inlanguagecode를 사용하여 지역화 선택이 가능하며, 이를 사용하지 않으면 본문의 언어를 사용함)", + "apihelp-query+siteinfo-paramvalue-prop-extensiontags": "파서 확장 태그의 목록을 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-functionhooks": "파서 함수 훅의 목록을 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-variables": "변수 ID의 목록을 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-protocols": "외부 링크에 허용된 프로토콜의 목록을 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-defaultoptions": "사용자 환경 설정의 기본값을 반환합니다.", + "apihelp-query+siteinfo-paramvalue-prop-uploaddialog": "업로드 대화 상자 구성을 반환합니다.", + "apihelp-query+siteinfo-param-numberingroup": "사용자 그룹의 사용자 수를 나열합니다.", + "apihelp-query+siteinfo-example-simple": "사이트 정보를 가져옵니다.", + "apihelp-query+siteinfo-example-interwiki": "로컬 인터위키 접두사 목록을 가져옵니다.", + "apihelp-query+tags-param-limit": "나열할 태그의 최대 수.", + "apihelp-query+tags-paramvalue-prop-name": "태그의 이름을 추가합니다.", + "apihelp-query+tags-paramvalue-prop-description": "태그의 설명을 추가합니다.", + "apihelp-query+tags-paramvalue-prop-hitcount": "판의 수와 이 판을 가진 로그 엔트리를 추가합니다.", + "apihelp-query+templates-param-limit": "반환할 틀 수.", + "apihelp-query+tokens-param-type": "요청할 토큰의 종류.", + "apihelp-query+transcludedin-paramvalue-prop-pageid": "각 문서의 페이지 ID.", + "apihelp-query+transcludedin-paramvalue-prop-title": "각 문서의 제목.", + "apihelp-query+transcludedin-paramvalue-prop-redirect": "문서가 넘겨주기이면 표시합니다.", + "apihelp-query+transcludedin-param-namespace": "이 이름공간의 문서만 포함합니다.", + "apihelp-query+transcludedin-param-limit": "반환할 항목 수.", + "apihelp-query+transcludedin-param-show": "이 기준을 충족하는 항목만 표시합니다:\n;redirect:넘겨주기만 표시합니다.\n;!redirect:넘겨주기가 아닌 항목만 표시합니다.", + "apihelp-query+usercontribs-description": "한 사용자의 모든 편집을 가져옵니다.", + "apihelp-query+usercontribs-param-limit": "반환할 기여의 최대 수.", + "apihelp-query+usercontribs-paramvalue-prop-ids": "페이지 ID와 판 ID를 추가합니다.", + "apihelp-query+usercontribs-paramvalue-prop-title": "문서의 제목과 이름공간 ID를 추가합니다.", + "apihelp-query+usercontribs-paramvalue-prop-timestamp": "편집의 타임스탬프를 추가합니다.", + "apihelp-query+usercontribs-paramvalue-prop-size": "편집의 새로운 크기를 추가합니다.", + "apihelp-query+usercontribs-paramvalue-prop-flags": "편집의 플래그를 추가합니다.", + "apihelp-query+usercontribs-paramvalue-prop-patrolled": "점검한 편집을 태그합니다.", + "apihelp-query+usercontribs-paramvalue-prop-tags": "편집의 태그를 나열합니다.", + "apihelp-query+usercontribs-param-tag": "이 태그로 태그된 판만을 나열합니다.", + "apihelp-query+usercontribs-param-toponly": "최신 판인 변경 사항만 나열합니다.", + "apihelp-query+usercontribs-example-user": "사용자 Example의 기여를 표시합니다.", + "apihelp-query+usercontribs-example-ipprefix": "192.0.2.로 시작하는 모든 IP 주소의 기여를 표시합니다.", + "apihelp-query+userinfo-description": "현재 사용자의 정보를 가져옵니다.", + "apihelp-query+userinfo-param-prop": "포함할 정보:", + "apihelp-query+userinfo-paramvalue-prop-blockinfo": "현재 사용자가 차단되면 누구에 의해 무슨 이유로 차단되었는지 태그합니다.", + "apihelp-query+userinfo-paramvalue-prop-hasmsg": "현재 사용자가 대기 중인 메시지가 있다면 messages 태그를 추가합니다.", + "apihelp-query+userinfo-paramvalue-prop-groups": "현재 사용자가 소속된 모든 그룹을 나열합니다.", + "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "현재 사용자가 자동으로 소속된 모든 그룹을 나열합니다.", + "apihelp-query+userinfo-paramvalue-prop-rights": "현재 사용자가 가진 모든 권한을 나열합니다.", + "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "현재 사용자가 추가 및 제거할 수 있는 그룹을 나열합니다.", + "apihelp-query+userinfo-paramvalue-prop-options": "현재 사용자가 설정한 모든 설정을 나열합니다.", + "apihelp-query+userinfo-paramvalue-prop-editcount": "현재 사용자의 편집 수를 추가합니다.", + "apihelp-query+userinfo-paramvalue-prop-realname": "사용자의 실명을 추가합니다.", + "apihelp-query+userinfo-paramvalue-prop-email": "사용자의 이메일 주소와 이메일 인증 날짜를 추가합니다.", + "apihelp-query+userinfo-paramvalue-prop-registrationdate": "사용자의 등록 날짜를 추가합니다.", + "apihelp-query+userinfo-example-simple": "현재 사용자의 정보를 가져옵니다.", + "apihelp-query+userinfo-example-data": "현재 사용자의 추가 정보를 가져옵니다.", + "apihelp-query+users-description": "사용자 목록에 대한 정보를 가져옵니다.", + "apihelp-query+users-param-prop": "포함할 정보:", + "apihelp-query+users-paramvalue-prop-editcount": "사용자의 편집 수를 추가합니다.", + "apihelp-query+users-paramvalue-prop-registration": "사용자의 등록 타임스탬프를 추가합니다.", + "apihelp-query+users-param-token": "[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]을 대신 사용하십시오.", + "apihelp-query+users-example-simple": "사용자 Example의 정보를 반환합니다.", + "apihelp-query+watchlist-description": "현재 사용자의 주시목록의 문서의 최근 바뀜을 가져옵니다.", + "apihelp-query+watchlist-param-user": "이 사용자의 변경 사항만 나열합니다.", + "apihelp-query+watchlist-param-excludeuser": "이 사용자의 변경 사항을 나열하지 않습니다.", + "apihelp-query+watchlist-paramvalue-prop-ids": "판 ID와 페이지 ID를 추가합니다.", + "apihelp-query+watchlist-paramvalue-prop-title": "문서의 제목을 추가합니다.", + "apihelp-query+watchlist-paramvalue-prop-flags": "편집에 대한 플래그를 추가합니다.", + "apihelp-query+watchlist-paramvalue-prop-loginfo": "적절한 곳에 로그 정보를 추가합니다.", + "apihelp-removeauthenticationdata-description": "현재 사용자의 인증 데이터를 제거합니다.", + "apihelp-revisiondelete-description": "판을 삭제하거나 되살립니다.", + "apihelp-revisiondelete-param-reason": "삭제 또는 복구 이유.", "apihelp-rollback-param-tags": "되돌리기를 적용하기 위해 태그합니다.", + "apihelp-stashedit-param-sectiontitle": "새 문단을 위한 제목.", + "apihelp-stashedit-param-text": "문서 내용.", + "apihelp-stashedit-param-contentmodel": "새 콘텐츠의 콘텐츠 모델.", + "apihelp-tag-param-reason": "변경 이유.", + "apihelp-tokens-param-type": "요청할 토큰의 종류.", "apihelp-unblock-description": "사용자를 차단 해제합니다.", + "apihelp-unblock-param-reason": "차단 해제 이유.", + "apihelp-userrights-param-user": "사용자 이름.", + "apihelp-userrights-param-userid": "사용자 ID.", "apihelp-rawfm-description": "출력 데이터, 디버깅 요소를 포함, (HTML에 포함된)JSON형식.", + "apihelp-xml-param-includexmlnamespace": "지정하면 XML 이름공간을 추가합니다.", + "api-format-title": "미디어위키 API 결과", "api-help-title": "미디어위키 API 도움말", "api-help-lead": "이 페이지는 자동으로 생성된 미디어위키 API 도움말 문서입니다.\n\n설명 문서 및 예시: https://www.mediawiki.org/wiki/API", "api-help-main-header": "메인 모듈", "api-help-flag-deprecated": "이 모듈은 사용되지 않습니다.", + "api-help-flag-internal": "이 모듈은 내부용이거나 불안정합니다. 동작은 예고 없이 변경될 수 있습니다.", "api-help-flag-readrights": "이 모듈은 read 권한을 요구합니다.", "api-help-flag-writerights": "이 모듈은 write 권한을 요구합니다.", "api-help-flag-mustbeposted": "이 모듈은 POST 요청만을 허용합니다.", + "api-help-flag-generator": "이 모듈은 생성기로 사용할 수 있습니다.", "api-help-source": "출처: $1", + "api-help-source-unknown": "소스: 알 수 없음", "api-help-license": "라이선스: [[$1|$2]]", "api-help-license-noname": "라이선스: [[$1|링크 참조]]", "api-help-license-unknown": "라이선스: 알 수 없음", @@ -160,15 +458,27 @@ "api-help-param-deprecated": "사용 중지됨.", "api-help-param-required": "이 변수는 필수 입력 사항입니다.", "api-help-datatypes-header": "데이터 유형", - "api-help-datatypes": "API 요청 내 몇몇 매개변수형에 대해 더 자세히 설명해보겠습니다:\n;boolean\n:Boolean 매개변수들은 HTML 체크박스처럼 동작합니다: 만약 매개변수가 지정되었다면, 값에 상관없이 참의 값으로 여겨집니다. 거짓값은 매개변수 전체를 생략하세요.\n;timestamp\n:타임스탬프들은 여러 형식으로 표현될 수 있으나 ISO 8601 날짜와 시간이 추천됩니다. 모든 시간은 UTC이어야 하며, 포함된 시간대는 모두 무시됩니다.\n:* ISO 8601 날짜와 시간, 2001-01-15T14:56:00Z (구두점과 Z는 선택입니다.)\n:* ISO 8601 날짜와 시간과 (무시되는) 소수 초, 2001-01-15T14:56:00.00001Z (대시, 콜론과 Z 는 선택입니다.)\n:* 미디어위키 형식, 20010115145600\n:* 일반적인 수 형식 2001-01-15 14:56:00 (GMT, +##, 또는 -##와 같은 선택적 시간대는 무시됩니다)\n:*RFC 2822 형식 (시간대는 생략될 수 있음), Mon, 15 Jan 2001 14:56:00\n:* RFC 850 형식 (시간대는 생략될 수 있음), Monday, 15-Jan-2001 14:56:00\n:* C ctime 형식, Mon Jan 15 14:56:00 2001\n:* 1부터 13자리까지의 숫자로 표현된 1970-01-01T00:00:00Z 부터 흐른 시간(초) (0을 제외)\n:* 문자열 now", + "api-help-datatypes": "API 요청 내 몇몇 매개변수형에 대해 더 자세히 설명해보겠습니다:\n;boolean\n:Boolean 매개변수들은 HTML 체크박스처럼 동작합니다: 만약 매개변수가 지정되었다면, 값에 상관없이 참의 값으로 여겨집니다. 거짓값은 매개변수 전체를 생략하세요.\n;timestamp\n:타임스탬프들은 여러 형식으로 표현될 수 있으나 ISO 8601 날짜와 시간이 추천됩니다. 모든 시간은 UTC이어야 하며, 포함된 시간대는 모두 무시됩니다.\n:* ISO 8601 날짜와 시간, 2001-01-15T14:56:00Z (구두점과 Z는 선택입니다.)\n:* ISO 8601 날짜와 시간과 (무시되는) 소수 초, 2001-01-15T14:56:00.00001Z (대시, 콜론과 Z는 선택입니다.)\n:* 미디어위키 형식, 20010115145600\n:* 일반적인 수 형식 2001-01-15 14:56:00 (GMT, +##, 또는 -##와 같은 선택적 시간대는 무시됩니다)\n:*RFC 2822 형식 (시간대는 생략될 수 있음), Mon, 15 Jan 2001 14:56:00\n:* RFC 850 형식 (시간대는 생략될 수 있음), Monday, 15-Jan-2001 14:56:00\n:* C ctime 형식, Mon Jan 15 14:56:00 2001\n:* 1부터 13자리까지의 숫자로 표현된 1970-01-01T00:00:00Z 부터 흐른 시간(초) (0을 제외)\n:* 문자열 now", + "api-help-param-type-limit": "유형: 정수 또는 max", "api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}", "api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])", "api-help-param-list": "{{PLURAL:$1|1=하나의 값|2=값 (\"{{!}}\"로 구분)}}: $2", + "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=비어 있어야 함|비어 있을 수 있거나 $2}}", + "api-help-param-limit": "$1 초과는 허용되지 않습니다.", + "api-help-param-limit2": "$1 초과는 허용되지 않습니다. (봇의 경우 $2)", + "api-help-param-integer-min": "{{PLURAL:$1|1=값|2=값들}}은 $2 이상이어야 합니다.", + "api-help-param-integer-max": "{{PLURAL:$1|1=값|2=값들}}은 $3 이하여야 합니다.", + "api-help-param-integer-minmax": "{{PLURAL:$1|1=값|2=값들}}은 $2와 $3 사이여야 합니다.", + "api-help-param-multi-max": "값들의 최대 수는 {{PLURAL:$1|$1}}입니다. (봇의 경우 {{PLURAL:$2|$2}})", "api-help-param-default": "기본값: $1", "api-help-param-default-empty": "기본값: (비어 있음)", + "api-help-param-token-webui": "호환성을 위해, 웹 UI에 사용된 토큰도 허용합니다.", + "api-help-param-continue": "더 많은 결과를 이용할 수 있을 때, 계속하려면 이것을 사용하십시오.", "api-help-param-no-description": "(설명 없음)", "api-help-examples": "{{PLURAL:$1|예시}}:", "api-help-permissions": "{{PLURAL:$1|권한}}:", "api-help-permissions-granted-to": "{{PLURAL:$1|다음 그룹에 부여됨}}: $2", + "api-help-open-in-apisandbox": "[연습장에서 열기]", + "api-help-authmanagerhelper-messageformat": "반환 메시지에 사용할 형식.", "api-credits": "API 개발자:\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (초기 개발자, 선임 개발자 2006년 9월~2007년 9월)\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시거나,\nhttps://phabricator.wikimedia.org/ 에 버그 신고를 해 주시기 바랍니다.." } diff --git a/includes/api/i18n/ksh.json b/includes/api/i18n/ksh.json index 26da426827..2376c7b449 100644 --- a/includes/api/i18n/ksh.json +++ b/includes/api/i18n/ksh.json @@ -129,6 +129,7 @@ "apihelp-feedcontributions-param-deletedonly": "zeijsch blohß de fottjeschmeße Beijdrähsch.", "apihelp-feedcontributions-param-toponly": "Zeich blohß de Änderonge, di och de neußte sin.", "apihelp-feedcontributions-param-newonly": "Zeich blohß de Änderonge, woh Sigge neu aanjelaat woode sin.", + "apihelp-feedcontributions-param-hideminor": "Donn kein Minni-Ännderonge ennblände.", "apihelp-feedcontributions-param-showsizediff": "Zeijsch de Ongerscheijd en de Jrühße zwesche de Väsjohne.", "apihelp-feedcontributions-example-simple": "Zeijsch de Änderonge vum Metmaacher Example.", "apihelp-feedrecentchanges-description": "Donn ene Kannahl för de neuste Änderonge ußjävve.", @@ -189,6 +190,7 @@ "apihelp-import-param-namespace": "En heh dat Appachtemang emmpotehre. Kam_mer nit mem Parramehter „$1rootpage“ zersamme bruche.", "apihelp-import-param-rootpage": "Als Ongersigg vun heh dä Sigg empottehre. Km_mer nit zosamme met däm Parramehter „$1namespace“ bruche.", "apihelp-import-example-import": "Donn di Sigg „[[meta:Help:ParserFunctions]]“ en et Appachtemang 100empottehre, met alle älldere Väsjohne ennjeschloßße.", + "apihelp-linkaccount-example-link": "Fang dä Vörjang vum Verlengk obb ene Zohjang aan vun Example aan.", "apihelp-login-param-name": "Metmaacher_Nahme.", "apihelp-login-param-password": "Paßwoot.", "apihelp-login-param-domain": "De Domaijn (kann fott bliehve)", @@ -872,6 +874,8 @@ "apihelp-query+watchlistraw-param-limit": "Wi vell Äjehbneße ennsjesammp pro Oprohv ußjejovve wähde sulle.", "apihelp-query+watchlistraw-param-prop": "Wat för en zohsäzlejje Eijeschaffte holle:", "apihelp-query+watchlistraw-example-simple": "Donn alle Sigge uß dem aktälle Metmaacher sing Oppaßleß opleßte.", + "apihelp-removeauthenticationdata-example-simple": "Versöhk dem aktoäle Metmaacher sing Dahte för FooAuthenticationRequest fott ze nämme.", + "apihelp-resetpassword-example-email": "Schegg en e-mail mem Passwod neu säze aan alle Matmaacher met dä Addräß user@example.com.", "apihelp-revisiondelete-description": "Versione fottschmieße un widder zeröck holle.", "apihelp-revisiondelete-param-hide": "Wat för jehde Väsjohn ze veschteijsche.", "apihelp-revisiondelete-param-show": "Wat för jehde Väsjohn zerökzeholle.", @@ -885,6 +889,7 @@ "apihelp-stashedit-param-sectiontitle": "De Övverschreff för ene neuje Afschnett", "apihelp-stashedit-param-text": "Dä Sigg ehre Ennhalld.", "apihelp-stashedit-param-contentmodel": "Et Enhalltsmodäll för dä neue Ennhalld.", + "apihelp-stashedit-param-summary": "Zosammefaßong änndere", "apihelp-tag-description": "Donn Makkehronge vun einzel Väsjohne udder Enndraähsch em Logbohch fott nämme udder se verjävve.", "apihelp-tag-param-rcid": "Ein udder mih Kännonge uß de neuste Ännderonge, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.", "apihelp-tag-param-revid": "Ein Kännong udder mih, woh di Makkehrong derbei jedonn udder fott jenumme wähde sull.", diff --git a/includes/api/i18n/lb.json b/includes/api/i18n/lb.json index 76fd47daf4..041203e4d4 100644 --- a/includes/api/i18n/lb.json +++ b/includes/api/i18n/lb.json @@ -41,6 +41,7 @@ "apihelp-feedcontributions-param-month": "Vum Mount (a virdrun).", "apihelp-feedcontributions-param-deletedonly": "Nëmme geläscht Kontributioune weisen.", "apihelp-feedcontributions-param-toponly": "Nëmmen Ännerunge weisen déi déi lescht Versioun sinn.", + "apihelp-feedcontributions-param-hideminor": "Kleng Ännerunge verstoppen.", "apihelp-feedrecentchanges-param-days": "Deeg, op déi d'Resultater limitéiert gi sollen", "apihelp-feedrecentchanges-param-hideminor": "Kleng Ännerunge verstoppen.", "apihelp-feedrecentchanges-param-hidebots": "Ännerunge vu Botte verstoppen.", @@ -159,6 +160,7 @@ "apihelp-stashedit-param-title": "Titel vun der Säit déi geännert gëtt.", "apihelp-stashedit-param-sectiontitle": "Den Titel fir en neien Abschnitt.", "apihelp-stashedit-param-text": "Inhalt vun der Säit", + "apihelp-stashedit-param-summary": "Resumé änneren", "apihelp-tag-param-reason": "Grond fir d'Ännerung.", "apihelp-unblock-description": "D'Spär vun engem Benotzer ophiewen.", "apihelp-unblock-param-reason": "Grond fir d'Spär opzehiewen", diff --git a/includes/api/i18n/mr.json b/includes/api/i18n/mr.json index 432d9c0de0..d88e0ec7b2 100644 --- a/includes/api/i18n/mr.json +++ b/includes/api/i18n/mr.json @@ -98,5 +98,6 @@ "apihelp-query+watchlist-paramvalue-type-log": "नोंद प्रविष्ट्या", "apihelp-query+watchlist-paramvalue-type-categorize": "वर्ग सदस्यता बदलते.", "apihelp-stashedit-param-title": "पानाच्या मथळ्याचे संपादन होत आहे.", - "apihelp-stashedit-param-sectiontitle": "नविन विभागाचा मथळा" + "apihelp-stashedit-param-sectiontitle": "नविन विभागाचा मथळा", + "apihelp-stashedit-param-summary": "सारांश बदला." } diff --git a/includes/api/i18n/nl.json b/includes/api/i18n/nl.json index 865ebd98ec..4b99320be6 100644 --- a/includes/api/i18n/nl.json +++ b/includes/api/i18n/nl.json @@ -29,6 +29,7 @@ "apihelp-block-description": "Gebruiker blokkeren.", "apihelp-block-param-user": "Gebruikersnaam, IP-adres of IP-range om te blokkeren.", "apihelp-block-param-reason": "Reden voor blokkade.", + "apihelp-block-param-anononly": "Alleen anonieme gebruikers blokkeren (uitschakelen van anonieme bewerkingen via dit IP-adres)", "apihelp-block-param-nocreate": "Voorkom registeren van accounts.", "apihelp-block-param-autoblock": "Blokkeer automatisch het laatst gebruikte IP-adres en ieder volgend IP-adres van waaruit ze proberen aan te melden.", "apihelp-block-param-reblock": "De huidige blokkade aanpassen als de gebruiker al geblokkeerd is.", diff --git a/includes/api/i18n/pl.json b/includes/api/i18n/pl.json index 2acc27be24..96fe70e63e 100644 --- a/includes/api/i18n/pl.json +++ b/includes/api/i18n/pl.json @@ -90,6 +90,7 @@ "apihelp-feedcontributions-param-deletedonly": "Pokazuj tylko usunięty wkład.", "apihelp-feedcontributions-param-toponly": "Pokazuj tylko edycje będące ostatnią zmianą strony.", "apihelp-feedcontributions-param-newonly": "Pokazuj tylko edycje tworzące stronę.", + "apihelp-feedcontributions-param-hideminor": "Ukryj drobne zmiany.", "apihelp-feedcontributions-param-showsizediff": "Pokaż różnicę rozmiaru między wersjami.", "apihelp-feedrecentchanges-param-feedformat": "Format danych wyjściowych.", "apihelp-feedrecentchanges-param-namespace": "Przestrzeń nazw, do której ograniczone są wyniki.", diff --git a/includes/api/i18n/ps.json b/includes/api/i18n/ps.json index 89fa617adf..c2545fc2ab 100644 --- a/includes/api/i18n/ps.json +++ b/includes/api/i18n/ps.json @@ -45,6 +45,7 @@ "apihelp-query+watchlist-paramvalue-prop-title": "د يو مخ سرليک ورگډوي.", "apihelp-query+watchlist-paramvalue-type-new": "مخ جوړونې.", "apihelp-stashedit-param-sectiontitle": "د يوې نوې برخې سرليک.", + "apihelp-stashedit-param-summary": "د بدلون لنډيز.", "apihelp-tag-param-reason": "د بدلون سبب.", "apihelp-unblock-param-reason": "د بنديز ليرې کولو سبب.", "apihelp-undelete-param-reason": "د بيازېرملو سبب.", diff --git a/includes/api/i18n/pt-br.json b/includes/api/i18n/pt-br.json index a72b088da5..38af0cb471 100644 --- a/includes/api/i18n/pt-br.json +++ b/includes/api/i18n/pt-br.json @@ -7,7 +7,9 @@ "Rhcastilhos", "Macofe", "Almondega", - "Raphaelras" + "Raphaelras", + "Caçador de Palavras", + "LucyDiniz" ] }, "apihelp-main-param-action": "Qual ação executar.", @@ -343,6 +345,7 @@ "apihelp-stashedit-param-text": "Conteúdo da página", "apihelp-stashedit-param-contentmodel": "Modelo de conteúdo do novo conteúdo.", "apihelp-stashedit-param-contentformat": "Formato de serialização de conteúdo usado para o texto de entrada.", + "apihelp-stashedit-param-summary": "Mudar sumário.", "apihelp-tag-param-reason": "Motivo para a mudança.", "apihelp-unblock-description": "Desbloquear usuário", "apihelp-unblock-param-id": "ID do bloco para desbloquear (obtido através de list=blocks). Não pode ser usado em conjunto com $1user.", diff --git a/includes/api/i18n/pt.json b/includes/api/i18n/pt.json index b70ebe92fd..1b90a0dfda 100644 --- a/includes/api/i18n/pt.json +++ b/includes/api/i18n/pt.json @@ -35,6 +35,7 @@ "apihelp-expandtemplates-param-title": "Título da página.", "apihelp-feedcontributions-param-feedformat": "O formato do feed.", "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas contribuições eliminadas.", + "apihelp-feedcontributions-param-hideminor": "Ocultar edições menores.", "apihelp-feedcontributions-param-showsizediff": "Mostrar diferença de tamanho entre edições.", "apihelp-feedrecentchanges-param-feedformat": "O formato do feed.", "apihelp-feedrecentchanges-param-limit": "Número máximo de resultados a apresentar.", diff --git a/includes/api/i18n/qqq.json b/includes/api/i18n/qqq.json index 11efd46461..6c47aa4230 100644 --- a/includes/api/i18n/qqq.json +++ b/includes/api/i18n/qqq.json @@ -75,6 +75,9 @@ "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-cspreport-description": "{{doc-apihelp-description|cspreport}}", + "apihelp-cspreport-param-reportonly": "{{doc-apihelp-param|cspreport|reportonly}}", + "apihelp-cspreport-param-source": "{{doc-apihelp-param|cspreport|source}}", "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}}", @@ -1204,6 +1207,7 @@ "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-param-dir": "{{doc-apihelp-param|query+watchlistraw|dir}}", "apihelp-query+watchlistraw-param-fromtitle": "{{doc-apihelp-param|query+watchlistraw|fromtitle}}", "apihelp-query+watchlistraw-param-totitle": "{{doc-apihelp-param|query+watchlistraw|totitle}}", "apihelp-query+watchlistraw-example-simple": "{{doc-apihelp-example|query+watchlistraw}}", @@ -1256,6 +1260,7 @@ "apihelp-stashedit-param-contentmodel": "{{doc-apihelp-param|stashedit|contentmodel}}", "apihelp-stashedit-param-contentformat": "{{doc-apihelp-param|stashedit|contentformat}}", "apihelp-stashedit-param-baserevid": "{{doc-apihelp-param|stashedit|baserevid}}", + "apihelp-stashedit-param-summary": "{{doc-apihelp-param|stashedit|summary}}", "apihelp-tag-description": "{{doc-apihelp-description|tag}}", "apihelp-tag-param-rcid": "{{doc-apihelp-param|tag|rcid}}", "apihelp-tag-param-revid": "{{doc-apihelp-param|tag|revid}}", diff --git a/includes/api/i18n/sah.json b/includes/api/i18n/sah.json new file mode 100644 index 0000000000..89e17f4686 --- /dev/null +++ b/includes/api/i18n/sah.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "София", + "HalanTul" + ] + }, + "apihelp-stashedit-param-summary": "Түмүгү уларыт." +} diff --git a/includes/api/i18n/sd.json b/includes/api/i18n/sd.json index ad4bee4dae..fdf003d356 100644 --- a/includes/api/i18n/sd.json +++ b/includes/api/i18n/sd.json @@ -10,5 +10,6 @@ "apihelp-query+watchlist-paramvalue-type-edit": "قاعديوار صفحاتي ترميمون.", "apihelp-query+watchlist-paramvalue-type-external": "خارجي تبديليون.", "apihelp-query+watchlist-paramvalue-type-new": "صفحن جون تخليقون.", - "apihelp-query+watchlist-paramvalue-type-log": "لاگ داخلائون." + "apihelp-query+watchlist-paramvalue-type-log": "لاگ داخلائون.", + "apihelp-stashedit-param-summary": "تَتُ تبديل ڪريو." } diff --git a/includes/api/i18n/sv.json b/includes/api/i18n/sv.json index 5de1deedc1..3205248f43 100644 --- a/includes/api/i18n/sv.json +++ b/includes/api/i18n/sv.json @@ -133,6 +133,7 @@ "apihelp-feedcontributions-param-deletedonly": "Visa bara borttagna bidrag.", "apihelp-feedcontributions-param-toponly": "Visa endast ändringar som är senaste revideringen.", "apihelp-feedcontributions-param-newonly": "Visa endast redigeringar där sidor skapas.", + "apihelp-feedcontributions-param-hideminor": "Göm mindre ändringar.", "apihelp-feedcontributions-param-showsizediff": "Visa skillnaden i storlek mellan revisioner.", "apihelp-feedcontributions-example-simple": "Returnera bidrag för Exempel", "apihelp-feedrecentchanges-description": "Returnerar ett flöde med senaste ändringar.", @@ -404,6 +405,7 @@ "apihelp-query+langbacklinks-example-simple": "Hämta sidor som länkar till [[:fr:Test]].", "apihelp-query+langlinks-param-dir": "Riktningen att lista mot.", "apihelp-query+links-param-dir": "Riktningen att lista mot.", + "apihelp-query+prefixsearch-param-profile": "Sök profil att använda.", "apihelp-query+protectedtitles-param-limit": "Hur många sidor att returnera totalt.", "apihelp-query+protectedtitles-example-simple": "Lista skyddade titlar.", "apihelp-query+recentchanges-example-simple": "Lista de senaste ändringarna.", @@ -422,6 +424,7 @@ "apihelp-query+watchlistraw-description": "Hämta alla sidor på den aktuella användarens bevakningslista.", "apihelp-query+watchlistraw-example-simple": "Lista sidor på den aktuella användarens bevakningslista.", "apihelp-setnotificationtimestamp-example-all": "Återställ meddelandestatus för hela bevakningslistan.", + "apihelp-stashedit-param-summary": "Ändra sammanfattning.", "apihelp-upload-param-filekey": "Nyckel som identifierar en tidigare uppladdning som lagrats temporärt.", "apihelp-upload-param-stash": "Om angiven, kommer servern att temporärt lagra filen istället för att lägga till den i centralförvaret.", "apihelp-upload-example-url": "Ladda upp från URL.", diff --git a/includes/api/i18n/udm.json b/includes/api/i18n/udm.json new file mode 100644 index 0000000000..fe9d0859f1 --- /dev/null +++ b/includes/api/i18n/udm.json @@ -0,0 +1,9 @@ +{ + "@metadata": { + "authors": [ + "Kaganer" + ] + }, + "apihelp-edit-example-edit": "Бамез тупатъяно.", + "apihelp-login-example-login": "Пырыны." +} diff --git a/includes/api/i18n/uk.json b/includes/api/i18n/uk.json index 0802c53c92..d99945d4b7 100644 --- a/includes/api/i18n/uk.json +++ b/includes/api/i18n/uk.json @@ -41,6 +41,7 @@ "apihelp-block-example-ip-simple": "Блокувати IP-адресу 192.0.2.5 на три дні з причиною First strike.", "apihelp-block-example-user-complex": "Блокувати користувачаVandal на невизначений термін з причиною Vandalism і заборонити створення нових облікових записів та надсилання електронної пошти.", "apihelp-changeauthenticationdata-description": "Зміна параметрів аутентифікації для поточного користувача.", + "apihelp-changeauthenticationdata-example-password": "Спроба змінити поточний пароль користувача на ExamplePassword.", "apihelp-checktoken-description": "Перевірити коректність токена з [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", "apihelp-checktoken-param-type": "Тип токена, який тестується.", "apihelp-checktoken-param-token": "Токен для тесту.", @@ -48,6 +49,9 @@ "apihelp-checktoken-example-simple": "Перевірити дійсність токена csrf.", "apihelp-clearhasmsg-description": "Очищає прапорець hasmsg для поточного користувача.", "apihelp-clearhasmsg-example-1": "Очистити прапорець hasmsg для поточного користувача.", + "apihelp-clientlogin-description": "Увійдіть у вікі з допомогою інтерактивного потоку.", + "apihelp-clientlogin-example-login": "Почати процес входу у вікі як користувач Example з паролем ExamplePassword.", + "apihelp-clientlogin-example-login2": "Продовжити вхід в систему після відповіді UI для двофакторної автентифікації, надаючи OATHToken як 987654.", "apihelp-compare-description": "Отримати порівняння двох сторінок.\n\nПовинні бути номер версії, назва сторінки або ID сторінки для «від» і «до».", "apihelp-compare-param-fromtitle": "Перший заголовок для порівняння.", "apihelp-compare-param-fromid": "Перший ID сторінки для порівняння.", @@ -57,6 +61,8 @@ "apihelp-compare-param-torev": "Друга версія для порівняння.", "apihelp-compare-example-1": "Створити порівняння версій 1 і 2.", "apihelp-createaccount-description": "Створити новий обліковий запис користувача.", + "apihelp-createaccount-param-preservestate": "Якщо запит [[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]] повернув істину для hasprimarypreservedstate, запити позначені як primary-required повинні бути пропущені. Якщо він повернув не порожнє значення для preservedusername, це ім'я користувача повинно бути використано для параметру username.", + "apihelp-createaccount-example-create": "Почати процес створення користувача Example з паролем ExamplePassword.", "apihelp-createaccount-param-name": "Ім'я користувача.", "apihelp-createaccount-param-password": "Пароль (ігнорується, якщо встановлено $1mailpassword).", "apihelp-createaccount-param-domain": "Домен для зовнішньої аутентифікації (опціонально).", @@ -144,6 +150,7 @@ "apihelp-feedcontributions-param-deletedonly": "Показати лише вилучений внесок.", "apihelp-feedcontributions-param-toponly": "Показати лише редагування, які є останніми версіями.", "apihelp-feedcontributions-param-newonly": "Показати лише редагування, які є створеннями сторінок.", + "apihelp-feedcontributions-param-hideminor": "Приховати незначні редагування.", "apihelp-feedcontributions-param-showsizediff": "Показати різницю розміру між версіями.", "apihelp-feedcontributions-example-simple": "Вивести внесок для користувача Example.", "apihelp-feedrecentchanges-description": "Видає стрічку нових редагувань.", @@ -205,7 +212,11 @@ "apihelp-import-param-namespace": "Імпортувати у цей простір назв. Не можна використати разом з $1rootpage.", "apihelp-import-param-rootpage": "Імпортувати як підсторінку цієї сторінки. Не можна використати разом з $1namespace.", "apihelp-import-example-import": "Імпортувати [[meta:Help:ParserFunctions]] у простір назв 100 з повною історією.", - "apihelp-login-description": "Увійти в систему й отримати куки автентифікації.\n\nУ випадку успішного входження в систему, потрібні куки буде включено в заголовки HTTP-відповіді. У разі невдалого входу, подальші спроби будуть обмежені до ліміту автоматичних спроб підбирання пароля.", + "apihelp-linkaccount-description": "Пов'язати обліковий запис третьої сторони з поточним користувачем.", + "apihelp-linkaccount-example-link": "Почати процес пов'язування з обліковм записом з Example.", + "apihelp-login-description": "Увійти в систему й отримати куки автентифікації.\n\nЦю дію треба використовувати лише в комбінації з [[Special:BotPasswords]]; використання для входу в основний обліковий запис застаріле і може ламатися без попередження. Щоб безпечно увійти в основний обліковий запис, використовуйте [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-description-nobotpasswords": "Увійти й отримати куки автентифікації.\n\nЦя дія застаріла і може ламатися без попередження. Щоб безпечно входити в систему, використовуйте [[Special:ApiHelp/clientlogin|action=clientlogin]].", + "apihelp-login-description-nonauthmanager": "Увійти й отримати куки автентифікації.\n\nУ випадку успішного входження в систему будуть включені в заголовки відповіді HTTP. У випадку невдалого входження подальші спроби можуть бути урізані, щоб обмежити атаки автоматичного вгадування пароля.", "apihelp-login-param-name": "Ім'я користувача.", "apihelp-login-param-password": "Пароль.", "apihelp-login-param-domain": "Домен (необов'язково).", @@ -537,6 +548,12 @@ "apihelp-query+allusers-param-activeusers": "Перерахувати лише користувачів, що були активні $1 {{PLURAL:$1|останній день|останні дні|останніх днів}}.", "apihelp-query+allusers-param-attachedwiki": "Із $1prop=centralids, також вказати, чи користувач має приєднану вікі, визначену цим ідентифікатором.", "apihelp-query+allusers-example-Y": "Перерахувати користувачів, починаючи з Y.", + "apihelp-query+authmanagerinfo-description": "Отримати інформацію про поточний стан автентифікації.", + "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Перевірити, чи поточний стан автентифікації користувача є достатнім для даної конфіденційної операції.", + "apihelp-query+authmanagerinfo-param-requestsfor": "Отримати інформацію про запити автентифікації, потрібні для даної дії автентифікації.", + "apihelp-query+filerepoinfo-example-login": "Вибірка запитів, що можуть бути використані при початку входу.", + "apihelp-query+filerepoinfo-example-login-merged": "Отримати запити, які можуть бути використані при початку входу, з об'єднаними полями форми.", + "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "Перевірити чи автентифікація є достатньою для дії foo.", "apihelp-query+backlinks-description": "Знайти усі сторінки, що посилаються на подану сторінку.", "apihelp-query+backlinks-param-title": "Назва для пошуку. Не можна використати разом з $1pageid.", "apihelp-query+backlinks-param-pageid": "ID сторінки для пошуку. Не можна використати разом з $1title.", @@ -878,6 +895,7 @@ "apihelp-query+prefixsearch-param-limit": "Максимальна кількість результатів для виведення.", "apihelp-query+prefixsearch-param-offset": "Кількість результатів, які пропустити.", "apihelp-query+prefixsearch-example-simple": "Шукати назви сторінок, які починаються з meaning.", + "apihelp-query+prefixsearch-param-profile": "Профіль пошуку для використання.", "apihelp-query+protectedtitles-description": "Вивести список усіх назв, захищених від створення.", "apihelp-query+protectedtitles-param-namespace": "Перерахувати назви лише в цих просторах назв.", "apihelp-query+protectedtitles-param-level": "Перерахувати лише назви з цими рівням захисту.", @@ -990,6 +1008,7 @@ "apihelp-query+search-param-what": "Який тип пошуку виконати.", "apihelp-query+search-param-info": "Які метадані отримати.", "apihelp-query+search-param-prop": "Які властивості для виведення:", + "apihelp-query+search-param-qiprofile": "Незалежний профіль запиту для використання (впливає на алгоритм ранжування).", "apihelp-query+search-paramvalue-prop-size": "Додає розмір сторінки в байтах.", "apihelp-query+search-paramvalue-prop-wordcount": "Додає кількість слів на сторінці.", "apihelp-query+search-paramvalue-prop-timestamp": "Додає часову мітку останнього редагування сторінки.", @@ -1135,6 +1154,7 @@ "apihelp-query+users-paramvalue-prop-emailable": "Помічає чи хоче користувач отримувати електронну пошту через [[Special:Emailuser]].", "apihelp-query+users-paramvalue-prop-gender": "Помічає стать користувача. Повертає \"male\", \"female\", або \"unknown\".", "apihelp-query+users-paramvalue-prop-centralids": "Додає центральні ідентифікатори і стан приєднання для користувача.", + "apihelp-query+users-paramvalue-prop-cancreate": "Вказує, чи можна створити обліковий запис для допустимих, але незареєстрованих імен користувачів.", "apihelp-query+users-param-attachedwiki": "Із $1prop=centralids, вказати, чи користувач має приєднану вікі, визначену цим ідентифікатором.", "apihelp-query+users-param-users": "Список користувачів, для яких отримати інформацію.", "apihelp-query+users-param-token": "Використати натомість [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].", @@ -1183,10 +1203,20 @@ "apihelp-query+watchlistraw-param-show": "Перелічити лише елементи, які відповідають цим критеріям.", "apihelp-query+watchlistraw-param-owner": "Використовується разом з $1token для доступу до списку спостереження різних користувачів.", "apihelp-query+watchlistraw-param-token": "Токен безпеки (доступний у [[Special:Preferences#mw-prefsection-watchlist|налаштуваннях]] користувача) для отримання доступу до списку спостереження іншого користувача.", + "apihelp-query+watchlistraw-param-dir": "Напрямок, у якому перелічити.", "apihelp-query+watchlistraw-param-fromtitle": "Назва (з префіксом простору назв), з якої почати перерахування.", "apihelp-query+watchlistraw-param-totitle": "Назва (з префіксом простору назв), якою закінчити перерахування.", "apihelp-query+watchlistraw-example-simple": "Перелічити сторінки у списку спостереження поточного користувача.", "apihelp-query+watchlistraw-example-generator": "Вибрати інформацію про сторінку для сторінок у списку спостереження поточного користувача.", + "apihelp-removeauthenticationdata-description": "Вилучити параметри автентифікації для поточного користувача.", + "apihelp-removeauthenticationdata-example-simple": "Спроба вилучити дані поточного користувача для FooAuthenticationRequest.", + "apihelp-resetpassword-description": "Відправити користувачу лист для відновлення пароля.", + "apihelp-resetpassword-description-noroutes": "Немає доступних способів відновити пароль.\n\nУвімкніть способи у [[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]], щоб використовувати цей модуль.", + "apihelp-resetpassword-param-user": "Користувача відновлено.", + "apihelp-resetpassword-param-email": "Адреса електронної пошти користувача відновлено.", + "apihelp-resetpassword-param-capture": "Повернути тимчасові паролі, які були надіслані. Вимагає право користувача passwordreset.", + "apihelp-resetpassword-example-user": "Надіслати лист для скидання пароля користувачу Example.", + "apihelp-resetpassword-example-email": "Надіслати лист для скидання пароля усім користувачам з адресою електронної пошти user@example.com.", "apihelp-revisiondelete-description": "Вилучити або відновити версії.", "apihelp-revisiondelete-param-type": "Тип здійснюваного вилучення версії.", "apihelp-revisiondelete-param-target": "Назва сторінки, версію якої вилучити, якщо вимагається для цього типу.", @@ -1226,6 +1256,7 @@ "apihelp-stashedit-param-contentmodel": "Модель вмісту нового вмісту.", "apihelp-stashedit-param-contentformat": "Формат серіалізації вмісту, використовуваний для введеного тексту.", "apihelp-stashedit-param-baserevid": "Ідентифікатор базової версії.", + "apihelp-stashedit-param-summary": "Змінити опис.", "apihelp-tag-description": "Додати або вилучити зміни міток з окремих версій або записів журналу.", "apihelp-tag-param-rcid": "Один або більше ідентифікаторів останніх змін, до яких додати або вилучити мітки.", "apihelp-tag-param-revid": "Один або більше ідентифікатор з якого додати або вилучити мітку.", @@ -1255,6 +1286,7 @@ "apihelp-undelete-param-watchlist": "Безумовно додати або вилучити сторінку із списку спостереження поточного користувача, використати налаштування, або не змінювати статус (не)спостереження.", "apihelp-undelete-example-page": "Відновити сторінку Main Page.", "apihelp-undelete-example-revisions": "Відновити дві версії сторінки Main Page.", + "apihelp-unlinkaccount-description": "Вилучити пов'язаний обліковий запис третьої сторони з поточного користувача.", "apihelp-upload-description": "Завантажити файл, або отримати статус завантажень у процесі.\n\nДоступні декілька методів:\n* Завантажити вміст файлу напряму, використовуючи параметр $1file.\n* Завантажити файл шматками, використовуючи параметри $1filesize, $1chunk, та $1offset.\n* Змусити сервер Медіавікі отримати файл за URL, використовуючи параметр $1url.\n* Завершити раніше розпочате завантаження, яке не вдалось через попередження, використовуючи параметр $1filekey.\nЗауважте, що HTTP POST повинен бути здійснений як завантаження файлу (наприклад, використовуючи multipart/form-data)", "apihelp-upload-param-filename": "Цільова назва файлу.", "apihelp-upload-param-comment": "Коментар завантаження. Також використовується як початковий текст сторінок для нових файлів, якщо $1text не вказано.", @@ -1364,6 +1396,9 @@ "api-help-permissions-granted-to": "{{PLURAL:$1|Надано|Надані}}: $2", "api-help-right-apihighlimits": "Використовувати вищі ліміти у запитах API (повільні запити: $1; швидкі запити: $2). Ліміти для повільних запитів також застосовуються до багатозначних параметрів.", "api-help-open-in-apisandbox": "[відкрити в пісочниці]", + "api-help-authmanagerhelper-messageformat": "Формат до використання для повернення повідомлень.", + "api-help-authmanagerhelper-mergerequestfields": "Об'єднати інформацію всіх автентифікаційних запитів у один масив.", + "api-help-authmanagerhelper-preservestate": "Зберегти статус з попередньої спроби входу, що не вдалась, якщо можливо.", "api-credits-header": "Автор(и)", "api-credits": "Розробники API:\n* Roan Kattouw (головний розробник вер. 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (творець, головний розробник вер. 2006 – вер. 2007)\n* Brad Jorsch (головний розробник 2013 – тепер)\n\nБудь ласка, надсилайте свої коментарі, пропозиції та запитання на mediawiki-api@lists.wikimedia.org\nабо зафайліть звіт про баґ на https://phabricator.wikimedia.org/." } diff --git a/includes/api/i18n/zh-hans.json b/includes/api/i18n/zh-hans.json index 46e5c85798..6b697dcede 100644 --- a/includes/api/i18n/zh-hans.json +++ b/includes/api/i18n/zh-hans.json @@ -18,7 +18,9 @@ "Umherirrender", "Apflu", "Hzy980512", - "PhiLiP" + "PhiLiP", + "Arthur2e5", + "損齋" ] }, "apihelp-main-description": "
    \n* [[mw:API:Main_page|文档]]\n* [[mw:API:FAQ|常见问题]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 邮件列表]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API公告]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 程序错误与功能请求]\n
    \n状态信息:本页所展示的所有特性都应正常工作,但是API仍在开发当中,将会随时变化。请订阅[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 邮件列表]以便获得更新通知。\n\n错误请求:当API收到错误请求时,HTTP header将会返回一个包含\"MediaWiki-API-Error\"的值,随后header的值与error code将会送回并设置为相同的值。详细信息请参阅[[mw:API:Errors_and_warnings|API: 错误与警告]]。\n\n测试中:测试API请求的易用性,请参见[[Special:ApiSandbox]]。", @@ -81,6 +83,7 @@ "apihelp-createaccount-param-language": "要为用户设置为默认值的语言代码(可选,默认为内容语言)。", "apihelp-createaccount-example-pass": "创建用户testuser和密码test123。", "apihelp-createaccount-example-mail": "创建用户testmailuser并电邮发送一个随机生成的密码。", + "apihelp-cspreport-description": "由浏览器使用以报告违反内容安全方针的内容。此模块应永不使用,除了在被CSP兼容的浏览器自动使用时。", "apihelp-delete-description": "删除一个页面。", "apihelp-delete-param-title": "要删除的页面标题。不能与$1pageid一起使用。", "apihelp-delete-param-pageid": "要删除的页面的页面 ID。不能与$1title一起使用。", @@ -157,6 +160,7 @@ "apihelp-feedcontributions-param-deletedonly": "仅显示已删除的贡献。", "apihelp-feedcontributions-param-toponly": "仅仅显示那些作为最新修订的编辑。", "apihelp-feedcontributions-param-newonly": "仅仅显示那些作为页面创建的编辑。", + "apihelp-feedcontributions-param-hideminor": "隐藏小编辑。", "apihelp-feedcontributions-param-showsizediff": "显示修订版本之间的大小差别。", "apihelp-feedcontributions-example-simple": "返回用户Example的贡献。", "apihelp-feedrecentchanges-description": "返回最近更改的摘要。", @@ -555,6 +559,8 @@ "apihelp-query+allusers-param-attachedwiki": "与$1prop=centralids一起使用,也表明用户是否附加于此ID定义的wiki。", "apihelp-query+allusers-example-Y": "列出以Y开头的用户。", "apihelp-query+authmanagerinfo-description": "检索有关当前身份验证状态的信息。", + "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "测试用户当前的身份验证状态是否足够用于指定的安全敏感操作。", + "apihelp-query+authmanagerinfo-param-requestsfor": "取得指定身份验证操作所需的有关身份验证请求的信息。", "apihelp-query+filerepoinfo-example-login": "检索当开始登录时可能使用的请求。", "apihelp-query+filerepoinfo-example-login-merged": "检索当开始登录时可能使用的请求,并合并表单字段。", "apihelp-query+filerepoinfo-example-securitysensitiveoperation": "测试身份验证对操作foo是否足够。", @@ -1158,6 +1164,7 @@ "apihelp-query+users-paramvalue-prop-emailable": "Tags if the user can and wants to receive email through [[Special:Emailuser]].", "apihelp-query+users-paramvalue-prop-gender": "标记用户性别。返回“male”、“female”或“unknown”。", "apihelp-query+users-paramvalue-prop-centralids": "添加中心ID并为用户附加状态。", + "apihelp-query+users-paramvalue-prop-cancreate": "表明是否可以为有效但尚未注册的用户名创建一个账户。", "apihelp-query+users-param-attachedwiki": "与$1prop=centralids一起使用,表明用户是否附加于此ID定义的wiki。", "apihelp-query+users-param-users": "要获取信息的用户列表。", "apihelp-query+users-param-token": "请改用[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。", @@ -1206,6 +1213,7 @@ "apihelp-query+watchlistraw-param-show": "只列出符合这些标准的项目。", "apihelp-query+watchlistraw-param-owner": "与$1token一起使用以访问不同用户的监视列表。", "apihelp-query+watchlistraw-param-token": "允许访问其他用户监视列表的安全密钥(可通过用户的[[Special:Preferences#mw-prefsection-watchlist|参数设置]]找到)。", + "apihelp-query+watchlistraw-param-dir": "罗列所采用的方向。", "apihelp-query+watchlistraw-param-fromtitle": "要列举的起始标题(带名字空间前缀)。", "apihelp-query+watchlistraw-param-totitle": "要列举的最终标题(带名字空间前缀)。", "apihelp-query+watchlistraw-example-simple": "列出当前用户的监视列表中的页面。", @@ -1258,6 +1266,7 @@ "apihelp-stashedit-param-contentmodel": "新内容的内容模型。", "apihelp-stashedit-param-contentformat": "用于输入文本的内容序列化格式。", "apihelp-stashedit-param-baserevid": "基础修订的修订ID。", + "apihelp-stashedit-param-summary": "更改摘要。", "apihelp-tag-description": "从个别修订或日志记录中添加或移除更改标签。", "apihelp-tag-param-rcid": "要添加或移除标签的一个或更多的最近更改ID。", "apihelp-tag-param-revid": "要添加或移除标签的一个或更多的修订ID。", @@ -1365,7 +1374,7 @@ "api-help-license-noname": "许可协议:[[$1|参见链接]]", "api-help-license-unknown": "许可协议:未知", "api-help-parameters": "{{PLURAL:$1|参数}}:", - "api-help-param-deprecated": "不推荐使用。", + "api-help-param-deprecated": "已弃用。", "api-help-param-required": "这个参数是必须的。", "api-help-datatypes-header": "数据类型", "api-help-datatypes": "一些在API请求中的参数类型需要更进一步解释:\n;boolean\n:布尔参数就像HTML复选框一样工作:如果指定参数,无论何值都被认为是真。如果要假值,则可完全忽略参数。\n;timestamp\n:时间戳可被指定为很多格式。推荐使用ISO 8601日期和时间标准。所有时间为UTC时间,包含的任何时区会被忽略。\n:* ISO 8601日期和时间,2001-01-15T14:56:00Z(标点和Z是可选项)\n:* 带小数秒(会被忽略)的ISO 8601日期和时间,2001-01-15T14:56:00.00001Z(破折号、括号和Z是可选的)\n:* MediaWiki格式,20010115145600\n:* 一般数字格式,2001-01-15 14:56:00(GMT、+##或-##的可选时区会被忽略)\n:* EXIF格式,2001:01:15 14:56:00\n:* RFC 2822格式(时区可能会被省略),Mon, 15 Jan 2001 14:56:00\n:* RFC 850格式(时区可能会被省略),Monday, 15-Jan-2001 14:56:00\n:* C ctime格式,Mon Jan 15 14:56:00 2001\n:* 秒数是从1970-01-01T00:00:00Z开始,作为1到13位数的整数(除了0)\n:* 字符串now", @@ -1398,7 +1407,7 @@ "api-help-permissions-granted-to": "{{PLURAL:$1|授予}}:$2", "api-help-right-apihighlimits": "在API查询中使用更高的上限(慢查询:$1;快查询:$2)。慢查询的限制也适用于多值参数。", "api-help-open-in-apisandbox": "[在沙盒中打开]", - "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过amirequestsfor=$4取得来自[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]的可用字段,和来自[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]的$5令牌。\n# Present the fields to the user, and obtain their submission.\n# Post to this module, supplying $1returnurl and any relevant fields.\n# Check the status in the response.\n#* If you received PASS or FAIL, you're done. The operation either succeeded or it didn't.\n#* If you received UI, present the new fields to the user and obtain their submission. Then post to this module with $1continue and the relevant fields set, and repeat step 4.\n#* If you received REDIRECT, direct the user to the redirecttarget and wait for the return to $1returnurl. Then post to this module with $1continue and any fields passed to the return URL, and repeat step 4.\n#* If you received RESTART, that means the authentication worked but we don't have a linked user account. You might treat this as UI or as FAIL.", + "api-help-authmanager-general-usage": "使用此模块的一般程序是:\n# 通过amirequestsfor=$4取得来自[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]的可用字段,和来自[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]的$5令牌。\n# 向用户显示字段,并获得其提交内容。\n# 发送至此模块,提供$1returnurl及任何相关字段。\n# Check the status in the response.\n#* If you received PASS or FAIL, you're done. The operation either succeeded or it didn't.\n#* If you received UI, present the new fields to the user and obtain their submission. Then post to this module with $1continue and the relevant fields set, and repeat step 4.\n#* If you received REDIRECT, direct the user to the redirecttarget and wait for the return to $1returnurl. Then post to this module with $1continue and any fields passed to the return URL, and repeat step 4.\n#* If you received RESTART, that means the authentication worked but we don't have a linked user account. You might treat this as UI or as FAIL.", "api-help-authmanagerhelper-request": "使用此身份验证请求,通过返回自[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]的id与amirequestsfor=$1。", "api-help-authmanagerhelper-messageformat": "返回消息使用的格式。", "api-help-authmanagerhelper-mergerequestfields": "合并用于所有身份验证请求的字段信息至一个数组中。", diff --git a/includes/auth/AbstractPreAuthenticationProvider.php b/includes/auth/AbstractPreAuthenticationProvider.php index 48a9c88c9d..d997dbbc85 100644 --- a/includes/auth/AbstractPreAuthenticationProvider.php +++ b/includes/auth/AbstractPreAuthenticationProvider.php @@ -45,7 +45,7 @@ abstract class AbstractPreAuthenticationProvider extends AbstractAuthenticationP return \StatusValue::newGood(); } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { return \StatusValue::newGood(); } diff --git a/includes/auth/AbstractPrimaryAuthenticationProvider.php b/includes/auth/AbstractPrimaryAuthenticationProvider.php index 2e0d669d3e..ea3dfa3bd6 100644 --- a/includes/auth/AbstractPrimaryAuthenticationProvider.php +++ b/includes/auth/AbstractPrimaryAuthenticationProvider.php @@ -91,7 +91,7 @@ abstract class AbstractPrimaryAuthenticationProvider extends AbstractAuthenticat public function postAccountCreation( $user, $creator, AuthenticationResponse $response ) { } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { return \StatusValue::newGood(); } diff --git a/includes/auth/AbstractSecondaryAuthenticationProvider.php b/includes/auth/AbstractSecondaryAuthenticationProvider.php index 89fd6f92a5..00493bc7a4 100644 --- a/includes/auth/AbstractSecondaryAuthenticationProvider.php +++ b/includes/auth/AbstractSecondaryAuthenticationProvider.php @@ -77,7 +77,7 @@ abstract class AbstractSecondaryAuthenticationProvider extends AbstractAuthentic public function postAccountCreation( $user, $creator, AuthenticationResponse $response ) { } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { return \StatusValue::newGood(); } diff --git a/includes/auth/AuthManager.php b/includes/auth/AuthManager.php index 2ed0d618c7..82eeff0c4e 100644 --- a/includes/auth/AuthManager.php +++ b/includes/auth/AuthManager.php @@ -878,10 +878,22 @@ class AuthManager implements LoggerAwareInterface { /** * Determine whether a particular account can be created * @param string $username - * @param int $flags Bitfield of User:READ_* constants + * @param array $options + * - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL + * - creating: (bool) For internal use only. Never specify this. * @return Status */ - public function canCreateAccount( $username, $flags = User::READ_NORMAL ) { + public function canCreateAccount( $username, $options = [] ) { + // Back compat + if ( is_int( $options ) ) { + $options = [ 'flags' => $options ]; + } + $options += [ + 'flags' => User::READ_NORMAL, + 'creating' => false, + ]; + $flags = $options['flags']; + if ( !$this->canCreateAccounts() ) { return Status::newFatal( 'authmanager-create-disabled' ); } @@ -905,7 +917,7 @@ class AuthManager implements LoggerAwareInterface { $this->getPrimaryAuthenticationProviders() + $this->getSecondaryAuthenticationProviders(); foreach ( $providers as $provider ) { - $status = $provider->testUserForCreation( $user, false ); + $status = $provider->testUserForCreation( $user, false, $options ); if ( !$status->isGood() ) { return Status::wrap( $status ); } @@ -1010,7 +1022,9 @@ class AuthManager implements LoggerAwareInterface { return AuthenticationResponse::newFail( $status->getMessage() ); } - $status = $this->canCreateAccount( $username, User::READ_LOCKING ); + $status = $this->canCreateAccount( + $username, [ 'flags' => User::READ_LOCKING, 'creating' => true ] + ); if ( !$status->isGood() ) { $this->logger->debug( __METHOD__ . ': {user} cannot be created: {reason}', [ 'user' => $username, @@ -1575,11 +1589,15 @@ class AuthManager implements LoggerAwareInterface { } // Denied by providers? + $options = [ + 'flags' => User::READ_LATEST, + 'creating' => true, + ]; $providers = $this->getPreAuthenticationProviders() + $this->getPrimaryAuthenticationProviders() + $this->getSecondaryAuthenticationProviders(); foreach ( $providers as $provider ) { - $status = $provider->testUserForCreation( $user, $source ); + $status = $provider->testUserForCreation( $user, $source, $options ); if ( !$status->isGood() ) { $ret = Status::wrap( $status ); $this->logger->debug( __METHOD__ . ': Provider denied creation of {username}: {reason}', [ @@ -1650,7 +1668,7 @@ class AuthManager implements LoggerAwareInterface { throw $ex; } - $this->setDefaultUserOptions( $user, true ); + $this->setDefaultUserOptions( $user, false ); // Inform the providers $this->callMethodOnProviders( 6, 'autoCreatedAccount', [ $user, $source ] ); @@ -1677,6 +1695,10 @@ class AuthManager implements LoggerAwareInterface { $logid = $logEntry->insert(); } + // Commit database changes, so even if something else later blows up + // the newly-created user doesn't get lost. + wfGetLBFactory()->commitMasterChanges( __METHOD__ ); + if ( $login ) { $this->setSessionDataForUser( $user ); } diff --git a/includes/auth/CheckBlocksSecondaryAuthenticationProvider.php b/includes/auth/CheckBlocksSecondaryAuthenticationProvider.php index 070da9f542..f7a7ec193d 100644 --- a/includes/auth/CheckBlocksSecondaryAuthenticationProvider.php +++ b/includes/auth/CheckBlocksSecondaryAuthenticationProvider.php @@ -23,7 +23,6 @@ namespace MediaWiki\Auth; use Config; use StatusValue; -use User; /** * Check if the user is blocked, and prevent authentication if so. @@ -75,7 +74,7 @@ class CheckBlocksSecondaryAuthenticationProvider extends AbstractSecondaryAuthen return AuthenticationResponse::newAbstain(); } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { $block = $user->isBlockedFromCreateAccount(); if ( $block ) { $errorParams = [ diff --git a/includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php b/includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php index 32c8fd55de..beb11f4331 100644 --- a/includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php +++ b/includes/auth/ConfirmLinkSecondaryAuthenticationProvider.php @@ -2,7 +2,6 @@ namespace MediaWiki\Auth; -use StatusValue; use User; /** diff --git a/includes/auth/EmailNotificationSecondaryAuthenticationProvider.php b/includes/auth/EmailNotificationSecondaryAuthenticationProvider.php index c632e3c70d..d32640ea1d 100644 --- a/includes/auth/EmailNotificationSecondaryAuthenticationProvider.php +++ b/includes/auth/EmailNotificationSecondaryAuthenticationProvider.php @@ -3,7 +3,6 @@ namespace MediaWiki\Auth; use Config; -use StatusValue; /** * Handles email notification / email address confirmation for account creation. diff --git a/includes/auth/LegacyHookPreAuthenticationProvider.php b/includes/auth/LegacyHookPreAuthenticationProvider.php index 1a8a75892d..cab6e32d5b 100644 --- a/includes/auth/LegacyHookPreAuthenticationProvider.php +++ b/includes/auth/LegacyHookPreAuthenticationProvider.php @@ -96,7 +96,7 @@ class LegacyHookPreAuthenticationProvider extends AbstractPreAuthenticationProvi return StatusValue::newGood(); } - public function testUserForCreation( $user, $autocreate ) { + public function testUserForCreation( $user, $autocreate, array $options = [] ) { if ( $autocreate !== false ) { $abortError = ''; if ( !\Hooks::run( 'AbortAutoAccount', [ $user, &$abortError ] ) ) { @@ -106,27 +106,6 @@ class LegacyHookPreAuthenticationProvider extends AbstractPreAuthenticationProvi $user, $user, LoginForm::ABORTED, $abortError, 'AbortAutoAccount' ); } - } else { - $abortError = ''; - $abortStatus = null; - if ( !\Hooks::run( 'AbortNewAccount', [ $user, &$abortError, &$abortStatus ] ) ) { - // Hook point to add extra creation throttles and blocks - $this->logger->debug( __METHOD__ . ': a hook blocked creation' ); - if ( $abortStatus === null ) { - // Report back the old string as a raw message status. - // This will report the error back as 'createaccount-hook-aborted' - // with the given string as the message. - // To return a different error code, return a StatusValue object. - $msg = wfMessage( 'createaccount-hook-aborted' )->rawParams( $abortError ); - return StatusValue::newFatal( $msg ); - } else { - // For MediaWiki 1.23+ and updated hooks, return the Status object - // returned from the hook. - $ret = StatusValue::newGood(); - $ret->merge( $abortStatus ); - return $ret; - } - } } return StatusValue::newGood(); diff --git a/includes/auth/PreAuthenticationProvider.php b/includes/auth/PreAuthenticationProvider.php index 846d16e265..13fae6eb29 100644 --- a/includes/auth/PreAuthenticationProvider.php +++ b/includes/auth/PreAuthenticationProvider.php @@ -83,9 +83,17 @@ interface PreAuthenticationProvider extends AuthenticationProvider { * into such. * @param bool|string $autocreate False if this is not an auto-creation, or * the source of the auto-creation passed to AuthManager::autoCreateUser(). + * @param array $options + * - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL + * - creating: (bool) If false (or missing), this call is only testing if + * a user could be created. If set, this (non-autocreation) is for + * actually creating an account and will be followed by a call to + * testForAccountCreation(). In this case, the provider might return + * StatusValue::newGood() here and let the later call to + * testForAccountCreation() do a more thorough test. * @return StatusValue */ - public function testUserForCreation( $user, $autocreate ); + public function testUserForCreation( $user, $autocreate, array $options = [] ); /** * Post-creation callback diff --git a/includes/auth/PrimaryAuthenticationProvider.php b/includes/auth/PrimaryAuthenticationProvider.php index 169e7f138f..c44c8fc1c9 100644 --- a/includes/auth/PrimaryAuthenticationProvider.php +++ b/includes/auth/PrimaryAuthenticationProvider.php @@ -277,9 +277,17 @@ interface PrimaryAuthenticationProvider extends AuthenticationProvider { * into such. * @param bool|string $autocreate False if this is not an auto-creation, or * the source of the auto-creation passed to AuthManager::autoCreateUser(). + * @param array $options + * - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL + * - creating: (bool) If false (or missing), this call is only testing if + * a user could be created. If set, this (non-autocreation) is for + * actually creating an account and will be followed by a call to + * testForAccountCreation(). In this case, the provider might return + * StatusValue::newGood() here and let the later call to + * testForAccountCreation() do a more thorough test. * @return StatusValue */ - public function testUserForCreation( $user, $autocreate ); + public function testUserForCreation( $user, $autocreate, array $options = [] ); /** * Post-auto-creation callback diff --git a/includes/auth/SecondaryAuthenticationProvider.php b/includes/auth/SecondaryAuthenticationProvider.php index 0d52d2500b..1ccc9c6972 100644 --- a/includes/auth/SecondaryAuthenticationProvider.php +++ b/includes/auth/SecondaryAuthenticationProvider.php @@ -200,9 +200,17 @@ interface SecondaryAuthenticationProvider extends AuthenticationProvider { * into such. * @param bool|string $autocreate False if this is not an auto-creation, or * the source of the auto-creation passed to AuthManager::autoCreateUser(). + * @param array $options + * - flags: (int) Bitfield of User:READ_* constants, default User::READ_NORMAL + * - creating: (bool) If false (or missing), this call is only testing if + * a user could be created. If set, this (non-autocreation) is for + * actually creating an account and will be followed by a call to + * testForAccountCreation(). In this case, the provider might return + * StatusValue::newGood() here and let the later call to + * testForAccountCreation() do a more thorough test. * @return StatusValue */ - public function testUserForCreation( $user, $autocreate ); + public function testUserForCreation( $user, $autocreate, array $options = [] ); /** * Post-auto-creation callback diff --git a/includes/auth/Throttler.php b/includes/auth/Throttler.php index 5b14a3baff..f47c60655f 100644 --- a/includes/auth/Throttler.php +++ b/includes/auth/Throttler.php @@ -22,13 +22,10 @@ namespace MediaWiki\Auth; use BagOStuff; -use Config; use MediaWiki\Logger\LoggerFactory; use Psr\Log\LoggerAwareInterface; use Psr\Log\LoggerInterface; use Psr\Log\LogLevel; -use Psr\Log\NullLogger; -use User; /** * A helper class for throttling authentication attempts. diff --git a/includes/cache/localisation/LocalisationCache.php b/includes/cache/localisation/LocalisationCache.php index 0fb9ed8561..4970a2bb5f 100644 --- a/includes/cache/localisation/LocalisationCache.php +++ b/includes/cache/localisation/LocalisationCache.php @@ -23,6 +23,7 @@ use Cdb\Reader as CdbReader; use Cdb\Writer as CdbWriter; use CLDRPluralRuleParser\Evaluator; +use CLDRPluralRuleParser\Error as CLDRPluralRuleError; use MediaWiki\MediaWikiServices; /** diff --git a/includes/changes/EnhancedChangesList.php b/includes/changes/EnhancedChangesList.php index 099a295c91..d3a414b5be 100644 --- a/includes/changes/EnhancedChangesList.php +++ b/includes/changes/EnhancedChangesList.php @@ -358,8 +358,7 @@ class EnhancedChangesList extends ChangesList { protected function getLineData( array $block, RCCacheEntry $rcObj, array $queryParams = [] ) { $RCShowChangedSize = $this->getConfig()->get( 'RCShowChangedSize' ); - # Classes to apply -- TODO implement - $classes = []; + $classes = [ 'mw-enhanced-rc' ]; $type = $rcObj->mAttribs['rc_type']; $data = []; $lineParams = []; @@ -367,8 +366,9 @@ class EnhancedChangesList extends ChangesList { if ( $rcObj->watched && $rcObj->mAttribs['rc_timestamp'] >= $rcObj->watched ) { - $lineParams['classes'] = [ 'mw-enhanced-watched' ]; + $classes = [ 'mw-enhanced-watched' ]; } + $separator = ' . . '; $data['recentChangesFlags'] = [ @@ -442,7 +442,7 @@ class EnhancedChangesList extends ChangesList { // give the hook a chance to modify the data $success = Hooks::run( 'EnhancedChangesListModifyLineData', - [ $this, &$data, $block, $rcObj ] ); + [ $this, &$data, $block, $rcObj, &$classes ] ); if ( !$success ) { // skip entry if hook aborted it return []; @@ -461,6 +461,8 @@ class EnhancedChangesList extends ChangesList { unset( $data['timestampLink'] ); } + $lineParams['classes'] = array_values( $classes ); + // everything else: makes it easier for extensions to add or remove data $lineParams['data'] = array_values( $data ); diff --git a/includes/content/AbstractContent.php b/includes/content/AbstractContent.php index e7446550bb..811b241798 100644 --- a/includes/content/AbstractContent.php +++ b/includes/content/AbstractContent.php @@ -281,7 +281,7 @@ abstract class AbstractContent implements Content { * * @since 1.21 * - * @return null + * @return Title|null * * @see Content::getRedirectTarget */ diff --git a/includes/content/CodeContentHandler.php b/includes/content/CodeContentHandler.php index 694b633e7b..2bbf6ca7b2 100644 --- a/includes/content/CodeContentHandler.php +++ b/includes/content/CodeContentHandler.php @@ -63,4 +63,12 @@ abstract class CodeContentHandler extends TextContentHandler { protected function getContentClass() { throw new MWException( 'Subclass must override' ); } + + /** + * @param SearchEngine $engine + * @return array + */ + public function getFieldsForSearchIndex( SearchEngine $engine ) { + return []; + } } diff --git a/includes/content/ContentHandler.php b/includes/content/ContentHandler.php index e225fb783f..1ecd6145c7 100644 --- a/includes/content/ContentHandler.php +++ b/includes/content/ContentHandler.php @@ -1248,4 +1248,26 @@ abstract class ContentHandler { return $ok; } + + /** + * Get fields definition for search index + * @param SearchEngine $engine + * @return SearchIndexField[] List of fields this content handler can provide. + * @since 1.28 + */ + public function getFieldsForSearchIndex( SearchEngine $engine ) { + /* Default fields: + /* + * namespace + * namespace_text + * redirect + * source_text + * suggest + * timestamp + * title + * text + * text_bytes + */ + return []; + } } diff --git a/includes/content/TextContentHandler.php b/includes/content/TextContentHandler.php index ad40cd9077..748c81069f 100644 --- a/includes/content/TextContentHandler.php +++ b/includes/content/TextContentHandler.php @@ -31,8 +31,7 @@ class TextContentHandler extends ContentHandler { // @codingStandardsIgnoreStart bug 57585 - public function __construct( $modelId = CONTENT_MODEL_TEXT, - $formats = [ CONTENT_FORMAT_TEXT ] ) { + public function __construct( $modelId = CONTENT_MODEL_TEXT, $formats = [ CONTENT_FORMAT_TEXT ] ) { parent::__construct( $modelId, $formats ); } // @codingStandardsIgnoreEnd @@ -41,7 +40,7 @@ class TextContentHandler extends ContentHandler { * Returns the content's text as-is. * * @param Content $content - * @param string $format The serialization format to check + * @param string $format The serialization format to check * * @return mixed */ @@ -143,4 +142,10 @@ class TextContentHandler extends ContentHandler { return true; } + public function getFieldsForSearchIndex( SearchEngine $engine ) { + $fields = []; + $fields['language'] = + $engine->makeSearchFieldMapping( 'language', SearchIndexField::INDEX_TYPE_KEYWORD ); + return $fields; + } } diff --git a/includes/content/WikitextContentHandler.php b/includes/content/WikitextContentHandler.php index 0701a0f3de..4e8f0df098 100644 --- a/includes/content/WikitextContentHandler.php +++ b/includes/content/WikitextContentHandler.php @@ -108,4 +108,41 @@ class WikitextContentHandler extends TextContentHandler { return true; } + public function getFieldsForSearchIndex( SearchEngine $engine ) { + $fields = []; + + $fields['category'] = + $engine->makeSearchFieldMapping( 'category', SearchIndexField::INDEX_TYPE_TEXT ); + $fields['category']->setFlag( SearchIndexField::FLAG_CASEFOLD ); + + $fields['external_link'] = + $engine->makeSearchFieldMapping( 'external_link', SearchIndexField::INDEX_TYPE_KEYWORD ); + + $fields['heading'] = + $engine->makeSearchFieldMapping( 'heading', SearchIndexField::INDEX_TYPE_TEXT ); + $fields['heading']->setFlag( SearchIndexField::FLAG_SCORING ); + + $fields['auxiliary_text'] = + $engine->makeSearchFieldMapping( 'auxiliary_text', SearchIndexField::INDEX_TYPE_TEXT ); + + $fields['opening_text'] = + $engine->makeSearchFieldMapping( 'opening_text', SearchIndexField::INDEX_TYPE_TEXT ); + $fields['opening_text']->setFlag( SearchIndexField::FLAG_SCORING | + SearchIndexField::FLAG_NO_HIGHLIGHT ); + + $fields['outgoing_link'] = + $engine->makeSearchFieldMapping( 'outgoing_link', SearchIndexField::INDEX_TYPE_KEYWORD ); + + $fields['template'] = + $engine->makeSearchFieldMapping( 'template', SearchIndexField::INDEX_TYPE_KEYWORD ); + $fields['template']->setFlag( SearchIndexField::FLAG_CASEFOLD ); + + // FIXME: this really belongs in separate file handler but files + // do not have separate handler. Sadness. + $fields['file_text'] = + $engine->makeSearchFieldMapping( 'file_text', SearchIndexField::INDEX_TYPE_TEXT ); + + return $fields; + } + } diff --git a/includes/db/DBConnRef.php b/includes/db/DBConnRef.php index af5f8f9fee..1893c73583 100644 --- a/includes/db/DBConnRef.php +++ b/includes/db/DBConnRef.php @@ -417,11 +417,15 @@ class DBConnRef implements IDatabase { return $this->__call( __FUNCTION__, func_get_args() ); } - public function onTransactionIdle( $callback ) { + public function onTransactionResolution( callable $callback ) { return $this->__call( __FUNCTION__, func_get_args() ); } - public function onTransactionPreCommitOrIdle( $callback ) { + public function onTransactionIdle( callable $callback ) { + return $this->__call( __FUNCTION__, func_get_args() ); + } + + public function onTransactionPreCommitOrIdle( callable $callback ) { return $this->__call( __FUNCTION__, func_get_args() ); } diff --git a/includes/db/Database.php b/includes/db/Database.php index 6bdcb24cdb..cfdf3828d1 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -52,10 +52,12 @@ abstract class DatabaseBase implements IDatabase { protected $mConn = null; protected $mOpened = false; - /** @var callable[] */ + /** @var array[] List of (callable, method name) */ protected $mTrxIdleCallbacks = []; - /** @var callable[] */ + /** @var array[] List of (callable, method name) */ protected $mTrxPreCommitCallbacks = []; + /** @var array[] List of (callable, method name) */ + protected $mTrxEndCallbacks = []; protected $mTablePrefix; protected $mSchema; @@ -2448,14 +2450,21 @@ abstract class DatabaseBase implements IDatabase { return false; } - final public function onTransactionIdle( $callback ) { + final public function onTransactionResolution( callable $callback ) { + if ( !$this->mTrxLevel ) { + throw new DBUnexpectedError( $this, "No transaction is active." ); + } + $this->mTrxEndCallbacks[] = [ $callback, wfGetCaller() ]; + } + + final public function onTransactionIdle( callable $callback ) { $this->mTrxIdleCallbacks[] = [ $callback, wfGetCaller() ]; if ( !$this->mTrxLevel ) { $this->runOnTransactionIdleCallbacks(); } } - final public function onTransactionPreCommitOrIdle( $callback ) { + final public function onTransactionPreCommitOrIdle( callable $callback ) { if ( $this->mTrxLevel ) { $this->mTrxPreCommitCallbacks[] = [ $callback, wfGetCaller() ]; } else { @@ -2473,8 +2482,12 @@ abstract class DatabaseBase implements IDatabase { $e = $ePrior = null; // last exception do { // callbacks may add callbacks :) - $callbacks = $this->mTrxIdleCallbacks; + $callbacks = array_merge( + $this->mTrxIdleCallbacks, + $this->mTrxEndCallbacks // include "transaction resolution" callbacks + ); $this->mTrxIdleCallbacks = []; // recursion guard + $this->mTrxEndCallbacks = []; // recursion guard foreach ( $callbacks as $callback ) { try { list( $phpCallback ) = $callback; @@ -2607,10 +2620,11 @@ abstract class DatabaseBase implements IDatabase { $this->getTransactionProfiler()->transactionWritingOut( $this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime ); } + $this->runOnTransactionIdleCallbacks(); } - # Avoid fatals if close() was called + // Avoid fatals if close() was called $this->assertOpen(); $this->doBegin( $fname ); @@ -2671,7 +2685,7 @@ abstract class DatabaseBase implements IDatabase { } } - # Avoid fatals if close() was called + // Avoid fatals if close() was called $this->assertOpen(); $this->runOnTransactionPreCommitCallbacks(); @@ -2682,6 +2696,7 @@ abstract class DatabaseBase implements IDatabase { $this->getTransactionProfiler()->transactionWritingOut( $this->mServer, $this->mDBname, $this->mTrxShortId, $writeTime ); } + $this->runOnTransactionIdleCallbacks(); } @@ -2710,17 +2725,19 @@ abstract class DatabaseBase implements IDatabase { } } - # Avoid fatals if close() was called + // Avoid fatals if close() was called $this->assertOpen(); $this->doRollback( $fname ); - $this->mTrxIdleCallbacks = []; // cancel - $this->mTrxPreCommitCallbacks = []; // cancel $this->mTrxAtomicLevels = []; if ( $this->mTrxDoneWrites ) { $this->getTransactionProfiler()->transactionWritingOut( $this->mServer, $this->mDBname, $this->mTrxShortId ); } + + $this->mTrxIdleCallbacks = []; // clear + $this->mTrxPreCommitCallbacks = []; // clear + $this->runOnTransactionIdleCallbacks(); } /** @@ -3294,9 +3311,14 @@ abstract class DatabaseBase implements IDatabase { if ( $this->mTrxLevel && $this->mTrxDoneWrites ) { trigger_error( "Uncommitted DB writes (transaction from {$this->mTrxFname})." ); } - if ( count( $this->mTrxIdleCallbacks ) || count( $this->mTrxPreCommitCallbacks ) ) { + $danglingCallbacks = array_merge( + $this->mTrxIdleCallbacks, + $this->mTrxPreCommitCallbacks, + $this->mTrxEndCallbacks + ); + if ( $danglingCallbacks ) { $callers = []; - foreach ( $this->mTrxIdleCallbacks as $callbackInfo ) { + foreach ( $danglingCallbacks as $callbackInfo ) { $callers[] = $callbackInfo[1]; } $callers = implode( ', ', $callers ); diff --git a/includes/db/DatabaseOracle.php b/includes/db/DatabaseOracle.php index 9e53653a76..f9ba0507d4 100644 --- a/includes/db/DatabaseOracle.php +++ b/includes/db/DatabaseOracle.php @@ -432,7 +432,7 @@ class DatabaseOracle extends Database { /** * Frees resources associated with the LOB descriptor - * @param ResultWrapper|resource $res + * @param ResultWrapper|ORAResult $res */ function freeResult( $res ) { if ( $res instanceof ResultWrapper ) { @@ -443,7 +443,7 @@ class DatabaseOracle extends Database { } /** - * @param ResultWrapper|stdClass $res + * @param ResultWrapper|ORAResult $res * @return mixed */ function fetchObject( $res ) { @@ -454,6 +454,10 @@ class DatabaseOracle extends Database { return $res->fetchObject(); } + /** + * @param ResultWrapper|ORAResult $res + * @return mixed + */ function fetchRow( $res ) { if ( $res instanceof ResultWrapper ) { $res = $res->result; @@ -462,6 +466,10 @@ class DatabaseOracle extends Database { return $res->fetchRow(); } + /** + * @param ResultWrapper|ORAResult $res + * @return int + */ function numRows( $res ) { if ( $res instanceof ResultWrapper ) { $res = $res->result; @@ -470,6 +478,10 @@ class DatabaseOracle extends Database { return $res->numRows(); } + /** + * @param ResultWrapper|ORAResult $res + * @return int + */ function numFields( $res ) { if ( $res instanceof ResultWrapper ) { $res = $res->result; diff --git a/includes/db/DatabasePostgres.php b/includes/db/DatabasePostgres.php index 839d6a0ec2..c9127ff599 100644 --- a/includes/db/DatabasePostgres.php +++ b/includes/db/DatabasePostgres.php @@ -1383,6 +1383,11 @@ SQL; return (bool)$exists; } + /** + * @var string $table + * @var string $field + * @return PostgresField|null + */ function fieldInfo( $table, $field ) { return PostgresField::fromText( $this, $table, $field ); } diff --git a/includes/db/IDatabase.php b/includes/db/IDatabase.php index 0a71df2312..36772b8048 100644 --- a/includes/db/IDatabase.php +++ b/includes/db/IDatabase.php @@ -1215,6 +1215,20 @@ interface IDatabase { */ public function getMasterPos(); + /** + * Run an anonymous function as soon as the current transaction commits or rolls back. + * An error is thrown if no transaction is pending. Queries in the function will run in + * AUTO-COMMIT mode unless there are begin() calls. Callbacks must commit any transactions + * that they begin. + * + * This is useful for combining cooperative locks and DB transactions. + * + * @param callable $callback + * @return mixed + * @since 1.28 + */ + public function onTransactionResolution( callable $callback ); + /** * Run an anonymous function as soon as there is no transaction pending. * If there is a transaction and it is rolled back, then the callback is cancelled. @@ -1231,7 +1245,7 @@ interface IDatabase { * @param callable $callback * @since 1.20 */ - public function onTransactionIdle( $callback ); + public function onTransactionIdle( callable $callback ); /** * Run an anonymous function before the current transaction commits or now if there is none. @@ -1246,7 +1260,7 @@ interface IDatabase { * @param callable $callback * @since 1.22 */ - public function onTransactionPreCommitOrIdle( $callback ); + public function onTransactionPreCommitOrIdle( callable $callback ); /** * Begin an atomic section of statements diff --git a/includes/debug/logger/monolog/KafkaHandler.php b/includes/debug/logger/monolog/KafkaHandler.php index 0fd3b086af..432a9e1490 100644 --- a/includes/debug/logger/monolog/KafkaHandler.php +++ b/includes/debug/logger/monolog/KafkaHandler.php @@ -22,6 +22,7 @@ namespace MediaWiki\Logger\Monolog; use Kafka\MetaDataFromKafka; use Kafka\Produce; +use Kafka\Protocol\Decoder; use MediaWiki\Logger\LoggerFactory; use Monolog\Handler\AbstractProcessingHandler; use Monolog\Logger; @@ -68,6 +69,7 @@ class KafkaHandler extends AbstractProcessingHandler { 'alias' => [], // map from monolog channel to kafka topic 'swallowExceptions' => false, // swallow exceptions sending records 'logExceptions' => null, // A PSR3 logger to inform about errors + 'requireAck' => 0, ]; /** @@ -118,6 +120,10 @@ class KafkaHandler extends AbstractProcessingHandler { $options['logExceptions'] = LoggerFactory::getInstance( $options['logExceptions'] ); } + if ( isset( $options['requireAck'] ) ) { + $produce->setRequireAck( $options['requireAck'] ); + } + return new self( $produce, $options, $level, $bubble ); } @@ -165,13 +171,42 @@ class KafkaHandler extends AbstractProcessingHandler { */ protected function send() { try { - $this->produce->send(); + $response = $this->produce->send(); } catch ( \Kafka\Exception $e ) { $ignore = $this->warning( 'Error sending records to kafka: {exception}', [ 'exception' => $e ] ); if ( !$ignore ) { throw $e; + } else { + return; + } + } + + if ( is_bool( $response ) ) { + return; + } + + $errors = []; + foreach ( $response as $topicName => $partitionResponse ) { + foreach ( $partitionResponse as $partition => $info ) { + if ( $info['errCode'] === 0 ) { + // no error + continue; + } + $errors[] = sprintf( + 'Error producing to %s (errno %d): %s', + $topicName, + $info['errCode'], + Decoder::getError( $info['errCode'] ) + ); + } + } + + if ( $errors ) { + $error = implode( "\n", $errors ); + if ( !$this->warning( $error ) ) { + throw new \RuntimeException( $error ); } } } diff --git a/includes/deferred/DeferredUpdates.php b/includes/deferred/DeferredUpdates.php index e3b75704aa..1552777a80 100644 --- a/includes/deferred/DeferredUpdates.php +++ b/includes/deferred/DeferredUpdates.php @@ -126,8 +126,10 @@ class DeferredUpdates { } public static function execute( array &$queue, $mode ) { - $updates = $queue; // snapshot of queue + $stats = \MediaWiki\MediaWikiServices::getInstance()->getStatsdDataFactory(); + $method = RequestContext::getMain()->getRequest()->getMethod(); + $updates = $queue; // snapshot of queue // Keep doing rounds of updates until none get enqueued while ( count( $updates ) ) { $queue = []; // clear the queue @@ -141,6 +143,7 @@ class DeferredUpdates { } else { $otherUpdates[] = $update; } + $stats->increment( 'deferred_updates.' . $method . '.' . get_class( $update ) ); } // Delegate DataUpdate execution to the DataUpdate class diff --git a/includes/deferred/LinksDeletionUpdate.php b/includes/deferred/LinksDeletionUpdate.php index b8bd74722c..a7c39ca625 100644 --- a/includes/deferred/LinksDeletionUpdate.php +++ b/includes/deferred/LinksDeletionUpdate.php @@ -27,23 +27,28 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate protected $page; /** @var integer */ protected $pageId; + /** @var string */ + protected $timestamp; /** * @param WikiPage $page Page we are updating * @param integer|null $pageId ID of the page we are updating [optional] + * @param string|null $timestamp TS_MW timestamp of deletion * @throws MWException */ - function __construct( WikiPage $page, $pageId = null ) { + function __construct( WikiPage $page, $pageId = null, $timestamp = null ) { parent::__construct( false ); // no implicit transaction $this->page = $page; - if ( $page->exists() ) { + if ( $pageId ) { + $this->pageId = $pageId; // page ID at time of deletion + } elseif ( $page->exists() ) { $this->pageId = $page->getId(); - } elseif ( $pageId ) { - $this->pageId = $pageId; } else { throw new InvalidArgumentException( "Page ID not known. Page doesn't exist?" ); } + + $this->timestamp = $timestamp ?: wfTimestampNow(); } public function doUpdate() { @@ -68,7 +73,7 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate ); $catBatches = array_chunk( $cats, $batchSize ); foreach ( $catBatches as $catBatch ) { - $this->page->updateCategoryCounts( [], $catBatch ); + $this->page->updateCategoryCounts( [], $catBatch, $id ); if ( count( $catBatches ) > 1 ) { $this->mDb->commit( __METHOD__, 'flush' ); wfGetLBFactory()->waitForReplication( [ 'wiki' => $this->mDb->getWikiID() ] ); @@ -135,7 +140,9 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate [ 'rc_type != ' . RC_LOG, 'rc_namespace' => $title->getNamespace(), - 'rc_title' => $title->getDBkey() + 'rc_title' => $title->getDBkey(), + 'rc_timestamp < ' . + $this->mDb->addQuotes( $this->mDb->timestamp( $this->timestamp ) ) ], __METHOD__ ); @@ -188,7 +195,7 @@ class LinksDeletionUpdate extends SqlDataUpdate implements EnqueueableDataUpdate 'wiki' => $this->mDb->getWikiID(), 'job' => new JobSpecification( 'deleteLinks', - [ 'pageId' => $this->pageId ], + [ 'pageId' => $this->pageId, 'timestamp' => $this->timestamp ], [ 'removeDuplicates' => true ], $this->page->getTitle() ) diff --git a/includes/diff/DifferenceEngine.php b/includes/diff/DifferenceEngine.php index f35356ce06..af5fbf3346 100644 --- a/includes/diff/DifferenceEngine.php +++ b/includes/diff/DifferenceEngine.php @@ -891,18 +891,23 @@ class DifferenceEngine extends ContextSource { if ( $wgExternalDiffEngine == 'wikidiff' || $wgExternalDiffEngine == 'wikidiff3' ) { wfDeprecated( "\$wgExternalDiffEngine = '{$wgExternalDiffEngine}'", '1.27' ); $wgExternalDiffEngine = false; + } elseif ( $wgExternalDiffEngine == 'wikidiff2' ) { + // Same as above, but with no deprecation warnings + $wgExternalDiffEngine = false; + } elseif ( !is_string( $wgExternalDiffEngine ) && $wgExternalDiffEngine !== false ) { + // And prevent people from shooting themselves in the foot... + wfWarn( '$wgExternalDiffEngine is set to a non-string value, forcing it to false' ); + $wgExternalDiffEngine = false; } - if ( $wgExternalDiffEngine == 'wikidiff2' ) { - if ( function_exists( 'wikidiff2_do_diff' ) ) { - # Better external diff engine, the 2 may some day be dropped - # This one does the escaping and segmenting itself - $text = wikidiff2_do_diff( $otext, $ntext, 2 ); - $text .= $this->debug( 'wikidiff2' ); + if ( function_exists( 'wikidiff2_do_diff' ) && $wgExternalDiffEngine === false ) { + # Better external diff engine, the 2 may some day be dropped + # This one does the escaping and segmenting itself + $text = wikidiff2_do_diff( $otext, $ntext, 2 ); + $text .= $this->debug( 'wikidiff2' ); - return $text; - } - } elseif ( $wgExternalDiffEngine !== false ) { + return $text; + } elseif ( $wgExternalDiffEngine !== false && is_executable( $wgExternalDiffEngine ) ) { # Diff via the shell $tmpDir = wfTempDir(); $tempName1 = tempnam( $tmpDir, 'diff_' ); diff --git a/includes/exception/MWExceptionHandler.php b/includes/exception/MWExceptionHandler.php index 63adc29bfd..e4ff5f3330 100644 --- a/includes/exception/MWExceptionHandler.php +++ b/includes/exception/MWExceptionHandler.php @@ -93,10 +93,11 @@ class MWExceptionHandler { } } } else { - $message = "Exception encountered, of type \"" . get_class( $e ) . "\""; - - if ( $wgShowExceptionDetails ) { - $message .= "\n" . self::getLogMessage( $e ) . "\nBacktrace:\n" . + if ( !$wgShowExceptionDetails ) { + $message = self::getPublicLogMessage( $e ); + } else { + $message = self::getLogMessage( $e ) . + "\nBacktrace:\n" . self::getRedactedTraceAsString( $e ) . "\n"; } @@ -492,7 +493,7 @@ TXT; $type = get_class( $e ); return '[' . $reqId . '] ' . gmdate( 'Y-m-d H:i:s' ) . ': ' - . 'Fatal exception of type ' . $type; + . 'Fatal exception of type "' . $type . '"'; } /** diff --git a/includes/export/DumpStringOutput.php b/includes/export/DumpStringOutput.php new file mode 100644 index 0000000000..5168225179 --- /dev/null +++ b/includes/export/DumpStringOutput.php @@ -0,0 +1,45 @@ +output .= $string; + } + + /** + * Get the string containing the output. + * + * @return string + */ + public function getOutput() { + return $this->output; + } +} diff --git a/includes/export/WikiExporter.php b/includes/export/WikiExporter.php index 54de26d4dd..c1f2d59dcc 100644 --- a/includes/export/WikiExporter.php +++ b/includes/export/WikiExporter.php @@ -134,13 +134,21 @@ class WikiExporter { * @param int $start Inclusive lower limit (this id is included) * @param int $end Exclusive upper limit (this id is not included) * If 0, no upper limit. + * @param bool $orderRevs order revisions within pages in ascending order */ - public function pagesByRange( $start, $end ) { - $condition = 'page_id >= ' . intval( $start ); - if ( $end ) { - $condition .= ' AND page_id < ' . intval( $end ); + public function pagesByRange( $start, $end, $orderRevs ) { + if ( $orderRevs ) { + $condition = 'rev_page >= ' . intval( $start ); + if ( $end ) { + $condition .= ' AND rev_page < ' . intval( $end ); + } + } else { + $condition = 'page_id >= ' . intval( $start ); + if ( $end ) { + $condition .= ' AND page_id < ' . intval( $end ); + } } - $this->dumpFrom( $condition ); + $this->dumpFrom( $condition, $orderRevs ); } /** @@ -245,7 +253,7 @@ class WikiExporter { * @throws MWException * @throws Exception */ - protected function dumpFrom( $cond = '' ) { + protected function dumpFrom( $cond = '', $orderRevs = false ) { # For logging dumps... if ( $this->history & self::LOGS ) { $where = [ 'user_id = log_user' ]; @@ -332,7 +340,16 @@ class WikiExporter { } } elseif ( $this->history & WikiExporter::FULL ) { # Full history dumps... - $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page' ]; + # query optimization for history stub dumps + if ( $this->text == WikiExporter::STUB && $orderRevs ) { + $tables = [ 'revision', 'page' ]; + $opts[] = 'STRAIGHT_JOIN'; + $opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ]; + $opts['USE INDEX']['revision'] = 'rev_page_id'; + $join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ]; + } else { + $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page' ]; + } } elseif ( $this->history & WikiExporter::CURRENT ) { # Latest revision dumps... if ( $this->list_authors && $cond != '' ) { // List authors, if so desired @@ -369,7 +386,6 @@ class WikiExporter { if ( $this->buffer == WikiExporter::STREAM ) { $prev = $this->db->bufferResults( false ); } - $result = null; // Assuring $result is not undefined, if exception occurs early try { Hooks::run( 'ModifyExportQuery', diff --git a/includes/filerepo/FileRepo.php b/includes/filerepo/FileRepo.php index 9ad24283c9..d7559d057b 100644 --- a/includes/filerepo/FileRepo.php +++ b/includes/filerepo/FileRepo.php @@ -533,11 +533,10 @@ class FileRepo { public function findFileFromKey( $sha1, $options = [] ) { $time = isset( $options['time'] ) ? $options['time'] : false; # First try to find a matching current version of a file... - if ( $this->fileFactoryKey ) { - $img = call_user_func( $this->fileFactoryKey, $sha1, $this, $time ); - } else { + if ( !$this->fileFactoryKey ) { return false; // find-by-sha1 not supported } + $img = call_user_func( $this->fileFactoryKey, $sha1, $this, $time ); if ( $img && $img->exists() ) { return $img; } diff --git a/includes/filerepo/file/LocalFile.php b/includes/filerepo/file/LocalFile.php index c7670785b2..5d63645dc8 100644 --- a/includes/filerepo/file/LocalFile.php +++ b/includes/filerepo/file/LocalFile.php @@ -21,6 +21,8 @@ * @ingroup FileAbstraction */ +use \MediaWiki\Logger\LoggerFactory; + /** * Bump this number when serialized cache records may be incompatible. */ @@ -1910,6 +1912,7 @@ class LocalFile extends File { */ function lock() { if ( !$this->locked ) { + $logger = LoggerFactory::getInstance( 'LocalFile' ); $dbw = $this->repo->getMasterDB(); if ( !$dbw->trxLevel() ) { $dbw->begin( __METHOD__ ); @@ -1920,25 +1923,27 @@ class LocalFile extends File { // Also, that would cause contention on INSERT of similarly named rows. $backend = $this->getRepo()->getBackend(); $lockPaths = [ $this->getPath() ]; // represents all versions of the file - $start = microtime( true ); $status = $backend->lockFiles( $lockPaths, LockManager::LOCK_EX, 10 ); - $waited = microtime( true ) - $start; if ( !$status->isGood() ) { if ( $this->lockedOwnTrx ) { $dbw->rollback( __METHOD__ ); } - throw new LocalFileLockError( - "Could not acquire lock for '{$this->getName()}' ($waited sec): " . - $status->getWikiText( false, false, 'en' ) - ); + $logger->warning( "Failed to lock '{file}'", [ 'file' => $this->name ] ); + + throw new LocalFileLockError( $status ); } - // Release the lock *after* commit to avoid row-level contention - $this->locked++; - $dbw->onTransactionIdle( function () use ( $backend, $lockPaths ) { - $backend->unlockFiles( $lockPaths, LockManager::LOCK_EX ); + // Release the lock *after* commit to avoid row-level contention. + // Make sure it triggers on rollback() as well as commit() (T132921). + $dbw->onTransactionResolution( function () use ( $backend, $lockPaths, $logger ) { + $status = $backend->unlockFiles( $lockPaths, LockManager::LOCK_EX ); + if ( !$status->isGood() ) { + $logger->error( "Failed to unlock '{file}'", [ 'file' => $this->name ] ); + } } ); } + $this->locked++; + return $this->lockedOwnTrx; } @@ -3047,6 +3052,17 @@ class LocalFileMoveBatch { } } -class LocalFileLockError extends Exception { +class LocalFileLockError extends ErrorPageError { + public function __construct( Status $status ) { + parent::__construct( + 'actionfailed', + $status->getMessage() + ); + } + public function report() { + global $wgOut; + $wgOut->setStatusCode( 429 ); + parent::report(); + } } diff --git a/includes/gallery/ImageGalleryBase.php b/includes/gallery/ImageGalleryBase.php index c8a25f0b28..6884f65626 100644 --- a/includes/gallery/ImageGalleryBase.php +++ b/includes/gallery/ImageGalleryBase.php @@ -113,6 +113,7 @@ abstract class ImageGalleryBase extends ContextSource { 'packed' => 'PackedImageGallery', 'packed-hover' => 'PackedHoverImageGallery', 'packed-overlay' => 'PackedOverlayImageGallery', + 'slideshow' => 'SlideshowImageGallery', ]; // Allow extensions to make a new gallery format. Hooks::run( 'GalleryGetModes', [ &self::$modeMapping ] ); diff --git a/includes/gallery/SlideshowImageGallery.php b/includes/gallery/SlideshowImageGallery.php new file mode 100644 index 0000000000..3f0c9329d0 --- /dev/null +++ b/includes/gallery/SlideshowImageGallery.php @@ -0,0 +1,37 @@ +mPerRow = 0; + } + + /** + * Add javascript adds interface elements + * @return array + */ + protected function getModules() { + return [ 'mediawiki.page.gallery.slideshow' ]; + } +} diff --git a/includes/htmlform/HTMLSelectNamespaceWithButton.php b/includes/htmlform/HTMLSelectNamespaceWithButton.php index 24b15bd700..52259836df 100644 --- a/includes/htmlform/HTMLSelectNamespaceWithButton.php +++ b/includes/htmlform/HTMLSelectNamespaceWithButton.php @@ -3,7 +3,7 @@ * Creates a Html::namespaceSelector input field with a button assigned to the input field. */ class HTMLSelectNamespaceWithButton extends HTMLSelectNamespace { - /** @var HTMLFormClassWithButton $mClassWithButton */ + /** @var HTMLFormFieldWithButton $mClassWithButton */ protected $mClassWithButton = null; public function __construct( $info ) { diff --git a/includes/htmlform/HTMLTextFieldWithButton.php b/includes/htmlform/HTMLTextFieldWithButton.php index c6dac32270..7c1c6739e6 100644 --- a/includes/htmlform/HTMLTextFieldWithButton.php +++ b/includes/htmlform/HTMLTextFieldWithButton.php @@ -3,7 +3,7 @@ * Creates a text input field with a button assigned to the input field. */ class HTMLTextFieldWithButton extends HTMLTextField { - /** @var HTMLFormClassWithButton $mClassWithButton */ + /** @var HTMLFormFieldWithButton $mClassWithButton */ protected $mClassWithButton = null; public function __construct( $info ) { diff --git a/includes/installer/Installer.php b/includes/installer/Installer.php index 7c161ca77a..4d5aa7ad22 100644 --- a/includes/installer/Installer.php +++ b/includes/installer/Installer.php @@ -121,8 +121,6 @@ abstract class Installer { protected $envChecks = [ 'envCheckDB', 'envCheckBrokenXML', - 'envCheckMbstring', - 'envCheckXML', 'envCheckPCRE', 'envCheckMemory', 'envCheckCache', @@ -136,9 +134,6 @@ abstract class Installer { 'envCheckUploadsDirectory', 'envCheckLibicu', 'envCheckSuhosinMaxValueLength', - 'envCheckCtype', - 'envCheckIconv', - 'envCheckJSON', ]; /** @@ -791,40 +786,6 @@ abstract class Installer { return true; } - /** - * Environment check for mbstring.func_overload. - * @return bool - */ - protected function envCheckMbstring() { - if ( wfIniGetBool( 'mbstring.func_overload' ) ) { - $this->showError( 'config-mbstring' ); - - return false; - } - - if ( !function_exists( 'mb_substr' ) ) { - $this->showError( 'config-mbstring-absent' ); - - return false; - } - - return true; - } - - /** - * Environment check for the XML module. - * @return bool - */ - protected function envCheckXML() { - if ( !function_exists( "utf8_encode" ) ) { - $this->showError( 'config-xml-bad' ); - - return false; - } - - return true; - } - /** * Environment check for the PCRE module. * @@ -1177,45 +1138,6 @@ abstract class Installer { } } - /** - * @return bool - */ - protected function envCheckCtype() { - if ( !function_exists( 'ctype_digit' ) ) { - $this->showError( 'config-ctype' ); - - return false; - } - - return true; - } - - /** - * @return bool - */ - protected function envCheckIconv() { - if ( !function_exists( 'iconv' ) ) { - $this->showError( 'config-iconv' ); - - return false; - } - - return true; - } - - /** - * @return bool - */ - protected function envCheckJSON() { - if ( !function_exists( 'json_decode' ) ) { - $this->showError( 'config-json' ); - - return false; - } - - return true; - } - /** * Environment prep for the server hostname. */ diff --git a/includes/installer/WebInstaller.php b/includes/installer/WebInstaller.php index 4c4e6b7ed0..c08212e390 100644 --- a/includes/installer/WebInstaller.php +++ b/includes/installer/WebInstaller.php @@ -1156,6 +1156,20 @@ class WebInstaller extends Installer { return Html::rawElement( 'div', [ 'class' => 'config-download-link' ], $anchor ); } + /** + * If the software package wants the LocalSettings.php file + * to be placed in a specific location, override this function + * (see mw-config/overrides/README) to return the path of + * where the file should be saved, or false for a generic + * "in the base of your install" + * + * @since 1.27 + * @return string|bool + */ + public function getLocalSettingsLocation() { + return false; + } + /** * @return bool */ diff --git a/includes/installer/WebInstallerComplete.php b/includes/installer/WebInstallerComplete.php index 11a183314a..456058e455 100644 --- a/includes/installer/WebInstallerComplete.php +++ b/includes/installer/WebInstallerComplete.php @@ -37,13 +37,20 @@ class WebInstallerComplete extends WebInstallerPage { $this->startForm(); $this->parent->disableLinkPopups(); + $location = $this->parent->getLocalSettingsLocation(); + $msg = 'config-install-done'; + if ( $location !== false ) { + // config-install-done-path + $msg .= '-path'; + } $this->addHTML( $this->parent->getInfoBox( - wfMessage( 'config-install-done', + wfMessage( $msg, $lsUrl, $this->getVar( 'wgServer' ) . $this->getVar( 'wgScriptPath' ) . '/index.php', - '' + '', + $location ?: '' )->plain(), 'tick-32.png' ) ); diff --git a/includes/installer/i18n/ar.json b/includes/installer/i18n/ar.json index 085bf12ba1..239ad7e4a7 100644 --- a/includes/installer/i18n/ar.json +++ b/includes/installer/i18n/ar.json @@ -20,7 +20,7 @@ "config-localsettings-badkey": "مفتاح الترقية الذي قدمته غير صحيح.", "config-upgrade-key-missing": "تنصيب موجود للميدياويكي قد تم اكتشافه.\nلترقية هذا التنصيب، الرجاء وضع السطر أسفل LocalSettings.php الخاصة بك:\n\n$1", "config-localsettings-incomplete": "صفحة LocalSettings.php يبدو أنها ناقصة.\nالمتغير $1 لم يتم تعيينه.\nالرجاء تغيير LocalSettings.php لكي يتم تعيين المتغير، ثم اضغط على \"{{int:Config-continue}}\".", - "config-localsettings-connection-error": "تمت مصادفة خطأ أثناء الاتصال بقاعدة البيانات باستخدام الإعدادات المحددة في LocalSettings.php أو AdminSettings.php. الرجاء إصلاح هذه الإعدادات وحاول مجددًا.\n\n$1", + "config-localsettings-connection-error": "تمت مصادفة خطأ أثناء الاتصال بقاعدة البيانات باستخدام الإعدادات المحددة في LocalSettings.php أو LocalSettings.php. الرجاء إصلاح هذه الإعدادات وحاول مجددًا.\n\n$1", "config-session-error": "خطأ في بدء الجلسة: $1", "config-session-expired": "يبدو أن بيانات جلستك قد انتهت صلاحيتها.\nالجلسات مكونة مدى الحياة من $1.\nيمكنك زيادة هذه بتعيين session.gc_maxlifetime في php.ini.\nأعد تشغيل عميل التثبيت.", "config-no-session": "بيانات جلستك قد ضاعت!\nتحقق من php.ini للتأكد أن session.save_path تم تعيينه كدليل مناسب.", diff --git a/includes/installer/i18n/ast.json b/includes/installer/i18n/ast.json index aa4f1c9934..ea96cfef6b 100644 --- a/includes/installer/i18n/ast.json +++ b/includes/installer/i18n/ast.json @@ -55,8 +55,6 @@ "config-no-db": "¡Nun pudo alcontrase un controlador de base de datos afayadizu! Necesites instalar un controlador de base de datos pa PHP.\n{{PLURAL:$2|Tien sofitu el tipu de base de datos siguiente|Tienen sofitu los tipos de base de datos siguientes}}: $1.\n\nSi compilasti PHP tu mesmu, reconfigúralu con un cliente de base de datos activáu, por exemplu, usando ./configure --with-mysqli.\nSi instalasti PHP dende un paquete de Debian o Ubuntu, necesites instalar tamién,por exemplu, el paquete php5-mysql.", "config-outdated-sqlite": "'''Avisu:''' tien SQLite $1, que ye inferior a la versión mínima necesaria $2. SQLite nun tará disponible.", "config-no-fts3": "'''Avisu:''' SQLite ta compiláu ensin el [//sqlite.org/fts3.html módulu FTS3]; les funciones de gueta nun tarán disponibles nesti sistema.", - "config-mbstring": "Fatal: ¡[@http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] ta activáu!\nEsta opción causa errores y pué corromper los datos de mou imprevisible.\nNun puedes instalar o utilizar MediaWiki nun siendo que esta opción tea desactivada.", - "config-xml-bad": "Falta'l módulu XML de PHP.\nMediaWiki rique funciones d'esti módulu y nun va funcionar con esta configuración.\nSeique precises instalar el paquete RPM llamáu php-xml.", "config-pcre-old": "Fatal: Ríquese PCRE $1 o posterior.\nEl binariu de PHP ta enllazáu con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Más información].", "config-apc": "[http://www.php.net/apc APC] ta instaláu", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ta instaláu", diff --git a/includes/installer/i18n/ba.json b/includes/installer/i18n/ba.json index c81aa66662..a1fcfab214 100644 --- a/includes/installer/i18n/ba.json +++ b/includes/installer/i18n/ba.json @@ -23,7 +23,7 @@ "config-localsettings-badkey": "Дөрөҫ булмаған асҡыс күрһәттегеҙ", "config-upgrade-key-missing": "Ҡуйылған MediaWiki копияһы булыуы асыҡланды. Яңыртыу өсөн файл аҙағында ҡуйығыҙ: LocalSettings.php:\n\n$1", "config-localsettings-incomplete": "Ғәмәлдәге LocalSettings.php файла тулған. $1 билдәләнмәгән. Зинһар өсөн LocalSettings.php кодын үҙгәртегеҙ. Һуңынан ошонда сиртегеҙ «{{int:Config-continue}}».", - "config-localsettings-connection-error": "LocalSettings.php көйләүҙәрендә хата китте йәки AdminSettings.php көйләүҙәрендә хата. Зинһар өсөн, көйләүҙәрҙе тәҙәтегеҙ, яңынан эшләп ҡарағыҙ\n$1", + "config-localsettings-connection-error": "LocalSettings.php көйләүҙәрендә хата китте йәки LocalSettings.php көйләүҙәрендә хата. Зинһар өсөн, көйләүҙәрҙе тәҙәтегеҙ, яңынан эшләп ҡарағыҙ\n$1", "config-session-error": "Эш башлағанда сыҡҡан хата: $1", "config-session-expired": "Һеҙҙең ваҡыт үтте. Сессия $1 оҙонлоғона көйләнгән. Уны оҙайтыу өсөн php.ini. эсендә session.gc_maxlifetime кодын үҙгәртегеҙ.\nУрынлаштырыу процессын яңынан башлағыҙ.", "config-no-session": "Был сессия юғалған!\nҮҙегеҙҙең php.ini тикшерегеҙ, \nsession.save_path коды тейешле каталогҡа урынлаштырылған икәненә ышынғыҙ.", @@ -63,16 +63,10 @@ "config-no-db": "Мәғлүмәттәр базаһына тура килгән драйверҙарҙы табып булманы!Һеҙгә PHP өсөн мәғлүмәттәр базаһының драйверҙарын ҡуйырға кәрәк.{{PLURAL:$2|сираттағы төр ҡулланыла|сираттағы төрҙәр ҡулланыла}}мәғлүмәттәр базалары:$1.\nӘгәр һеҙ үҙегеҙ PHP -ға компиляция яһаған булһағыҙ, мәғлүмәттәр базаһына клиентты индереп уны яңынан, мәҫәлән, ./configure --with-mysqli ярҙамы менән көйләгеҙ. Әгәр ҙә һеҙ PHP -ны Debian йәки Ubuntu пакеттарынан ҡуйһағыҙ, һеҙгә, мәҫәлән, php5-mysql пакетын да ҡуйырға кәрәк булыр.", "config-outdated-sqlite": "'''Киҫәтеү''': Һеҙҙә SQLite $1 ҡуйылған, $2 тейешле өлгөнән түбән . SQLite асылмаясаҡ.", "config-no-fts3": "'''Иғтибар''': SQLite модулһыҙ йыйлған [//sqlite.org/fts3.html FTS3] — был мәғлүмәт базаһы өсөн эҙләү мөмкин булмаясаҡ.", - "config-mbstring": "\"Проблема\": PHP опцияһы тоташтырылған\n[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nБыл индерелгән мәғлүмәттәрҙең хаталарына һәм көтөлмәгән боҙолоуҙарға килтерә.\nОпцияны һүндермәйенсә MediaWikiны ҡуйыу һәм ҡулланыу мөмкин түгел.", - "config-xml-bad": "РНР өсөн XML-модуль юҡ. \nMediaWiki бындай конфигурацияла эшләмәйәсәк, сөнки был модулдең функционалы талап ителә.\nБәлки, Һеҙгә RPM-пакет php-xml булдырырыға кәрәк булыр.", "config-pcre-old": "'''Фаталь хата:''' PCRE версияһы йәки яңырағы талап ителә $1.\nБашҡарылыусы файл PHP менән бәйләнгән PCRE $2версияһы.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Ентекләберәк].", "config-pcre-no-utf8": "'''Фаталь хата'''. PHP өсөн PCRE модуле PCRE_UTF8 менән яраҡлыштырылмаған.\nMediaWiki дөрөҫ эшләһен өсөн UTF-8 талап ителә.", "config-memory-raised": "Хәтер сикләнгән PHP (memory_limit) $1 $2 тиклем арттырылған.", "config-memory-bad": "'''Иғтибар:''' PHP күләме memory_limit $1 тәшкил итә.\nБәлки, был саманан тыш аҙҙыр. \nҠуйылыштың уңышһыҙлыҡҡа осрауы бар!", - "config-ctype": "Фаталь хата: PHР тотороҡло эшләргә тейеш [http://www.php.net/manual/en/iconv.installation.php киңәйтеү iconv].", - "config-iconv": "Фаталь хата: PHР тотороҡло эшләргә тейеш [http://www.php.net/manual/en/iconv.installation.php киңәйтеү iconv].", - "config-json": "'''Фаталь хата:''' PHP JSON ярҙамынан тыш эшләнгән.\nҺеҙгә йә PHP JSON киңәйтеүен, йәки MediaWiki алдынан [http://pecl.php.net/package/jsonc PECL jsonc] киңәйтеүен ҡуйырға кәрәк.\n* PHP-киңәйтеүсе /etc/php.ini йәки /etc/php.d/json.ini инергә тейеш булһа ла, Red Hat Enterprise Linux (CentOS) 5 һәм 6, составына инә.\n* 2013 йылдың майынан һуң сығарылған Linux-тың ҡайһы бер дистрибутивтары PECL киңәйтеүен php5-json или php-pecl-jsonc кеүек асыр урынға, PHP киңәйтеүсеһен асмай.", - "config-mbstring-absent": "Фаталь хата: PHP [http://www.php.net/manual/en/mbstring.setup.php расширения mbstring] ярҙамында компиляция үтергә тейеш.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] урынлаштырылды", "config-apc": "[http://www.php.net/apc APC] урынлаштырылды", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] урынлыштырылды", diff --git a/includes/installer/i18n/bcl.json b/includes/installer/i18n/bcl.json index a6b4bce6be..0f8bf2c361 100644 --- a/includes/installer/i18n/bcl.json +++ b/includes/installer/i18n/bcl.json @@ -27,7 +27,6 @@ "config-page-upgradedoc": "Ipinagpapalangkaw", "config-page-existingwiki": "Eksistidong wiki", "config-restart": "Iyo, pakipoon kaini otro", - "config-xml-bad": "An XML kan PHP na modyul nawawara.\nAn Mediawiki minakaipo nin mga punksyon sa modyul na ini asin dae matrabaho sa laog kaining konpigurasyon.\nIka minakaipong magmuntar kan php-xml RPM package", "config-db-wiki-settings": "Bistohon ining wiki", "config-db-name": "Pangaran kan datos-sarayan:", "config-db-username": "Ngaran-paragamit nin datos-sarayan:", diff --git a/includes/installer/i18n/be-tarask.json b/includes/installer/i18n/be-tarask.json index a51db82d0a..7dc8cd9ddf 100644 --- a/includes/installer/i18n/be-tarask.json +++ b/includes/installer/i18n/be-tarask.json @@ -54,21 +54,15 @@ "config-env-php": "Усталяваны PHP $1.", "config-env-hhvm": "HHVM $1 усталяваная.", "config-unicode-using-intl": "Выкарыстоўваецца [http://pecl.php.net/intl intl пашырэньне з PECL] для Unicode-нармалізацыі", - "config-unicode-pure-php-warning": "'''Папярэджаньне''': [http://pecl.php.net/intl Пашырэньне intl з PECL] — ня слушнае для Unicode-нармалізацыі, цяпер выкарыстоўваецца марудная PHP-рэалізацыя.\nКалі ў Вас сайт з высокай наведваемасьцю, раім пачытаць пра [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-нармалізацыю].", - "config-unicode-update-warning": "'''Папярэджаньне''': усталяваная вэрсія бібліятэкі для Unicode-нармалізацыі выкарыстоўвае састарэлую вэрсію бібліятэкі з [http://site.icu-project.org/ праекту ICU].\nРаім [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations абнавіць], калі ваш сайт будзе працаваць зь Unicode.", + "config-unicode-pure-php-warning": "'''Папярэджаньне''': [http://pecl.php.net/intl Пашырэньне intl з PECL] — ня слушнае для Unicode-нармалізацыі, цяпер выкарыстоўваецца марудная PHP-рэалізацыя.\nКалі ў Вас сайт з высокай наведвальнасьцю, раім пачытаць пра [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-нармалізацыю].", + "config-unicode-update-warning": "'''Папярэджаньне''': усталяваная вэрсія бібліятэкі для Unicode-нармалізацыі выкарыстоўвае састарэлую вэрсію бібліятэкі з [http://site.icu-project.org/ праекту ICU].\nРаім [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations абнавіць], калі ваш сайт будзе працаваць з Unicode.", "config-no-db": "Немагчыма знайсьці адпаведны драйвэр базы зьвестак. Вам неабходна ўсталяваць драйвэр базы зьвестак для PHP.\n{{PLURAL:$2|Падтрымліваецца наступны тып базы|Падтрымліваюцца наступныя тыпы базаў}} зьвестак: $1.\n\nКалі вы скампілявалі PHP самастойна, зьмяніце канфігурацыю, каб уключыць кліента базы зьвестак, напрыклад, з дапамогай ./configure --with-mysqli.\nКалі вы ўсталявалі PHP з пакунку Debian або Ubuntu, тады вам трэба дадаткова ўсталяваць, напрыклад, пакунак php5-mysql.", "config-outdated-sqlite": "'''Папярэджаньне''': усталяваны SQLite $1, у той час, калі мінімальная сумяшчальная вэрсія — $2. SQLite ня будзе даступны.", "config-no-fts3": "'''Папярэджаньне''': SQLite створаны без модуля [//sqlite.org/fts3.html FTS3], для гэтага ўнутранага інтэрфэйсу ня будзе даступная магчымасьць пошуку.", - "config-mbstring": "'''Фатальная памылка: рэжым [http://www.php.net/manual/en/ref.info.php#mbstring.overload mbstring.func_overload] уключаны!'''\nГэты рэжым выклікае памылкі і можа шкодзіць зьвесткі непрадказальным чынам.\nПрацяг усталяваньня альбо выкарыстаньне MediaWiki немагчымыя, пакуль рэжым ня будзе выключаны.", - "config-xml-bad": "Ня знойдзены модуль XML для PHP.\nMediaWiki патрэбныя функцыі з гэтага модулю, таму MediaWiki ня будзе працаваць у гэтай канфігурацыі.\nМагчыма, вам трэба ўсталяваць RPM-пакет php-xml.", "config-pcre-old": "Крытычная памылка: патрэбны PCRE вэрсіі $1 або пазьнейшай.\nPHP-файл, які выконваецца, зьвязаны з PCRE вэрсіі $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Больш інфармацыі].", "config-pcre-no-utf8": "'''Фатальная памылка''': модуль PCRE для PHP скампіляваны без падтрымкі PCRE_UTF8.\nMediaWiki патрабуе падтрымкі UTF-8 для слушнай працы.", "config-memory-raised": "Абмежаваньне на даступную для PHP памяць memory_limit было падвышанае з $1 да $2.", "config-memory-bad": "'''Папярэджаньне:''' памер PHP memory_limit складае $1.\nВерагодна, гэта вельмі мала.\nУсталяваньне можа быць няўдалым!", - "config-ctype": "'''Фатальная памылка''': PHP мусіць быць скампіляваны з падтрымкай [http://www.php.net/manual/en/ctype.installation.php пашырэньня Ctype].", - "config-iconv": "Непапраўная памылка: PHP мусіць быць скампіляваны з падтрымкай [http://www.php.net/manual/en/iconv.installation.php пашырэньня iconv].", - "config-json": "Крытычная памылка: PHP быў скампіляваны без падтрымкі JSON.\nВы павінныя ўсталяваць або пашырэньне PHP JSON, або пашырэньне [http://pecl.php.net/package/jsonc PECL jsonc] перад усталёўкай MediaWiki.\n* Пашырэньне PHP уваходзіць у Red Hat Enterprise Linux (CentOS) 5 і 6, пры гэтым павінна быць падключана ў /etc/php.ini або /etc/php.d/json.ini.\n* Некаторыя дыстрыбутывы Linux, выдадзеныя пасьля траўня 2013 году, ня маюць пашырэньня PHP, замест яго пакуюць пашырэньне PECL як php5-json або php-pecl-jsonc.", - "config-mbstring-absent": "Непапраўная памылка: PHP мусіць быць скампіляваны з падтрымкай [http://www.php.net/manual/en/mbstring.setup.php пашырэньня mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] усталяваны", "config-apc": "[http://www.php.net/apc APC] усталяваны", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] усталяваны", @@ -244,13 +238,13 @@ "config-email-sender-help": "Увядзіце адрас электроннай пошты для вяртаньня ў якасьці адрасу дасылаемых электронных лістоў.\nСюды будуць дасылацца неатрыманыя электронныя лісты.\nШматлікія паштовыя сэрвэры патрабуюць, каб хаця б назва дамэну была слушнай.", "config-upload-settings": "Загрузкі выяваў і файлаў", "config-upload-enable": "Дазволіць загрузку файлаў", - "config-upload-help": "Дазвол загрузкі файлаў можа патэнцыйна пагражаць бясьпекі сэрвэра.\nДадатковую інфармацыю можна атрымаць ў [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security разьдзеле бясьпекі].\n\nКаб дазволіць загрузку файлаў, зьмяніце рэжым падкаталёга images у карэннай дырэкторыі MediaWiki так, каб ўэб-сэрвэр меў доступ на запіс.\nПотым дазвольце гэтую магчымасьць.", + "config-upload-help": "Дазвол загрузкі файлаў можа патэнцыйна пагражаць бясьпецы сэрвэра.\nДадатковую інфармацыю можна атрымаць ў [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security разьдзеле бясьпекі].\n\nКаб дазволіць загрузку файлаў, зьмяніце рэжым падкаталёгу images у карэннай дырэкторыі MediaWiki так, каб вэб-сэрвэр меў доступ на запіс.\nПотым дазвольце гэтую магчымасьць.", "config-upload-deleted": "Дырэкторыя для выдаленых файлаў:", "config-upload-deleted-help": "Выберыце дырэкторыю, у якой будуць захоўвацца выдаленыя файлы.\nУ ідэальным выпадку, яна не павінна мець доступу з Інтэрнэту.", "config-logo": "URL-адрас лягатыпу:", "config-logo-help": "Афармленьне MediaWiki па змоўчваньні ўключае прастору для лягатыпу памерам 135×160 піксэляў у верхнім левым куце.\nЗагрузіце выяву адпаведнага памеру і ўвядзіце тут URL-адрас.\n\nВы можаце ўжыць $wgStylePath або $wgScriptPath, калі ваш лягатып знаходзіцца адносна гэтых шляхоў.\n\nКалі Вы не жадаеце мець ніякага лягатыпу, пакіньце поле пустым.", "config-instantcommons": "Дазволіць Instant Commons", - "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымасьць, якая дазваляе вікі выкарыстоўваць выявы, гукі і іншыя мэдыя, якія знаходзяцца на сайце [https://commons.wikimedia.org/ Wikimedia Commons].\nКаб гэта зрабіць, MediaWiki патрабуе доступу да Інтэрнэту.\n\nКаб даведацца болей пра гэтую магчымасьць, уключаючы інструкцыю пра тое, як яе ўстанавіць ў любой вікі, акрамя Wikimedia Commons, глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos дакумэнтацыю].", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] — магчымасьць, якая дазваляе вікі выкарыстоўваць выявы, гукі і іншыя мэдыя, якія знаходзяцца на сайце [https://commons.wikimedia.org/ Wikimedia Commons].\nКаб гэта зрабіць, MediaWiki патрабуе доступу да Інтэрнэту.\n\nКаб даведацца болей пра гэтую магчымасьць, у тым ліку пра інструкцыю, як яе ўсталяваць для іншых вікі, акрамя Wikimedia Commons, глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos дакумэнтацыю].", "config-cc-error": "Выбар ліцэнзіі Creative Commons ня даў вынікаў.\nУвядзіце назву ліцэнзіі ўручную.", "config-cc-again": "Выберыце яшчэ раз…", "config-cc-not-chosen": "Выберыце, якую ліцэнзію Creative Commons Вы жадаеце выкарыстоўваць і націсьніце «proceed».", @@ -316,7 +310,7 @@ "config-help": "дапамога", "config-help-tooltip": "націсьніце, каб разгарнуць", "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?", - "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў].", + "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў] або [https://www.mediawiki.org/wiki/Extension_Matrix матрыцу пашырэньняў], каб пабачыць поўны сьпіс.", "mainpagetext": "MediaWiki была ўсталяваная.", "mainpagedocfooter": "Глядзіце [https://meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Даведайцеся, як змагацца з спамам у вашай вікі]" } diff --git a/includes/installer/i18n/bg.json b/includes/installer/i18n/bg.json index 79055897af..cc314020dd 100644 --- a/includes/installer/i18n/bg.json +++ b/includes/installer/i18n/bg.json @@ -56,15 +56,10 @@ "config-no-db": "Не може да бъде открит подходящ драйвер за база данни! Необходимо е да инсталирате драйвер за база данни за PHP.\n{{PLURAL:$2|Поддържа се следния тип|Поддържат се следните типове}} бази от данни: $1.\n\nАко сами сте компилирали PHP, преконфигурирайте го с включен клиент за база данни, например чрез използване на ./configure --with-mysql.\nАко сте инсталирали PHP от пакет за Debian или Ubuntu, необходимо е също така да инсталирате и модула php5-mysql.", "config-outdated-sqlite": "Предупреждение: имате инсталиран SQLite $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.", "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.", - "config-mbstring": "'''Фатално: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активирана!'''\nТова може да повреди непредвидимо въвеждането на данните.\nИнсталацията на МедияУики е невъзможна докато тази настройка не бъде изключена.", - "config-xml-bad": "За PHP липсва XML модул.\nМедияуики няма да работи в тази конфигурация, тъй като се изисква функционалност на този модул.\nМоже би ще трябва да инсталирате RPM-пакет php-xml.", "config-pcre-old": "Фатална грешка: Изисква се PCRE версия $1 или по-нова.\nИзпълнимият файл на PHP е свързан с PCRE версия $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Повече информация за PCRE].", "config-pcre-no-utf8": "'''Фатално''': Модулът PCRE на PHP изглежда е компилиран без поддръжка на PCRE_UTF8.\nЗа да функционира правилно, МедияУики изисква поддръжка на UTF-8.", "config-memory-raised": "memory_limit на PHP е $1, увеличаване до $2.", "config-memory-bad": "'''Предупреждение:''' memory_limit на PHP е $1.\nСтойността вероятно е твърде ниска.\nВъзможно е инсталацията да се провали!", - "config-ctype": "'''Фатално''': Необходимо е PHP да бъде компилиран с поддръжка на [http://www.php.net/manual/en/ctype.installation.php разширението Ctype].", - "config-iconv": "Фатална грешка: PHP трябва да бъде компилиран с поддръжка на разширението [http://www.php.net/manual/bg/iconv.installation.php iconv].", - "config-json": "Фатална грешка: PHP е компилирано без поддръжка на JSON.\nТрябва да инсталирате JSON разширението за PHP или разширението [http://pecl.php.net/package/jsonc PECL jsonc] преди да продължите с инсталацията на МедияУики.\n* Разширението за PHP е включено Red Hat Enterprise Linux (CentOS) 5 и 6, но трябва да се включи в /etc/php.ini или /etc/php.d/json.ini.\n* Някои Линукс дистрибуции излезли след май 2013 не включват това PHP разширение, като вместо него в дистрибуцията е включено PECL разширение като php5-json или php-pecl-jsonc.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] е инсталиран", "config-apc": "[http://www.php.net/apc APC] е инсталиран", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] е инсталиран", diff --git a/includes/installer/i18n/br.json b/includes/installer/i18n/br.json index 219b53f4aa..1211929fe1 100644 --- a/includes/installer/i18n/br.json +++ b/includes/installer/i18n/br.json @@ -57,12 +57,9 @@ "config-unicode-update-warning": "'''Diwallit''': ober a ra stumm staliet endalc'her skoueriekaat Unicode gant ur stumm kozh eus [http://site.icu-project.org/ levraoueg meziantoù ar raktres ICU].\nDleout a rafec'h [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations hizivaat] ma seblant deoc'h bezañ pouezus ober gant Unicode.", "config-no-db": "N'eus ket bet gallet kavout ur sturier diazoù roadennoù a zere ! Ret eo deoc'h staliañ ur sturier diazoù roadennoù evit PHP.\nSkoret eo an diazoù roadennoù da-heul : $1.\n\nMa rit gant un herberc'hiañ kenrannet, goulennit digant ho herberc'hier staliañ ur sturier diaz roadennoù azas.\nMa kempunit PHP c'hwi hoc'h-unan, adkeflugnit-eñ en ur weredekaat un arval diaz roadennoù, da skouer en ur ober gant ./configure --mysql.\nM'hoc'h eus staliet PHP adalek ur pakad Debian pe Ubuntu, eo ret deoc'h staliañ ar vodulenn php5-mysql ivez.", "config-no-fts3": "'''Diwallit ''': Kempunet eo SQLite hep ar [//sqlite.org/fts3.html vodulenn FTS3]; ne vo ket posupl ober gant an arc'hwelioù klask er staliadur-mañ", - "config-mbstring": "'''Fazi groñs : gweredekaet eo [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] !'''\nDegas a ra an dibarzh-mañ fazioù ha gallout a ra breinañ ar roadennoù en ur mod dic'hortoz.\nN'hallit ket staliañ pe ober gant MediaWiki e-keit ha m'eo gweredekaet an dibarzh-se.", - "config-xml-bad": "Mankout a ra modulenn XML PHP.\nEzhomm en deus MediaWiki eus arc'hwelioù zo eus ar vodulenn-se ha ne'z aio ket en-dro gant ar c'hefluniadur zo.\nM'emaoc'h gant Mandrake, stailhit pakad php-xml.", "config-pcre-no-utf8": "'''Fazi groñs ''': evit doare eo bet kempunet modulenn PCRE PHP hep ar skor PCRE_UTF8.\nEzhomm en deus MediaWiki eus UTF-8 evit mont plaen en-dro.", "config-memory-raised": "memory_limit ar PHP zo $1, kemmet e $2.", "config-memory-bad": "'''Diwallit :''' Da $1 emañ arventenn memory_limit PHP.\nRe izel eo moarvat.\nMarteze e c'hwito ar staliadenn !", - "config-ctype": "Fazi grevus : PHP a rank bezañ kempunet gant ar skor evit an [http://www.php.net/manual/en/ctype.installation.php astenn Ctype].", "config-xcache": "Staliet eo [http://xcache.lighttpd.net/ XCache]", "config-apc": "Staliet eo [http://www.php.net/apc APC]", "config-wincache": "Staliet eo [http://www.iis.net/download/WinCacheForPhp WinCache]", diff --git a/includes/installer/i18n/cs.json b/includes/installer/i18n/cs.json index 5307aed313..5e24b04600 100644 --- a/includes/installer/i18n/cs.json +++ b/includes/installer/i18n/cs.json @@ -60,16 +60,10 @@ "config-no-db": "Nepodařilo se nalézt vhodný databázový ovladač! Musíte nainstalovat databázový ovladač pro PHP.\n{{PLURAL:$2|Je podporován následující typ databáze|Jsou podporovány následující typy databází}}: $1.\n\nPokud jste si PHP přeložili sami, překonfigurujte ho se zapnutým databázovým klientem, například pomocí ./configure --with-mysql.\nPokud jste PHP nainstalovali z balíčku Debian či Ubuntu, potřebujete nainstalovat také modul php5-mysql.", "config-outdated-sqlite": "Upozornění: Máte SQLite $1, které je starší než minimálně vyžadovaná verze $2. SQLite nebude dostupné.", "config-no-fts3": "Upozornění: SQLite bylo přeloženo bez [//sqlite.org/fts3.html modulu FTS3], funkce pro vyhledávání zde nebudou dostupné.", - "config-mbstring": "Kritická chyba: Je zapnuto [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!\nToto nastavení způsobuje chyby a může nepředvídatelně poÅ¡kozovat vstupní data.\nMediaWiki nelze nainstalovat ani používat, dokud není toto nastavení vypnuto.", - "config-xml-bad": "Chybí XML modul pro PHP.\nMediaWiki potřebuje funkce v tomto modulu a v této konfiguraci nebude fungovat.\nMožná si budete muset nainstalovat RPM balíček php-xml.", "config-pcre-old": "Kritická chyba: Je vyžadováno PCRE verze $1 nebo novější.\nVaÅ¡e binárka PHP obsahuje PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Více informací.]", "config-pcre-no-utf8": "Kritická chyba: PHP modul PCRE byl zřejmě přeložen bez podpory PCRE_UTF8.\nMediaWiki vyžaduje ke správné funkci podporu UTF-8.", "config-memory-raised": "memory_limit v PHP byl nastaven na $1, zvýšen na $2.", "config-memory-bad": "Upozornění: memory_limit je v PHP nastaven na $1.\nTo je pravděpodobně příliÅ¡ málo.\nInstalace může selhat!", - "config-ctype": "Kritická chyba: PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/ctype.installation.php rozšíření Ctype].", - "config-iconv": "Kritická chyba: PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/iconv.installation.php rozšíření iconv].", - "config-json": "Kritická chyba: PHP bylo přeloženo bez podpory JSON.\nPřed instalací MediaWiki musíte buď nainstalovat rozšíření PHP JSON nebo rozšíření [http://pecl.php.net/package/jsonc PECL jsonc].\n* Rozšíření PHP je součástí Red Hat Enterprise Linux (CentOS) 5 a 6, avÅ¡ak musí se povolit v /etc/php.ini nebo /etc/php.d/json.ini.\n* V některých linuxových distribucích vydaných po květnu 2013 může toto rozšíření PHP chybět a místo toho mohou používat rozšíření PECL jako php5-json nebo php-pecl-jsonc.", - "config-mbstring-absent": "Kritická chyba: PHP musí být přeloženo s podporou pro [http://www.php.net/manual/en/mbstring.setup.php rozšíření mbstring].", "config-xcache": "Je nainstalována [http://xcache.lighttpd.net/ XCache]", "config-apc": "Je nainstalováno [http://www.php.net/apc APC]", "config-wincache": "Je nainstalována [http://www.iis.net/download/WinCacheForPhp WinCache]", @@ -313,6 +307,7 @@ "config-install-extension-tables": "Vytvářejí se tabulky pro zapnutá rozšíření", "config-install-mainpage-failed": "Nepodařilo se vložit hlavní stranu: $1", "config-install-done": "Gratulujeme!\nNainstalovali jste MediaWiki.\n\nInstalátor vytvořil soubor LocalSettings.php.\nTen obsahuje veÅ¡kerou vaÅ¡i konfiguraci.\n\nBudete si ho muset stáhnout a uložit do základního adresáře vaší instalace wiki (do stejného adresáře jako soubor index.php). Stažení souboru se mělo spustit automaticky.\n\nPokud se vám stažení nenabídlo nebo jste ho zruÅ¡ili, můžete ho spustit znovu kliknutím na následující odkaz:\n\n$3\n\nPoznámka: Pokud to neuděláte hned, tento vygenerovaný konfigurační soubor nebude později dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.\n\nAž to dokončíte, můžete [$2 vstoupit do své wiki].", + "config-install-done-path": "Gratulujeme!\nNainstalovali jste MediaWiki.\n\nInstalátor vytvořil soubor LocalSettings.php.\nTen obsahuje veÅ¡kerou vaÅ¡i konfiguraci.\n\nBudete si ho muset stáhnout a uložit do $4. Stažení souboru se mělo spustit automaticky.\n\nPokud se vám stažení nenabídlo nebo jste ho zruÅ¡ili, můžete ho spustit znovu kliknutím na následující odkaz:\n\n$3\n\nPoznámka: Pokud to neuděláte hned, tento vygenerovaný konfigurační soubor nebude později dostupný, pokud instalaci opustíte, aniž byste si ho stáhli.\n\nAž to dokončíte, můžete [$2 vstoupit do své wiki].", "config-download-localsettings": "Stáhnout LocalSettings.php", "config-help": "nápověda", "config-help-tooltip": "rozbalíte kliknutím", diff --git a/includes/installer/i18n/de.json b/includes/installer/i18n/de.json index 6f353408d0..fd4456bd60 100644 --- a/includes/installer/i18n/de.json +++ b/includes/installer/i18n/de.json @@ -15,7 +15,8 @@ "Suriyaa Kudo", "Das Schäfchen", "Florian", - "Macofe" + "Macofe", + "ThePiscin" ] }, "config-desc": "Das MediaWiki-Installationsprogramm", @@ -67,16 +68,10 @@ "config-no-db": "Es konnte kein adäquater Datenbanktreiber gefunden werden. Es muss daher ein Datenbanktreiber für PHP installiert werden.\n{{PLURAL:$2|Das folgende Datenbanksystem wird|Die folgenden Datenbanksysteme werden}} unterstützt: $1\n\nWenn du PHP selbst kompiliert hast, konfiguriere es erneut mit einem aktivierten Datenbankclient, zum Beispiel durch Verwendung von ./configure --with-mysqli.\nWenn du PHP von einem Debian- oder Ubuntu-Paket installiert hast, dann musst du auch beispielsweise das php5-mysql-Paket installieren.", "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benötigt MediaWiki SQLite $2 oder höher. SQLite wird daher nicht verfügbar sein.", "config-no-fts3": "'''Warnung:''' SQLite wurde ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, sodass keine Suchfunktionen für dieses Datenbanksystem zur Verfügung stehen werden.", - "config-mbstring": "'''Fataler Fehler: Der Parameter [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] von PHP ist aktiviert!'''\nDiese Einstellung verursacht Fehler und führt zu unvorhersehbaren Problemen bei der Dateneingabe.\nMediaWiki kann nicht installiert werden, solange dieser Parameter nicht deaktiviert wurde.", - "config-xml-bad": "Das XML-Modul von PHP fehlt.\nMediaWiki benötigt Funktionen, die dieses Modul bereitstellt und wird in der bestehenden Konfiguration nicht funktionieren.\nDu musst vielleicht das „php-xml“-RPM-Paket installieren.", "config-pcre-old": "Fataler Fehler: PCRE $1 oder neuer ist erforderlich!\nDie vorhandene PHP-Binärdatei ist mit PCRE $2 verknüpft.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Weitere Informationen].", "config-pcre-no-utf8": "'''Fataler Fehler:''' Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worden zu sein.\nMediaWiki benötigt die UTF-8-Unterstützung, um fehlerfrei lauffähig zu sein.", "config-memory-raised": "Der PHP-Parameter memory_limit betrug $1 und wurde auf $2 erhöht.", "config-memory-bad": "'''Warnung:''' Der PHP-Parameter memory_limit beträgt $1.\nDieser Wert ist wahrscheinlich zu niedrig.\nDer Installationsvorgang könnte eventuell scheitern!", - "config-ctype": "'''Fataler Fehler:''' PHP muss mit Unterstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert werden.", - "config-iconv": "Fatal: PHP muss mit Support für die [http://www.php.net/manual/en/iconv.installation.php iconv-Erweiterung] kompiliert werden.", - "config-json": "Fataler Fehler: PHP wurde ohne Unterstützung für JSON kompiliert.\nVor der Installation von MediaWiki muss entweder die PHP-JSON- oder die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren werden.\n* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in /etc/php.ini oder /etc/php.d/json.ini aktiviert werden.\n* Einige Linux-Distributionen, die nach Mai 2013 veröffentlicht wurden, nutzen nicht mehr die PHP-Erweiterung, sondern stattdessen die PECL-Erweiterung als php5-json oder php-pecl-jsonc.", - "config-mbstring-absent": "Fatal: PHP muss mit Unterstützung für die [http://www.php.net/manual/de/mbstring.setup.php mbstring-Erweiterung] kompiliert werden.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] ist installiert", "config-apc": "[http://www.php.net/apc APC] ist installiert", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert", @@ -320,11 +315,12 @@ "config-install-extension-tables": "Erstellung der Tabellen für die aktivierten Erweiterungen", "config-install-mainpage-failed": "Die Hauptseite konnte nicht erstellt werden: $1", "config-install-done": "'''Herzlichen Glückwunsch!'''\nMediaWiki wurde erfolgreich installiert.\n\nDas Installationsprogramm hat die Datei LocalSettings.php erzeugt.\nSie enthält alle vorgenommenen Konfigurationseinstellungen.\n\nDiese Datei muss nun heruntergeladen und anschließend in das Stammverzeichnis der MediaWiki-Installation hochgeladen werden. Dies ist dasselbe Verzeichnis, in dem sich auch die Datei index.php befindet. Das Herunterladen sollte inzwischen automatisch gestartet worden sein.\n\nSofern dies nicht der Fall war, oder das Herunterladen unterbrochen wurde, kann der Vorgang durch einen Klick auf den folgenden Link erneut gestartet werden:\n\n$3\n\n'''Hinweis:''' Die Konfigurationsdatei sollte jetzt unbedingt heruntergeladen werden. Sie wird nach Beenden des Installationsprogramms, nicht mehr zur Verfügung stehen.\n\nSobald alles erledigt wurde, kann auf das '''[$2 Wiki zugegriffen werden]'''. Wir wünschen viel Spaß und Erfolg mit dem Wiki.", + "config-install-done-path": "Herzlichen Glückwunsch!\nDu hast MediaWiki installiert.\n\nDas Installationsprogramm hat eine Datei „LocalSettings.php“ erzeugt.\nSie enthält deine gesamte Konfiguration.\n\nDu musst sie herunterladen und unter $4 ablegen. Der Download sollte automatisch gestartet sein.\n\nFalls der Download nicht angeboten wird oder du ihn abgebrochen hast, kannst du ihn durch Anklicken des folgenden Links neu starten:\n\n$3\n\nHinweis: Falls du dies jetzt nicht tust, wird die erzeugte Konfigurationsdatei später nicht verfügbar sein, wenn du die Installation ohne Herunterladen verlässt.\n\nBei Fertigstellung kannst du [$2 dein Wiki aufrufen].", "config-download-localsettings": "LocalSettings.php herunterladen", "config-help": "Hilfe", "config-help-tooltip": "Zum Expandieren klicken", "config-nofile": "Die Datei „$1“ konnte nicht gefunden werden. Wurde sie gelöscht?", - "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] durchsuchen.", + "config-extension-link": "Wusstest du, dass dein Wiki die Nutzung von [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Erweiterungen] unterstützt?\n\nDu kannst die [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Erweiterungen nach Kategorie] anzeigen oder die [https://www.mediawiki.org/wiki/Extension_Matrix Erweiterungs-Matrix] aufrufen, um eine vollständige Liste der Erweiterungen zu sehen.", "mainpagetext": "MediaWiki wurde installiert.", - "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [https://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalisiere MediaWiki für deine Sprache]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]" + "mainpagedocfooter": "Hilfe zur Benutzung und Konfiguration der Wiki-Software findest du im [https://meta.wikimedia.org/wiki/Help:Contents Benutzerhandbuch].\n\n== Starthilfen ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Liste der Konfigurationsvariablen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki-FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailingliste neuer MediaWiki-Versionen]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Übersetze MediaWiki für deine Sprache]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Erfahre, wie du Spam auf deinem Wiki bekämpfen kannst]" } diff --git a/includes/installer/i18n/diq.json b/includes/installer/i18n/diq.json index 3ebac780ef..f8d26a780d 100644 --- a/includes/installer/i18n/diq.json +++ b/includes/installer/i18n/diq.json @@ -3,7 +3,8 @@ "authors": [ "Erdemaslancan", "Mirzali", - "Marmase" + "Marmase", + "Kumkumuk" ] }, "config-desc": "Qandé MediaWiki sazi", @@ -27,7 +28,11 @@ "config-restart": "E, fına dest pekê", "config-sidebar": "* [https://www.mediawiki.org MediaWiki keye]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Şınasiya Karberi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents Şınasiya Ä°darekaran]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Peşti]\n----\n* Mı buwanê\n* Notê elaqeyıni\n* Kopyakerdış\n* Zêdekerdış", "config-env-php": "PHP $1 i biyo saz.", + "config-db-type": "Database tipe:", + "config-db-host": "Database host:", + "config-db-name": "Database name:", "config-db-port": "Portê database:", + "config-type-mssql": "Microsoft SQL Server", "config-header-mysql": "Eyarê MySQL", "config-mysql-innodb": "InnoDB", "config-mysql-myisam": "MyISAM", @@ -54,12 +59,13 @@ "config-email-settings": "Sazê e-posta", "config-logo": "URL'ey Logoy:", "config-extensions": "Olekeni", + "config-skins": "Temey", "config-install-step-done": "qeyd ke", "config-install-step-failed": "nêbı", "config-install-schema": "Şema dek", "config-install-pg-commit": "Vırnayışa cemaati", "config-install-tables": "Tabloy dek", "config-help": "peşti", - "mainpagetext": "'''MediaWiki vıst ra ser, vıraziya.'''", + "mainpagetext": "MediaWiki vıst ra ser, vıraziya.", "mainpagedocfooter": "Qandé ğebtiyayışi u sazkerdeışi Wiki-Softwarey [https://meta.wikimedia.org/wiki/Help:Contents Ä°darê karberi] de mıracaet ke.\n\n== Destega sergendi ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista eyaranê vıraştışi]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki de ÇZP]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki ra lista serbest-dayışê postey]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Zıwandé şıma de Lokal MediaWiki]" } diff --git a/includes/installer/i18n/el.json b/includes/installer/i18n/el.json index aa27624716..a11c301f5e 100644 --- a/includes/installer/i18n/el.json +++ b/includes/installer/i18n/el.json @@ -59,7 +59,6 @@ "config-unicode-pure-php-warning": "Προειδοποίηση: Η [http://pecl.php.net/intl επέκταση intl PECL] δεν είναι διαθέσιμη για να χειριστεί την κανονικοποίηση Unicode, επιστρέφουμε στην αργή αμιγώς PHP εφαρμογή.\nΕάν λειτουργείτε έναν ιστότοπο υψηλής επισκεψιμότητας, θα πρέπει να ρίξετε μια ματιά στην [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations κανονικοποίηση Unicode].", "config-no-db": "Δεν βρέθηκε κάποιο κατάλληλο πρόγραμμα οδήγησης βάσης δεδομένων! Θα πρέπει να εγκαταστήσετε ένα πρόγραμμα οδήγησης βάσης δεδομένων για PHP.\nΟ παρακάτω {{PLURAL:$2|τύπος βάσης δεδομένων|τύποι βάσεων δεδομένων}} υποστηρίζονται: $1.\n\nΑν κάνετε compile την PHP μόνοι σας, ρυθμίστε ξανά τις παραμέτρους με κάποιον ενεργοποιημένο εξυπηρετητή βάσεων δεδομένων, για παράδειγμα, χρησιμοποιώντας την εντολή ./configure --with-mysqli.\nΕάν έχετε εγκαταστήσει την PHP από κάποιο πακέτο στο Debian ή στο Ubuntu, τότε θα πρέπει να εγκαταστήσετε επίσης, για παράδειγμα, το πακέτο php5-mysql.", "config-outdated-sqlite": "Προειδοποίηση: έχετε την SQLite έκδοση $1, που είναι χαμηλότερη από την ελάχιστη απαιτούμενη έκδοση $2. Η SQLite δεν θα είναι διαθέσιμη.", - "config-xml-bad": "Το PHP XML module λείπει.\nΤο MediaWiki απαιτεί συναρτήσεις που περιλαμβάνονται σε αυτό το module και δεν θα λειτουργήσει με αυτή την παραμετροποίηση. \nΊσως χρειάζεται να εγκαταστήσετε το πακέτο RPM php-xml.", "config-pcre-no-utf8": "Κρίσιμο: Το PCRE module της PHP φαίνεται να έχει μεταγλωττιστεί χωρίς υποστήριξη PCRE_UTF8.\nΓια τη σωστή λειτουργία του MediaWiki απαιτείται υποστήριξη UTF-8.", "config-memory-raised": "Το memory_limit της PHP είναι $1 και αυξήθηκε σε $2.", "config-memory-bad": "Προειδοποίηση: το memory_limit της PHP είναι $1.\nΑυτή η τιμή είναι πιθανώς πολύ χαμηλή.\n\nΗ εγκατάσταση ενδέχεται να αποτύχει!", diff --git a/includes/installer/i18n/en.json b/includes/installer/i18n/en.json index 9077082214..79383f3818 100644 --- a/includes/installer/i18n/en.json +++ b/includes/installer/i18n/en.json @@ -51,16 +51,10 @@ "config-no-db": "Could not find a suitable database driver! You need to install a database driver for PHP.\nThe following database {{PLURAL:$2|type is|types are}} supported: $1.\n\nIf you compiled PHP yourself, reconfigure it with a database client enabled, for example, using ./configure --with-mysqli.\nIf you installed PHP from a Debian or Ubuntu package, then you also need to install, for example, the php5-mysql package.", "config-outdated-sqlite": "Warning: you have SQLite $1, which is lower than minimum required version $2. SQLite will be unavailable.", "config-no-fts3": "Warning: SQLite is compiled without the [//sqlite.org/fts3.html FTS3 module], search features will be unavailable on this backend.", - "config-mbstring": "Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!\nThis option causes errors and may corrupt data unpredictably.\nYou cannot install or use MediaWiki unless this option is disabled.", - "config-xml-bad": "PHP's XML module is missing.\nMediaWiki requires functions in this module and will not work in this configuration.\nYou may need to install the php-xml RPM package.", "config-pcre-old": "Fatal: PCRE $1 or later is required.\nYour PHP binary is linked with PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE More information].", "config-pcre-no-utf8": "Fatal: PHP's PCRE module seems to be compiled without PCRE_UTF8 support.\nMediaWiki requires UTF-8 support to function correctly.", "config-memory-raised": "PHP's memory_limit is $1, raised to $2.", "config-memory-bad": "Warning: PHP's memory_limit is $1.\nThis is probably too low.\nThe installation may fail!", - "config-ctype": "Fatal: PHP must be compiled with support for the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].", - "config-iconv": "Fatal: PHP must be compiled with support for the [http://www.php.net/manual/en/iconv.installation.php iconv extension].", - "config-json": "Fatal: PHP was compiled without JSON support.\nYou must install either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension before installing MediaWiki.\n* The PHP extension is included in Red Hat Enterprise Linux (CentOS) 5 and 6, though must be enabled in /etc/php.ini or /etc/php.d/json.ini.\n* Some Linux distributions released after May 2013 omit the PHP extension, instead packaging the PECL extension as php5-json or php-pecl-jsonc.", - "config-mbstring-absent": "Fatal: PHP must be compiled with support for the [http://www.php.net/manual/en/mbstring.setup.php mbstring extension].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] is installed", "config-apc": "[http://www.php.net/apc APC] is installed", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is installed", @@ -304,6 +298,7 @@ "config-install-extension-tables": "Creating tables for enabled extensions", "config-install-mainpage-failed": "Could not insert main page: $1", "config-install-done": "Congratulations!\nYou have installed MediaWiki.\n\nThe installer has generated a LocalSettings.php file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\nNote: If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can [$2 enter your wiki].", + "config-install-done-path": "Congratulations!\nYou have installed MediaWiki.\n\nThe installer has generated a LocalSettings.php file.\nIt contains all your configuration.\n\nYou will need to download it and put it at $4. The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\nNote: If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can [$2 enter your wiki].", "config-download-localsettings": "Download LocalSettings.php", "config-help": "help", "config-help-tooltip": "click to expand", diff --git a/includes/installer/i18n/es.json b/includes/installer/i18n/es.json index 3ec5342b01..b1c3d48645 100644 --- a/includes/installer/i18n/es.json +++ b/includes/installer/i18n/es.json @@ -82,16 +82,10 @@ "config-no-db": "No se encontró un controlador adecuado para la base de datos. Necesitas instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|El siguiente gestor de bases de datos está soportado|Los siguientes gestores de bases de datos están soportados}}: $1.\n\nSi compilaste PHP tú mismo, debes reconfigurarlo habilitando un cliente de base de datos, por ejemplo, usando ./configure --with-mysqli.\nSi instalaste PHP desde un paquete Debian o Ubuntu, entonces también necesitas instalar, por ejemplo, el paquete php5-mysql.", "config-outdated-sqlite": "Advertencia: tienes SQLite $1, que es inferior a la mínima versión requerida: $2. SQLite no estará disponible.", "config-no-fts3": "Advertencia: SQLite está compilado sin el [//sqlite.org/fts3.html módulo FTS3]. Las funcionalidades de búsqueda no estarán disponibles en esta instalación.", - "config-mbstring": "'''Fatal: La opción [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activada!'''\nEsta opción causa errores y puede corromper los datos de una forma imprevisible.\nNo se puede instalar o usar MediaWiki a menos que esta opción sea desactivada.", - "config-xml-bad": "Falta el módulo XML de PHP.\nMediaWiki requiere funciones de este módulo y no funcionará en esta configuración.\nPuede que necesites instalar el el paquete RPM llamado php-xml.", "config-pcre-old": "'''Fatal:''' Se requiere PCRE $1 o posterior.\nSu PHP binario está enlazado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Más información].", "config-pcre-no-utf8": "'''Error fatal ''': Parece que el módulo PCRE de PHP fue compilado sin el soporte PCRE_UTF8.\nMediaWiki requiere compatibilidad con UTF-8 para funcionar correctamente.", "config-memory-raised": "El parámetro memory_limit de PHP es $1. Se aumenta a $2.", "config-memory-bad": "Advertencia: el parámetro memory_limit de PHP es $1.\nProbablemente sea demasiado bajo.\n¡La instalación puede fallar!", - "config-ctype": "'''Fatal''': Se necesita compilar PHP con compatibilidad para la [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].", - "config-iconv": "Fatal: PHP debe ser compilado con soporte para la [http://www.php.net/manual/en/iconv.installation.php extensión iconv].", - "config-json": "'''Fatal:''' PHP fue compilado sin soporte para JSON.\nDebes instalar la extensión JSON o la extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.\n* La extensión PHP se incluye en Red Hat Enterprise Linux (CentOS) 5 y 6, aunque debe habilitarse en /etc/php.ini o /etc/php.d/json.ini.\n* Algunas distribuciones Linux liberadas después de mayo del 2013 omiten la extensión PHP, y en su lugar disponen de la extensión PECL en el paquete php5-json o php-pecl-jsonc.", - "config-mbstring-absent": "'''Fatal''': Se necesita compilar PHP con compatibilidad para la [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado", "config-apc": "[http://www.php.net/apc APC] está instalado", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado", @@ -334,7 +328,8 @@ "config-install-mainpage": "Creando página principal con contenido predeterminado", "config-install-extension-tables": "Creando las tablas para las extensiones habilitadas", "config-install-mainpage-failed": "No se pudo insertar la página principal: $1", - "config-install-done": "¡Felicidades!\nHas instalado MediaWiki.\n\nEl instalador ha generado un archivo LocalSettings.php.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\nNota: si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás [$2 entrar en tu wiki].", + "config-install-done": "¡Felicidades!\nHas instalado MediaWiki.\n\nEl instalador ha generado un archivo LocalSettings.php.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en la base de la instalación de wiki (el mismo directorio que index.php). La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\nNota: si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás [$2 entrar en tu wiki].", + "config-install-done-path": "¡Felicidades!\nHas instalado MediaWiki.\n\nEl instalador ha generado un archivo LocalSettings.php.\nEste contiene toda su configuración.\n\nDeberás descargarlo y ponerlo en $4. La descarga debería haber comenzado automáticamente.\n\nSi no comenzó la descarga, o si se ha cancelado, puedes reiniciar la descarga haciendo clic en el siguiente enlace:\n\n$3\n\nNota: si no haces esto ahora, este archivo de configuración generado no estará disponible más tarde si sales de la instalación sin descargarlo.\n\nCuando lo hayas hecho, podrás [$2 entrar en tu wiki].", "config-download-localsettings": "Descargar LocalSettings.php", "config-help": "ayuda", "config-help-tooltip": "haz clic para ampliar", diff --git a/includes/installer/i18n/fa.json b/includes/installer/i18n/fa.json index 98132574dd..e22317cbf3 100644 --- a/includes/installer/i18n/fa.json +++ b/includes/installer/i18n/fa.json @@ -13,7 +13,8 @@ "Huji", "Macofe", "درفش کاویانی", - "Hamisun" + "Hamisun", + "Alifakoor" ] }, "config-desc": "نصب کنندهٔ ویکی‌مدیا", @@ -60,21 +61,15 @@ "config-env-php": "پی‌اچ‌پی $1 نصب شده‌است.", "config-env-hhvm": "HHVM $1 نصب شده‌است.", "config-unicode-using-intl": "برای یونیکد عادی از [http://pecl.php.net/intl intl PECL extension] استفاده کنید.", - "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.", - "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].", + "config-unicode-pure-php-warning": "'''هشدار:''' [http://pecl.php.net/intl intl PECL extension] برای کنترل یونیکد عادی در دسترس نیست،اجرای کاملاً آهسته به تعویق می‌افتد.\n\nاگر شما یک سایت پر‌ ترافیک را اجرا می‌کنید، باید کمی [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization] را بخوانید.", + "config-unicode-update-warning": "'''هشدار:''' نسخهٔ نصب شدهٔ پوشهٔ یونیکد عادی از ورژن قدیمی‌تر کتابخانه [http://site.icu-project.org/ the ICU project's] استفاده می‌کند.\n\nاگر کلاً علاقه‌مند به استفاده از یونیکد هستید باید [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade].", "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|سوأل کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از ./configure --with-mysql استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.", "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.", "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.", - "config-mbstring": "''' مخرب:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] فعال است.\nاین گزینه باعث ایجاد خطا می‌شود و ممکن است اطلاعات را به طور غیر‌قابل پیش‌بینی از بین ببرد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.", - "config-xml-bad": "ماژول اکس‌ام‌ال پی‌اچ‌پی کار نمی‌کند.\nمدیاویکی نیازمند عملیاتی در این ماژول است و در این پیکربندی کار نخواهد‌کرد.\nشاید نیاز باشد که بستهٔ نرم افزاریِ آرپی‌ام پی‌اچ‌پی-ایکس‌ام‌ال را نصب کنید.", "config-pcre-old": "''' خطای اساسی:'' ' PCRE $1 یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].", "config-pcre-no-utf8": "'''مخرب:''' به‌ نظر می‌رسد ماژول پی‌سی‌آرایی پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-Û¸ است.", "config-memory-raised": "PHP's memory_limit, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.", "config-memory-bad": "'''هشدار:''' PHP's memory_limit نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.", - "config-ctype": "'''مخرب:''' پی‌اچ‌پی باید با پشتیبانی برای [http://www.php.net/manual/en/ctype.installation.php Ctype extension] تهیه شده‌باشد.", - "config-iconv": "خطای اساسی: پی‌اچ‌پی باید کامپایل‌شده باشد برای پشتیبانی از [http://www.php.net/manual/en/iconv.installation.php افزونهٔ iconv].", - "config-json": "'''مخرب:''' پی‌اچ‌پی بدون پشتیبانی جِی‌اس‌اُ‌ان تهیه شده‌بود.\nشما باید قبل از نصب مدیاویکی یا بسط جِی‌اس‌اُ‌ان پی‌اچ‌پی یا بسط [http://pecl.php.net/package/jsonc PECL jsonc] را نصب کنید.\n* بسط پی‌اچ‌پی شامل لینوکس اینترپرایز رد هت (سِنت‌اُاِس) 5 یا 6 است، هرچند باید در /etc/php.ini یا /etc/php.d/json.ini فعال باشد.\n* به‌جای بسته‌بندی کردن بسط پی‌ایی‌سی‌اِل مانند php5-json یا php-pecl-jsonc، توزیع‌های برخی لینوکس پس از ماه می Û²Û°Û±Û³ با حذف بسط پی‌اچ‌پی افزایش پیدا کرد.", - "config-mbstring-absent": "خطای اساسی: پی‌اچ‌پی باید با پشتیبانی [http://www.php.net/manual/en/mbstring.setup.php mbstring extension] تهیه شده باشد.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] نصب شده‌است.", "config-apc": "[http://www.php.net/apc APC] نصب شده‌است.", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] نصب شده‌است.", @@ -315,6 +310,7 @@ "config-install-extension-tables": "ایجاد جداول برای افزونه‌های فعال", "config-install-mainpage-failed": "قادر به درج صفحهٔ اصلی نمی‌باشد:$1", "config-install-done": "'''تبریک!'''\nبا موفقیت مدیاویکی را نصب کردید.\nبرنامه نصب‌کننده پرونده LocalSettings.php را درست کرد.\nکه شامل تمام تنظیمات می‌باشد.\n\nشما نیاز به دریافت آن دارید و آن را در پایهٔ نصب ویکی قرار دهید (همان پوشهٔ index.php). دریافت باید به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشد یا اگر آن را لغو کردید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\n'''توجه داشته باشید:''' اگر این را الآن انجام ندهید، این پرونده تولیدشده در صورتی که نصب را بدون دریافت آن تمام کردید بعداً در اختیار شما قرار نخواهد گرفت.\n\nوقتی انجام شد شما می‌توانید '''[$2 وارد ویکی شوید]'''.", + "config-install-done-path": "تبریک!\nمدیاویکی با موفقیت نصب گردید.\nبرنامه نصب‌کننده یک پرونده LocalSettings.php ایجاد کرده است که شامل تمام تنظیمات می‌باشد.\n\nلازم است شما آن را دریافت کرده و در $4 قرار دهید. اِن دریافت می باِست به صورت خودکار شروع شده‌باشد.\n\nاگر دریافت شروع نشده بود و یا آن را لغو کرده اید با کلیک روی پیوند زیر می‌توانید آن را دریافت کنید:\n\n$3\n\nتوجه: اگر این کار را هم اکنون انجام ندهید و بدون دریافت آن از برنامه نصب خارج شويد، این پرونده تنظیمات تولیدشده در آینده در اختیار شما قرار نخواهد داشت.\n\nوقتی که آن کار را انجام داديد، می‌توانید [$2 وارد ويکی خودتان شويد].", "config-download-localsettings": "دریافت LocalSettings.php", "config-help": "راهنما", "config-help-tooltip": "برای گسترش کلیک کنید", diff --git a/includes/installer/i18n/fi.json b/includes/installer/i18n/fi.json index 33b2532997..0a61173a96 100644 --- a/includes/installer/i18n/fi.json +++ b/includes/installer/i18n/fi.json @@ -67,9 +67,9 @@ "config-env-php": "PHP $1 on asennettu.", "config-env-hhvm": "HHVM $1 on asennettu.", "config-unicode-using-intl": "Käyttää [http://pecl.php.net/intl intl PECL-laajennusta] Unicode-normalisaatioon.", - "config-no-db": "Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajurit PHP:lle.\nSeuraavat tietokantatyypit ovat tuettuja: $1.", + "config-no-db": "Sopivaa tietokanta-ajuria ei löytynyt! Sinun täytyy asentaa tietokanta-ajuri PHP:lle.\n{{PLURAL:$2|Seuraava tietokantatyyppi on tuettu|Seuraavat tietokantatyypit ovat tuettuja}}: $1.\n\nJos koostit PHP:n itse, määritä se uudelleen tietokanta-asiakkaan ollessa käytössä, esimerkiksi koodilla ./configure --with-mysqli.\nJos asensit PHP:n Debian- tai Ubuntu-pakkauksesta, sinun on myös asennettava esimerkiksi php5-mysql-pakkaus.", "config-outdated-sqlite": "Varoitus: sinulla on käytössä SQLite $1, joke on vanhempi kuin vähintään vaadittava versio $2. SQLite ei ole saatavilla.", - "config-xml-bad": "PHP:n XML-moduulia ei löydy.\nMediaWiki käyttää tämän moduulin funktioita, eikä toimi tässä kokoonpanossa.\nJos käytät Mandrakea, asenna php-xml paketti.", + "config-no-fts3": "Varoitus: SQLite on koostettu ilman [//sqlite.org/fts3.html FTS3-moduulia], hakuominaisuudet eivät ole käytössä tässä taustajärjestelmässä.", "config-pcre-old": "Tärkeää: PCRE $1 tai uudempi versio tarvitaan.\nPHP-binäärisi on linkitetty versiolla PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Lisätietoja].", "config-memory-raised": "PHP:n memory_limit on $1, nostetaan arvoon $2.", "config-memory-bad": "'''Varoitus:''' PHP:n memory_limit on $1.\nTämä on luultavasti liian alhainen.\nAsennus saattaa epäonnistua!", @@ -144,6 +144,7 @@ "config-connection-error": "$1.\n\nTarkista isäntä, käyttäjänimi, salasana ja yritä uudestaan.", "config-invalid-schema": "Virheellinen skeema MediaWikille \"$1\".\nKäytä pelkkiä ASCII-kirjaimia (a-z, A-Z), numeroita (0-9) ja alaviivoja (_).", "config-db-sys-create-oracle": "Asennusohjelma tukee ainoastaan SYSDBA-tunnuksen käyttämistä uuden tunnuksen luonnissa.", + "config-db-sys-user-exists-oracle": "Käyttäjätunnus \"$1\" on jo olemassa. SYSDBA:ta voidaan käyttää vain uuden tunnuksen luontiin!", "config-postgres-old": "MediaWiki tarvitsee PostgreSQL:n version $1 tai uudemman. Nykyinen versio on $2.", "config-mssql-old": "Vaaditaan Microsoft SQL Server $1 tai uudempi. Sinulla on käytössä $2.", "config-sqlite-name-help": "Valitse nimi, joka yksilöi tämän wikin.\nÄlä käytä välilyöntejä tai viivoja.\nNimeä käytetään SQLite-tietokannan tiedostonimessä.", @@ -165,6 +166,9 @@ "config-mysql-charset": "Tietokannan merkistökoodaus:", "config-mysql-binary": "Binääri", "config-mysql-utf8": "UTF-8", + "config-mssql-auth": "Varmennuksen tyyppi:", + "config-mssql-install-auth": "Valitse varmennuksen tyyppi, jota käytetään yhdistäessä tietokantaan asennuksen aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.", + "config-mssql-web-auth": "Valitse varmennuksen tyyppi, jota verkkopalvelin käyttää yhdistäessään tietokantapalvelimeen wikin tavallisen toiminnan aikana.\nJos valitset \"{{int:config-mssql-windowsauth}}\", käytetään verkkopalvelimen käyttäjän kirjautumistietoja.", "config-site-name": "Wikin nimi", "config-site-name-help": "Tämä näkyy selaimen otsikkona ja muissa kohdissa.", "config-site-name-blank": "Kirjoita sivuston nimi.", @@ -226,6 +230,7 @@ "config-upload-deleted": "Poistettujen tiedostojen hakemisto:", "config-upload-deleted-help": "Valitse hakemisto johon poistetut tiedostot arkistoidaan.\nHakemiston ei tulisi olla käytettävissä internetverkosta.", "config-logo": "Logon URL-osoite", + "config-logo-help": "MediaWikin oletusulkoasussa on paikka 135x160 pikselin kokoiselle logolle sivupalkin yläpuolella.\nTallenna sopivan kokoinen kuva ja lisää URL tähän.\n\nVoit käyttää muuttujia $wgStylePath tai $wgScriptPath, jos logosi on määritelty suhteessa näihin polkuihin.\n\nJos et halua logoa, jätä tämä kenttä tyhjäksi.", "config-instantcommons": "Aktivoi Instant Commons", "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] on ominaisuus, joka antaa wikien käyttää kuvia, ääniä ja muuta mediaa [https://commons.wikimedia.org/ Wikimedia Commons] -sivustolta.\nTehdäkseen tämän MediaWiki tarvitsee Internet-yhteyden.\n\nLisätietoja tästä ominaisuudesta, mukaan lukien ohjeet, kuinka sen voi asettaa muille wikeille kuin Wikimedia Commons, löytyy [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos ohjeista].", "config-cc-error": "Creative Commons -lisenssinvalitsija ei antanut tulosta.\nSyötä lisenssin nimi manuaalisesti.", @@ -276,6 +281,7 @@ "config-install-interwiki-exists": "Varoitus: interwiki-taulussa on jo tietueita, ohitetaan oletuslista.", "config-install-stats": "Alustetaan tilastoja", "config-install-keys": "Muodostetaan salausavaimia", + "config-insecure-keys": "Varoitus: Asennuksen aikana {{PLURAL:$2|luotu turva-avain|luodut turva-avaimet}} ($1) {{PLURAL:$2|ei|eivät}} ole täysin {{PLURAL:$2|turvallinen|turvallisia}}. Harkitse {{PLURAL:$2|sen|niiden}} muuttamista manuaalisesti.", "config-install-updates": "Estä tarpeettomien päivitysten asennus", "config-install-sysop": "Luodaan ylläpitäjän tiliä", "config-install-subscribe-fail": "Liittyminen mediawiki-announce listalle epäonnistui: $1", diff --git a/includes/installer/i18n/fr.json b/includes/installer/i18n/fr.json index 740ed35af1..d73f61b038 100644 --- a/includes/installer/i18n/fr.json +++ b/includes/installer/i18n/fr.json @@ -75,20 +75,14 @@ "config-env-hhvm": "HHVM $1 est installé.", "config-unicode-using-intl": "Utilisation de [http://pecl.php.net/intl l'extension PECL intl] pour la normalisation Unicode.", "config-unicode-pure-php-warning": "Attention : L’[http://pecl.php.net/intl extension PECL intl] n’est pas disponible pour la normalisation d’Unicode, retour à la version lente implémentée en PHP.\nSi votre site web sera très fréquenté, vous devriez lire ceci : [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations ''Unicode normalization''] (en anglais).", - "config-unicode-update-warning": "'''Attention''': La version installée du ''wrapper'' de normalisation Unicode utilise une vieille version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations mise à jour] si vous êtes tout à fait concerné par l'usage d'Unicode.", + "config-unicode-update-warning": "Attention: La version installée du normalisateur Unicode utilise une ancienne version de la [http://site.icu-project.org/ bibliothèque logicielle ''ICU Project''].\nVous devriez faire une [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations mise à jour] si vous êtes concerné par l'usage d'Unicode.", "config-no-db": "Impossible de trouver un pilote de base de données approprié ! Vous devez installer un pilote de base de données pour PHP. {{PLURAL:$2|Le type suivant|Les types suivants}} de bases de données {{PLURAL:$2|est reconnu|sont reconnus}} : $1.\n\nSi vous avez compilé PHP vous-même, reconfigurez-le avec un client de base de données actif, par exemple en utilisant ./configure --with-mysqli. Si vous avez installé PHP depuis un paquet Debian ou Ubuntu, alors vous devrez aussi installer, par exemple, le paquet php5-mysql.", "config-outdated-sqlite": "'''Attention''': vous avez SQLite $1, qui est inférieur à la version minimale requise $2. SQLite sera indisponible.", "config-no-fts3": "'''Attention :''' SQLite est compilé sans le module [//sqlite.org/fts3.html FTS3] ; les fonctions de recherche ne seront pas disponibles sur ce moteur.", - "config-mbstring": "'''Erreur fatale : [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] est activé !'''\nCette option provoque des erreurs et peut corrompre les données de manière imprévisible.\nVous ne pouvez pas installer ou utiliser MediaWiki tant que cette option est activée.", - "config-xml-bad": "Le module XML de PHP est manquant.\nMediaWiki requiert des fonctions de ce module et ne fonctionnera pas avec cette configuration.\nVous pourrez avoir besoin d’installer le paquet RPM php-xml.", "config-pcre-old": "'''Fatal :''' PCRE $1 ou ultérieur est nécessaire.\nVotre binaire PHP est lié avec PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Plus d’information sur PCRE].", "config-pcre-no-utf8": "'''Erreur fatale''': Le module PCRE de PHP semble être compilé sans le support PCRE_UTF8.\nMédiaWiki nécessite la gestion d’UTF-8 pour fonctionner correctement.", "config-memory-raised": "Le paramètre memory_limit de PHP était à $1, porté à $2.", "config-memory-bad": "'''Attention :''' Le paramètre memory_limit de PHP est à $1.\nCette valeur est probablement trop faible.\nIl est possible que l’installation échoue !", - "config-ctype": "'''Fatal ''': PHP doit être compilé avec le support pour l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].", - "config-iconv": "Erreur critique : PHP doit être compilé avec le support de l’[http://www.php.net/manual/en/iconv.installation.php extension iconv].", - "config-json": "'''Erreur fatale :''' PHP a été compilé sans le support de JSON.\nVous devez soit installez l’extension JSON de PHP ou l’extension [http://pecl.php.net/package/jsonc PECL jsonc] avant d’installer MediaWiki.\n* L’extension PHP est comprise dans Red Hat Enterprise Linux (CentOS) 5 et 6, mais doit être activée dans /etc/php.ini ou /etc/php.d/json.ini.\n* Certaines distributions Linux après mai 2013 ne comprennent pas l’extension PHP, mais ont mis à la place l’extension PECL sous la forme php5-json ou php-pecl-jsonc.", - "config-mbstring-absent": "Fatal : PHP doit être compilé avec la prise en charge de [http://www.php.net/manual/en/mbstring.setup.php l’extension mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] est installé", "config-apc": "[http://www.php.net/apc APC] est installé", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] est installé", @@ -238,7 +232,7 @@ "config-profile-no-anon": "Création de compte requise", "config-profile-fishbowl": "Éditeurs autorisés seulement", "config-profile-private": "Wiki privé", - "config-profile-help": "Les wikis fonctionnent au mieux lorsque vous laissez un maximum de personnes les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, MediaWiki est utilisé dans bien d'autres cas et il n’est pas toujours facile de convaincre tout le monde des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle {{int:config-profile-wiki}} autorise toute personne à modifier, y compris sans s’identifier.\n{{int:config-profile-no-anon}} fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n{{int:config-profile-fishbowl}} autorise la modification par les utilisateurs approuvés mais le public peut toujours consulter les pages et leur historique.\n{{int:config-profile-private}} n’autorise que les utilisateurs approuvés à voir et éditer les pages.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights page correspondante du manuel].", + "config-profile-help": "Les wikis fonctionnent au mieux lorsque vous laissez un maximum de personnes les modifier.\nAvec MediaWiki, il est facile de vérifier les modifications récentes et de révoquer tout dommage créé par des utilisateurs débutants ou mal intentionnés.\n\nCependant, MediaWiki est utilisé dans bien d'autres cas et il n’est pas toujours facile de convaincre chacun des bénéfices de l’esprit wiki.\nVous avez donc le choix.\n\nLe modèle {{int:config-profile-wiki}} autorise toute personne à modifier, y compris sans s’identifier.\n{{int:config-profile-no-anon}} fournit plus de contrôle, mais peut rebuter les contributeurs occasionnels.\n\n{{int:config-profile-fishbowl}} autorise la modification par les utilisateurs approuvés mais le public peut toujours consulter les pages et leur historique.\n{{int:config-profile-private}} n’autorise que les utilisateurs approuvés à voir et éditer les pages.\n\nDes configurations de droits d’utilisateurs plus complexes sont disponibles après l'installation, voir la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights page correspondante du manuel].", "config-license": "Droits d'auteur et licence :", "config-license-none": "Aucune licence en bas de page", "config-license-cc-by-sa": "Creative Commons attribution partage à l'identique", @@ -332,6 +326,7 @@ "config-install-extension-tables": "Création de tables pour les extensions activées", "config-install-mainpage-failed": "Impossible d’insérer la page principale : $1", "config-install-done": "Félicitations!\nVous avez installé MediaWiki.\n\nLe programme d'installation a généré un fichier LocalSettings.php. Il contient tous les paramètres de votre configuration.\n\nVous devrez le télécharger et le mettre à la racine de votre installation wiki (dans le même répertoire que index.php). Le téléchargement devrait démarrer automatiquement.\n\nSi le téléchargement n'a pas été proposé, ou que vous l'avez annulé, vous pouvez redémarrer le téléchargement en cliquant ce lien :\n\n$3\n\nNote : Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera pas disponible plus tard si vous quittez l'installation sans le télécharger.\n\nLorsque c'est fait, vous pouvez [$2 accéder à votre wiki] .", + "config-install-done-path": "Félicitations !\nVous avez installé MédiaWiki.\n\nL’installeur a généré un fichier LocalSettings.php.\nIl contient toute votre configuration.\n\nVous devez le télécharger et le mettre dans $4. Le téléchargement devrait avoir démarré automatiquement.\n\nSi le téléchargement n’a pas été proposé ou si vous l’avez annulé, vous pouvez le redémarrer en cliquant sur le lien ci-dessous :\n\n$3\n\nNote : Si vous ne le faites pas maintenant, ce fichier de configuration généré ne sera plus disponible ultérieurement si vous quittez l’installation sans le télécharger.\n\nUne fois ceci fait, vous pouvez [$2 entrer dans votre wiki].", "config-download-localsettings": "Télécharger LocalSettings.php", "config-help": "aide", "config-help-tooltip": "cliquer pour agrandir", diff --git a/includes/installer/i18n/gl.json b/includes/installer/i18n/gl.json index 69ce0a19b5..d57e19fd44 100644 --- a/includes/installer/i18n/gl.json +++ b/includes/installer/i18n/gl.json @@ -57,16 +57,10 @@ "config-no-db": "Non se puido atopar un controlador axeitado para a base de datos! Necesita instalar un controlador de base de datos para PHP.\n{{PLURAL:$2|Acéptase o seguinte tipo|Acéptanse os seguintes tipos}} de base de datos: $1.\n\nSe compilou o PHP vostede mesmo, reconfigúreo activando un cliente de base de datos, por exemplo, usando ./configure --with-mysql.\nSe instalou o PHP desde un paquete Debian ou Ubuntu, entón tamén necesita instalar, por exemplo, o módulo php5-mysql.", "config-outdated-sqlite": "Atención: Ten o SQLite $1, que é inferior á versión mínima necesaria: $2. O SQLite non estará dispoñible.", "config-no-fts3": "Atención: O SQLite está compilado sen o [//sqlite.org/fts3.html módulo FTS3]; as características de procura non estarán dispoñibles nesta instalación.", - "config-mbstring": "Erro fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está activado!\nEsta opción causa erros e pode corromper os datos de xeito imprevisible.\nNon pode instalar ou empregar MediaWiki a menos que esta opción estea desactivada.", - "config-xml-bad": "Falta o módulo XML do PHP.\nMediaWiki necesita funcións neste módulo e non funcionará con esta configuración.\nPode que necesite instalar o php-xml no paquete RPM.", "config-pcre-old": "Erro fatal: Necesítase PCRE $1 ou posterior.\nO seu PHP binario está ligado con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Máis información].", "config-pcre-no-utf8": "Erro fatal: Semella que o módulo PCRE do PHP foi compilado sen o soporte PCRE_UTF8.\nMediaWiki necesita soporte UTF-8 para funcionar correctamente.", "config-memory-raised": "O parámetro memory_limit do PHP é $1. Aumentado a $2.", "config-memory-bad": "Atención: O parámetro memory_limit do PHP é $1.\nProbablemente é un valor baixo de máis.\nA instalación pode fallar!", - "config-ctype": "Erro fatal: O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/ctype.installation.php extensión Ctype].", - "config-iconv": "Erro fatal: O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/iconv.installation.php extensión iconv].", - "config-json": "Erro fatal: O PHP compilouse sen o soporte de JSON.\nDebe instalar ben a extensión JSON do PHP ou a extensión [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar MediaWiki.\n* A extensión do PHP está incluída en Red Hat Enterprise Linux (CentOS) 5 e 6, mais debe activarse /etc/php.ini ou /etc/php.d/json.ini.\n* Algunhas distribucións do Linux lanzadas despois de maio de 2013 omiten a extensión do PHP, pero inclúen a extensión PECL como php5-json ou php-pecl-jsonc.", - "config-mbstring-absent": "Erro fatal: O PHP debe compilarse co soporte para a [http://www.php.net/manual/en/mbstring.setup.php extensión mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado", "config-apc": "[http://www.php.net/apc APC] está instalado", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado", @@ -310,6 +304,7 @@ "config-install-extension-tables": "Creando as táboas para as extensións activadas", "config-install-mainpage-failed": "Non se puido inserir a páxina principal: $1", "config-install-done": "Parabéns!\nInstalou MediaWiki.\n\nO programa de instalación xerou un ficheiro LocalSettings.php.\nEste ficheiro contén toda a súa configuración.\n\nTerá que descargalo e poñelo na base da instalación do seu wiki (no mesmo directorio ca index.php). A descarga debería comezar automaticamente.\n\nSe non comezou a descarga ou se a cancelou, pode facer que comece de novo premendo na ligazón que aparece a continuación:\n\n$3\n\nNota: Se non fai iso agora, este ficheiro de configuración xerado non estará dispoñible máis adiante se sae da instalación sen descargalo.\n\nCando faga todo isto, xa poderá [$2 entrar no seu wiki].", + "config-install-done-path": "Parabéns!\nInstalou MediaWiki.\n\nO instalador xerou un ficheiro LocalSettings.php.\nEste contén toda a súa configuración.\n\nDeberá descargalo e poñerlo en $4. A descarga debería ter comezado automaticamente.\n\nSe non comenzou a descarga, ou se a cancelou, podes reiniciala descarga premendo na seguinte ligazón:\n\n$3\n\nNota: se non fai isto agora, este ficheiro de configuración xerado non estará dispoñible máis tarde se sae da instalación sen descargarlo.\n\nCando o teña feito, poderá [$2 entrar na súa wiki].", "config-download-localsettings": "Descargar o LocalSettings.php", "config-help": "axuda", "config-help-tooltip": "prema para expandir", diff --git a/includes/installer/i18n/gsw.json b/includes/installer/i18n/gsw.json index b2dfdb595d..73331d976a 100644 --- a/includes/installer/i18n/gsw.json +++ b/includes/installer/i18n/gsw.json @@ -46,8 +46,6 @@ "config-unicode-update-warning": "'''Warnig:''' Di inschtalliert Version vum Unicode-Normalisierigswrapper verwändet e elteri Version vu dr Bibliothek vum [http://site.icu-project.org/ ICU-Projäkt].\nDu sottsch si [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aktualisiere], wänn Dor d Verwändig vu Unicode wichtig isch.", "config-no-db": "S isch kei adäquate Datebanktryyber gfunde wore!", "config-no-fts3": "'''Warnig:''' SQLite isch ohni s [//sqlite.org/fts3.html FTS3-Modul] kumpiliert wore, s stehn kei Suechfunktione z Verfiegig.", - "config-mbstring": "'''Fatal: Dr Parameter [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] vu PHP isch aktiviert!'''\nDie Yystellig verursacht Fähler un fiert zue nit vorhärsähbare Probläm bi dr Datenyygab.\nMediaWiki cha nit inschtalliert wäre, solang dää Parameter nit deaktiviert woren isch.", - "config-xml-bad": "S XML-Modul vu PHP fählt.\nMediaWiki brucht Funktione, wu au des Modul z Verfiegig stellt, un funktioniert in däre Konfiguration nit.\nWänn Mandriva brucht wird, mueß no s „php-xml“-Paket inschtalliert wäre.", "config-pcre-no-utf8": "'''Fatale Fähler: S PHP-Modul PCRE isch schyns ohni PCRE_UTF8-Unterstitzig kompiliert wore.'''\nMediaWiki brucht d UTF-8-Unterstitzi zum fählerfrej lauffähig syy.", "config-memory-raised": "Dr PHP-Parameter memory_limit lyt bi $1 un isch uf $2 uffegsetzt wore.", "config-memory-bad": "'''Warnig:''' Dr PHP-Parameter memory_limit lyt bi $1.\nDää Wärt isch wahrschyns z nider.\nDr Inschtallationsvorgang chennt wäge däm fählschlaa!", diff --git a/includes/installer/i18n/he.json b/includes/installer/i18n/he.json index 97bc64284d..6f519ec4d6 100644 --- a/includes/installer/i18n/he.json +++ b/includes/installer/i18n/he.json @@ -8,7 +8,8 @@ "Inkbug", "Yona b", "Rotemliss", - "Macofe" + "Macofe", + "Guycn2" ] }, "config-desc": "תכנית ההתקנה של מדיה־ויקי", @@ -55,21 +56,15 @@ "config-env-php": "מותקנת PHP $1.", "config-env-hhvm": "מותקנת HHVM $1.", "config-unicode-using-intl": "משתמש ב[http://pecl.php.net/intl הרחבת intl PECL] לנרמול יוניקוד.", - "config-unicode-pure-php-warning": "'''אזהרה''': [http://pecl.php.net/intl הרחבת intl PECL] אינה זמינה לטיפול בנרמול יוניקוד. משתמש ביישום PHP טהור ואטי יותר.\nאם זהו אתר בעל תעבורה גבוהה, כדאי לקרוא את המסמך הבא: [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].", + "config-unicode-pure-php-warning": "אזהרה: [http://pecl.php.net/intl הרחבת intl PECL] אינה זמינה לטיפול בנרמול יוניקוד. משתמש ביישום PHP טהור ואטי יותר.\nאם זהו אתר בעל תעבורה גבוהה, כדאי לקרוא את המסמך הבא: [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].", "config-unicode-update-warning": "'''אזהרה''': הגרסה המותקנת של מעטפת נרמול יוניקוד משתמשת בגרסה ישנה של הספרייה של [http://site.icu-project.org/ פרויקט ICU].\nכדאי [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations לעדכן] אם הטיפול ביוניקוד חשוב לך.", "config-no-db": "לא נמצא דרייבר מסד נתונים מתאים. יש להתקין דרייבר מסד נתונים ל־PHP.\n{{PLURAL:$2|נתמך הסוג הבא של מסד נתונים|נתמכים הסוגים הבאים של מסדי נתונים}}: $1.\n\nאם קִמפלת את PHP בעצמך, יש להגדיר אותו מחדש ולהפעיל את לקוח מסד נתונים, למשל באמצעות ./configure --with-mysqli.\nאם התקנת את PHP מחבילה של דביאן או של אובונטו, יש להתקין, למשל, גם את המודול php5-mysql.", "config-outdated-sqlite": "'''אזהרה''': במערכת מתוקן SQLite $1. גרסה זו לא נתמכת ולשימוש ב־SQLite נדרשת גרסה $2 לפחות. SQLlite לא יהיה זמין.", "config-no-fts3": "'''אזהרה''': SQLite מהודר ללא [//sqlite.org/fts3.html מודול FTS]. יכולות חיפוש לא יהיו זמינות בהתקנה הזאת.", - "config-mbstring": "'''שגיאה סופנית''': האפשרות [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] פעילה!'''\nהאפשרות הזאת גורמת לשגיאות ומעוותת את נתוני הקלט באופן בלתי־צפוי.\nלא ניתן להתקין את מדיה־ויקי או להשתמש בה אלא אם האפשרות הזאת תכובה.", - "config-xml-bad": "מודול XML של PHP חסר.\nמדיה־ויקי דורשת פונקציות של המודול ולא תעבוד עם הגדרות כאלו.\nייתכן שצריך להתקין באמצעות RPM את חבילת php-xml.", "config-pcre-old": "שגיאה סופנית: חובה להתקין PCRE מגרסה $1 או גרסה חדשה יותר.\nקובץ הרצת ה־PHP שלך מקושר עם PCRE מגרסה $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE מידע נוסף].", "config-pcre-no-utf8": "שגיאה סופנית: נראה שמודול PCRE של PHP מהודר ללא תמיכה ב־PCRE_UTF8.\nמדיה־ויקי דורשת תמיכה ב־UTF-8 לפעילות נכונה.", "config-memory-raised": "ערך האפשרות memory_limit של PHP הוא $1, הועלה ל־$2.", "config-memory-bad": "'''אזהרה:''' ערך האפשרות memory_limit של PHP הוא $1.\nזה כנראה נמוך מדי.\nההתקנה עשויה להיכשל!", - "config-ctype": "שגיאה סופנית: נדרשת גרסת PHP שתומכת בהרחבה [http://www.php.net/manual/en/ctype.installation.php Ctype].", - "config-iconv": "סופני: חובה להדר את PHP עם תמיכה ב[הרחבה http://www.php.net/manual/en/iconv.installation.php iconv].", - "config-json": "'''שגיאה סופנית:''' PHP קומפל ללא תמיכה ב־JSON.\nיש להתקין את ההרחהב JSON ב־PHP או את ההרחבה [http://pecl.php.net/package/jsonc PECL jsonc] לפני התקנת מדיה־ויקי.\n* ההרחבה ל־PHP כלולה ב־Red Hat Enterprise Linux (ו־CentOS), אך יש להפעיל אותה ב־/etc/php.ini או ב־/etc/php.d/json.ini.", - "config-mbstring-absent": "סופני: חובה להדר את PHP עם תמיכה ב[הרחבה http://www.php.net/manual/en/mbstring.setup.php mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] מותקן", "config-apc": "[http://www.php.net/apc APC] מותקן", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] מותקן", @@ -242,7 +237,7 @@ "config-email-sender-help": "הכניסו את כתובת הדוא״ל שתשמש ככתובת לתשובה לכל הדואר היוצא.\nלשם יישלחו תגובות שגיאה (bounce).\nשרתי דוא״ל רבים דורשים שלפחות החלק של המתחם יהיה תקין.", "config-upload-settings": "העלאת קבצים ותמונות", "config-upload-enable": "להפעיל העלאת קבצים", - "config-upload-help": "העלאות קבצים חושפות את השרת שלכם לסיכוני אבטחה.\nלמידע נוסף, קִראו את [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security חלק האבטחה] בספר ההדרכה.\n\nכדי להפעיל העלאת קבצים שנו את ההרשאות של התיקייה images תחת תיקיית השורש של מדיה־ויקי כך ששרת הווב יוכל לכתוב אליה.\nזה מפעיל את האפשרות הזאת.", + "config-upload-help": "העלאת קבצים חושפת את השרת שלך לסיכוני אבטחה.\nלמידע נוסף, אפשר לקרוא את [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security המדריך הזה].\n\nכדי לאפשר העלאות של קבצים, יש לשנות את ההרשאות של התיקייה images תחת תיקיית השורש של מדיה־ויקי כדי ששרת ה־web יוכל לכתוב אליה.\nלאחר מכן יש להפעיל את האפשרות הזאת.", "config-upload-deleted": "תיקיית לקבצים שנמחקו:", "config-upload-deleted-help": "בחרו את התיקייה לארכוב קבצים מחוקים.\nכדאי שזה לא יהיה נגיש לכל העולם דרך הרשת.", "config-logo": "כתובת הסמל:", @@ -309,7 +304,8 @@ "config-install-mainpage": "יצירת דף ראשי עם תוכן התחלתי", "config-install-extension-tables": "יצירת טבלאות להרחבות מופעלות", "config-install-mainpage-failed": "לא הצליחה הכנסת דף ראשי: $1.", - "config-install-done": "מזל טוב!\nהתקנתם בהצלחה את מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ LocalSettings.php.\nהוא מכיל את כל ההגדרות שלכם.\n\nתצטרכו להוריד אותו ולשים אותו בבסיס ההתקנה של הוויקי שלכם (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה הייתה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלתם אותה, אפשר להתחיל אותה מחדש בלחיצה על הקישור הבא:\n\n$3\n\nשימו לב: אם לא תעשו זאת עכשיו, קובץ ההגדרות המחוּלל לא יהיה זמין לכם שוב.\n\nאחרי שתעשו את זה, תוכלו [$2 להיכנס לוויקי שלכם].", + "config-install-done": "מזל טוב!\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ LocalSettings.php.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקיית הבסיס שבה הותקן הוויקי שלך (אותה התיקייה שבה נמצא הקובץ index.php). ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\nלתשומת לבך: אם ההורדה לא תבוצע כעת, קובץ ההגדרות לא יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך [$2 להיכנס לאתר הוויקי שלך].", + "config-install-done-path": "מזל טוב!\nהתקנת את תוכנת מדיה־ויקי.\n\nתוכנת ההתקנה יצרה את הקובץ LocalSettings.php.\nהוא מכיל את כל ההגדרות שלך.\n\nיש להוריד אותו ולהכניס אותו לתיקייה $4. ההורדה אמורה להתחיל באופן אוטומטי.\n\nאם ההורדה לא התחילה, או אם ביטלת אותה, אפשר להתחיל אותה מחדש באמצעות לחיצה על הקישור הבא:\n\n$3\n\nלתשומת לבך: אם ההורדה לא תבוצע כעת, קובץ ההגדרות לא יהיה זמין מאוחר יותר אם תוכנת ההתקנה תיסגר לפני שהקובץ יורד.\n\nלאחר שביצעת את הפעולות שלהלן, באפשרותך [$2 להיכנס לאתר הוויקי שלך].", "config-download-localsettings": "הורדת LocalSettings.php", "config-help": "עזרה", "config-help-tooltip": "להרחיב", diff --git a/includes/installer/i18n/hrx.json b/includes/installer/i18n/hrx.json index bb3b58f420..6bee175d79 100644 --- a/includes/installer/i18n/hrx.json +++ b/includes/installer/i18n/hrx.json @@ -53,14 +53,10 @@ "config-no-db": "Es konnt ken adäquater Datenbanktreiwer gefund sin. Es muss doher en Datenbanktreiwer für PHP installiert sin.\nDie folchende Datebanksysteme werre unnerstützt: $1\n\nWenn du PHP sellebst kompiliert host, konfigurier es erneit mit en aktiviert Datebankclient, zum Beispiel dorrich Verwennung von ./configure --with-mysqli.\nWenn du PHP von en Debian- orrer Ubuntu-Paket installiert host, dann musst du ooch beispielsweis das php5-mysql-Paket installiere.", "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ist installiert. Allerdings benöticht MediaWiki SQLite $2 orrer höcher. SQLite weard doher net verfüchbar sin.", "config-no-fts3": "'''Warnung:''' SQLite woard ohne das [//sqlite.org/fts3.html FTS3-Modul] kompiliert, so dass ken Suchfunktione für das Datenbanksystem zur Verfüchung stehn werre.", - "config-mbstring": "'''Fataler Fehler: Der Parameter [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] von PHP ist aktiviert!'''\nDie Instellung veruarsacht Fehler und führt zu unvoarhearsehbare Probleme bei der Dateingäb.\nMediaWiki kann net installiert sin, solang der Parameter net deaktiviert woard.", - "config-xml-bad": "Das XML-Modul von PHP fehlt.\nMediaWiki benöticht Funktione, die das Modul bereitstellt und weard in der bestehende Konfiguration net funktioniere.\nSofern Mandriva benutzt weard, muss noch das „php-xml“-Paket installiert sin.", "config-pcre-old": "Fataler Fehler: PCRE $1 orrer neier ist notwendich!\nDie vorhandne PHP-Binärdatei ist mit PCRE $2 verknüpft.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Weitre Informatione].", "config-pcre-no-utf8": "'''Fataler Fehler:''' Das PHP-Modul PCRE scheint ohne PCRE_UTF8-Unterstützung kompiliert worre sin.\nMediaWiki benöticht die UTF-8-Unnerstützung, um fehlerfrei looffähich zu sin.", "config-memory-raised": "Der PHP-Parameter memory_limit betruch $1 und woard uff $2 erhöcht.", "config-memory-bad": "'''Warnung:''' Der PHP-Parameter memory_limit beträcht $1.\nDer Weart ist wahrscheinlich zu niedrich.\nDer Installationsvoargang könnt doher scheitre!", - "config-ctype": "'''Fataler Fehler:''' PHP muss mit Unnerstützung für das [http://www.php.net/manual/de/ctype.installation.php Modul ctype] kompiliert sin.", - "config-json": "Fataler Fehler: PHP woard ohne Unnerstützung für JSON kompiliert.\nVoar der Installation von MediaWiki muss entweder die PHP-JSON- orrer die [http://pecl.php.net/package/jsonc PECL-jsonc]-Erweiterung installieren sin.\n* Die PHP-Erweiterung ist in Red Hat Enterprise Linux (CentOS) 5 und 6 enthalten, muss jedoch in /etc/php.ini oder /etc/php.d/json.ini aktiviert sin.\n* Eniche Linux-Distributione, die nach Mai 2013 veröffentlicht woor, nutze net meh die PHP-Erweitrung, sondscht stattder die PECL-Erweitrung als php5-json orrer php-pecl-jsonc.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] ist installiert", "config-apc": "[http://www.php.net/apc APC] ist installiert", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ist installiert", diff --git a/includes/installer/i18n/hsb.json b/includes/installer/i18n/hsb.json index f2aa6de54b..e875961adb 100644 --- a/includes/installer/i18n/hsb.json +++ b/includes/installer/i18n/hsb.json @@ -50,11 +50,9 @@ "config-no-db": "Njeda so přihódny ćěrjak datoweje banki namakać! DyrbiÅ¡ ćěrjak datoweje banki za PHP instalować.\nSlědowace typy datoweje banki so podpěruja: $1.\n\nJeli sy PHP sam kompilował, konfiguruj jón znowa z aktiwizowanym programom datoweje banki, na přikład z pomocu ./configure --with-mysqli.\nJeli sy PHP z Debianoweho abo Ubuntuoweho paketa instalował, dyrbiÅ¡ tež paket php5-mysql instalować.", "config-outdated-sqlite": "'''Warnowanje''': maÅ¡ SQLite $1, kotryž je starÅ¡i hač minimalna trěbna wersija $2. SQLite njebudźe k dispoziciji stać.", "config-no-fts3": "'''Warnowanje''': SQLite je so bjez [//sqlite.org/fts3.html FTS3-modula] kompilował, pytanske funkcije njebudu k dispoziciji stać.", - "config-xml-bad": "XML-modul za PHP faluje.\nMediaWiki trjeba funkcije w tutym modulu a njebudźe w tutej konfiguraciji fungować.\nJeli wužiwaÅ¡ Mandrake, instaluj paket php-xml.", "config-pcre-no-utf8": "'''Ćežki zmylk''': Zda so, zo PCRE-modul za PHP ma so bjez PCRE_UTF8-podpěry kompilować.\nMediaWiki trjeba UTF-8-podpěru, zo by korektnje fungował.", "config-memory-raised": "PHP-parameter memory_limit je $1, je so na hódnotu $2 zwyÅ¡ił.", "config-memory-bad": "'''Warnowanje:''' PHP-parameter memory_limit ma hódnotu $1,\nTo je najskerje přeniske.\nInstalacija móhła so njeporadźić!", - "config-ctype": "'''Ćežki zmylk''': PHP dyrbi so z podpěru za [http://www.php.net/manual/en/ctype.installation.php rozšěrjenje Ctype] kompilować.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] je instalowany", "config-apc": "[http://www.php.net/apc APC] je instalowany", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] je instalowany", diff --git a/includes/installer/i18n/hu.json b/includes/installer/i18n/hu.json index 109b442e26..f97b6dc46c 100644 --- a/includes/installer/i18n/hu.json +++ b/includes/installer/i18n/hu.json @@ -61,14 +61,10 @@ "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ő {{PLURAL:$2|adatbázistípus támogatott|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 például a php5-mysql csomagra is.", "config-outdated-sqlite": "Figyelmeztetés: SQLite $1 verziód van, ami alacsonyabb a legalább szükséges $2 verziónál. Az SQLite nem lesz elérhető.", "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-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.", - "config-xml-bad": "A PHP XML-modulja hiányzik.\nEgyes MediaWiki-funkciók, melyek ezt a modult igénylik, nem fognak működni ilyen konfigurációban.\nSzükséges lehet a php-xml RPM-csomag telepítése.", "config-pcre-old": "Kritikus hiba: PCRE $1 vagy későbbi szükséges.\nA Te PHP binárisod PCRE $2-vel lett linkelve.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE További információ].", "config-pcre-no-utf8": "'''Kritikus hiba''': Úgy tűnik, hogy a PHP PRCE modulja PRCE_UTF8 támogatás nélkül lett fordítva.\nA MediaWikinek UTF-8-támogatásra van szüksége a helyes működéshez.", "config-memory-raised": "A PHP memory_limit beállításának értéke: $1. Meg lett növelve a következő értékre: $2.", "config-memory-bad": "'''Figyelmeztetés:''' A PHP memory_limit beállításának értéke $1.\nEz az érték valószínűleg túl kevés, a telepítés sikertelen lehet.", - "config-ctype": "Kritikus hiba: A PHP-t [http://www.php.net/manual/en/ctype.installation.php Ctype kiterjesztés] támogatással kell fordítani.", - "config-iconv": "Kritikus hiba: a PHP-t az [http://www.php.net/manual/en/iconv.installation.php iconv kiterjesztést] támogatva kell fordítani.", "config-xcache": "Az [http://xcache.lighttpd.net/ XCache] telepítve van", "config-apc": "Az [http://www.php.net/apc APC] telepítve van", "config-wincache": "A [http://www.iis.net/download/WinCacheForPhp WinCache] telepítve van", diff --git a/includes/installer/i18n/ia.json b/includes/installer/i18n/ia.json index b1cebd2e31..2ebd0b3b1f 100644 --- a/includes/installer/i18n/ia.json +++ b/includes/installer/i18n/ia.json @@ -55,16 +55,10 @@ "config-no-db": "Non poteva trovar un driver appropriate pro le base de datos! Es necessari installar un driver de base de datos pro PHP.\nLe sequente {{PLURAL:$2|typo|typos}} de base de datos es supportate: $1.\n\nSi tu compilava PHP tu mesme, reconfigura lo con un cliente de base de datos activate, per exemplo, usante ./configure --with-mysqli.\nSi tu installava PHP ex un pacchetto Debian o Ubuntu, tu debe etiam installar, per exemplo, le modulo php5-mysql.", "config-outdated-sqlite": "'''Attention''': tu ha SQLite $1, que es inferior al version minimal requirite, $2. SQLite essera indisponibile.", "config-no-fts3": "'''Attention''': SQLite es compilate sin [//sqlite.org/fts3.html modulo FTS3]; functionalitate de recerca non essera disponibile in iste back-end.", - "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] es active!'''\nIste option causa errores e pote corrumper datos imprevisibilemente.\nTu non pote installar o usar MediaWiki si iste option non es disactivate.", - "config-xml-bad": "Le modulo XML de PHP es mancante.\nMediaWiki require functiones de iste modulo e non functionara in iste configuration.\nEs possibile que tu debe installar le pacchetto RPM php-xml.", "config-pcre-old": "Fatal: PCRE $1 o plus tarde es necessari.\nTu binario de PHP binary es ligate con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Plus information].", "config-pcre-no-utf8": "'''Fatal''': Le modulo PCRE de PHP pare haber essite compilate sin supporto de PCRE_UTF8.\nMediaWiki require supporto de UTF-8 pro functionar correctemente.", "config-memory-raised": "Le memory_limit de PHP es $1, elevate a $2.", "config-memory-bad": "'''Aviso:''' Le memory_limit de PHP es $1.\nIsto es probabilemente troppo basse.\nLe installation pote faller!", - "config-ctype": "'''Fatal''': PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/ctype.installation.php extension Ctype].", - "config-iconv": "Fatal: PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/iconv.installation.php extension iconv].", - "config-json": "'''Fatal:''' PHP ha essite compilate sin supporto de JSON.\nTu debe installar le extension JSON de PHP o le extension [http://pecl.php.net/package/jsonc PECL jsonc] extension ante de installar MediaWiki.\n* Le extension de PHP es includite in Red Hat Enterprise Linux (CentOS) 5 e 6, ma debe esser activate in /etc/php.ini o /etc/php.d/json.ini.\n* Alcun distributiones de Linux liberate post maio 2013 omitte iste extension de PHP, forniente in su loco le extension PECL como php5-json o php-pecl-jsonc.", - "config-mbstring-absent": "Fatal: PHP debe esser compilate con supporto pro le [http://www.php.net/manual/en/mbstring.setup.php extension mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] es installate", "config-apc": "[http://www.php.net/apc APC] es installate", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] es installate", @@ -246,7 +240,7 @@ "config-logo": "URL del logotypo:", "config-logo-help": "Le apparentia predefinite de MediaWiki include spatio pro un logotypo de 135×160 pixels supra le menu del barra lateral.\nIncarga un imagine con le dimensiones appropriate, e entra le URL hic.\n\nTu pote usar $wgStylePath o $wgScriptPath si le loco de tu logotypo es relative a iste camminos.\n\nSi tu non vole un logotypo, lassa iste quadro vacue.", "config-instantcommons": "Activar \"Instant Commons\"", - "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] es un function que permitte a wikis de usar imagines, sonos e altere multimedia trovate in le sito [https://commons.wikimedia.org/ Wikimedia Commons].\nPro poter facer isto, MediaWiki require accesso a Internet.\n\nPro plus information super iste function, includente instructiones super como configurar lo pro wikis altere que Wikimedia Commons, consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos le manual].", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] es un function que permitte a wikis de usar imagines, sonos e altere multimedia trovate in le sito [https://commons.wikimedia.org/ Wikimedia Commons].\nPro poter facer isto, MediaWiki require accesso a Internet.\n\nPro saper plus, p.ex. como configurar lo pro wikis altere que Wikimedia Commons, consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos le manual].", "config-cc-error": "Le selector de licentia Creative Commons non dava un resultato.\nEntra le nomine del licentia manualmente.", "config-cc-again": "Selige de novo…", "config-cc-not-chosen": "Selige le licentia Creative Commons que tu prefere e clicca \"proceed\".", @@ -308,6 +302,7 @@ "config-install-extension-tables": "Creation de tabellas pro le extensiones activate", "config-install-mainpage-failed": "Non poteva inserer le pagina principal: $1", "config-install-done": "Felicitationes!\nTu ha installate MediaWiki.\n\nLe installator ha generate un file LocalSettings.php.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in le base del installation wiki (le mesme directorio que index.php).\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, recomencia le discargamento con un clic sur le ligamine sequente:\n\n$3\n\nNota: Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote [$2 entrar in tu wiki].", + "config-install-done-path": "Felicitationes!\nTu ha installate MediaWiki.\n\nLe installator ha generate un file LocalSettings.php.\nIste contine tote le configuration.\n\nEs necessari discargar lo e poner lo in $4.\nLe discargamento debe haber comenciate automaticamente.\n\nSi le discargamento non ha comenciate, o si illo esseva cancellate, recomencia le discargamento con un clic sur le ligamine sequente:\n\n$3\n\nNota: Si tu non discarga iste file de configuration ora, illo non essera disponibile plus tarde.\n\nPost facer isto, tu pote [$2 entrar in tu wiki].", "config-download-localsettings": "Discargar LocalSettings.php", "config-help": "adjuta", "config-help-tooltip": "clicca pro displicar", diff --git a/includes/installer/i18n/id.json b/includes/installer/i18n/id.json index bba29133ee..296ddbd311 100644 --- a/includes/installer/i18n/id.json +++ b/includes/installer/i18n/id.json @@ -65,16 +65,10 @@ "config-no-db": "Pengandar basis data yang sesuai tidak ditemukan! Anda perlu menginstal pengandar basis data untuk PHP.\n{{PLURAL:$2|Jenis|Jenis}} basis data yang didukung: $1.\n\nJika Anda mengompilasi PHP sendiri, ubahlah konfigurasinya dengan mengaktifkan klien basis data, misalnya menggunakan ./configure --with-mysql.\nJika Anda menginstal PHP dari paket Debian atau Ubuntu, maka Anda juga perlu menginstal seperti paket php5-mysql.", "config-outdated-sqlite": "Peringatan: Anda menggunakan SQLite $1, yang lebih rendah dari versi minimum yang diperlukan $2. SQLite akan tidak tersedia.", "config-no-fts3": "'''Peringatan''': SQLite dikompilasi tanpa [//sqlite.org/fts3.html modul FTS3], fitur pencarian tidak akan tersedia pada konfigurasi ini.", - "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] aktif!'' '\nPilihan ini dapat menyebabkan kesalahan dan kerusakan data yang tidak terduga.\nAnda tidak dapat menginstal atau menggunakan MediaWiki kecuali pilihan ini dinonaktifkan.", - "config-xml-bad": "Modul XML PHP hilang.\nMediaWiki membutuhkan fungsi dalam modul ini dan tidak akan bekerja dalam konfigurasi ini.\nAnda mungkin perlu memasang paket RPM php-xml.", "config-pcre-old": "Fatal: PCRE $1 atau kemudian diperlukan.\nBiner PHP Anda dihubungkan dengan PCRE $2. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Selengkapnya].", "config-pcre-no-utf8": "'''Fatal''': Modul PCRE PHP tampaknya dikompilasi tanpa dukungan PCRE_UTF8.\nMediaWiki memerlukan dukungan UTF-8 untuk berfungsi dengan benar.", "config-memory-raised": "memory_limit PHP adalah $1, dinaikkan ke $2.", "config-memory-bad": "'''Peringatan:''' memory_limit PHP adalah $1.\nIni terlalu rendah.\nInstalasi terancam gagal!", - "config-ctype": "Fatal: PHP harus disusun dengan dukungan untuk [http://www.php.net/manual/en/ctype.installation.php ekstensi Ctype].", - "config-iconv": "Fatal: PHP harus disusun dengan dukungan untuk [http://www.php.net/manual/en/iconv.installation.php ekstensi iconv].", - "config-json": "Fatal: PHP dikompilasi tanpa dukungan JSON.\nAnda harus menginstal salah satu pengaya PHP JSON atau pengaya [http://pecl.php.net/package/jsonc PECL jsonc] sebelum menginstal MediaWiki.\n* Pengaya PHP termasuk dalam Red Hat Enterprise Linux (CentOS) 5 dan 6, meskipun harus diaktifkan pada /etc/php.ini atau /etc/php.d/json.ini.\n* Beberapa distribusi Linux dirilis setelah Mei 2013 menghilangkan pengaya PHP, bukan kemasan pengaya PECL sebagai php5-json atau php-pecl-jsonc.", - "config-mbstring-absent": "Fatal: PHP harus disusun dengan dukungan untuk [http://www.php.net/manual/en/mbstring.installation.php ekstensi mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] telah diinstal", "config-apc": "[http://www.php.net/apc APC] telah diinstal", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] telah diinstal", diff --git a/includes/installer/i18n/inh.json b/includes/installer/i18n/inh.json index abc7fbf64d..d6ba2fe009 100644 --- a/includes/installer/i18n/inh.json +++ b/includes/installer/i18n/inh.json @@ -1,8 +1,9 @@ { "@metadata": { "authors": [ - "Умар" + "Умар", + "ElizaMag" ] }, - "config-help": "гӀо" + "config-help": "новкъoстал" } diff --git a/includes/installer/i18n/it.json b/includes/installer/i18n/it.json index d878a88f82..0a2f40aa81 100644 --- a/includes/installer/i18n/it.json +++ b/includes/installer/i18n/it.json @@ -17,7 +17,8 @@ "Sannita", "C.R.", "Macofe", - "Matteocng" + "Matteocng", + "Einreiher" ] }, "config-desc": "Programma di installazione per MediaWiki", @@ -64,21 +65,15 @@ "config-env-php": "PHP $1 è installato.", "config-env-hhvm": "HHVM $1 è installato.", "config-unicode-using-intl": "Usa [http://pecl.php.net/intl l'estensione PECL intl] per la normalizzazione Unicode.", - "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, così si usa la lenta implementazione in puro PHP.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].", - "config-unicode-update-warning": "'''Attenzione:''' La versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornare] se ti interessa usare l'Unicode.", + "config-unicode-pure-php-warning": "'''Attenzione:''' [http://pecl.php.net/intl l'estensione PECL intl] non è disponibile per gestire la normalizzazione Unicode, quindi si torna alla lenta implementazione in PHP puro.\nSe esegui un sito ad alto traffico, dovresti leggere alcune considerazioni sulla [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations normalizzazione Unicode].", + "config-unicode-update-warning": "'''Attenzione:''' la versione installata del gestore per la normalizzazione Unicode usa una vecchia versione della libreria [http://site.icu-project.org/ del progetto ICU].\nDovresti [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations aggiornare] se vuoi usare l'Unicode.", "config-no-db": "Impossibile trovare un driver adatto per il database! È necessario installare un driver per PHP.\n{{PLURAL:$2|Il seguente formato di database è supportato|I seguenti formati di database sono supportati}}: $1.\n\nSe compili PHP autonomamente, riconfiguralo attivando un client database, per esempio utilizzando ./configure --with-mysqli.\nQualora avessi installato PHP per mezzo di un pacchetto Debian o Ubuntu, allora devi installare anche il pacchetto php5-mysql.", "config-outdated-sqlite": "'''Attenzione''': è presente SQLite $1 mentre è richiesta la versione $2, SQLite non sarà disponibile.", "config-no-fts3": "'''Attenzione''': SQLite è compilato senza il [//sqlite.org/fts3.html modulo FTS3], le funzionalità di ricerca non saranno disponibili su questo backend.", - "config-mbstring": "'''Errore: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivato!''' Questa opzione causa errori e può interferire in modo imprevedibile coi dati. Non è possibile installare o utilizzare MediaWiki a meno che questa opzione non sia disabilitata.", - "config-xml-bad": "Manca il modulo XML di PHP.\nMediaWIki ha bisogno di funzionalità presenti in questo modulo e non funzionerà con la configurazione corrente.\nSe stai eseguendo Mandrake, installa il paccketto php-xml.", "config-pcre-old": "Errore fatale: si richiede PCRE $1 o successivo.\nIl tuo file binario PHP è collegato con PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/Maggiori informazioni su PCRE].", "config-pcre-no-utf8": "'''Errore''': Il modulo PCRE di PHP sembra essere stato compilato senza il supporto PCRE_UTF8, ma MediaWiki lo richiede per funzionare correttamente.", "config-memory-raised": "Il valore memory_limit di PHP è $1, aumentato a $2.", "config-memory-bad": "''Attenzione:''' Il valore di memory_limit di PHP è $1.\nProbabilmente è troppo basso.\nL'installazione potrebbe non riuscire!", - "config-ctype": "Fatale: PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/it/ctype.installation.php estensione Ctype].", - "config-iconv": "Fatale: PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/en/iconv.installation.php estensione iconv].", - "config-json": "'''Errore:''' PHP è stato compilato senza il supporto per JSON. E' necessario installare l'estensione PHP per JSON o l'estensione [http://pecl.php.net/package/jsonc PECL jsonc] prima di installare MediaWiki.\n* L'estensione PHP è inclusa in Red Hat Enterprise Linux (CentOS) 5 e 6, ma deve essere abilitata in /etc/php.ini o /etc/php.d/json.ini.\n* Alcune distribuzioni di Linux pubblicate dopo il maggio 2013 omettono l'estensione PHP, e al posto utilizzano l'estensione PECL come php5-json o php-pecl-jsonc", - "config-mbstring-absent": "Fatale: PHP deve essere compilato con il supporto per l'[http://www.php.net/manual/en/mbstring.setup.php estensione mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato", "config-apc": "[http://www.php.net/apc APC] è installato", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] è installato", @@ -94,7 +89,7 @@ "config-no-cli-uri": "'''Attenzione''': --scriptpath non specificato, si utilizza il valore predefinito: $1.", "config-using-server": "Nome server in uso \"$1\".", "config-using-uri": "URL del server in uso \"$1$2\".", - "config-uploads-not-safe": "Attenzione: la directory predefinita per i caricamenti $1 è vulnerabile all'esecuzione arbitraria di script.\nAnche se MediaWiki controlla tutti i file caricati per rischi alla sicurezza, è fortemente raccomandato di [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security chiudere questa vulnerabilità di sicurezza] prima di abilitare i caricamenti.", + "config-uploads-not-safe": "Attenzione: la directory predefinita per i caricamenti $1 è vulnerabile all'esecuzione arbitraria di script.\nAnche se, a difesa della sicurezza, MediaWiki controlla tutti i file caricati, è fortemente raccomandato di [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security chiudere questa minaccia] prima di abilitare i caricamenti.", "config-no-cli-uploads-check": "Attenzione: la directory predefinita per i caricamenti ($1) non è stata verificata per la vulnerabilità sull'esecuzione arbitraria di script durante l'installazione da linea di comando.", "config-brokenlibxml": "Il tuo sistema ha una combinazione di versioni di PHP e libxml2 che è difettosa e che può provocare un danneggiamento non visibile di dati in MediaWiki ed in altre applicazioni per il web.\nAggiorna a libxml2 2.7.3 o successivo ([https://bugs.php.net/bug.php?id=45996 il bug è studiato dal lato PHP]).\nInstallazione interrotta.", "config-suhosin-max-value-length": "Suhosin è installato e limita il parametro GET length a $1 byte.\nIl componente MediaWiki ResourceLoader funzionerà aggirando questo limite, ma riducendo le prestazioni.\nSe possibile, dovresti impostare suhosin.get.max_value_length a 1024 o superiore in php.ini, ed impostare $wgResourceLoaderMaxQueryLength allo stesso valore in LocalSettings.php.", @@ -183,7 +178,7 @@ "config-mysql-charset": "Set di caratteri del database:", "config-mysql-binary": "Binario", "config-mysql-utf8": "UTF-8", - "config-mysql-charset-help": "In modalità binaria, MediaWiki archivia il testo UTF-8 nel database in campi binari.\nQuesto è più efficiente rispetto alla modalità UTF-8 di MySQL, e consente di utilizzare la gamma completa di caratteri Unicode.\n\nIn modalità UTF-8, MySQL conoscerà in quale set di caratteri sono i tuoi dati, e può presentarli e convertirli in modo appropriato, ma non ti permetterà di memorizzare i caratteri al di sopra del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Basic Multilingual Plane].", + "config-mysql-charset-help": "In modalità binaria, MediaWiki archivia il testo UTF-8 nel database in campi binari.\nCiò è più efficiente rispetto alla modalità UTF-8 di MySQL, e consente di utilizzare la gamma completa di caratteri Unicode.\n\nIn modalità UTF-8, MySQL saprà in quale set di caratteri sono i tuoi dati, e potrà presentarli e convertirli in modo appropriato, ma non ti permetterà di memorizzare i caratteri al di sopra del [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes Piano di base multilinguistico].", "config-mssql-auth": "Tipo di autenticazione:", "config-mssql-install-auth": "Seleziona il tipo di autenticazione che verrà utilizzato per connettersi al database durante il processo di installazione.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.", "config-mssql-web-auth": "Seleziona il tipo di autenticazione che il server web utilizzerà per connettersi al database, durante il normale funzionamento del wiki.\nSe si seleziona \"{{int:config-mssql-windowsauth}}\", saranno utilizzate le credenziali dell'utente con cui viene eseguito il server web, qualunque esso sia.", @@ -225,7 +220,7 @@ "config-profile-no-anon": "Creazione utenza obbligatoria", "config-profile-fishbowl": "Solo editori autorizzati", "config-profile-private": "Wiki privato", - "config-profile-help": "I wiki funzionano meglio se si lascia che molte persone li possano modificare.\nIn MediaWiki, è semplice rivedere le ultime modifiche, e ripristinare i danni causati da utenti ingenui o malintenzionati.\n\nTuttavia, molti hanno trovato MediaWiki essere utile in un'ampia varietà di ruoli, e a volte non è facile convincere tutti i vantaggi della modalità wiki.\nPerciò, fai la tua scelta.\n\nIl modello {{int:config-profile-wiki}} consente a chiunque di modificare, anche senza effettuare l'accesso.\nUn wiki con {{int:config-profile-no-anon}} offre una maggiore responsabilità, ma potrebbe scoraggiare i contributori occasionali.\n\nLo scenario {{int:config-profile-fishbowl}} consente agli utenti autorizzati di modificare, ma il pubblico può visualizzare le pagine, compresa la cronologia.\nUn {{int:config-profile-private}} consente solo agli utenti autorizzati di visualizzare le pagine, lo stesso gruppo può modificarle.\n\nConfigurazioni di diritti utente più complesse sono disponibili dopo l'installazione, vedi la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights parte relativa del manuale].", + "config-profile-help": "I wiki funzionano meglio se si permette a molte persone di poterli modificare.\nIn MediaWiki, è semplice controllare le ultime modifiche, e ripristinare i danni causati da utenti inesperti o malintenzionati.\n\nTuttavia, molti hanno trovato MediaWiki essere utile in un'ampia varietà di ruoli, e a volte non è facile convincere tutti dei vantaggi della modalità wiki.\nPerciò, fa' la tua scelta.\n\nIl modello {{int:config-profile-wiki}} consente a chiunque di modificare, anche senza effettuare l'accesso.\nUn wiki con {{int:config-profile-no-anon}} offre una maggiore responsabilità, ma potrebbe scoraggiare i contributori occasionali.\n\nLo scenario {{int:config-profile-fishbowl}} consente agli utenti autorizzati di modificare, ma il pubblico può visualizzare le pagine, compresa la cronologia.\nUn {{int:config-profile-private}} consente solo agli utenti autorizzati di visualizzare le pagine, lo stesso gruppo può modificarle.\n\nConfigurazioni di diritti utente più complesse sono disponibili dopo l'installazione, vedi la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights parte relativa del manuale].", "config-license": "Copyright e licenza:", "config-license-none": "Nessun piè di pagina per la licenza", "config-license-cc-by-sa": "Creative Commons Attribuzione-Condividi allo stesso modo", @@ -251,7 +246,7 @@ "config-email-sender-help": "Inserisci l'indirizzo email da utilizzare come indirizzo di ritorno per la posta in uscita.\nQuesto è dove verranno inviati gli eventuali errori.\nMolti server di posta richiedono che almeno la parte del nome di dominio sia valido.", "config-upload-settings": "Caricamenti di immagini e file", "config-upload-enable": "Consentire il caricamento di file", - "config-upload-help": "Il caricamento di file può potenzialmente esporre il tuo server a rischi di sicurezza.\nPer ulteriori informazioni, leggi la [//www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sezione sulla sicurezza] nel manuale.\n\nPer consentire il caricamento di file, modificare la modalità nella sottodirectory images della directory principale di MediaWiki affinché il server web possa scriverci.\nPoi attivare questa opzione.", + "config-upload-help": "Il caricamento di file potrebbe esporre il tuo server a rischi di sicurezza.\nPer ulteriori informazioni, leggi la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security sezione sulla sicurezza] nel manuale.\n\nPer consentire il caricamento di file, modifica la modalità nella sottodirectory images della directory principale di MediaWiki affinché il server web possa scrivere lì.\nPoi attiva questa opzione.", "config-upload-deleted": "Directory per i file cancellati:", "config-upload-deleted-help": "Scegli una directory in cui archiviare i file cancellati.\nIdealmente, questa non dovrebbe essere accessibile dal web.", "config-logo": "URL del logo:", @@ -325,5 +320,5 @@ "config-nofile": "Il file \"$1\" non può essere trovato. È stato eliminato?", "config-extension-link": "Sapevi che il tuo wiki supporta le [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensioni]?\n\nPuoi navigare tra le [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensioni per categoria].", "mainpagetext": "MediaWiki è stato installato.", - "mainpagedocfooter": "Consulta la [https://meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizza MediaWiki nella tua lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]" + "mainpagedocfooter": "Consulta la [https://meta.wikimedia.org/wiki/Special:MyLanguage/Help:Contents Guida utente] per maggiori informazioni sull'uso di questo software wiki.\n\n== Per iniziare ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Impostazioni di configurazione]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Domande frequenti su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Mailing list annunci MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Trova MediaWiki nella tua lingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Imparare a combattere lo spam sul tuo wiki]" } diff --git a/includes/installer/i18n/ja.json b/includes/installer/i18n/ja.json index 13f01a85c6..ea51e21bd7 100644 --- a/includes/installer/i18n/ja.json +++ b/includes/installer/i18n/ja.json @@ -70,16 +70,10 @@ "config-no-db": "適切なデータベース ドライバーが見つかりませんでした! PHP にデータベース ドライバーをインストールする必要があります。\n以下の種類のデータベース{{PLURAL:$2|のタイプ}}に対応しています: $1\n\nPHP を自分でコンパイルした場合は、例えば ./configure --with-mysqli を実行して、データベース クライアントを使用できるように再設定してください。\nDebian または Ubuntu のパッケージから PHP をインストールした場合は、モジュール (例: php5-mysql) もインストールする必要があります。", "config-outdated-sqlite": "警告: あなたは SQLite $1 を使用していますが、最低限必要なバージョン $2 より古いバージョンです。SQLite は利用できません。", "config-no-fts3": "警告: SQLite は [//sqlite.org/fts3.html FTS3] モジュールなしでコンパイルされており、このバックエンドでは検索機能は利用できなくなります。", - "config-mbstring": "致命的エラー: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] が動作しています!\nこのオプションは、エラーを引き起こし、予期せずデータを破壊するおそれがあります。\nこのオプションを無効化しない限り、MediaWiki のインストールや使用はできません。", - "config-xml-bad": "PHPのXMLモジュールが不足しています。\nMediaWikiは、このモジュールの関数を必要としているため、この構成では動作しません。\nphp-xml RPM パッケージをインストールする必要があります。", "config-pcre-old": "致命的エラー: PCRE $1 以降が必要です。\nご使用中の PHP のバイナリは PCRE $2 とリンクされています。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 詳細情報]", "config-pcre-no-utf8": "致命的エラー: PHP の PCRE が PCRE_UTF8 対応なしでコンパイルされているようです。\nMediaWiki を正しく動作させるには、UTF-8 対応が必要です。", "config-memory-raised": "PHPのmemory_limitは$1で、$2に引き上げられました。", "config-memory-bad": "警告: PHPのmemory_limitに$1に設定されています。\nこの値はおそらく小さすぎます。\nインストールが失敗するおそれがあります!", - "config-ctype": "致命的エラー: PHP は [http://www.php.net/manual/en/ctype.installation.php Ctype 拡張モジュール]のサポート付きでコンパイルされている必要があります。", - "config-iconv": "致命的なエラー: PHPは[http://www.php.net/manual/en/iconv.installation.php iconv 拡張機能]のサポートを有効にしてコンパイルされている必要があります。", - "config-json": "致命的エラー: PHP は JSON サポートなしでコンパイルされています。\nPHP に JSON 拡張モジュールまたは [http://pecl.php.net/package/jsonc PECL jsonc] 拡張モジュールをインストールしてから、MediaWiki をインストールしてください。\n* Red Hat Enterprise Linux (CentOS) 5 および 6には PHP の拡張機能が含まれているため、/etc/php.ini または /etc/php.d/json.ini から有効にしてください。\n* 2013å¹´5月以降にリリースされた一部の Linux ディストリビューションでは、PHP 拡張モジュールの代わりに、php5-json または php-pecl-jsonc として PECL が同梱されています。", - "config-mbstring-absent": "致命的エラー: PHP は [http://www.php.net/manual/en/mbstring.setup.php mbstring 拡張モジュール]のサポートを有効にしてコンパイルされている必要があります。", "config-xcache": "[http://xcache.lighttpd.net/ XCache] がインストール済み", "config-apc": "[http://www.php.net/apc APC] がインストール済み", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] がインストール済み", diff --git a/includes/installer/i18n/ko.json b/includes/installer/i18n/ko.json index 53cb99ce93..5e9c34d863 100644 --- a/includes/installer/i18n/ko.json +++ b/includes/installer/i18n/ko.json @@ -63,16 +63,10 @@ "config-no-db": "적절한 데이터베이스 드라이버를 찾을 수 없습니다! PHP용 데이터베이스 드라이버를 설치해야 합니다.\n다음 데이터베이스 {{PLURAL:$2|유형을 지원합니다}}: $1.\n\nPHP를 직접 컴파일했다면, 예를 들어 ./configure --with-mysql을 사용하여, 데이터베이스 클라이언트를 활성화하도록 다시 설정하세요.\n데비안이나 우분투 패키지에서 PHP를 설치했다면 php5-mysql 모듈도 설치해야 합니다.", "config-outdated-sqlite": "경고: 최소인 $2 버전보다 낮은 SQLite $1(이)가 있습니다. SQLite를 사용할 수 없습니다.", "config-no-fts3": "경고: SQLite를 [//sqlite.org/fts3.html FTS3 모듈] 없이 컴파일하며, 검색 기능은 백엔드에 사용할 수 없습니다.", - "config-mbstring": "치명: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]이 활성화되어 있습니다!\n이 옵션은 오류가 발생하고 데이터를 입력하는 데 예기치 않는 손상을 일으킬 수 있습니다.\n이 옵션을 비활성화하지 않는 한 미디어위키를 설치하고 사용할 수 없습니다.", - "config-xml-bad": "PHP의 XML 모듈이 없습니다.\n미디어위키는 이 모듈의 기능이 필요하며 이 설정에서는 작동하지 않습니다.\nphp-xml 패키지를 설치해야할 수도 있습니다.", "config-pcre-old": "치명: PCRE $1 또는 ê·¸ 이상이 필요합니다.\nPHP 바이너리는 PCRE $2에 연결되어 있습니다. [https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 자세한 정보].", "config-pcre-no-utf8": "치명: PHP의 PCRE 모듈은 RCRE_UTF8 지원 없이 컴파일된 것 같습니다.\n미디어위키가 올바르게 작동하려면 UTF-8을 지원해야 합니다.", "config-memory-raised": "PHP의 memory_limit는 $1이며 $2(으)로 늘렸습니다.", "config-memory-bad": "경고: PHP의 memory_limit는 $1입니다.\n아마도 너무 낮은 것 같습니다.\n설치가 실패할 수 있습니다!", - "config-ctype": "치명: PHP는 [http://www.php.net/manual/en/ctype.installation.php Ctype 확장 기능]을 지원하도록 하여 컴파일해야 합니다.", - "config-iconv": "치명: PHP는 [http://www.php.net/manual/en/iconv.installation.php iconv 확장 기능]을 지원하도록 하여 컴파일해야 합니다.", - "config-json": "치명: PHP가 JSON 지원이 없이 컴파일되었습니다.\n미디어위키를 설치하기 전에 PHP JSON 확장 기능이나 [http://pecl.php.net/package/jsonc PECL jsonc] 확장 기능 중 하나를 설치해야 합니다.\n* PHP 확장 기능은 Red Hat Enterprise Linux (CentOS) 5와 6에 포함되어 있지만, /etc/php.ini나 /etc/php.d/json.ini에서 활성화해야 합니다.\n* 2013년 5월 이후에 출시된 일부 리눅스 배포판은 PHP 확장 기능이 생략된 대신, php5-json이나 php-pecl-jsonc로 PECL 확장 기능이 포장되어 있습니다.", - "config-mbstring-absent": "치명적 오류: PHP는 [http://www.php.net/manual/en/mbstring.setup.php mbstring 확장]을 지원하도록 컴파일되어야 합니다.", "config-xcache": "[http://xcache.lighttpd.net/ XCache]가 설치되었습니다", "config-apc": "[http://www.php.net/apc APC]가 설치되었습니다", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]가 설치되었습니다", @@ -90,7 +84,7 @@ "config-using-uri": "\"$1$2\"(을)를 서버 URL로 사용합니다.", "config-uploads-not-safe": "경고: 올리기에 대한 기본 디렉터리($1)는 임의의 스크립트 실행에 취약합니다.\n미디어위키는 보안 위협 때문에 모든 올려진 파일을 검사하지만, 올리기를 활성화하기 전에 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security 이 보안 취약점을 해결할 것]을 매우 권장합니다.", "config-no-cli-uploads-check": "경고: 올리기를 위한 기본 디렉터리($1)는 CLI를 설치하는 동안 임의의 스크립트 실행에 대한 취약점에 대해 검사되지 않습니다.", - "config-brokenlibxml": "시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 미디어위키나 다른 웹 어플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.\nlibxml2 2.7.3 이후 버전으로 업그레이드하세요. ([https://bugs.php.net/bug.php?id=45996 PHP에 제기한 버그])\n설치가 중단되었습니다.", + "config-brokenlibxml": "시스템에 버그가 있는 PHP와 libxml2의 조합이 있으며 미디어위키나 다른 웹 애플리케이션에 숨겨진 데이터 손상을 일으킬 수 있습니다.\nlibxml2 2.7.3 이후 버전으로 업그레이드하세요. ([https://bugs.php.net/bug.php?id=45996 PHP에 제기한 버그])\n설치가 중단되었습니다.", "config-suhosin-max-value-length": "수호신(Suhosin)이 설치되고 $1 바이트로 GET 매개 변수 length를 제한하고 있습니다.\n미디어위키의 ResourceLoader 구성 요소는 이 제한을 회피하지만 성능이 저하됩니다.\n가능하면 php.ini의 suhosin.get.max_value_length를 1024 이상으로 설정하고 LocalSettings.php의 $wgResourceLoaderMaxQueryLength를 같은 값으로 설정해야 합니다.", "config-db-type": "데이터베이스 종류:", "config-db-host": "데이터베이스 호스트:", @@ -252,7 +246,7 @@ "config-logo": "로고 URL:", "config-logo-help": "미디어위키의 기본 스킨은 사이드바 메뉴 위에 135×160 픽셀의 로고의 공간을 포함하고 있습니다.\n적당한 크기로 그림을 올리고 여기에 URL을 입력하세요.\n\n로고가 상대적인 경로에 있으면 $wgStylePath나 $wgScriptPath를 사용할 수 있습니다.\n\n로고 사용을 원하지 않으면 이 상자를 비우세요.", "config-instantcommons": "인스턴트 공용 기능 활성화", - "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons 인스턴트 공용]은 [https://commons.wikimedia.org/ 위키미디어 공용] 사이트에서 찾을 수 있는 그림, 소리 및 다른 미디어를 위키에서 사용할 수 있도록 하는 기능입니다.\n이렇게 하려면 미디어위키가 인터넷에 접근해야합니다.\n\n위키미디어 공용 외에 기타 위키를 설정하는 방법에 대한 지침을 포함한, 기능에 대한 자세한 내용은 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 매뉴얼]을 참조하세요.", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons 인스턴트 공용]은 [https://commons.wikimedia.org/ 위키미디어 공용] 사이트에서 찾을 수 있는 그림, 소리 및 다른 미디어를 위키에서 사용할 수 있도록 하는 기능입니다.\n이렇게 하려면 미디어위키가 인터넷 연결을 필요로 합니다.\n\n위키미디어 공용 이외에 다른 위키에서 이를 설정하는 방법에 대한 지침을 포함한, 기능에 대한 자세한 내용은 [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos 매뉴얼]을 참조하세요.", "config-cc-error": "크리에이티브 커먼즈 라이선스 선택기에 결과가 없습니다.\n수동으로 라이선스 이름을 입력하세요.", "config-cc-again": "다시 선택...", "config-cc-not-chosen": "원하는 크리에이티브 커먼즈 라이선스를 선택하고 \"proceed\"을 클릭하세요.", @@ -314,6 +308,7 @@ "config-install-extension-tables": "활성화된 확장 기능을 위한 테이블을 만드는 중", "config-install-mainpage-failed": "대문을 삽입할 수 없습니다: $1", "config-install-done": "축하합니다!\n미디어위키를 설치했습니다.\n\n설치 관리자가 LocalSettings.php 파일을 만들었습니다.\n여기에 모든 설정이 포함되어 있습니다.\n\n파일을 다운로드하여 위키 설치의 거점에 넣어야 합니다. (index.php와 같은 디렉터리) 다운로드가 자동으로 시작됩니다.\n\n다운로드가 제공되지 않을 경우나 그것을 취소한 경우에는 아래의 링크를 클릭하여 다운로드를 다시 시작할 수 있습니다:\n\n$3\n\n참고: 이 생성한 설정 파일을 다운로드하지 않고 설치를 끝내면 이 파일은 나중에 사용할 수 없습니다.\n\n완료되었으면 [$2 위키에 들어갈 수 있습니다].", + "config-install-done-path": "축하합니다!\n미디어위키가 설치되었습니다.\n\n설치 관리자가 LocalSettings.php 파일을 생성했습니다.\n이 파일에 모든 설정이 포함되어 있습니다.\n\n이 파일을 다운로드하여 $4 위치에 넣으세요. 다운로드가 자동으로 시작되었을 것입니다.\n\n다운로드가 시작되지 않았거나 취소했다면, 아래 링크를 클릭하여 다운로드를 재시작할 수 있습니다.\n\n$3\n\n알림: 지금 다운로드하지 않는다면, 이후에는 이 설정 파일을 다운로드할 수 없습니다.\n\n모든 작업이 완료되었다면, [$2 위키에 들어갈 수 있습니다].", "config-download-localsettings": "LocalSettings.php 다운로드", "config-help": "도움말", "config-help-tooltip": "확장하려면 클릭", diff --git a/includes/installer/i18n/ksh.json b/includes/installer/i18n/ksh.json index 7e1540eccd..a39d3a1be4 100644 --- a/includes/installer/i18n/ksh.json +++ b/includes/installer/i18n/ksh.json @@ -55,16 +55,10 @@ "config-no-db": "Mer kunnte kei zopaß Daatebangk-Driiverprojamm fenge.\nMer bruche e Daatebangk-Driiverprojamm för PHP. Dat moß enjeresht wääde.\nMer künne met heh dä {{PLURAL:$2|Daatebangk|Daatebangke|Daatebangk}} ömjonn: $1.\n\nWann De nit om eijene Rääshner bes, moß De Dinge provider bedde, dat hä Der ene zopaß Driiver enresht.\nWann de PHP sellver övversaz häs, donn e Zohjangsprojramm för en Daatebangk enbenge, för e Beishpell met: ./configure --with-mysql.\nWann De PHP uss enem Debian udder Ubuntu Pakätt enjeresht häs, moß De dann och noch et php5-mysql op Dinge Räschner bränge.", "config-outdated-sqlite": "'''Opjepaß:''' SQLite $1 es enschtaleert. Avver MediaWiki bruch SQLite $2 udder hühter. SQLite kann dröm nit enjesaz wääde.", "config-no-fts3": "'''Opjepaß:''' De Projramme vum SQLite sin der ohne et [//sqlite.org/fts3.html FTS3-Modul] övversaz, dröm wääde de Funxjohne för et Söhke fähle.", - "config-mbstring": "Dä! Dem PHP singe Schallder [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] es enjeschalldt.\nDat sorresch för Fähler un kann enjejovve Daate esu kapott maach, dat doh draan nix mih ze repareere es.\nDomet kam_mer MediaWiki nit ennreeshte un och nit loufe lohße.\nDat heiß, mer moß en affschallde, söns jeiht nix.", - "config-xml-bad": "Dem PHP sing XML-Moduhl es nit ze fenge.\nMediaWiki bruch Funxjohne en däm Moduhl un deiht et esu nit.\nDe künns et nühdesch han, dat Pakätt \n„php-xml“ ze enschtallehre.", "config-pcre-old": "Fähler: PCRE $1 udder neuer es nüüdesch.\nPHP es jäz ävver met PCRE $2 zesamme jebonge.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mieh dohzoh].", "config-pcre-no-utf8": "'''Dä:''' Et PHP-Modul PCRE schingk ohne de PCRE_UTF8-Aandeile övversaz ze sin.\nMediaWiki bruch dä UTF-8-Krohm ävver, öm ohne Fähler loufe ze künne.", "config-memory-raised": "Der jrühzte zohjelasse Shpeisherbedarf vum PHP, et memory_limit, shtund op $1 un es op $2 erop jesaz woode.", "config-memory-bad": "'''Opjepaß:''' Dem PHP singe Parameeter memory_limit es $1.\nDat es wall ze winnisch.\nEt Enreeschte kunnt doh draan kappott jon!", - "config-ctype": "'''Fähler:''' PHP moß met dä Ongerschtözong för der [http://www.php.net/manual/en/ctype.installation.php Ctype Zohsaz] övversaz woode sin.", - "config-iconv": "'''Fähler:''' PHP moß met dä Ongerschtözong för der [http://www.php.net/manual/en/iconv.installation.php iconv Zohsaz] övversaz woode sin.", - "config-json": "'''Dä!:''' PHP wood der ohne JSON övversaz.\nJäz moß de äntweeder dä PHP-JSON-Zohsaz enschtallere udder der [http://pecl.php.net/package/jsonc PECL jsonc]-Zohsaz, ih dat de MedijaWikki enschtallere kanns.\n* Dä PHP-Zohsaz es em Red Hat Enterprise Linux (CentOS) 5 un 6 änthallde, moß ävver en de /etc/php.ini udder /etc/php.d/json.ini enjeschalldt wääde.\n* E paa Linux Destrebuzjohne lohß zigg_em Mai 2013 dä PHP-Zohsaz fott un packe doför der PECL-Zohsaz als php5-json udder php-pecl-jsonc med ein.", - "config-mbstring-absent": "'''Fähler:''' PHP moß met dä Ongerschtözong för singe Zohsaz [http://www.php.net/manual/en/mbstring.setup.php mbstring ] övversaz woode sin.", "config-xcache": "Dä [http://xcache.lighttpd.net/ XCache] es ennjeresht.", "config-apc": "Dä [http://www.php.net/apc APC] es ennjeresht.", "config-wincache": "Dä [http://www.iis.net/download/WinCacheForPhp WinCache] es ennjeresht.", @@ -240,7 +234,7 @@ "config-email-sender-help": "Jiff de Adräß för de e-mail en, woh Antwoote ob em Wiki singe e-mails hen jonn sulle.\nDat es och de Adräß, woh de e-mails met Fählermäldonge hen jon.\nVill ẞöövere för de e-mail welle winnischßdens ene jöltijje Domain en dä Adräß han.", "config-upload-settings": "Belder un Datteie huh laade", "config-upload-enable": "Et Belder un Datteie Huhlahde zohlohße", - "config-upload-help": "Datteije huh ze laade künnt e Risiko för dem ẞööver singe Sescherheit sin.\nMieh doh drövver kam_mer em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security Kapitel övver de Sescherheit] em Handbooch lässe.\n\nÖm et Huhlaade zohzelohße donn de Rääschde för der Zohjreff op dat Ongerverzeischneß images em MediaWiki singem Houpverzeischneß esu enshtälle, dat et Webßööverprojramm doh Datteije un Verzeischneße eren schrieve kann.\nDonoh donn heh di Saach zohlohße.", + "config-upload-help": "Datteije huh ze lahde künnd e Rissiko för dem ẞööver sing Sescherheit sin.\nMih doh drövver kam_mer em [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security Kapitel övver de Sescherheit] em Handbohch lässe.\n\nÖm et Huhlahde zohzelohße donn de Rääschde för der Zohjreff op dat Ongerverzeischneß images em MehdijaWikki singem Houpverzeischneß esu enschtälle, dat et Webßööverprojramm doh Datteije un Verzeijschneße eren schrihve kann.\nDonoh donn heh di Enschtällong dann zohlohße.", "config-upload-deleted": "Dat Verzeishneß för fottjeschmeße Datteije:", "config-upload-deleted-help": "Söhk e Verzeijschneß uß för de fottjeschmeße Datteije vum Wiki dren afzelääje.\nEt bäß es, wam_mer vum world wide web doh nit drahn kumme kann.", "config-logo": "Dem Wiki singem Logo sing URL:", @@ -308,11 +302,12 @@ "config-install-extension-tables": "Ben Datebangk-Tabälle för de Zohsazprojramme aam ennreschte", "config-install-mainpage-failed": "Kunnt de Houpsigg nit afshpeishere: $1", "config-install-done": "Jlöckwonsch!\nMediaWiki es jetz enstalleet.\n\nEt Projramm zom Enreeschte hät en Dattei LocalSettings.php aanjelaat.\nDoh sin de Enstellunge vum Wiki dren.\n\nDo weeß se eronge laade möße un dann en dem Wiki sing Aanfangsverzeishnes donn möße, et sellve Verzeisneß, woh di Dattei index.php dren litt. Dat Erongerlaade sullt automattesch aanjefange han.\n\nWann domet jet nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op dä Lengk heh dronger klecke:\n\n$3\n\nOpjepaß: Wann De dat jez nit deihß, es alles verschött, wat De bes jöz enjejovve häs, weil di Dattei fott es en däm Momang, woh heh dat Projamm aam Engk es.\n\nWann De mem Ronger- un widder Huhlaade fäädesh bes, kanns De [$2 en Ding Wiki jonn].", + "config-install-done-path": "Jlöckwonsch!\nEt MehdijaWiki es jäz enschtallehrt.\n\nDat Projramm zom Enreeschte hädd en Dattei LocalSettings.php aanjelaat.\nDoh sin alle Enschtällonge vum Wikki dren.\n\nDo weeß se eronge lahde möße, un dann en dem Wikki sing Aanfangsverzeischneß $4 donn möße. Dat Erongerlahde sullt automattesch aanjefange han.\n\nWann domet jät nit jeflupp hät, udder De di Dattei norr_ens han wells, donn op dä Lengk heh dronger klecke:\n\n$3\n\nOpjepaß: Wann De dat jäz nit deihß, es alles verschött, wat De bes jäz enjejovve häs, weil di Dattei fott es en däm Momang, woh heh dat Projamm aam Engk es.\n\nWann De mem Ronger- un widder Huhlaade fähdesch bes, kanns De [$2 en Ding Wikki jonn].", "config-download-localsettings": "Donn di Dattei LocalSettings.php eronger lahde", "config-help": "Hölp", "config-help-tooltip": "Donn Hölp heh aan däm Plaaz enblände.", "config-nofile": "De Dattei „$1“ ham_mer nit jefonge. Es di fottjeschmeße?", "config-extension-link": "Häs De jewoß, dat et Wiki [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions Zohsazprojramme] hann kann?\n\nDo kanns [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category Zohsazprojramme noh Saachjroppe] söhke udder en de [https://www.mediawiki.org/wiki/Extension_Matrix Tabäll met de Zohsazprojramme] kike, öm de kumplätte Leß met de Zohsazprojramme ze krijje.", "mainpagetext": "MehdijaWikki es jäz enschtalleht.", - "mainpagedocfooter": "Luur en et (änglesche) [https://meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki …]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndijonge övver neuje Ußjahbe vum MehdijaWikki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn MediaWiki op Ding Schprohch aanpaße]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Loor, wi der der SPAM em Wikki klein hälls]\n\n=== Jrammatek ===\nJeh nohdämm, ovv_et „di {{SITENAME}}“, „dä {{SITENAME}}“ udder „dat {{SITENAME}}“ heiß, moß mer velleijsch en Datteij änndere. Wann „{{SITENAME}}“ med „wikki“ ov „wiki“ ophürt, moß mer nix donn. Bei „dä {{SITENAME}}“ och nit. Söns kütt en di Datteij languages/classes/LanguageKsh.php vör udder henger dä Reihj met „No need add neuter wikis having names ending in -wiki.“ en neuje Reihj eren:\n* för „di {{SITENAME}}“ heijß di:\n*: '{{SITENAME}}' => 'f',\n* för „dat {{SITENAME}}“ heijs et:\n*: '{{SITENAME}}' => 'n',\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!" + "mainpagedocfooter": "Luuer en et (änglesche) [https://meta.wikimedia.org/wiki/Help:Contents Handbohch] wann De weße wells, wi de Wikki-ẞoffwähr jebruch un bedehnt wähde moß.\n\n== För der Aanfang ==\nDat es och all op Änglesch:\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings En Leß met müjjelesche Enschtällonge för et MehdijaWikki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Öff jefrooch övver et Mehdijawikki …]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce De Meilengleß met Annköndejonge övver neuje Ußjahbe vum MehdijaWikki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Donn Mehdijawikki op Ding Schprohch aanpaße]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Loor, wi der der SPAM em Wikki klein hälls]\n\n=== Jrammatek ===\nJeh nohdämm, ovv_et „di {{SITENAME}}“, „dä {{SITENAME}}“ udder „dat {{SITENAME}}“ heiß, moß mer velleijsch en Datteij änndere. Wann „{{SITENAME}}“ med „wikki“ ov „wiki“ ophürt, moß mer nix donn. Bei „dä {{SITENAME}}“ och nit. Söns kütt en di Datteij languages/classes/LanguageKsh.php vör udder henger dä Reihj met „No need add neuter wikis having names ending in -wiki.“ en neuje Reihj eren:\n* för „di {{SITENAME}}“ heijß di:\n*: '{{SITENAME}}' => 'f',\n* för „dat {{SITENAME}}“ heijs et:\n*: '{{SITENAME}}' => 'n',\n\n== Un dann ==\nDonn heh di Sigg ömbenänne un/udder jähje en ääschte Aanfangssigg för heh dat Wikki ußtuusche!\n\nAlles Johde!" } diff --git a/includes/installer/i18n/ku-latn.json b/includes/installer/i18n/ku-latn.json index 7124496dc1..3f20c0791a 100644 --- a/includes/installer/i18n/ku-latn.json +++ b/includes/installer/i18n/ku-latn.json @@ -36,6 +36,7 @@ "config-db-install-account": "Hesabê bikarhêner bo avakirinê", "config-db-username": "Navê bikarhêner bo danagehê:", "config-db-password": "Şîfreya danegehê:", + "config-invalid-db-type": "Cureya danegehê ya nederbasdar", "config-db-web-account": "Hesabê danegehê bô têgihiştina tora înternetê", "config-mysql-myisam": "MyISAM", "config-mysql-utf8": "UTF-8", diff --git a/includes/installer/i18n/lb.json b/includes/installer/i18n/lb.json index f3ff7026b0..3befe74538 100644 --- a/includes/installer/i18n/lb.json +++ b/includes/installer/i18n/lb.json @@ -48,7 +48,6 @@ "config-no-db": "Et konnt kee passenden Datebank-Driver fonnt ginn! Dir musst een Datebank-Driver fir PHP installéieren.\n{{PLURAL:$2|Dësn Datebank-Typ gëtt|Dës Datebank-Type ginn}} ënnerstëtzt: $1.\n\nWann Dir PHP selwer compiléiert hutt, da rekonfiguréiert en mat dem ageschalten Datebank-Client, zum Beispill an deem Dir ./configure --with-mysql benotzt.\nWann Dir PHP vun engem Debian oder Ubuntu Package aus installéiert hutt, da musst Dir och den php5-mysql Modul installéieren.", "config-outdated-sqlite": "'''Warnung:''' SQLite $1 ass installéiert. Allerdengs brauch MediaWiki SQLite $2 oder méi nei. SQLite ass dofir net disponibel.", "config-memory-bad": "'''Opgepasst:''' De Parameter memory_limit vu PHP ass $1.\nDat ass wahrscheinlech ze niddreg.\nD'Installatioun kéint net funktionéieren.", - "config-iconv": "Fatal: PHP muss mat Support fir d'[http://www.php.net/manual/en/iconv.installation.php iconv-Erweiderung] kompiléiert ginn.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] ass installéiert", "config-apc": "[http://www.php.net/apc APC] ass installéiert", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ass installéiert", diff --git a/includes/installer/i18n/lki.json b/includes/installer/i18n/lki.json index 15a5c7d5db..1df843a78e 100644 --- a/includes/installer/i18n/lki.json +++ b/includes/installer/i18n/lki.json @@ -55,13 +55,10 @@ "config-no-db": "درایور پایگاه اطلاعاتی مناسب پیدا نشد! شما لازم دارید یک درایور پایگاه اطلاعاتی برای پی‌اچ‌پی نصب کنید.انواع پایگاه اطلاعاتی زیر پشتیبانی شده‌اند:$1.\nاگر شما در گروه اشتراک‌گذاری هستید، از تهیه کنندهٔ گروه خود برای نصب یک درایور پایگاه اطلاعاتی مناسب {{PLURAL:$2|سوأل کنید.|پرسش کنید.}}\nاگر خود، پی‌اچ‌پی را تهیه کرده‌اید، با یک پردازشگر فعال دوباره پیکربندی کنید، برای مثال از ./configure --with-mysql استفاده کنید.\nاگر پی‌اچ‌پی را از یک بستهٔ دبیان یا آبونتو نصب کرده‌اید، بنابراین لازم دارید بخش php5-mysql را نصب کنید.", "config-outdated-sqlite": "''' هشدار:''' شما اس‌کیولایت $1 دارید، که پایین‌تر از حداقل نسخهٔ $2 مورد نیاز است.اس‌کیولایت در دسترس نخواهد بود.", "config-no-fts3": "'''هشدار:''' اس‌کیولایت بدون [//sqlite.org/fts3.html FTS3 module] تهیه شده‌است ، جستجوی ویژگی‌ها در این بخش پیشین در دسترس نخواهد‌بود.", - "config-mbstring": "''' مخرب:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] فعال است.\nاین گزینه باعث ایجاد خطا می‌شود و ممکن است اطلاعات را به طور غیر‌قابل پیش‌بینی از بین ببرد.\nشما نمی‌توانید مدیاویکی را نصب یا استفاده کنید مگر اینکه این گزینه غیر‌فعال باشد.", - "config-xml-bad": "ماژول اکس‌ام‌ال پی‌اچ‌پی کار نمی‌کند.\nمدیاویکی نیازمند عملیاتی در این ماژول است و در این پیکربندی کار نخواهد‌کرد.\nشاید نیاز باشد که بستهٔ نرم افزاریِ آرپی‌ام پی‌اچ‌پی-ایکس‌ام‌ال را نصب کنید.", "config-pcre-old": "''' خطای اساسی:'' ' PCRE $1 یا بعدا مورد نیاز است.\nکد باینری پی‌اچ‌پی‌تان با PCRE $2 پیوند دارد.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE اطلاعات بیشتر].", "config-pcre-no-utf8": "'''مخرب:''' به‌ نظر می‌رسد ماژول پی‌سی‌آرایی پی‌اچ‌پی بدون پشتیبانی پی‌سی‌آرایی_یو‌تی‌اف۸ تهیه شده‌است.\nمدیاویکی برای درست عمل کردن نیازمند پشتیبانی یوتی‌اف-Û¸ است.", "config-memory-raised": "PHP's memory_limit, نسخهٔ $1 است، به نسخهٔ $2 ارتقاء داده شده‌است.", "config-memory-bad": "'''هشدار:''' PHP's memory_limit نسخهٔ $1 است.\nاین ممکن است خیلی پایین باشد.\nممکن است نصب با مشکل رو‌به‌رو شود.", - "config-ctype": "'''مخرب:''' پی‌اچ‌پی باید با پشتیبانی برای [http://www.php.net/manual/en/ctype.installation.php Ctype extension] تهیه شده‌باشد.", "config-db-type": "نوع پایگاه اطلاعات:", "config-db-host": "میزبان پایگاه اطلاعات:", "config-db-host-oracle": "ای ویکیۀ شناسایی کۀ.", diff --git a/includes/installer/i18n/mai.json b/includes/installer/i18n/mai.json index e421a21301..8b8e0fbf98 100644 --- a/includes/installer/i18n/mai.json +++ b/includes/installer/i18n/mai.json @@ -35,5 +35,5 @@ "config-env-bad": "पर्यावरण क जाँच कएल गेल अछि।\nआहाँ मीडियाविकि स्थापित नै कर सकै चिए।", "config-env-php": "PHP $1 स्थापित कएल ग्याल अछि।", "mainpagetext": "मेडियाविकी नीक जकाँ प्रस्थापित भेल।", - "mainpagedocfooter": "सम्पर्क करू [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] विकि तंत्रांशक प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]" + "mainpagedocfooter": "सम्पर्क करी [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] विकि सफ्टवेयर प्रयोगक जानकारी लेल।\n\n==प्रारम्भ कोना करी==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Configuration settings list]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailing list]" } diff --git a/includes/installer/i18n/mk.json b/includes/installer/i18n/mk.json index 322c4b3da4..36ec5085ec 100644 --- a/includes/installer/i18n/mk.json +++ b/includes/installer/i18n/mk.json @@ -55,16 +55,10 @@ "config-no-db": "Не можев да најдам соодветен двигател за базата на податоци! Ќе треба да воспоставите двигател за PHP-база.\n{{PLURAL:$2|Поддржан се следниов вид|Поддржани се следниве видови}} бази: $1.\n\nДоколку самите го срочивте овој PHP, овозможете го базниот клиент во поставките — на пр. со ./configure --with-mysqli.\nАко овој PHP го воспоставите од пакет на Debian или Ubuntu, тогаш ќе треба исто така да го воспоставите, на пр., пакетот php5-mysql.", "config-outdated-sqlite": "'''Предупредување''': имате SQLite $1. Најстарата допуштена верзија е $2. Затоа, SQLite ќе биде недостапен.", "config-no-fts3": "'''Предупредување''': SQLite iе составен без модулот [//sqlite.org/fts3.html FTS3] - за оваа база нема да има можност за пребарување.", - "config-mbstring": "'''Кобно: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] е активно!'''\nОваа можност предизвикува грешки и може непредвидиво да го расипува вносот на податоци.\nОваа можност мора да е исклучена. Во спротивно нема да можете да го воспоставите и користите МедијаВики.", - "config-xml-bad": "XML-модулот за PHP недостасува.\nМедијаВики има потреба од функции во овој модул и нема да работи со овие поставки.\nМоже да треба да го воспоставите RPM-пакетот „php-xml“.", "config-pcre-old": "'''Кобно:''' Се бара PCRE $1 или понова верзија.\nВашиот PHP-бинарен е сврзан со PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Повеќе информации].", "config-pcre-no-utf8": "Кобно: PCRE-модулот на PHP е срочен без поддршка за PCRE_UTF8.\nМедијаВики бара поддршка за UTF-8 за да може да работи правилно.", "config-memory-raised": "memory_limit за PHP изнесува $1, зголемен на $2.", "config-memory-bad": "'''Предупредување:''' memory_limit за PHP изнесува $1.\nОва е веројатно премалку.\nВоспоставката може да не успее!", - "config-ctype": "Кобно: PHP мора да се срочи со поддршка за додатокот [http://www.php.net/manual/en/ctype.installation.php Ctype].", - "config-iconv": "Кобно: PHP мора да се срочува со поддршка за [http://www.php.net/manual/en/iconv.installation.php додатокот iconv].", - "config-json": "'''Кобно:''' PHP беше срочен без поддршка од JSON.\nЌе мора да го воспоставите додатокот за JSON во PHP, или додатокот [http://pecl.php.net/package/jsonc PECL jsonc] пред да го воспоставите МедијаВики.\n* Додатокот за PHP е вклучен во верзиите 5 и 6 на Linux (од Red Hat Enterprise) (CentOS), но мора да се активира во /etc/php.ini или /etc/php.d/json.ini.\n* Некои варијанти на Linux излезени по мај 2013 г. не го содржат додатокот за PHP, туку го пакуваат додатокот PECL како php5-json или php-pecl-jsonc.", - "config-mbstring-absent": "Кобно: PHP мора да се срочува со поддршка за додатокот [http://www.php.net/manual/en/mbstring.setup.php mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] е воспоставен", "config-apc": "[http://www.php.net/apc APC] е воспоставен", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] е воспоставен", @@ -308,6 +302,7 @@ "config-install-extension-tables": "Изработка на табели за овозможени додатоци", "config-install-mainpage-failed": "Не можев да вметнам главна страница: $1", "config-install-done": "Честитаме!\nУспешно го воспоставивте МедијаВики.\n\nВоспоставувачот создаде податотека LocalSettings.php.\nТаму се содржат сите ваши нагодувања.\n\nЌе треба да ја преземете и да ја ставите во основата на воспоставката (истата папка во која се наоѓа index.php). Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\nНапомена: Ако ова не го направите сега, податотеката со поставки повеќе нема да биде на достапна.\n\nОткога ќе завршите со тоа, можете да [$2 влезете на вашето вики].", + "config-install-done-path": "Честитаме!\nГо воспоставивте МедијаВики.\n\nВоспоставувачот создаде податотека LocalSettings.php.\nТаму се содржат сите ваши нагодувања.\n\nЌе треба да ја преземете и да ја ставите во $4. Преземањето треба да е започнато автоматски.\n\nАко не ви е понудено преземање, или пак ако сте го откажале, можете да го почнете одново стискајќи на следнава врска:\n\n$3\n\nНапомена: Ако ова не го направите сега, создадената податотека со поставки повеќе нема да биде на достапна, освен ако не ја преземете пред да излезете.\n\nОткога ќе завршите со тоа, можете да [$2 влезете на вашето вики].", "config-download-localsettings": "Преземи го LocalSettings.php", "config-help": "помош", "config-help-tooltip": "стиснете да расклопите", diff --git a/includes/installer/i18n/mr.json b/includes/installer/i18n/mr.json index 6982ffd29f..d3e0e173ca 100644 --- a/includes/installer/i18n/mr.json +++ b/includes/installer/i18n/mr.json @@ -43,7 +43,7 @@ "config-restart": "होय, परत चालू करा", "config-welcome": "=== पारिसरीक तपासण्या ===\nमिडियाविकिच्या उभारणीस हा परिसर योग्य आहे काय याच्या मूळ तपासण्या आता केल्या जातील.\nजर आपणास पुढे याची उभारणी करण्याबद्दल साहाय्य लागल्यास, याचा अंतर्भाव करणे लक्षात ठेवा.", "config-copyright": "=== प्रताधिकार व अटी ===\n\n$1\nहा कार्यसंच,हे एक मुक्त संचेतन आहे;आपण त्यास पुनर्वितरीत व/किंवा त्यास फ्री सॉफ्टवेअर फाऊंडेशन द्वारे प्रकाशित, GNU जनरल पब्लिक लायसन्स अंतर्गत बदलु शकता;या परवान्याची आवृत्ती २ किंवा (आपल्या इच्छेनुसार)त्यानंतरची आवृत्ती.\n\nहा कार्यसंचाचे वितरण,पण, कोणत्याही हमीशिवाय; याशिवाय व्यापारीकरणाच्या कोणत्याही अभिप्रेत आश्वासनाशिवाय किंवा एखाद्या विशिष्ट कार्यासाठीच्या अर्हतेशिवायही आशा ठेऊन केले आहे कि, तो उपयोगी असेल.\nअधिक माहितीसाठी GNU जनरल पब्लिक लायसन्स बघा.\nआपणास या कार्यसंचासमवेत GNU जनरल पब्लिक लायसन्सची प्रत मिळाली असेल,नसल्यास,फ्री सॉफ्टवेअर फाऊंडेशनला या पत्त्यावर लिहा.Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. किंवा त्यास [http://www.gnu.org/copyleft/gpl.html ऑनलाईन वाचा].", - "config-sidebar": "* [https://www.mediawiki.org मिडियाविकि गृह]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents सदस्य मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents प्रशासकाची मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ]\n----\n* Read me\n* विमोचन टिप्पण्या\n* नकलविणे\n* दर्जोन्नती करणे", + "config-sidebar": "* [https://www.mediawiki.org मिडियाविकि गृह]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents सदस्य मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Contents प्रशासकाची मार्गदर्शिका]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ एफएक्यू]\n----\n* रीड मी\n* विमोचन टिप्पण्या\n* नकलविणे\n* दर्जोन्नती करणे", "config-env-good": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकता.", "config-env-bad": "पारिसरीक तपासणी झाली आहे.\nआपण मिडियाविकि उभारू शकत नाही.", "config-env-php": "PHP $1 उभारल्या गेली.", @@ -52,8 +52,6 @@ "config-outdated-sqlite": "इशारा: आपणापाशी SQLite $1 आहे, जी किमान आवश्यक आवृत्ती $2 पेक्षा, निम्न आहे. SQLite अनुपलब्ध राहील.", "config-memory-raised": "पीएचपीची memory_limit ही $1 आहे, त्यास $2 ला वाढविली.", "config-memory-bad": "पीएचपीची memory_limit ही $1 आहे.\nही बरीच खालच्या स्तरावरची आहे.\nउभारणी अयशस्वी होऊ शकते!", - "config-ctype": "घातक: पीएचपीचे [http://www.php.net/manual/en/ctype.installation.php Ctype या विस्तारकाशी] साहाय्य करण्यास संकलन करावे लागेल.", - "config-iconv": "घातक: पीएचपीचे [http://www.php.net/manual/en/iconv.installation.php iconv या विस्तारकाशी]साहाय्य करण्यास संकलन करावे लागेल.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] उभारली", "config-apc": "[http://www.php.net/apc APC] उभारली आहे", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] उभारली आहे", @@ -108,5 +106,5 @@ "config-install-tables-failed": "त्रुटी:खालील त्रुटीमुळे सारणी बनविणे अयशस्वी:$1", "config-help": "साहाय्य", "mainpagetext": "'''मीडियाविकीचे इन्स्टॉलेशन पूर्ण.'''", - "mainpagedocfooter": "विकी सॉफ्टवेअर वापरण्याकरिता [https://meta.wikimedia.org/wiki/Help:Contents वापरकर्ता मार्गदर्शिका] पहा.\n\n== सुरुवात करा ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings रचित मांडण्याची यादी]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मिडियाविकि FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-मिडियाविकिची मेलिंग यादीचे विमोचनाची उद्घोषणा]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources आपल्या भाषेसाठी मिडियाविकिचे स्थानिकिकरण करा]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam आपल्या विकिवर स्पॅमशी दोन हात कसे करावे ते शिका]" + "mainpagedocfooter": "विकी संचेतन वापरण्याकरिता [https://meta.wikimedia.org/wiki/Help:Contents वापरकर्ता मार्गदर्शिका] पहा.\n\n== सुरुवात करा ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings रचित मांडण्यांची यादी]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ मिडियाविकि एफएक्यू]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-मिडियाविकिच्या मेलिंग यादीच्या विमोचनाची उद्घोषणा]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources आपल्या भाषेसाठी मिडियाविकिचे स्थानिकिकरण करा]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam आपल्या विकिवर स्पॅमशी दोन हात कसे करावे ते शिका]" } diff --git a/includes/installer/i18n/ms.json b/includes/installer/i18n/ms.json index 5b4eff4c36..71b50de519 100644 --- a/includes/installer/i18n/ms.json +++ b/includes/installer/i18n/ms.json @@ -55,10 +55,8 @@ "config-unicode-update-warning": "Amaran: Versi pembalut penormalan Unicode yang terpasang menggunakan perpustakaan [http://site.icu-project.org/ projek ICU] dalam versi yang lampau.\nAnda harus [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations menaik taraf] jika Unicode penting bagi anda.", "config-outdated-sqlite": "Amaran: anda mempunyai SQLite $1 yang lebih rendah daripada versi keperluan minimum $1. SQLite tidak akan disediakan.", "config-no-fts3": "Amaran: SQLite disusun tanpa [//sqlite.org/fts3.html modil FTS3], maka ciri-ciri pencarian tidak akan disediakan pada backend ini.", - "config-mbstring": "Amaran keras: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] sedang aktif!\nOpsyen ini menyebabkan ralat dan mungkin mencemari data secara tanpa diduga.\nAnda tidak boleh memasang atau menggunakan MediaWiki melainkan opsyen ini dinyahdayakan.", "config-pcre-old": "Amaran keras: PCRE $1 ke atas diperlukan.\nBinari PHP anda berpaut dengan PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Keterangan lanjut].", "config-memory-bad": "Amaran: memory_limit (Had memori) PHP adalah $1.\nIni mungkin terlalu rendah.\nPemasangan mungkin akan gagal!", - "config-ctype": "Amaran keras: PHP mesti disusun dengan sokongan untuk [http://www.php.net/manual/en/ctype.installation.php sambungan Ctype].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] dipasang", "config-apc": "[http://www.php.net/apc APC] dipasang", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] dipasang", diff --git a/includes/installer/i18n/nap.json b/includes/installer/i18n/nap.json index f9044c3ad1..84fb9a3c5c 100644 --- a/includes/installer/i18n/nap.json +++ b/includes/installer/i18n/nap.json @@ -55,15 +55,10 @@ "config-no-db": "Nun se può truvà nu driver adatto p' 'o database! È necessario installare nu driver p' 'o PHP.\n{{PLURAL:$2|'O furmato suppurtato|'E furmate suppurtate}} 'e database ccà annanze: $1.\n\nSi cumpilate PHP autonomamente, riaccunciatevello attivando nu client database, p'esempio ausannoo ./configure --with-mysqli.\nQuanno fosse installato PHP pe' bbìa 'e nu pacchetto Debian o Ubuntu, allora avite 'a installà pure 'o pacchetto php5-mysql.", "config-outdated-sqlite": "'''Attenziò''': tenite 'o SQLite $1 pe' tramente ca ce vulesse 'a verziona $2, SQLite nun sarrà a disposizione.", "config-no-fts3": "'''Attenziò''': SQLite è cumpilato senza 'o [//sqlite.org/fts3.html modulo FTS3], 'e funziune 'e p'ascià dinto nun sarranno a disposizione ncopp'a stu backend.", - "config-mbstring": "Fatale: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] è attivo!'\nSt'opzione scassa 'e date 'e na manera scanusciuta.\nNun se può installà o ausà MediaWiki si nun se stuta st'opzione.", - "config-xml-bad": "'O modulo XML 'e PHP è mancante.\nA MediaWiki servessero 'e funziune prisente dint'a stu modulo e nun faticarrà c' 'a configurazione 'e mò.\nSi se sta eseguenno Mandrake, installare 'o pacco php-xml RPM.", "config-pcre-old": "Errore fatale: s'addimanna PCRE $1 o succiessivo.\n'O file vuosto binario PHP è acucchiato c' 'o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Cchiù nfurmaziune].", "config-pcre-no-utf8": "Fatale: 'E module PCRE d' 'o PHP pare ca se so' compilate senza PCRE_UTF8 supporto.\nA MediaWiki serve nu supporto UTF-8 pe' putè funziunà apposto.", "config-memory-raised": "'O valore 'e PHP memory_limit è $1, aumentato a $2.", "config-memory-bad": "Attenziò: 'o valore 'e PHP memory_limit è $1.\nProbabbilmente troppo basso.\n'A installazione se putesse scassà!", - "config-ctype": "'''Errore''': 'o PHP s'adda ghienchere c' 'o supporto pe' l'[http://www.php.net/manual/it/ctype.installation.php estensione Ctype].", - "config-iconv": "Fatale: PHP s'adda ghienchere c' 'o supporto pe' l'[http://www.php.net/manual/en/iconv.installation.php estensione iconv].", - "config-json": "'''Errore:''' PHP è stato compilato senza 'o supporto pe' JSON. E' necessario installà l'estensione PHP pe' JSON o l'estensione [http://pecl.php.net/package/jsonc PECL jsonc] apprimm' 'e installà MediaWiki.\n* L'estensione PHP sta dint'a Red Hat Enterprise Linux (CentOS) 5 e 6, ma s'avess'abbià 'n /etc/php.ini o /etc/php.d/json.ini.\n* Cocche distribuzione 'e Linux pubblicata aropp'a majo 'e 2013 lèvano l'estensione PHP, e a pizzo sujo aúsano l'estensione PECL comme php5-json o php-pecl-jsonc", "config-xcache": "[http://xcache.lighttpd.net/ XCache] è installato", "config-apc": "[http://www.php.net/apc APC] è installato", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] è installato", diff --git a/includes/installer/i18n/nb.json b/includes/installer/i18n/nb.json index 27faecbc35..29bbb71aa9 100644 --- a/includes/installer/i18n/nb.json +++ b/includes/installer/i18n/nb.json @@ -19,7 +19,7 @@ "config-localsettings-badkey": "Oppgraderingsnøkkelen du oppga er feil.", "config-upgrade-key-missing": "En eksisterende installasjon av MediaWiki er funnet.\nFor Ã¥ oppgradere denne installasjonen, vær vennlig Ã¥ legge til følgende linje helt til slutt i din ''LocalSettings.php''-fil:\n\n$1", "config-localsettings-incomplete": "Den eksisterende ''LocalSettings.php'' ser ut til Ã¥ være ufullstendig.\nVariabelen $1 har ingen verdi.\nVær vennlig Ã¥ endre ''LocalSettings.php'' slik at variabelen fÃ¥r en verdi, og klikk ''{{int:Config-continue}}''.", - "config-localsettings-connection-error": "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''LocalSettings.php'' eller ''AdminSettings.php''. Vær vennlig Ã¥ rette opp disse innstillingene og prøv igjen.\n\n$1", + "config-localsettings-connection-error": "Det ble funnet en feil ved tilknytning av databasen med innstillingene i ''LocalSettings.php'' eller ''LocalSettings.php''. Vær vennlig Ã¥ rette opp disse innstillingene og prøv igjen.\n\n$1", "config-session-error": "Feil under oppstart av økt: $1", "config-session-expired": "Dine øktdata ser ut til Ã¥ ha utløpt.\nØkter er konfigurert for en levetid pÃ¥ $1.\nDu kan øke dette ved Ã¥ sette session.gc_maxlifetime i php.ini.\nStart installasjonsprosessen pÃ¥ nytt.", "config-no-session": "Dine øktdata ble tapt!\nSjekk din php.ini og sørg for at session.save_path er satt til en passende mappe.", @@ -59,15 +59,10 @@ "config-no-db": "Fant ingen passende databasedriver! Du mÃ¥ installere en databasedriver for PHP.\nFølgende {{PLURAL:$2|databasetype|databasetyper}} støttes: $1\n\nOm du kompilerte PHP selv, rekonfigurer den med en aktivert databaseklient, for eksempel ved Ã¥ bruke ./configure --with-mysql.\nOm du installerte PHP fra en Debian- eller Ubuntu-pakke, mÃ¥ du ogsÃ¥ installere for eksempel php5-mysql-pakken.", "config-outdated-sqlite": "'''Advarsel''': Du har SQLite $1, som er en eldre versjon enn minimumskravet SQLite $2. SQLite vil ikke være tilgjengelig.", "config-no-fts3": "'''Advarsel''': SQLite er kompilert uten [//sqlite.org/fts3.html FTS3-modulen], søkefunksjoner vil ikke være tilgjengelig pÃ¥ dette bakstykket.", - "config-mbstring": "'''Kritisk: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] er aktiv!'''\nDette alternativet fører til feil og kan ødelegge data pÃ¥ en uforutsigbar mÃ¥te.\nDu kan ikke installere eller bruke MediaWiki med mindre dette alternativet deaktiveres.", - "config-xml-bad": "PHPs XML-modul mangler.\nMediaWiki krever funksjonene i denne modulen og vil ikke virke i denne konfigurasjonen.\nDu mÃ¥ kanskje laste ned php-xml RPM pakken.", "config-pcre-old": "'''Alvorlig:''' PCRE $1 eller senere kreves.\nDin PHP-kode er lenket med PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Nærmere informasjon].", "config-pcre-no-utf8": "'''Fatal''': PHPs PCRE modul ser ut til Ã¥ være kompilert uten PCRE_UTF8-støtte.\nMediaWiki krever UTF-8-støtte for Ã¥ fungere riktig.", "config-memory-raised": "PHPs memory_limit er $1, økt til $2.", "config-memory-bad": "'''Advarsel:''' PHPs memory_limit er $1.\nDette er sannsynligvis for lavt.\nInstallasjonen kan mislykkes!", - "config-ctype": "'''Fatal feil''': PHP mÃ¥ kompileres med støtte for [http://www.php.net/manual/en/ctype.installation.php Ctype-utvidelsen].", - "config-iconv": "Kritisk: PHP mÃ¥ kompileres med støtte for [http://www.php.net/manual/en/iconv.installation.php iconv-utvidelsen].", - "config-json": "'''Alvorlig:''' PHP ble kompilert uten JSON-støtte.\nDu mÃ¥ installere enten PHP JSON-utvidelsen eller [http://pecl.php.net/package/jsonc PECL jsonc]-utvidelsen før du installere MediaWiki.\n* PHP-utvidelsen inngÃ¥r i Red Hat Enterprise Linux (CentOS) 5 and 6, men mÃ¥ aktiveres i /etc/php.ini eller /etc/php.d/json.ini.\n* Noen Linux-distribusjoner sluppet etter mai 2013 har ikke med PHP-utvidelsen, men har i stedet med PECL-utvidelsen php5-json eller php-pecl-jsonc.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] er innstallert", "config-apc": "[http://www.php.net/apc APC] er innstallert", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] er installert", diff --git a/includes/installer/i18n/nl-informal.json b/includes/installer/i18n/nl-informal.json index d52a3bb0ad..299b3b140b 100644 --- a/includes/installer/i18n/nl-informal.json +++ b/includes/installer/i18n/nl-informal.json @@ -20,8 +20,6 @@ "config-unicode-update-warning": "'''Waarschuwing''': de geïnstalleerde versie van de Unicodenormalisatiewrapper maakt gebruik van een oudere versie van [http://site.icu-project.org/ de bibliotheek van het ICU-project].\nJe moet [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations bijwerken] als Unicode voor jou van belang is.", "config-no-db": "Het was niet mogelijk een geschikte databasedriver te vinden voor PHP.\nJe moet een databasedriver installeren voor PHP.\nDe volgende databases worden ondersteund: $1.\n\nAls je op een gedeelde omgeving zit, vraag dan aan je hostingprovider een geschikte databasedriver te installeren.\nAls je PHP zelf hebt gecompileerd, wijzig dan je instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via ./configure --with-mysql.\nAls je PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook de module php5-mysql.", "config-outdated-sqlite": "''' Waarschuwing:''' je gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.", - "config-mbstring": "'''Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!'''\nDeze instelling zorgt voor gegevenscorruptie.\nJe kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.", - "config-xml-bad": "De XML-module van PHP ontbreekt.\nMediaWiki heeft de functies van deze module nodig en werkt niet zonder deze module.\nAls je gebruik maakt van Mandrake, installeer dan het package php-xml.", "config-mod-security": "'''Waarschuwing:''' je webserver heeft de module [http://modsecurity.org/ mod_security] ingeschakeld. Als deze onjuist is ingesteld, kan dit problemen geven in combinatie met MediaWiki of andere software die gebruikers in staat stelt willekeurige inhoud te posten.\nLees de [http://modsecurity.org/documentation/ documentatie over mod_security] of neem contact op met de helpdesk van je provider als je tegen problemen aanloopt.", "config-imagemagick": "ImageMagick aangetroffen: $1.\nHet aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als je uploaden inschakelt.", "config-gd": "Ingebouwde GD grafische bibliotheek aangetroffen.\nHet aanmaken van miniaturen van afbeeldingen wordt ingeschakeld als je uploaden inschakelt.", diff --git a/includes/installer/i18n/nl.json b/includes/installer/i18n/nl.json index 32893c696b..78649ce571 100644 --- a/includes/installer/i18n/nl.json +++ b/includes/installer/i18n/nl.json @@ -68,15 +68,10 @@ "config-no-db": "Het was niet mogelijk een geschikte databasedriver te vinden voor PHP! U moet een databasedriver installeren voor PHP.\n{{PLURAL:$2|Het volgende databasetype wordt|De volgende databasetypes worden}} ondersteund: $1.\n\nAls u PHP zelf hebt gecompileerd, wijzig dan uw instellingen zodat een databasedriver wordt geactiveerd, bijvoorbeeld via ./configure --with-mysqli.\nAls u PHP hebt geïnstalleerd via een Debian- of Ubuntu-package, installeer dan ook bijvoorbeeld de module php5-mysql.", "config-outdated-sqlite": "''' Waarschuwing:''' u gebruikt SQLite $1. SQLite is niet beschikbaar omdat de minimaal vereiste versie $2 is.", "config-no-fts3": "Waarschuwing: SQLite is gecompileerd zonder de module [//sqlite.org/fts3.html FTS3]; zoekfuncties zijn niet beschikbaar.", - "config-mbstring": "Onherstelbare fout: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is actief!\nDeze instelling zorgt voor onvoorspelbare gegevenscorruptie.\nU kunt MediaWiki niet installeren tenzij deze instelling is uitgeschakeld.", - "config-xml-bad": "De XML-module van PHP ontbreekt.\nMediaWiki vereist functies in deze module en werkt niet in deze configuratie.\nMogelijk moet u het RPM-pakket php-xml installeren.", "config-pcre-old": "'''Onherstelbare fout:''' PCRE $1 of een latere versie is vereist.\nUw uitvoerbare versie van PHP is gekoppeld met PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Meer informatie].", "config-pcre-no-utf8": "'''Fataal:''' de module PRCE van PHP lijkt te zijn gecompileerd zonder ondersteuning voor PCRE_UTF8.\nMediaWiki heeft ondersteuning voor UTF-8 nodig om correct te kunnen werken.", "config-memory-raised": "PHP's memory_limit is $1 en is verhoogd tot $2.", "config-memory-bad": "'''Waarschuwing:''' PHP's memory_limit is $1.\nDit is waarschijnlijk te laag.\nDe installatie kan mislukken!", - "config-ctype": "'''Fataal:''' PHP moet gecompileerd zijn met ondersteuning voor de [http://www.php.net/manual/en/ctype.installation.php extensie Ctype].", - "config-iconv": "Onherstelbare fout: PHP moet gecompileerd zijn met ondersteuning voor de [http://www.php.net/manual/en/iconv.installation.php uitbreiding iconv].", - "config-json": "Fatale fout: PHP is gecompileerd zonder ondersteuning voor JSON.\nU moet de PHP-extensie JSON installeren of de extensie [http://pecl.php.net/package/jsonc PECL jsonc] voordat u MediaWiki installeert.\n* De PHP-extensie is beschikbaar in Red Hat Enterprise Linux (CentOS) 5 en 6, maar moet ingeschakeld worden /etc/php.ini or /etc/php.d/json.ini.\n* Sommige Linuxdistributies die zijn uitgebracht na mei 2013 hebben de PHP-extensie niet, maar hebben een package voor de PECL-extensie als php5-json of php-pecl-jsonc.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] is op dit moment geïnstalleerd", "config-apc": "[http://www.php.net/apc APC] is op dit moment geïnstalleerd", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is op dit moment geïnstalleerd", @@ -319,7 +314,7 @@ "config-install-mainpage": "Hoofdpagina aanmaken met standaard inhoud", "config-install-extension-tables": "Tabellen voor ingeschakelde uitbreidingen worden aangemaakt", "config-install-mainpage-failed": "Het was niet mogelijk de hoofdpagina in te voegen: $1", - "config-install-done": "Gefeliciteerd!\nU hebt MediaWiki met geïnstalleerd.\n\nHet installatieprogramma heeft het bestand LocalSettings.php aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten, in dezelfde map als index.php.\nDe download moet u automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\nLet op: als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u [$2 uw wiki gebruiken].", + "config-install-done": "Gefeliciteerd!\nU hebt MediaWiki geïnstalleerd.\n\nHet installatieprogramma heeft het bestand LocalSettings.php aangemaakt.\nDit bevat al uw instellingen.\n\nU moet het bestand downloaden en in de hoofdmap van uw wiki-installatie plaatsten, in dezelfde map als index.php.\nDe download moet u automatisch zijn aangeboden.\n\nAls de download niet is aangeboden of als u de download hebt geannuleerd, dan kunt u de download opnieuw starten door op de onderstaande koppeling te klikken:\n\n$3\n\nLet op: als u dit niet nu doet, dan is het bestand als u later de installatieprocedure afsluit zonder het bestand te downloaden niet meer beschikbaar.\n\nNa het plaatsen van het bestand met instellingen kunt u [$2 uw wiki gebruiken].", "config-download-localsettings": "LocalSettings.php downloaden", "config-help": "hulp", "config-help-tooltip": "klik om uit te vouwen", diff --git a/includes/installer/i18n/oc.json b/includes/installer/i18n/oc.json index ad6b52627c..e332690027 100644 --- a/includes/installer/i18n/oc.json +++ b/includes/installer/i18n/oc.json @@ -11,7 +11,7 @@ "config-information": "Informacions", "config-localsettings-key": "Clau de mesa a jorn :", "config-localsettings-badkey": "La clau de mesa a jorn qu'avètz provesida es incorrècta", - "config-session-error": "Error al moment de l'aviada de la sesilha : $1", + "config-session-error": "Error al moment de l'aviada de la session : $1", "config-your-language": "Vòstra lenga :", "config-your-language-help": "Seleccionatz la lenga d'utilizar pendent lo processus d'installacion.", "config-wiki-language": "Lenga del wiki :", @@ -149,6 +149,7 @@ "config-extensions": "Extensions", "config-skins": "Abilhatges", "config-skins-use-as-default": "Utilizar aqueste abilhatge per defaut", + "config-skins-must-enable-some": "Vos cal seleccionar almens un tèma per activar.", "config-install-step-done": "fait", "config-install-step-failed": "fracàs", "config-install-extensions": "Inclusion de las extensions", @@ -173,6 +174,6 @@ "config-download-localsettings": "Telecargar LocalSettings.php", "config-help": "ajuda", "config-help-tooltip": "clicar per agrandir", - "mainpagetext": "'''MediaWiki es estat installat amb succès.'''", + "mainpagetext": "MediaWiki es estat installat amb succès.", "mainpagedocfooter": "Consultatz lo [https://meta.wikimedia.org/wiki/Help:Contents/fr Guida de l'utilizaire] per mai d'entresenhas sus l'utilizacion d'aqueste logicial de wiki.\n\n== Per començar ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dels paramètres de configuracion]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/oc FAQ MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista de discussions de las distribucions de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Adaptatz MediaWiki dins vòstra lenga]" } diff --git a/includes/installer/i18n/pl.json b/includes/installer/i18n/pl.json index b705c856a3..193e445c1f 100644 --- a/includes/installer/i18n/pl.json +++ b/includes/installer/i18n/pl.json @@ -74,16 +74,10 @@ "config-no-db": "Nie można odnaleźć właściwego sterownika bazy danych! Musisz zainstalować sterownik bazy danych dla PHP.\nMożna użyć {{PLURAL:$2|następującego typu bazy|następujących typów baz} danych: $1.\n\nJeśli skompilowałeś PHP samodzielnie, skonfiguruj je ponownie z włączonym klientem bazy danych, na przykład za pomocą polecenia ./configure --with-mysqli.\nJeśli zainstalowałeś PHP jako pakiet Debiana lub Ubuntu, musisz również zainstalować np. moduł php5-mysql.", "config-outdated-sqlite": "'''Ostrzeżenie''': masz SQLite $1, która jest niższa od minimalnej wymaganej wersji $2 . SQLite będzie niedostępne.", "config-no-fts3": "'''Uwaga''' – SQLite został skompilowany bez [//sqlite.org/fts3.html modułu FTS3] – funkcje wyszukiwania nie będą dostępne.", - "config-mbstring": "'''Błąd krytyczny – włączono [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nTa opcja powoduje błędy i może wywołać nieprzewidywalne uszkodzenia wprowadzanych danych.\nZainstalować lub korzystać z MediaWiki można pod warunkiem, że ta opcja jest wyłączona.", - "config-xml-bad": "Brak modułu XML dla PHP.\nMediaWiki wymaga funkcji z tego modułu i nie może działać w tej konfiguracji.\nZainstaluj pakiet RPM php-xml.", "config-pcre-old": "Błąd krytyczny: Wymagany jest PCRE w wersji $1 lub nowszej.\nTwój plik wykonywalny PHP jest powiązany z wersją PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Więcej informacji].", "config-pcre-no-utf8": "'''Błąd krytyczny''' – wydaje się, że moduł PCRE w PHP został skompilowany bez wsparcia dla UTF‐8.\nMediaWiki wymaga wsparcia dla UTF‐8 do prawidłowego działania.", "config-memory-raised": "PHP memory_limit było ustawione na $1, zostanie zwiększone do $2.", "config-memory-bad": "'''Uwaga:''' PHP memory_limit jest ustawione na $1.\nTo jest prawdopodobnie zbyt mało.\nInstalacja może się nie udać!", - "config-ctype": "''' Krytyczny ''': PHP musi być skompilowany z obsługą [http://www.php.net/manual/en/ctype.installation.php rozszerzenia Ctype].", - "config-iconv": "Błąd krytyczny: PHP musi być skompilowane z obsługą [http://www.php.net/manual/en/iconv.installation.php rozszerzenia iconv].", - "config-json": "'''Błąd krytyczny:''' PHP skompilowano bez obsługa JSON.\nPrzed zainstalowaniem oprogramowania MediaWiki musisz zainstalować rozszerzenie PHP JSON albo rozszerzenie [http://pecl.php.net/package/jsonc PECL jsonc].\n* Rozszerzenie PHP jest zawarte w Red Hat Enterprise Linux (CentOS) 5 i 6, jednak musi zostać włączone w /etc/php.ini or /etc/php.d/json.ini.\n* Niektóre dystrybucje Linuksa, wydane po maju 2013, nie używają rozszerzenia PHP, lecz rozszerzenie PECL, jako php5-json lub php-pecl-jsonc.", - "config-mbstring-absent": "Błąd krytyczny: PHP musi być skompilowany z obsługą [http://www.php.net/manual/en/mbstring.setup.php rozszerzenia mbstring].", "config-xcache": "[Http://trac.lighttpd.net/xcache/ XCache] jest zainstalowany", "config-apc": "[Http://www.php.net/apc APC] jest zainstalowany", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] jest zainstalowany", @@ -168,7 +162,7 @@ "config-sqlite-readonly": "Plik $1 nie jest zapisywalny.", "config-sqlite-cant-create-db": "Nie można utworzyć pliku bazy danych $1.", "config-sqlite-fts3-downgrade": "Brak wsparcia FTS3 dla PHP. Tabele zostały cofnięte", - "config-can-upgrade": "W bazie danych są już tabele MediaWiki.\nAby uaktualnić je do MediaWiki $1, kliknij '''Dalej'''.", + "config-can-upgrade": "W bazie danych są już tabele MediaWiki.\nAby uaktualnić je do MediaWiki $1, kliknij Dalej.", "config-upgrade-done": "Uaktualnienie kompletne.\n\nMożna teraz [$1 rozpocząć korzystanie z wiki].\n\nJeśli chcesz ponownie wygenerować plik LocalSettings.php, kliknij przycisk poniżej.\nJest to niezalecane, chyba że występują problemy z twoją wiki.", "config-upgrade-done-no-regenerate": "Aktualizacja zakończona.\n\nMożesz teraz [$1 zacząć korzystać ze swojej wiki].", "config-regenerate": "Ponowne generowanie LocalSettings.php →", @@ -230,7 +224,7 @@ "config-profile-no-anon": "Wymagane utworzenie konta", "config-profile-fishbowl": "Wyłącznie zatwierdzeni edytorzy", "config-profile-private": "Prywatna wiki", - "config-profile-help": "Strony typu wiki działają najlepiej, gdy umożliwisz ich edytować jak największej liczbie osób.\nW MediaWiki można łatwo sprawdzić ostatnie zmiany i wycofać szkody, spowodowane przez naiwnych lub złośliwych użytkowników.\n\nJednakże wielu uznało że MediaWiki jest użyteczne w różnych sytuacjach, ale czasami nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.\n\nUstawienie {{int:config-profile-wiki}} pozwala każdemu na edycję, nawet bez logowania się.\nWiki z {{int:config-profile-no-anon}} zawiera dodatkowe możliwości, ale może zniechęcić przypadkowych edytorów.\n\nScenariusz {{int:config-profile-fishbowl}} umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.\nUstawienie '''{{int:config-profile-private}}'' ' pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.\n\nBardziej skomplikowane konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights odpowiednią część podręcznika].", + "config-profile-help": "Strony typu wiki działają najlepiej, gdy umożliwisz ich edytowanie jak największej liczbie osób.\nW MediaWiki można łatwo sprawdzić ostatnie zmiany i wycofać szkody, spowodowane przez naiwnych lub złośliwych użytkowników.\n\nPomimo, że wielu uznało MediaWiki jako przydatne do wielu zadań, nie jest łatwo przekonać wszystkich do korzyści ze sposobu działania wiki. Masz więc wybór.\n\nUstawienie {{int:config-profile-wiki}} pozwala każdemu na edycję, nawet bez logowania się.\nWiki z {{int:config-profile-no-anon}} dostarcza szersze możliwości związane z podziałem kont użytkowników, ale może zniechęcić okazjonalnych redaktorów.\n\nScenariusz {{int:config-profile-fishbowl}} umożliwia zatwierdzonym użytkownikom edycję, ale wyświetlanie stron jest powszechnie dostępne, włącznie z historią.\nUstawienie {{int:config-profile-private}} pozwala na wyświetlanie stron tylko zatwierdzonym użytkownikom, ta sama grupa może je edytować.\n\nBardziej złożone konfiguracje uprawnień użytkowników są dostępne po zakończeniu instalacji, zobacz [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights odpowiednią część podręcznika].", "config-license": "Prawa autorskie i licencja:", "config-license-none": "Brak stopki z licencją", "config-license-cc-by-sa": "Creative Commons – za uznaniem autora, na tych samych zasadach", @@ -299,7 +293,7 @@ "config-install-pg-plpgsql": "Sprawdzanie języka PL/pgSQL", "config-pg-no-plpgsql": "Musisz zainstalować język PL/pgSQL w bazie danych $1", "config-pg-no-create-privs": "Konto, które zostało określone dla instalacji nie ma wystarczających uprawnień, aby utworzyć konto.", - "config-pg-not-in-role": "Konto określone dla użytkownika sieci już istnieje.\nKonto określone dla instalacji nie ma uprawnień administratora ani nie jest przynależy do roli użytkownika sieci web, więc nie można utworzyć obiektów stanowiących własność użytkownika sieci.\n\nMediaWiki wymaga obecnie, by tabele były własnością konta zwykłego użytkownika. Podaj inną nazwę konta użytkownika, lub kliknij przycisk \"Wstecz\" i podaj nazwę konta użytkownika instalatora, które posiada odpowiednie uprawnienia.", + "config-pg-not-in-role": "Konto określone dla użytkownika sieci już istnieje.\nKonto określone dla instalacji nie ma uprawnień administratora, ani nie jest przynależy do roli użytkownika sieci web, więc nie można utworzyć obiektów stanowiących własność użytkownika sieci.\n\nMediaWiki obecnie wymaga, aby tabele były własnością konta zwykłego użytkownika. Podaj inną nazwę konta użytkownika albo kliknij przycisk „Wstecz” i podaj nazwę konta użytkownika instalatora, które posiada odpowiednie uprawnienia.", "config-install-user": "Tworzenie użytkownika bazy danych", "config-install-user-alreadyexists": "Konto użytkownika „$1” już istnieje", "config-install-user-create-failed": "Tworzenie użytkownika \"$1\" nie powiodło się: $2", diff --git a/includes/installer/i18n/pms.json b/includes/installer/i18n/pms.json index 07ec8d9309..0747672f76 100644 --- a/includes/installer/i18n/pms.json +++ b/includes/installer/i18n/pms.json @@ -58,12 +58,9 @@ "config-no-db": "Impossìbil trové un pilòta ëd base ëd dàit bon! A dev instalé un pilòta ëd base ëd dàit për PHP.\n{{PLURAL:$2|La sòrt ëd base ëd dàit mantnùa a l'é costa|Le sòrt ëd base ëd dàit mantùe a son coste}} sì-dapress: $1.\n\nS'a l'é compilasse PHP chiel-midem, ch'a lo configura torna con un client ëd base ëd dàit abilità, për esempi an dovrand ./configure --with-mysql.\nS'a l'ha instalà PHP dai pachèt Debian o Ubuntu, antlora a dev ëdcò anstalé, për esempi, ël mòdul php5-mysql.", "config-outdated-sqlite": "'''Avis''': chiel a l'ha SQLite $1, che a l'é pi vej che la version mìnima dont a-i é damanca $2. SQLite a sarà pa disponìbil.", "config-no-fts3": "'''Avis''': SQLite a l'é compilà sensa ël mòdul [//sqlite.org/fts3.html FTS3], le funsion d'arserca a saran pa disponìbij su cost motor.", - "config-mbstring": "'''Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] a l'é ativ!'''\nCosta opsion a càusa d'eror e a peul danegié ij dat d'intrada an manera pa prevedìbil.\nA peul pa instalé o dovré MediaWiki se st'opsion a l'é pa disabilità.", - "config-xml-bad": "Ël mòdol XML ed PHP a l'é mancant.\nMediaWiki a l'ha da manca dle funsion ant ës mòdul e a marcërà pa an costa configurassion.\nA dev instalé ël pachet php-xml RPM.", "config-pcre-no-utf8": "'''Fatal''': ël mòdul PCRE ëd PHP a smija esse compilà sensa l'apògg PCRE_UTF8.\nMediaWiki a ciama l'apògg d'UTF8 për marcé për da bin.", "config-memory-raised": "memory_limit ëd PHP a l'é $1, aussà a $2.", "config-memory-bad": "'''Avis:''' memory_limit ëd PHP a l'é $1.\nSossì a l'é probabilment tròp bass.\nL'instalassion a peul falì!", - "config-ctype": "'''Fatal''': PHP a dev esse compilà con l'apògg për l'[http://www.php.net/manual/en/ctype.installation.php extension Ctype].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] a l'é instalà", "config-apc": "[http://www.php.net/apc APC] a l'é instalà", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] a l'é instalà", @@ -78,7 +75,7 @@ "config-using-uri": "Utilisassion ëd l'anliura ëd servent «$1$2».", "config-uploads-not-safe": "'''Avis:''' Sò dossié stàndard për carié $1 a l'é vulneràbil a l'esecussion ëd qualsëssìa senari.\nBele che MediaWiki a contròla j'aspet ëd sicurëssa ëd tùit j'archivi carià, a l'é motobin arcomandà ëd [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security saré ës përtus ëd sicurëssa] prima d'abilité ij cariament.", "config-no-cli-uploads-check": "'''Avis:''' Toa cartela predefinìa për j-amportassion ($1) a l'é nen controlà a propòsit ëd la vulnerabilità\nd'esecussion ëd senari arbitrari durant l'istalassion CLI.", - "config-brokenlibxml": "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.\nCh'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([https://bugs.php.net/bug.php?id=45996 bug filed with PHP]).\nIstalassion abortìa.", + "config-brokenlibxml": "Sò sistema a l'ha na combinassion ëd version PHP e libxml2 che a l'ha dij bigat e a peul provoché la corussion ëd dat ëstërmà an MediaWiki e d'àutre aplicassion për l'aragnà.\nCh'a agiorna a PHP 5.2.9 o pi neuv e libxml2 2.7.3 o pi neuv ([https://bugs.php.net/bug.php?id=45996 bigat archivià con PHP]).\nAnstalassion abortìa.", "config-suhosin-max-value-length": "Suhosin a l'é instalà e a lìmita la longheur dël paràmetr GET a $1 byte. Ël component ResourceLoader ëd MediaWiki a travajerà an rispetand ës lìmit, ma sòn a degraderà le prestassion. Se possìbil, a dovrìa amposté suhosin.get.max_value_lenght a 1024 o pi àut an php.ini, e amposté $wgResourceLoaderMaxQueryLength al midem valor an LocalSettings.php .", "config-db-type": "Sòrt ëd base ëd dàit:", "config-db-host": "Ospitant ëd la base ëd dàit:", @@ -196,7 +193,7 @@ "config-profile-no-anon": "A venta creé un cont", "config-profile-fishbowl": "Mach editor autorisà", "config-profile-private": "Wiki privà", - "config-profile-help": "Le wiki a marcio mej quand ch'a lassa che pì përsone possìbij a-j modìfico.\nAn MediaWiki, a l'é bel fé revisioné j'ùltime modìfiche, e buté andré qualsëssìa dann che a sia fàit da dj'utent noviss o malissios.\n\nAn tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.\nParèj a l'ha doe possibilità.\n\nËl model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.\nNa wiki con '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contributor ocasionaj.\n\nËl senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.\nUn '''{{int:config-profile-private}}''' a përmët mach a j'utent aprovà ëd vëdde le pàgine, con la midema partìa ch'a peul modifiché.\n\nConfigurassion ëd drit d'utent pi complicà a son disponìbij apress l'instalassion, vëdde la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights pàgina a pòsta dël manual].", + "config-profile-help": "Le wiki a marcio mej quand ch'a lassa che pì përsone possìbij a-j modìfico.\nAn MediaWiki, a l'é bel fé revisioné j'ùltime modìfiche, e buté andré qualsëssìa dann che a sia fàit da dj'utent noviss o malissios.\n\nAn tùit ij cas, an tanti a l'han trovà che MediaWiki a sia ùtil ant na gran varietà ëd manere, e dle vire a l'é pa bel fé convince cheidun dij vantagi dla wiki.\nParèj a l'ha doe possibilità.\n\nËl model '''{{int:config-profile-wiki}}''' a përmët a chicassìa ëd modifiché, bele sensa intré ant ël sistema.\nNa wiki con '''{{int:config-profile-no-anon}}''' a dà pì 'd contròl, ma a peul slontané dij contributor ocasionaj.\n\nËl senari '''{{int:config-profile-fishbowl}}''' a përmët a j'utent aprovà ëd modifiché, ma ël pùblich a peul vëdde le pàgine, comprèisa la stòria.\nNa '''{{int:config-profile-private}}''' a përmët mach a j'utent aprovà ëd vëdde le pàgine, con la midema partìa ch'a peul modifiché.\n\nConfigurassion ëd drit d'utent pi complicà a son disponìbij apress l'instalassion, vëdde la [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:User_rights pàgina a pòsta dël manual].", "config-license": "Drit d'autor e licensa", "config-license-none": "Gnun-a licensa an nòta an bass", "config-license-cc-by-sa": "Creative Commons atribussion an part uguaj", @@ -286,5 +283,5 @@ "config-help": "agiut", "config-nofile": "L'archivi «$1» as treuva nen. A l'é stàit ëscancelà?", "mainpagetext": "'''MediaWiki a l'é staita anstalà a la përfession.'''", - "mainpagedocfooter": "Che a varda la [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] për avèj dj'anformassion ant sël coma dovré ël programa dla wiki.\n\n== Për anandiesse a travajé ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dij paràmeter ëd configurassion]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki Chestion frequente]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista ëd discussion an sla distribussion ëd MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localisa MediaWiki për toa lenga]" + "mainpagedocfooter": "Che a varda la [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] për avèj dj'anformassion ant sël coma dovré ël programa dla wiki.\n\n== Për anandiesse a travajé ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Lista dij paràmeter ëd configurassion]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Chestion frequente su MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Lista ëd discussion an sla distribussion ëd MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Ch'a localisa MediaWiki për toa lenga]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Amprende coma combate contra la rumenta su soa wiki]" } diff --git a/includes/installer/i18n/pt-br.json b/includes/installer/i18n/pt-br.json index c78bd2d26c..8cf22e241b 100644 --- a/includes/installer/i18n/pt-br.json +++ b/includes/installer/i18n/pt-br.json @@ -71,15 +71,10 @@ "config-no-db": "Não foi possível encontrar um driver apropriado para a banco de dados! Você precisa instalar um driver de banco de dados para PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de banco de dados: $1.\n\nSe compilou o PHP você mesmo, reconfigure-o com um cliente de banco de dados ativado, por exemplo, usando ./configure --with-mysqli.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então também precisa instalar, por exemplo, o pacote php5-mysql.", "config-outdated-sqlite": "Aviso: você tem o SQLite versão $1, que é menor do que a versão mínima necessária $2. O SQLite não estará disponível.", "config-no-fts3": "Aviso O SQLite foi compilado sem o [//sqlite.org/fts3.html módulo FTS3], as funcionalidades de pesquisa não estarão disponíveis nesta instalação.", - "config-mbstring": "Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativada!\nEsta opção causa erros e pode corromper os dados de forma imprevisível.\nVocê não pode instalar ou utilizar o MediaWiki a menos que esta opção seja desativada.", - "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nPode precisar de instalar o pacote RPM chamado php-xml.", "config-pcre-old": "Erro fatal: É necessário o PCRE $1 ou versão posterior.\nO binário do seu PHP foi vinculado com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].", "config-pcre-no-utf8": "Erro fatal: O módulo PCRE do PHP parece ser compilado sem suporte a PCRE_UTF8.\nO MediaWiki requer suporte a UTF-8 para funcionar corretamente.", "config-memory-raised": "A configuração memory_limit do PHP era $1; foi aumentada para $2.", "config-memory-bad": "Aviso: A configuração memory_limit do PHP é $1.\nIsso provavelmente é muito baixo.\nA instalação pode falhar!", - "config-ctype": "Erro fatal: O PHP deve ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].", - "config-iconv": "Fatal: O PHP deve ser compilado com suporte para a [http://www.php.net/manual/en/iconv.installation.php extensão iconv].", - "config-json": "Erro fatal: O PHP foi compilado sem suporte a JSON.\nVocê deve instalar a extensão PHP JSON ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP já está incluída no Red Hat Enterprise Linux (CentOS) 5 e 6, mas deve ser habilitado no /etc/php.ini ou no /etc/php.d/json.ini.\n* Algumas distribuições Linux lançadas após maio de 2013 omitem a extensão PHP, oferecendo em seu lugar a extensão PECL como parte do pacote php5-json ou do php-pecl-jsonc.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] está instalado", "config-apc": "[http://www.php.net/apc APC] está instalado", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] está instalado", diff --git a/includes/installer/i18n/pt.json b/includes/installer/i18n/pt.json index 819e0f8687..49f242a946 100644 --- a/includes/installer/i18n/pt.json +++ b/includes/installer/i18n/pt.json @@ -68,15 +68,10 @@ "config-no-db": "Não foi possível encontrar um controlador apropriado da base de dados! Precisa de instalar um controlador da base de dados para o PHP. {{PLURAL:$2|É aceite o seguinte tipo|São aceites os seguintes tipos}} de base de dados: $1.\n\nSe fez a compilação do PHP, reconfigure-o com um cliente de base de dados ativado; por exemplo, usando ./configure --with-mysql.\nSe instalou o PHP a partir de um pacote Debian ou Ubuntu, então precisa de instalar também, por exemplo, o pacote php5-mysql.", "config-outdated-sqlite": "'''Aviso''': Tem a versão $1 do SQLite, que é anterior à versão mínima necessária, a $2. O SQLite não estará disponível.", "config-no-fts3": "'''Aviso''': O SQLite foi compilado sem o módulo [//sqlite.org/fts3.html FTS3]; as funcionalidades de pesquisa não estarão disponíveis nesta instalação.", - "config-mbstring": "'''Erro fatal: A opção [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] está ativa!'''\nEsta opção causa erros e pode corromper os dados de uma forma imprevisível.\nNão pode instalar ou usar o MediaWiki a menos que esta opção seja desativada.", - "config-xml-bad": "Falta o módulo XML do PHP.\nO MediaWiki necessita de funções deste módulo e não funcionará com esta configuração.\nPode precisar de instalar o pacote RPM chamado php-xml.", "config-pcre-old": "Erro fatal: É necessário o PCRE $1 ou versão posterior.\nO link do seu binário PHP foi feito com o PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mais informações].", "config-pcre-no-utf8": "'''Erro fatal''': O módulo PCRE do PHP parece ter sido compilado sem suporte PCRE_UTF8.\nO MediaWiki necessita do suporte UTF-8 para funcionar corretamente.", "config-memory-raised": "A configuração memory_limit do PHP era $1; foi aumentada para $2.", "config-memory-bad": "'''Aviso:''' A configuração memory_limit do PHP é $1.\nIsto é provavelmente demasiado baixo.\nA instalação poderá falhar!", - "config-ctype": "'''Erro fatal''': O PHP tem de ser compilado com suporte para a [http://www.php.net/manual/en/ctype.installation.php extensão Ctype].", - "config-iconv": "Erro fatal: O PHP deve ser compilado com suporte à [http://www.php.net/manual/en/iconv.installation.php extensão iconv].", - "config-json": "Erro fatal: O PHP foi compilado sem suporte de JSON.\nTem de instalar a extensão JSON do PHP (incluída no PHP 5.2 ou posterior) ou a extensão [http://pecl.php.net/package/jsonc PECL jsonc] antes de instalar o MediaWiki.\n* A extensão JSON do PHP está incluída nas distribuções 5 e 6 do Red Hat Enterprise Linux (CentOS), mas tem de estar ativa nos ficheiros /etc/php.ini ou /etc/php.d/json.ini.\n* Algumas distribuições do Linux posteriores a maio de 2013 omitem a extensão JSON do PHP e substituem-na pela extensão PECL chamando-lhe php5-json ou php-pecl-jsonc.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] instalada", "config-apc": "[http://www.php.net/apc APC] instalada", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] instalada", @@ -251,13 +246,13 @@ "config-email-sender-help": "Introduza o endereço de correio electrónico que será usado como endereço de retorno nas mensagens electrónicas de saída.\nÉ para este endereço que serão enviadas as mensagens que não podem ser entregues.\nMuitos servidores de correio electrónico exigem que pelo menos a parte do nome do domínio seja válida. \\", "config-upload-settings": "Carregamento de imagens e ficheiros", "config-upload-enable": "Possibilitar o carregamento de ficheiros", - "config-upload-help": "O carregamento de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security seção sobre segurança] do Manual Técnico.\n\nPara permitir o carregamento de ficheiros, altere as permissões do subdiretório images no diretório de raiz do MediaWiki para que o servidor de internet possa escrever nele.\nDepois ative esta opção.", + "config-upload-help": "O carregamento de ficheiros expõe o seu servidor a riscos de segurança.\nPara mais informações, leia a [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security secção sobre segurança] do Manual Técnico.\n\nPara permitir o carregamento de ficheiros, altere as permissões do subdiretório images no diretório de raiz do MediaWiki para que o servidor de Internet possa escrever nele.\nDepois ative esta opção.", "config-upload-deleted": "Diretório para os ficheiros apagados:", "config-upload-deleted-help": "Escolha um diretório onde serão arquivados os ficheiros apagados.\nO ideal é que este diretório não possa ser diretamente acedido a partir da internet.", "config-logo": "URL do logótipo:", "config-logo-help": "O tema padrão do MediaWiki inclui espaço para um logótipo de 135x160 pixels acima do menu da barra lateral.\nColoque na wiki uma imagem com estas dimensões e introduza aqui a URL dessa imagem.\n\nSe não pretende usar um logótipo, deixe este campo em branco.", "config-instantcommons": "Ativar Instant Commons", - "config-instantcommons-help": "O [https://www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no site [https://commons.wikimedia.org/ Wikimedia Commons].\nPara poder usá-los, o MediaWiki necessita de acesso à internet.\n\nPara mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Manual Técnico].", + "config-instantcommons-help": "O [https://www.mediawiki.org/wiki/InstantCommons Instant Commons] é uma funcionalidade que permite que as wikis usem imagens, áudio e outros ficheiros multimédia disponíveis no sítio [https://commons.wikimedia.org/ Wikimedia Commons].\nPara poder usá-los, o MediaWiki necessita de acesso à Internet.\n\nPara mais informações sobre esta funcionalidade, incluindo instruções sobre como configurá-la para usar outras wikis em vez da Wikimedia Commons, consulte o [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos Manual Técnico].", "config-cc-error": "O auxiliar de escolha de licenças da Creative Commons não produziu resultados.\nIntroduza o nome da licença manualmente.", "config-cc-again": "Escolha outra vez...", "config-cc-not-chosen": "Escolha a licença da Creative Commons que pretende e clique \"proceed\".", @@ -316,6 +311,7 @@ "config-install-extension-tables": "A criar as tabelas das extensões ativadas", "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1", "config-install-done": "Parabéns!\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro LocalSettings.php.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer a descarga do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Esta descarga deverá ter sido iniciada automaticamente.\n\nSe a descarga não foi iniciada, ou se o cancelou, pode recomeçá-la ao clicar na ligação abaixo:\n\n$3\n\nNota: Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode [$2 entrar na wiki].", + "config-install-done-path": "Parabéns!\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro LocalSettings.php.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer a descarga do ficheiro e colocá-lo no diretório $4. Esta descarga deverá ter sido iniciada automaticamente.\n\nSe a descarga não foi iniciada, ou se o cancelou, pode recomeçá-la ao clicar na ligação abaixo:\n\n$3\n\nNota: Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode [$2 entrar na wiki].", "config-download-localsettings": "Descarga do LocalSettings.php", "config-help": "ajuda", "config-help-tooltip": "clique para expandir", diff --git a/includes/installer/i18n/qqq.json b/includes/installer/i18n/qqq.json index b2ff1037d7..69a6830b1b 100644 --- a/includes/installer/i18n/qqq.json +++ b/includes/installer/i18n/qqq.json @@ -69,16 +69,10 @@ "config-no-db": "{{doc-important|Do not translate \"./configure --with-mysqli\" and \"php5-mysql\".}}\nParameters:\n* $1 is comma separated list of database types supported by MediaWiki.\n* $2 is the count of items in $1 - for use in plural.", "config-outdated-sqlite": "Used as warning. Parameters:\n* $1 - the version of SQLite that has been installed\n* $2 - minimum version", "config-no-fts3": "A \"[[:wikipedia:Front and back ends|backend]]\" is a system or component that ordinary users don't interact with directly and don't need to know about, and that is responsible for a distinct task or service - for example, a storage back-end is a generic system for storing data which other applications can use. Possible alternatives for back-end are \"system\" or \"service\", or (depending on context and language) even leave it untranslated.", - "config-mbstring": "{{Related|Config-fatal}}", - "config-xml-bad": "Status message in the MediaWiki installer environment checks.", "config-pcre-old": "Parameters:\n* $1 - minimum PCRE version number\n* $2 - the installed version of [[wikipedia:PCRE|PCRE]]\n{{Related|Config-fatal}}", "config-pcre-no-utf8": "PCRE is a name of a programmers' library for supporting regular expressions. It can probably be translated without change.\n{{Related|Config-fatal}}", "config-memory-raised": "Parameters:\n* $1 is the configured memory_limit.\n* $2 is the value to which memory_limit was raised.", "config-memory-bad": "Parameters:\n* $1 is the configured memory_limit.", - "config-ctype": "Message if support for [http://www.php.net/manual/en/ctype.installation.php Ctype] is missing from PHP.\n{{Related|Config-fatal}}", - "config-iconv": "Message if support for [http://www.php.net/manual/en/iconv.installation.php iconv] is missing from PHP.\n{{Related|Config-fatal}}", - "config-json": "Message if support for [[wikipedia:JSON|JSON]] is missing from PHP.\n* \"[[wikipedia:Red Hat Enterprise Linux|Red Hat Enterprise Linux]]\" (RHEL) and \"[[wikipedia:CentOS|CentOS]]\" refer to two almost-identical Linux distributions. \"5 and 6\" refers to version 5 or 6 of either distribution. Because RHEL 7 likely will not include the PHP extension, do not translate as \"5 or newer\".\n* \"The [http://www.php.net/json PHP extension]\" is the JSON extension included with PHP 5.2 and newer.\n* \"The [http://pecl.php.net/package/jsonc PECL extension]\" is based on the PHP extension, though excludes code some distributions have found unacceptable (see [[phab:T49431]]).\n{{Related|Config-fatal}}", - "config-mbstring-absent": "Message if support for [http://www.php.net/manual/en/mbstring.installation.php mbstring] is missing from PHP.\n{{Related|Config-fatal}}", "config-xcache": "Message indicates if this program is available", "config-apc": "Message indicates if this program is available", "config-wincache": "Message indicates if this program is available", @@ -322,6 +316,7 @@ "config-install-extension-tables": "Notice shown to the user during the install about progress.", "config-install-mainpage-failed": "Used as error message. Parameters:\n* $1 - detailed error message", "config-install-done": "Parameters:\n* $1 is the URL to LocalSettings download\n* $2 is a link to the wiki.\n* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.", + "config-install-done-path": "Parameters:\n* $1 is the URL to LocalSettings download\n* $2 is a link to the wiki.\n* $3 is a download link with attached download icon. The config-download-localsettings message will be used as the link text.\n* $4 is the filesystem location of where the LocalSettings.php file should be saved to.", "config-download-localsettings": "The link text used in the download link in config-install-done.", "config-help": "This is used in help boxes.\n{{Identical|Help}}", "config-help-tooltip": "Tooltip for the 'help' links ({{msg-mw|config-help}}), to make it clear they'll expand in place rather than open a new page", diff --git a/includes/installer/i18n/ru.json b/includes/installer/i18n/ru.json index a7d4c631a0..34ef3e801a 100644 --- a/includes/installer/i18n/ru.json +++ b/includes/installer/i18n/ru.json @@ -33,7 +33,7 @@ "config-localsettings-badkey": "Вы указали неправильный ключ обновления", "config-upgrade-key-missing": "Обнаружена существующая установленная копия MediaWiki.\nЧтобы обновить обнаруженную установку, пожалуйста, добавьте следующую строку в конец вашего файла LocalSettings.php:\n\n$1", "config-localsettings-incomplete": "Похоже, что существующий файл LocalSettings.php неполон.\nНе установлена переменная $1.\nПожалуйста, измените LocalSettings.php так, чтобы значение этой переменной было задано, затем нажмите «{{int:Config-continue}}».", - "config-localsettings-connection-error": "Произошла ошибка при подключении к базе данных с помощью настроек, указанных в LocalSettings.php или AdminSettings.php. Пожалуйста, исправьте эти настройки и повторите попытку.\n\n$1", + "config-localsettings-connection-error": "Произошла ошибка при подключении к базе данных с использованием настроек, указанных в LocalSettings.php. Пожалуйста, исправьте эти настройки и повторите попытку.\n\n$1", "config-session-error": "Ошибка при запуске сессии: $1", "config-session-expired": "Ваша сессия истекла.\nСессии настроены на длительность $1.\nВы её можете увеличить, изменив session.gc_maxlifetime в php.ini.\nПерезапустите процесс установки.", "config-no-session": "Данные сессии потеряны!\nПроверьте ваш php.ini и убедитесь, что session.save_path установлен в соответствующий каталог.", @@ -73,16 +73,10 @@ "config-no-db": "Не удалось найти подходящие драйвера баз данных! Вам необходимо установить драйвера базы данных для PHP.\n{{PLURAL:$2|Поддерживается следующий тип|Поддерживаются следующие типы}} баз данных: $1.\n\nЕсли вы скомпилировали PHP сами, перенастройте его с включением клиента баз данных, например, с помощью ./configure --with-mysqli.\nЕсли вы установили PHP из пакетов Debian или Ubuntu, то вам также необходимо установить, например, пакет php5-mysql.", "config-outdated-sqlite": "'''Предупреждение''': у Вас установлен SQLite $1, версия которого ниже требуемой $2 . SQLite будет недоступен.", "config-no-fts3": "'''Внимание''': SQLite собран без модуля [//sqlite.org/fts3.html FTS3] — поиск не будет работать для этой базы данных.", - "config-mbstring": "'''Проблема: включена опция PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nЭто приводит к ошибкам и непредсказуемой порче вводимых данных.\nУстановка и использование MediaWiki без выключения этой опции невозможно.", - "config-xml-bad": "Для РНР отсутствует XML-модуль.\nMediaWiki не будет работать в этой конфигурации, так как требуется функционал этого модуля.\nВозможно, вам понадобится установить RPM-пакет php-xml.", "config-pcre-old": "'''Фатальная ошибка:''' требуется PCRE версии $1 или более поздняя.\nВаш исполняемый файл PHP связан с PCRE версии $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Подробнее].", "config-pcre-no-utf8": "'''Фатальная ошибка'''. Модуль PCRE для PHP, похоже, собран без поддержки PCRE_UTF8.\nMediaWiki требует поддержки UTF-8 для корректной работы.", "config-memory-raised": "Ограничение на доступную PHP память (memory_limit) поднято с $1 до $2.", "config-memory-bad": "'''Внимание:''' размер PHP memory_limit составляет $1.\nВероятно, этого слишком мало.\nУстановка может потерпеть неудачу!", - "config-ctype": "'''Фатальная ошибка:''' PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/ru/ctype.installation.php расширения Ctype].", - "config-iconv": "Фатальная ошибка: PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/en/iconv.installation.php расширения iconv].", - "config-json": "'''Фатальная ошибка:''' PHP был скомпилирован без поддержка JSON.\nВам необходимо установить либо расширение PHP JSON, либо расширение [http://pecl.php.net/package/jsonc PECL jsonc] перед установкой MediaWiki.\n* PHP-расширение входит в состав Red Hat Enterprise Linux (CentOS) 5 и 6, хотя должна быть включено в /etc/php.ini или /etc/php.d/json.ini.\n* Некоторые дистрибутивы Linux, выпущенные после мая 2013 года, не включают расширение PHP, вместо того, чтобы упаковывать расширение PECL как php5-json или php-pecl-jsonc.", - "config-mbstring-absent": "Фатальная ошибка: PHP должен быть скомпилирован с поддержкой [http://www.php.net/manual/en/mbstring.setup.php расширения mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] установлен", "config-apc": "[http://www.php.net/apc APC] установлен", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] установлен", @@ -326,6 +320,7 @@ "config-install-extension-tables": "Создание таблиц для включённых расширений", "config-install-mainpage-failed": "Не удаётся вставить главную страницу: $1", "config-install-done": "Поздравляем!\nВы установили MediaWiki.\n\nВо время установки был создан файл LocalSettings.php.\nОн содержит все ваши настройки.\n\nВам необходимо скачать его и положить в корневую директорию вашей вики (ту же директорию, где находится файл index.php). Его загрузка должна начаться автоматически.\n\nЕсли автоматическая загрузка не началась или вы её отменили, вы можете скачать по ссылке ниже:\n\n$3\n\nПримечание: Если вы не сделаете этого сейчас, то сгенерированный файл конфигурации не будет доступен вам в дальнейшем, если вы выйдете из установки, не скачивая его.\n\nПо окончании действий, описанных выше, вы сможете [$2 войти в вашу вики].", + "config-install-done-path": "Поздравляем!\nВы установили MediaWiki.\n\nВо время установки был создан файл LocalSettings.php.\nОн содержит все ваши настройки.\n\nВам необходимо скачать его и положить в $4. Его загрузка должна начаться автоматически.\n\nЕсли автоматическая загрузка не началась или вы её отменили, вы можете скачать по ссылке ниже:\n\n$3\n\nПримечание: Если вы не сделаете этого сейчас, то сгенерированный файл конфигурации не будет доступен вам в дальнейшем, если вы выйдете из установки, не скачивая его.\n\nПо окончании действий, описанных выше, вы сможете [$2 войти в вашу вики].", "config-download-localsettings": "Загрузить LocalSettings.php", "config-help": "справка", "config-help-tooltip": "нажмите, чтобы развернуть", diff --git a/includes/installer/i18n/sco.json b/includes/installer/i18n/sco.json index 6b3fae0dc5..c79c22d37e 100644 --- a/includes/installer/i18n/sco.json +++ b/includes/installer/i18n/sco.json @@ -14,7 +14,7 @@ "config-localsettings-upgrade": "Ae LocalSettings.php file haes been detectit.\nTae upgrade this installation, please enter the vailyie o $wgUpgradeKey in the kist ablo.\nYe'll fynd it in LocalSettings.php.", "config-localsettings-cli-upgrade": "Ae LocalSettings.php file haes been detectit.\nTae upgrade this installation, please rin update.php insteid", "config-localsettings-key": "The Upgrade key:", - "config-localsettings-badkey": "The key that ye gave is fause.", + "config-localsettings-badkey": "The upgrade key ye providit is incorrect.", "config-upgrade-key-missing": "Aen exeestin installation o MediaWiki haes been detectit.\nTae upgrade this installation, please pit the follaein line at the bottom o yer LocalSettings.php:\n\n$1", "config-localsettings-incomplete": "The exeestin LocalSettings.php appears tae be oncompleate.\nThe $1 variable isna set.\nPlease chynge LocalSettings.php sae that this variable is set, n clap \"{{int:Config-continue}}\".", "config-localsettings-connection-error": "Ae mistak wis encountered whan connectin til the database uisin the settins specified in LocalSettings.php. Please fix thir settins n try again.\n\n$1", @@ -53,22 +53,18 @@ "config-env-hhvm": "HHVM $1 is instawed.", "config-unicode-using-intl": "Uising the [http://pecl.php.net/intl intl PECL extension] fer Unicode normalization.", "config-unicode-pure-php-warning": "Warnishment: The [http://pecl.php.net/intl intl PECL extension] is no available tae haunle Unicode normalisation, fawin back tae slaw pure-PHP implementation.\nGif ye rin ae hei-traffic steid, ye shid read ae wee bit oan [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalization].", - "config-unicode-update-warning": "Warnishment: The instawed version o the Unicode normalization wrapper uises aen aulder version o [http://site.icu-project.org/ the ICU project's] librie.\nYe shid [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] gif ye'r concerned aneat uisin Unicode.", - "config-no-db": "Coudna fynd ae suitable database driver! Ye need tae instaw ae database driver fer PHP.\nThe follaein database types ar supported: $1.\n\nGif ye compiled PHP yersel, reconfeegure it wi ae database client enabled, fer example, uising ./confeegure --wi-mysqli.\nGif ye installed PHP fae ae Debian or Ubuntu package, than ye need tae instaw forby, fer example, the php5-mysql package.", + "config-unicode-update-warning": "Wairnin: The installed version o the Unicode normalisation wrapper uises an aulder version o [http://site.icu-project.org/ the ICU project's] library.\nYe shoud [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations upgrade] if ye are at aw concerned aboot uisin Unicode.", + "config-no-db": "Could nae find a suitable database driver! Ye need tae install a database driver for PHP.\nThe follaein database {{PLURAL:$2|type is|types are}} supportit: $1.\n\nIf you compiled PHP yersel, reconfigur it wi a database client enabled, for example, uisin ./configure --with-mysqli.\nIf ye installed PHP frae a Debian or Ubuntu package, then ye an aa need tae install, for example, the php5-mysql package.", "config-outdated-sqlite": "Warnishment: ye have SQLite $1, this is lower than minimum required version $2. SQLite will be onavailable.", "config-no-fts3": "Warnishment: SQLite is compiled wioot the [//sqlite.org/fts3.html FTS3 module], rake features will be onavailable oan this backend.", - "config-mbstring": "Fatal: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] is active!\nThis optie causes mistaks an can rot data onpredictably.\nYe canna install or uise MediaWiki onless this optie is disabled.", - "config-xml-bad": "PHP's XML module is missin.\nMediaWiki needs functions in this module n will naw wairk in this confeeguration.\nGif ye'r rinnin Mandrake, instaw the php-xml package.", "config-pcre-old": "Fatal: PCRE $1 or later is required.\nYer PHP binary is link't wi PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mair informâtion].", "config-pcre-no-utf8": "Fatal: PHP's PCRE module seems tae be compiled wioot PCRE_UTF8 support.\nMediaWiki requires UTF-8 support tae function correctly.", "config-memory-raised": "PHP's memerie_limit is $1, raised til $2.", "config-memory-bad": "Warnishment: PHP's memerie_limit is $1.\nThis is proably ower low.\nThe installation micht fail!", - "config-ctype": "Fatal: PHP maun be compiled wi support fer the [http://www.php.net/manual/en/ctype.installation.php Ctype extension].", - "config-iconv": "Fatal: PHP maun be compiled wi support fer the [http://www.php.net/manual/en/iconv.installation.php iconv extension].", - "config-json": "Fatal: PHP wis compiled wioot JSON support.\nYe maun instaw either the PHP JSON extension or the [http://pecl.php.net/package/jsonc PECL jsonc] extension afore instawin MediaWiki.\n* The PHP extension is incluided in Red Hat Enterprise Linux (CentOS) 5 n 6, thoogh it maun be enabled in /etc/php.ini or /etc/php.d/json.ini.\n* Some Linux distributions released efter Mey 2013 omit the PHP extension, instead packagin the PECL extension aes php5-json or php-pecl-jsonc.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] is installed.", "config-apc": "[http://www.php.net/apc APC] is installed.", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] is instawed.", + "config-no-cache-apcu": "Wairnin: Could nae find [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] or [http://www.iis.net/download/WinCacheForPhp WinCache].\nObject cachin isna enabled.", "config-mod-security": "Warnishment: Yer wab server haes [http://modsecurity.org/ mod_security] enabled. Gif misconfeegured, it can cause problems fer MediaWiki or ither saffware that allous uisers tae post arbitrie content.\nRefer til [http://modsecurity.org/documentation/ mod_security documentation] or contact yer host's support gif ye encounter random mistaks.", "config-diff3-bad": "GNU diff3 naw foond.", "config-git": "Foond the Git version control saffware: $1.", @@ -183,7 +179,7 @@ "config-ns-site-name": "Same aes the wiki name: $1", "config-ns-other": "Ither (speceefie)", "config-ns-other-default": "MaWiki", - "config-project-namespace-help": "Follaein Wikipedia's example, moni wikis keep their policy pages separate fae thair content pages, in ae \"'''project namespace'''\".\nAw page titles in this namespace stert wi ae certain prefix, that ye can speceefie here.\nUisuallie, this prefix is derived fae the name o the wiki, but it canna contain punctuation chairacters sic like \"#\" or \":\".", + "config-project-namespace-help": "Follaein Wikipaedia's example, mony wikis keep thair policy pages separate frae thair content pages, in a '''project namespace'''.\nAw page teetles in this namespace stairt wi a certain prefix, which ye can specify here.\nUisually, this prefix is derived frae the name o the wiki, but it canna conteen punctuation characters such as \"#\" or \":\".", "config-ns-invalid": "The speceefied namespace \"$1\" is onvalid.\nSpeceefie ae different project namespace.", "config-ns-conflict": "The speceefied namespace \"$1\" conflicts wi ae defaut MediaWiki namespace.\nSpeceefie ae different project namespace.", "config-admin-box": "Admeenistrater accoont", @@ -243,7 +239,7 @@ "config-logo": "Logo URL:", "config-logo-help": "MediaWiki's defaut skin inclædes space fer ae 135x160 pixel logo abuin the sidebaur menu.\nUplaid aen eemage o the appropriate size, n enter the URL here.\n\nYe can uise $wgStylePath or $wgScriptPath gif yer logo is relative til thae paths.\n\nGif ye dinna want ae logo, lea this kist blank.", "config-instantcommons": "Enable Instant Commyns", - "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commyns] is ae featur that allous wikis tae uise eemages, soonds n ither media foond oan the [https://commons.wikimedia.org/ Wikimedia Commons] steid.\nIn order tae dae this, MediaWiki needs access til the Internet.\n\nFer mair information oan this featur, incluidin instructions oan hou tae set it up fer wikis ither than the Wikimedia Commons, consult [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] is a featur that allaes wikis tae uise images, soonds an ither media foond on the [https://commons.wikimedia.org/ Wikimedia Commons] steid.\nIn order tae dae this, MediaWiki requires access tae the Internet.\n\nFor mair information on this featur, includin instructions on hou tae set it up for wikis ither nir the Wikimedia Commons, consult [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos the manual].", "config-cc-error": "The Creative Commyns license chuiser gae naw result.\nEnter the license name manually.", "config-cc-again": "Pick again...", "config-cc-not-chosen": "Chuise whit Creative Commyns license ye want an clap oan \"proceed\".", @@ -304,12 +300,12 @@ "config-install-mainpage": "Cræftin main page wi defaut content", "config-install-extension-tables": "Makin buirds fer enabled extensions", "config-install-mainpage-failed": "Coudna insert main page: $1", - "config-install-done": "Congratulations!\nYe'v successfulie instawed MediaWiki.\n\nThe instawer haes generated ae LocalSettings.php file.\nIt contains aw yer confeeguration.\n\nYe'll need tae doonlaid it n pit it in the base o yer wiki instawation (the same directerie aes index.php). The doonlaid shid hae stairted autæmateeclie.\n\nGif the doonlaid wisna affered, or gif ye cancelled it, ye can restairt the doonlaid bi clapin oan the airtin ablo:\n\n$3\n\nMynd: Gif ye dinna dae this the nou, this generated confeeguration file willna be available til ye laiter gif ye exit the instawation wioot doonlaidin it.\n\nWhan that haes been dun, ye can [$2 enter yer wiki].", + "config-install-done": "Congratulations!\nYe hae installed MediaWiki.\n\nThe installer has generatit a LocalSettings.php file.\nIt conteens aw yer configuration.\n\nYe will need tae dounlaid it an put it in the base o yer wiki installation (the same directory as index.php). The dounlaid should hae stairtit automatically.\n\nIf the dounlaid wisna offered, or if ye cancelled it, ye can restairt the dounlaid bi clickin the airtin ablo:\n\n$3\n\nNote: If ye dinna dae this nou, this generatit configuration file will nae be available tae ye later if ye exit the installation wioot dounlaidin it.\n\nWhen that haes been duin, ye can [$2 enter yer wiki].", "config-download-localsettings": "Dounlaid LocalSettings.php", "config-help": "heelp", "config-help-tooltip": "clap tae mak muckler", "config-nofile": "File \"$1\" coudna be foond. Haes it been delytit?", "config-extension-link": "Did ye ken that yer wiki supports [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions extensions]?\n\nYe can brouse [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category extensions bi categorie] or the [https://www.mediawiki.org/wiki/Extension_Matrix Extension Matrix] tae see the full leet o extensions.", - "mainpagetext": "MediaWiki haes been installit wi speed.", + "mainpagetext": "MediaWiki haes been installed.", "mainpagedocfooter": "Consult the [https://meta.wikimedia.org/wiki/Help:Contents/sco Uiser's Guide] fer information oan uisin the wiki saffware.\n\n== Gettin stairtit ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Confeeguration settins leet]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki FAQ]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki release mailin leet]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localise MediaWiki fer yer leid]" } diff --git a/includes/installer/i18n/sk.json b/includes/installer/i18n/sk.json index 45586efa64..1dcd2c1e06 100644 --- a/includes/installer/i18n/sk.json +++ b/includes/installer/i18n/sk.json @@ -11,7 +11,7 @@ "config-title": "InÅ¡talácia MediaWiki $1", "config-information": "Informácie", "config-localsettings-key": "Aktualizačný kľúč:", - "config-localsettings-badkey": "Zadaný kľúč je nesprávny.", + "config-localsettings-badkey": "Zadaný aktualizačný kľúč je nesprávny.", "config-your-language": "Váš jazyk:", "config-your-language-help": "Vyberte jazyk, ktorý chcete použiÅ¥ počas inÅ¡talácie.", "config-wiki-language": "Wiki jazyk:", @@ -51,6 +51,8 @@ "config-missing-db-name": "Musíte zadaÅ¥ hodnotu pre \"{{int:config-db-name}}\".", "config-missing-db-host": "Musíte zadaÅ¥ hodnotu pre \"{{int:config-db-host}}\".", "config-missing-db-server-oracle": "Musíte zadaÅ¥ hodnotu pre \"{{int:config-db-host-oracle}}\".", + "config-site-name": "Názov wiki:", + "config-site-name-blank": "Zadajte názov stránky.", "config-ns-generic": "Projekt", "config-admin-box": "Účet správcu", "config-admin-name": "VaÅ¡e používateľské meno:", diff --git a/includes/installer/i18n/sv.json b/includes/installer/i18n/sv.json index 8f00d98384..829aae4561 100644 --- a/includes/installer/i18n/sv.json +++ b/includes/installer/i18n/sv.json @@ -57,20 +57,14 @@ "config-env-hhvm": "HHVM $1 är installerat.", "config-unicode-using-intl": "Använder [http://pecl.php.net/intl intl PECL-tillägget] för Unicode-normalisering.", "config-unicode-pure-php-warning": "'''Varning:''' [http://pecl.php.net/intl intl PECL-tillägget] är inte tillgängligt för att hantera Unicode-normalisering, faller tillbaka till en lÃ¥ngsamt implementering i ren PHP.\nOm du driver en högtrafikerad webbplats bör du läsa lite om [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode-normalisering].", - "config-unicode-update-warning": "'''Varning:''' Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.", + "config-unicode-update-warning": "Varning: Den installerade versionen av Unicode-normaliserings \"wrappern\" använder en äldre version av [http://site.icu-project.org/ ICU projektets] bibliotek.\nDu bör [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations uppgradera] om är intresserad av att använda Unicode.", "config-no-db": "Kunde inte hitta en lämplig databasdrivrutin! Du mÃ¥ste installera en databasdrivrutin för PHP.\nFöljande databas{{PLURAL:$2|typ |typer}} stöds: $1.\n\nI du själv kompilerat din PHP, konfigurera den med en databasklient aktiverad genom att t.ex. använda ./configure --with-mysqli.\nOm du installerade PHP frÃ¥n ett Debian- eller Ubuntupaket mÃ¥ste du även installera, t.ex. php5-mysql-paketet.", "config-outdated-sqlite": "'''Varning:''' du har SQLite $1, vilket är lägre än minimikravet version $2. SQLite kommer inte att vara tillgänglig.", "config-no-fts3": "'''Varning:''' SQLite kompileras utan [//sqlite.org/fts3.html FTS3-modulen], sökfunktioner kommer att vara otillgängliga pÃ¥ denna backend.", - "config-mbstring": "'''Kritiskt: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] är aktiv!'''\nDetta alternativ orsakar fel och kan korrumpera data oförutsägbart.\nDu kan inte installera eller använda MediaWiki om detta alternativ är aktiverat.", - "config-xml-bad": "PHP:s XML-modul saknas.\nMediaWiki kräver funktioner i denna modul och kommer inte att fungera i den här konfigurationen.\nDu kan behöva installera RPM-paketet för php-xml.", "config-pcre-old": "'''Kritiskt:''' PCRE $1 eller senare krävs.\nDin PHP-binär är länkad till PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Mer information].", "config-pcre-no-utf8": "'''Kritiskt:''' PHP:s PCRE-modul verkar vara kompilerat utan PCRE_UTF8-stöd.\nMediaWiki kräver stöd för UTF-8 för att fungera korrekt.", "config-memory-raised": "PHPs memory_limit är $1, ökad till $2.", "config-memory-bad": "''' Varning:''' PHP:s memory_limit är $1.\nDetta är förmodligen för lÃ¥gt.\nInstallationen kan misslyckas!", - "config-ctype": "'''Kritiskt:''' PHP mÃ¥ste kompileras med stöd för [http://www.php.net/manual/en/ctype.installation.php Ctype-tillägget].", - "config-iconv": "Kritiskt: PHP mÃ¥ste kompileras med stöd för [http://www.php.net/manual/en/iconv.installation.php iconv-tillägget].", - "config-json": "'''Varning:''' PHP kompilerades utan JSON-stöd.\nDu mÃ¥ste antingen installera PHP JSON-tillägget eller [http://pecl.php.net/package/jsonc PECL jsonc]-tillägget före installationen av MediaWiki.\n* PHP-tillägget är inkluderat i Red Hat Enterprise Linux (CentOS) 5 och 6, men mÃ¥ste aktiveras i /etc/php.ini eller /etc/php.d/json.ini.\n* Vissa Linux-distributioner släppta efter maj 2013 har utelämnat PHP-tillägget och har istället inkluderat PECL-tillägget som php5-json eller php-pecl-jsonc.", - "config-mbstring-absent": "'''Kritiskt:''' PHP mÃ¥ste kompileras med stöd för tillägget [http://www.php.net/manual/en/mbstring.setup.php mbstring mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] är installerat", "config-apc": "[http://www.php.net/apc APC] är installerat", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] är installerat", @@ -86,7 +80,7 @@ "config-no-cli-uri": "'''Varning:''' Ingen --scriptpath är angiven, använder standarden: $1 .", "config-using-server": "Använder servernamn \"$1\".", "config-using-uri": "Använder server-URL \"$1$2\".", - "config-uploads-not-safe": "'''Varning:''' Din standardkatalog för uppladdningar $1 är sÃ¥rbar för körning av godtyckliga skript.\nÄven om MediaWiki kontrollerar alla uppladdade filer för säkerhetshot är det ändÃ¥ starkt rekommenderat att [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security stänga detta säkerhetshÃ¥l] innan du aktiverar uppladdningar.", + "config-uploads-not-safe": "Varning: Din standardkatalog för uppladdningar $1 är sÃ¥rbar för körning av godtyckliga skript.\nÄven om MediaWiki kontrollerar alla uppladdade filer för säkerhetshot är det ändÃ¥ starkt rekommenderat att [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Security#Upload_security stänga detta säkerhetshÃ¥l] innan du aktiverar uppladdningar.", "config-no-cli-uploads-check": "'''Varning:''' Din standardkatalog för uppladdningar ($1) har inte kontrollerats för sÃ¥rbarhet frÃ¥n körning av godtyckliga skript under CLI-installationen.", "config-brokenlibxml": "Ditt system har en kombination av PHP och libxml2 som är buggigt och kan orsaka datakorruption i MediaWiki och andra webbprogram.\nUppgradera till libxml2 2.7.3 eller senare ([https//bugs.php.net/bug.php?id=45996 buggfil med PHP]).\nInstallationen avbröts.", "config-suhosin-max-value-length": "Suhosin är installerat och begränsar GET-parametern length till $1 bytes.\nMediaWikis ResourceLoader-komponent kommer att arbeta runt denna begränsning, men det kommer att försämra prestandan.\nOm möjligt bör du sätta suhosin.get.max_value_length till 1024 eller högre i php.ini, och sätta $wgResourceLoaderMaxQueryLength till samma värde som i LocalSettings.php.", @@ -311,6 +305,7 @@ "config-install-extension-tables": "Skapar tabeller för aktiverade tillägg", "config-install-mainpage-failed": "Kunde inte infoga huvudsidan: $1", "config-install-done": "Grattis!\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen LocalSettings.php.\nDet innehÃ¥ller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i roten för din wiki-installation (samma katalog som index.php). Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka pÃ¥ länken nedan:\n\n$3\n\nOBS: Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du [$2 gÃ¥ in pÃ¥ din wiki]", + "config-install-done-path": "Grattis!\nDu har installerat MediaWiki.\n\nInstallationsprogrammet har genererat filen LocalSettings.php.\nDet innehÃ¥ller alla dina konfigurationer.\n\nDu kommer att behöva ladda ner den och placera den i $4. Nedladdningen borde ha startats automatiskt.\n\nOm ingen nedladdning erbjöds, eller om du har avbrutit det kan du starta om nedladdningen genom att klicka pÃ¥ länken nedan:\n\n$3\n\nOBS: Om du inte gör detta nu, kommer denna genererade konfigurationsfil inte vara tillgänglig för dig senare om du avslutar installationen utan att ladda ned den.\n\nNär det är klart, kan du [$2 gÃ¥ in pÃ¥ din wiki]", "config-download-localsettings": "Ladda ner LocalSettings.php", "config-help": "hjälp", "config-help-tooltip": "klicka för att expandera", diff --git a/includes/installer/i18n/tl.json b/includes/installer/i18n/tl.json index f08994d901..2ba2c27137 100644 --- a/includes/installer/i18n/tl.json +++ b/includes/installer/i18n/tl.json @@ -18,7 +18,7 @@ "config-localsettings-badkey": "Hindi tama ang susing ibinigay mo.", "config-upgrade-key-missing": "Napansin ang isang umiiral na pagtatalaga ng MediaWiki.\nUpang isapanahon ang katalagahang ito, mangyaring ilagay ang sumusunod na guhit sa ilalim ng iyong LocalSettings.php:\n\n$1", "config-localsettings-incomplete": "Lumilitaw na hindi pa buo ang umiiral na LocalSettings.php.\nAng pabagu-bagong $1 ay hindi nakatakda.\nMangyaring baguhin ang LocalSettings.php upang ang maitakda ang pagpapabagu-bagong ito, at pindutin ang \"{{int:Config-continue}}\".", - "config-localsettings-connection-error": "Isang kamalian ang nakatagpo noong kumakabit sa kalipunan ng dato na ginagamit ang tinukoy na mga katakdaan sa loob ng LocalSettings.php o\nAdminSettings.php. Paki kumpunihin ang mga katakdaang ito at subukang muli.\n\n$1", + "config-localsettings-connection-error": "Isang kamalian ang nakatagpo noong kumakabit sa kalipunan ng dato na ginagamit ang tinukoy na mga katakdaan sa loob ng LocalSettings.php o\nLocalSettings.php. Paki kumpunihin ang mga katakdaang ito at subukang muli.\n\n$1", "config-session-error": "Kamalian sa pagsisimula ng sesyon: $1", "config-session-expired": "Tila nagwakas na ang inilaan sa iyong panahon ng dato.\nAng inilaang mga panahon ay iniayos para sa isang panahon ng buhay na $1.\nMapapataas mo ito sa pamamagitan ng pagtatakda ng session.gc_maxlifetime sa loob ng php.ini.\nMuling simulan ang proseso ng pagluluklok.", "config-no-session": "Nawala ang iyong datos ng sesyon!\nSuriin ang iyong php.ini at tiyakin na ang session.save_path ay nakatakda sa angkop na direktoryo.", @@ -57,12 +57,9 @@ "config-no-db": "Hindi matagpuan ang isang angkop na tagapagmaneho ng kalipunan ng datos! Kailangan mong magluklok ng isang tagapagmaneho ng kalipunan ng dato para sa PHP.\nTinatangkilik ang sumusunod na mga uri ng kalipunan ng dato: $1.\n\nKung ikaw ay nasa isang pinagsasaluhang pagpapasinaya, hilingin sa iyong tagapagbigay ng pagpapasinaya na iluklok ang isang angkop na tagapagmaneho ng kalipunan ng dato.\nKung ikaw mismo ang nangalap ng PHP, muling isaayos ito na pinagagana ang isang kliyente ng kalipunan ng dato, halimbawa na ang paggamit ng ./configure --with-mysql.\nKung iniluklok mo ang PHP mula sa isang pakete ng Debian o Ubuntu, kung gayon kailangan mo ring magluklok ng modyul na php5-mysql.", "config-outdated-sqlite": "'''Babala''': mayroong kang $1 ng SQLite, na mas mababa kaysa sa pinaka mababang kailangang bersiyon na $2. Magiging hindi makukuha ang SQLite.", "config-no-fts3": "'''Warning''': Ang SQLite ay hindi itinala at tinipon na wala ang [//sqlite.org/fts3.html modulong FTS3], ang mga tampok na panghanap ay magiging hindi makukuha sa ibabaw ng panlikod na dulong ito.", - "config-mbstring": "'''Malubha: Masigla ang [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]!'''\nAng napiling ito ay nagdurulot ng mga kamalian at maaaring sumira nang hindi nahuhulaan ang dato.\nHindi mo maaaring iluklok o gamitin ang MediaWiki maliban na lamang kung hindi na pinagagana ang napiling ito.", - "config-xml-bad": "Nawawala ang modulong XML ng PHP.\nNangangailangan ang MediaWiki ng mga tungkulin sa loob ng modulong ito at hindi aandar sa loob ng ganitong pagkakaayos.\nKung pinapatakbo mo ang Mandrake, iluklok ang pakete ng php-xml.", "config-pcre-no-utf8": "'''Malubha''': Tila tinipon ang modyul na PCRE ng PHP na wala ang suporta ng PCRE_UTF8.\nNangangailangan ang MediaWiki ng suporta ng UTF-8 upang maging tama ang pag-andar.", "config-memory-raised": "Ang hangganan_ng_alaala ng PHP ay $1, itinaas sa $2.", "config-memory-bad": "'''Babala:''' Ang hangganan_ng_alaala ng PHP ay $1.\nIto ay maaaring napakababa.\nMaaaring mabigo ang pagluluklok!", - "config-ctype": "'''Maluba''': Dapat na tipunin ang PHP na mayroong suporta para sa [http://www.php.net/manual/en/ctype.installation.php dugtong Ctype].", "config-xcache": "Ininstala na ang [http://xcache.lighttpd.net/ XCache]", "config-apc": "Ininstala na ang [http://www.php.net/apc APC]", "config-wincache": "Ininstala na ang [http://www.iis.net/download/WinCacheForPhp WinCache]", diff --git a/includes/installer/i18n/tr.json b/includes/installer/i18n/tr.json index b76a483068..823b1ba64f 100644 --- a/includes/installer/i18n/tr.json +++ b/includes/installer/i18n/tr.json @@ -66,12 +66,9 @@ "config-unicode-pure-php-warning": "Uyarı: [http://pecl.php.net/intl intl PECL uzantısı] Unicode normalizasyonunu kaldırabilecek şekilde müsait değil; bu yüzden sayfa saf PHP uygulamasına dönüyor. Yüksek trafik alan bir sayfa çalıştırıyorsanız, [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations Unicode normalizasyonu] ile ilgili biraz bilgi almalısınız.", "config-outdated-sqlite": "Uyarı: Elinizde SQLite $1 var. Gerekli minimum sürüm: $2. SQLite kullanılamayacaktır.", "config-no-fts3": "Uyarı: SQLite [//sqlite.org/fts3.html FTS3 modülü] olmadan derlendi, bu arkayüzde arama özellikleri kullanılamayacaktır.", - "config-xml-bad": "PHP 'nin XML modülü eksik.\nMediaWiki bu modüldeki fonksiyonlara ihtiyaç duyar ve şimdiki kurulumda çalışmayacaktır.\nPhp-xml RPM paketini yüklemeniz gerekebilir.", "config-pcre-old": "Ağır hata: PCRE $1 veya daha üst versiyon gerekli.\nSizin PHP kurulumunuz PCRE $2 ile bağlı.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Daha fazla bilgi].", "config-memory-raised": "PHP'nin memory_limit (hafıza sınırı) değeri $1, $2'ye yükseltildi.", "config-memory-bad": "Uyarı: PHP'nin memory_limit (hafıza sınırı) değeri $1.\nBu büyük ihtimalle çok düşük.\nKurulum başarısız olabilir!", - "config-ctype": "Ölümcül: PHP [http://www.php.net/manual/en/ctype.installation.php Ctype uzantısı] desteği ile beraber derlenmelidir.", - "config-iconv": "Ölümcül: PHP [http://www.php.net/manual/en/iconv.installation.php iconv uzantısı] desteği ile beraber derlenmelidir.", "config-xcache": "[http://xcache.lighttpd.net/ XCache] kurulu", "config-apc": "[http://www.php.net/apc APC] kurulu", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] kurulu", diff --git a/includes/installer/i18n/uk.json b/includes/installer/i18n/uk.json index 24f4588a0b..8bc18b0b7b 100644 --- a/includes/installer/i18n/uk.json +++ b/includes/installer/i18n/uk.json @@ -64,16 +64,10 @@ "config-no-db": "Не вдалося знайти потрібний драйвер бази даних! Вам необхідно встановити драйвер бази даних для PHP. Підтримуються {{PLURAL:$2|такий тип|такі типи}} баз даних: $1.\n\nЯкщо ви скомпілювали PHP самостійно, переналаштуйте його з увімкненим клієнтом бази даних, наприклад за допомогою ./configure --with-mysqli.\n\nЯкщо установлено PHP з пакетів Debian або Ubuntu, тоді ви також повинні встановити, наприклад, пакунок php5-mysql.", "config-outdated-sqlite": "'''Увага''': у Вас встановлена версія SQLite $1, а це нижче, ніж мінімально необхідна версія $2. SQLite буде недоступним.", "config-no-fts3": "'''Увага''': SQLite зібраний без [//sqlite.org/fts3.html модуля FTS3], функції пошуку не будуть працювати у цій системі.", - "config-mbstring": "'''Проблема: Опція PHP [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] увімкнена!'''\nЦя опція призводить до непередбачуваного пошкодження даних.\nВи не можете встановити і використовувати MediaWiki, поки не буде вимкнено цю опцію.", - "config-xml-bad": "XML-модуть PHP відсутній.\nMediaWiki необхідні його функції, без цього модуля вона працювати не буде.\nВам може знадобитися встановити php-xml RPM пакет.", "config-pcre-old": "'''Фатальна помилка:''' потрібно PCRE версії $1 або пізнішої.\nВаш виконуваний файл PHP пов'язаний з PCRE версії $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Подробиці].", "config-pcre-no-utf8": "'''Помилка''': PCRE-модуть PHP, вочевидь, було зібрано без підтримки PCRE_UTF8.\nMediaWiki вимагає підтримку UTF-8 для коректної роботи.", "config-memory-raised": "Обмеження пам'яті PHP (memory_limit) $1, піднято до $2.", "config-memory-bad": "'''Увага:''' Розмір пам'яті PHP (memory_limit) становить $1.\nІмовірно, це замало.\nВстановлення може не вдатись!", - "config-ctype": "'''Помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/ctype.installation.php розширення Ctype].", - "config-iconv": "'''Фатальна помилка''': PHP має бути зібраним з підтримкою [http://www.php.net/manual/en/iconv.installation.php розширення iconv].", - "config-json": "'''Fatal:''' PHP був скомпільований без підтримки JSON.\nВам потрібно встановити або розширення PHP JSON або розширення[http://pecl.php.net/package/jsonc PECL jsonc] перед встановлення Медіавікі.\n* Розширення PHP включено у Red Hat Enterprise Linux (CentOS) 5 та 6, хоча має бути доступним у /etc/php.ini або /etc/php.d/json.ini.\n* Деякі дистрибутиви Лінукса, випущені після травня 2013, пропустили розширення PHP, натомість упакували розширення PECL як php5-json або php-pecl-jsonc.", - "config-mbstring-absent": "Фатальна помилка: PHP має бути скомпільовано з підтримкою [http://www.php.net/manual/en/mbstring.setup.php розширення mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] встановлено", "config-apc": "[http://www.php.net/apc APC] встановлено", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] встановлено", @@ -252,7 +246,7 @@ "config-logo": "URL логотипу:", "config-logo-help": "Стандартна схема оформлення MediaWiki містить вільне для логотипу місце над бічною панеллю розміром 135x160 пікселів.\n\nЗавантажте зображення відповідного розміру і введіть тут його URL.\n\nВи можете використати $wgStylePath або $wgScriptPath, якщо ваш логотип пов'язаний з цими шляхами.\n\nЯкщо Вам не потрібен логотип, залиште це поле пустим.", "config-instantcommons": "Увімкнути Instant Commons", - "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] це функція, що дозволяє вікі використовувати зображення, звуки та інші медіа, розміщені на [https://commons.wikimedia.org/ Вікісховищі].\nДля цього MediaWiki необхідний доступ до інтернету.\n\nДодаткову інформацію стосовно цієї функції, включаючи інструкції, як її увімкнути у вікі, відмінних від Вікісховища, дивіться у [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos посібнику].", + "config-instantcommons-help": "[https://www.mediawiki.org/wiki/InstantCommons Instant Commons] — це функція, що дозволяє вікі використовувати зображення, звуки та інші медіа, розміщені у [https://commons.wikimedia.org/ Вікісховищі].\nДля цього MediaWiki необхідний доступ до інтернету.\n\nДодаткову інформацію стосовно цієї функції, включаючи інструкції, як її увімкнути у вікі, відмінних від Вікісховища, дивіться у [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgForeignFileRepos посібнику].", "config-cc-error": "Механізм вибору ліцензії Creative Commons не дав результатів.\nВведіть назву ліцензії вручну.", "config-cc-again": "Виберіть знову ...", "config-cc-not-chosen": "Оберіть, яку ліцензію Creative Commons Ви хочете використовувати, і натисніть \"proceed\".", @@ -314,11 +308,12 @@ "config-install-extension-tables": "Створення таблиць для увімкнених розширень", "config-install-mainpage-failed": "Не вдається вставити головну сторінку: $1", "config-install-done": "Вітаємо!\nВи успішно встановили MediaWiki.\n\nІнсталятор згенерував файл LocalSettings.php, який містить усі Ваші налаштування.\n\nВам необхідно завантажити його і помістити у кореневу папку Вашої вікі (туди ж, де index.php). Завантаження мало початись автоматично.\n\nЯкщо завантаження не почалось або Ви його скасували, можете заново його почати, натиснувши на посилання внизу:\n\n$3\n\nПримітка: Якщо Ви не зробите цього зараз, цей файл не буде доступним пізніше, коли Ви вийдете з встановлення, не скачавши його.\n\nПісля виконання дій, описаних вище, Ви зможете [$2 увійти у свою вікі].", + "config-install-done-path": "Вітаємо!\nВи встановили Медіавікі.\n\nІнсталятор створив файл LocalSettings.php.\nУ ньому містяться всі Ваші налаштування.\n\nВам потрібно завантажити його й помістити в $4. Завантаження повинно було автоматично розпочатись.\n\nЯкщо завантаження не було запропоновано, або Ви його скасували, Ви можете перезапустити завантаження натиснувши на посилання нижче:\n\n$3\n\nЗверніть увагу: Якщо Ви не зробите це зараз, цей згенерований файл налаштувань не буде доступним для Вас пізніше якщо Ви вийдете зі встановлення не завантаживши його.\n\nКоли це було зроблено Ви можете [$2 зайти до своєї вікі].", "config-download-localsettings": "Завантажити LocalSettings.php", "config-help": "допомога", "config-help-tooltip": "натисніть, щоб розгорнути", "config-nofile": "Файл \"$1\" не знайдено. Його видалено?", "config-extension-link": "Чи знаєте ви, що ваше вікі підтримує [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions розширення]?\n\nВи можете переглядати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category розширення по категорії] або в [https://www.mediawiki.org/wiki/Extension_Matrix матрицю розширень] щоб побачити повний список розширень.", "mainpagetext": "Програмне забезпечення «MediaWiki» встановлено.", - "mainpagedocfooter": "Інформацію про роботу з цією вікі можна знайти в [https://meta.wikimedia.org/wiki/Help:Contents посібнику користувача].\n\n== Деякі корисні ресурси ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список налаштувань];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Часті питання з приводу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розсилка повідомлень про появу нових версій MediaWiki];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локалізуйте MediaWiki своєю мовою]" + "mainpagedocfooter": "Інформацію про роботу з цією вікі можна знайти в [https://meta.wikimedia.org/wiki/Help:Contents посібнику користувача].\n\n== Деякі корисні ресурси ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список налаштувань];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Часті питання з приводу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розсилка повідомлень про появу нових версій MediaWiki];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локалізувати MediaWiki своєю мовою]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Дізнатися, як боротися зі спамом у своїй вікі]" } diff --git a/includes/installer/i18n/vi.json b/includes/installer/i18n/vi.json index 0225fae3f3..f2f56d0803 100644 --- a/includes/installer/i18n/vi.json +++ b/includes/installer/i18n/vi.json @@ -58,16 +58,10 @@ "config-no-db": "Không tìm thấy một trình điều khiển cÆ¡ sở dữ liệu phù hợp! Bạn cần phải cài một trình điều khiển cÆ¡ sở dữ liệu cho PHP.\n{{PLURAL:$2|Loại|Các loại}} cÆ¡ sở dữ liệu sau đây được hỗ trợ: $1.\n\nNếu bạn đã biên dịch PHP lấy, cấu hình lại nó mà kích hoạt một trình khách cÆ¡ sở dữ liệu, ví dụ bằng lệnh ./configure --with-mysqli.\nNếu bạn đã cài PHP từ một gói Debian hoặc Ubuntu, thì bạn cÅ©ng cần phải cài ví dụ gói php5-mysql.", "config-outdated-sqlite": "Chú ý: Bạn có SQLite $1, phiên bản này thấp hÆ¡n phiên bản yêu câu tối thiểu $2. SQLite sẽ không có tác dụng.", "config-no-fts3": "Chú ý: SQLite được biên dịch mà không có [//sqlite.org/fts3.html mô đun FTS3], nên các chức năng tìm kiếm sẽ bị vô hiệu trên hệ thống phía sau này.", - "config-mbstring": "Lỗi chí tá»­: [http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] được kích hoạt!\nTùy chọn này gây lỗi và có thể làm hỏng dữ liệu một cách không thể đoán trước.\nBạn không thể cài đặt hoặc sá»­ dụng MediaWiki trừ phi tùy chọn này bị vô hiệu.", - "config-xml-bad": "Mô đun XML của PHP đang bị thiếu.\nMediaWiki yêu cầu các hàm trong mô đun này và sẽ không hoạt động trong cấu hình này.\nBạn có thể cần cài đặt gói RPM php-xml.", "config-pcre-old": "Lỗi chí tá»­: PCRE $1 trở lên được yêu cầu phải có.\nBản nhị phân PHP của bạn dang được liên kết với PCRE $2.\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE Thông tin bổ sung].", "config-pcre-no-utf8": "Lỗi chí tá»­: Mô đun PCRE của PHP dường nhÆ° được biên dịch mà không có hỗ trợ PCRE_UTF8.\nMediaWiki yêu cầu phải có hỗ trợ UTF-8 để hoạt động chính xác.", "config-memory-raised": "memory_limit của PHP là $1, tăng lên $2.", "config-memory-bad": "Cảnh báo: memory_limit của PHP là $1.\nGiá trị này có lẽ quá thấp.\nCài đặt có thể bị thất bại!", - "config-ctype": "Lỗi chí tá»­: PHP phải được biên dịch với hỗ trợ cho [http://www.php.net/manual/en/ctype.installation.php phần mở rộng Ctype].", - "config-iconv": "Lỗi chí tá»­: PHP phải được biên dịch với hỗ trợ cho [http://www.php.net/manual/en/iconv.installation.php phần mở rộng iconv].", - "config-json": "Lỗi chí tá»­: PHP được biên dịch mà không có hỗ trợ cho JSON.\nBạn phải cài đặt hoặc phần mở rộng JSON PHP hoặc phần mở rộng [http://pecl.php.net/package/jsonc PECL jsonc] trước khi cài đặt MediaWiki.\n* Phần mở rộng PHP có sẵn trong Red Hat Enterprise Linux (CentOS) 5 và 6 nhÆ°ng phải được kích hoạt trong /etc/php.ini hoặc /etc/php.d/json.ini.\n* Một số phiên bản Linux được phát hành sau tháng 5 năm 2013 bỏ qua phần mở rộng PHP và gói lại phần mở rộng PECL là php5-json hoặc php-pecl-jsonc thay thế.", - "config-mbstring-absent": "Lỗi chí tá»­: PHP phải được biên dịch với hỗ trợ cho [http://www.php.net/manual/en/mbstring.setup.php phần mở rộng mbstring].", "config-xcache": "[http://xcache.lighttpd.net/ XCache] đã được cài đặt", "config-apc": "[http://www.php.net/apc APC] đã được cài đặt", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] đã được cài đặt", @@ -308,6 +302,7 @@ "config-install-extension-tables": "Đang tạo bảng cho các phần mở rộng được kích hoạt", "config-install-mainpage-failed": "Không thể chèn trang đầu: $1", "config-install-done": "Xin chúc mừng!\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin LocalSettings.php.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó trong thÆ° mục cài đặt wiki của bạn (cùng thÆ° mục với index.php). Việc tải về có lẽ sẽ được khởi động tá»± động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\nLÆ°u ý: Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể [$2 truy cập trang wiki của bạn].", + "config-install-done-path": "Xin chúc mừng!\nBạn đã cài đặt MediaWiki.\n\nBộ cài đặt đã tạo ra một tập tin LocalSettings.php.\nTập tin này chứa tất cả các cấu hình của bạn.\n\nBạn sẽ cần phải tải nó về và đặt nó tại $4. Việc tải về có lẽ sẽ được khởi động tá»± động.\n\nNếu bản tải về không được cung cấp, hoặc nếu bạn hủy bỏ nó, bạn có thể khởi động lại tải về bằng cách nhấn vào liên kết dưới đây:\n\n$3\n\nLÆ°u ý: Nếu bạn không làm điều này ngay bây giờ, điều này sẽ tạo ra tập tin cấu hình sẽ không có giá trị cho bạn sau này nếu bạn thoát khỏi trình cài đặt mà không tải nó về.\n\nKhi đã việc tải về đã hoàn thành, bạn có thể [$2 truy cập trang wiki của bạn].", "config-download-localsettings": "Tải về LocalSettings.php", "config-help": "Trợ giúp", "config-help-tooltip": "nhấn chuột để mở rộng", diff --git a/includes/installer/i18n/wuu.json b/includes/installer/i18n/wuu.json index 57116ffe53..8b8d02daad 100644 --- a/includes/installer/i18n/wuu.json +++ b/includes/installer/i18n/wuu.json @@ -8,6 +8,6 @@ }, "config-information": "信息", "config-page-language": "闲话", - "mainpagetext": "'''MediaWiki安装成功哉!'''", + "mainpagetext": "MediaWiki安装好哉。", "mainpagedocfooter": "请访问[https://meta.wikimedia.org/wiki/Help:Contents 用户手册]以获得使用此维基软件个信息!\n\n== 入门 ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings MediaWiki 配置设置列表]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常见问题解答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 发布邮件列表]" } diff --git a/includes/installer/i18n/zh-hans.json b/includes/installer/i18n/zh-hans.json index 20afffe9f3..07e1fc370d 100644 --- a/includes/installer/i18n/zh-hans.json +++ b/includes/installer/i18n/zh-hans.json @@ -74,16 +74,10 @@ "config-no-db": "无法找到合适的数据库驱动!您需要为PHP安装数据库驱动。目前支持以下数据库{{PLURAL:$2|类型}}:$1。\n\n如果您自己编译了PHP,请通过启用数据库客户端重新配置它,例如使用 ./configure --with-mysqli。如果您从 Debian 或 Ubuntu 安装包安装了PHP,那么您也需要安装,例如 php5-mysql 安装包。", "config-outdated-sqlite": "警告:您已安装SQLite $1,但是它的版本低于最低要求版本$2。因此您无法选择SQLite。", "config-no-fts3": "警告:已编译的SQLite不包含[//sqlite.org/fts3.html FTS3模块],后台搜索功能将不可用。", - "config-mbstring": "致命错误:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload]已启用!\n此选项会导致错误并不可预测地破坏数据,请将其禁用,否则您将不能安装或使用MediaWiki。", - "config-xml-bad": "缺少PHP的XML模块。MediaWiki需要使用该模块提供的函数,在当前配置下将无法工作。您可能需要安装php-xml RPM包。", "config-pcre-old": "致命错误:需要PCRE $1 或更高版本。\n您的 PHP 二进制文件与 PCRE $2 链接。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 详细信息]。", "config-pcre-no-utf8": "致命错误:PHP的PCRE模块在编译时可能没有包含PCRE_UTF8支持。\nMediaWiki需要UTF-8支持才能正常工作。", "config-memory-raised": "PHP的内存使用上限memory_limit为$1,自动提升到$2。", "config-memory-bad": "警告:PHP的内存使用上限memory_limit为$1。\n该设定可能过低,并导致安装失败!", - "config-ctype": "致命错误:PHP必须有[http://www.php.net/manual/en/ctype.installation.php Ctype 扩展]来支持编译。", - "config-iconv": "致命错误:PHP必须编译支持[http://www.php.net/manual/en/iconv.installation.php iconv拓展]。", - "config-json": "致命错误:PHP编译没有附带JSON支持。\n在安装MediaWiki前,你必须安装PHP JSON扩展或者[http://pecl.php.net/package/jsonc PECL jsonc]扩展。\n* PHP扩展已包含在Red Hat Enterprise Linux (CentOS) 5和6中,但必须在/etc/php.ini或/etc/php.d/json.ini中启用。\n* 部分在2013å¹´5月后发行的Linux发行版省略了PHP扩展,而将PECL扩展打包成了php5-json或php-pecl-jsonc。", - "config-mbstring-absent": "致命错误:PHP必须有[http://www.php.net/manual/en/mbstring.setup.php mbstring扩展]来支持编译。", "config-xcache": "[http://xcache.lighttpd.net/ XCache]已安装", "config-apc": "[http://www.php.net/apc APC]已安装", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache]已安装", @@ -293,7 +287,7 @@ "config-install-extensions": "正在包含扩展程序", "config-install-database": "正在配置数据库", "config-install-schema": "创建架构", - "config-install-pg-schema-not-exist": "PostgreSQL 架构不存在", + "config-install-pg-schema-not-exist": "PostgreSQL 架构不存在。", "config-install-pg-schema-failed": "创建数据表失败。请确保用户“$1”拥有写入模式“$2”的权限。", "config-install-pg-commit": "正在提交更改", "config-install-pg-plpgsql": "正在检查PL/pgSQL语言", @@ -324,6 +318,7 @@ "config-install-extension-tables": "正在创建已启用扩展程序表", "config-install-mainpage-failed": "无法插入首页:$1", "config-install-done": "恭喜!\n您已经安装了MediaWiki。\n\n安装程序已经生成了LocalSettings.php文件,其中包含了您所有的配置。\n\n您需要下载该文件,并将其放在您wiki的根目录(index.php的同级目录)中。稍后下载将自动开始。\n\n如果浏览器没有提示您下载,或者您取消了下载,您可以点击下面的链接重新开始下载:\n\n$3\n\n注意:如果您现在不完成本步骤,而是没有下载便退出了安装过程,此后您将无法获得自动生成的配置文件。\n\n当本步骤完成后,您可以[$2 进入您的wiki]。", + "config-install-done-path": "祝贺!您已经安装了MediaWiki。\n\n安装程序已经生成了LocalSettings.php文件。它包含您所有的配置。\n\n您需要下载该文件,并将其放在$4。下载应已自动开始。\n\n如果没有提供下载,或者您取消了下载,您可以点击下面的链接重新开始下载:\n\n$3\n\n注意:如果您现在不完成本步骤,而是没有下载便退出了安装过程,此后您将无法获得自动生成的配置文件。\n\n当本步骤完成后,您可以[$2 进入您的wiki]。", "config-download-localsettings": "下载LocalSettings.php", "config-help": "帮助", "config-help-tooltip": "单击展开", diff --git a/includes/installer/i18n/zh-hant.json b/includes/installer/i18n/zh-hant.json index a0eeac5a09..53d001e13e 100644 --- a/includes/installer/i18n/zh-hant.json +++ b/includes/installer/i18n/zh-hant.json @@ -67,15 +67,10 @@ "config-no-db": "找不到合適的資料庫驅動程式!您需要安裝 PHP 資料庫驅動程式。\n目前支援以下{{PLURAL:$2|類型|類型}}的資料庫: $1 。\n\n如果您是自行編譯 PHP,您必須重新設定並開啟資料庫客戶端,例:使用 ./configure --with-mysqli 指令參數。\n如果您是使用 Debian 或 Ubuntu 的套件安裝 PHP ,您則需要額外安裝,例:php5-mysql 套件。", "config-outdated-sqlite": "警告:您已安裝 SQLite $1,但是它的版本低於最低需求版本 $2。 因此您無法使用 SQLite。", "config-no-fts3": "警告: SQLite 編譯時未包含 [//sqlite.org/fts3.html FTS3 模組],後台搜尋功能將無法使用。", - "config-mbstring": "嚴重:[http://www.php.net/manual/en/ref.mbstring.php#mbstring.overload mbstring.func_overload] 選項被開啟!\n此選項會導致資料在無法預測的情況下損壞。\n您必須將開選項關閉方可繼續安裝 MediaWiki。", - "config-xml-bad": "PHP 缺少的 XML 模組。\nMediaWiki 需要使用此模組中所提供的函數,且在目前的設定下將無法繼續作業。\n您可能需要安裝 php-xml RPM 套件。", "config-pcre-old": "嚴重: 需要使用 PCRE $1 或更新的版本。\n您的 PHP 執行檔使用的是 PCRE $2。\n[https://www.mediawiki.org/wiki/Manual:Errors_and_symptoms/PCRE 詳細資訊]。", "config-pcre-no-utf8": "嚴重: PHP 的 PCRE 模組在編譯時未包含 PCRE_UTF8 支援。\nMediaWiki 需要支援 UTF-8 才可正常運作。", "config-memory-raised": "PHP 的記憶體使用上限 memory_limit 目前為 $1,自動提高到 $2。", "config-memory-bad": "警告:PHP 的記憶體使用上限 memory_limit 為 $1。\n該設定值可能過低。\n這可能導致後續的安裝失敗!", - "config-ctype": "嚴重: PHP 編譯時必須包含 [http://www.php.net/manual/en/ctype.installation.php Ctype 擴充套件]。", - "config-iconv": "嚴重:PHP 編譯時必須包含 [http://www.php.net/manual/en/iconv.installation.php iconv 擴充套件]。", - "config-json": "嚴重: PHP 編譯時並未包含 JSON 擴充套件。\n在 MediaWiki 繼續安裝之前您必須先安裝 PHP JSON 擴充套件或 [http://pecl.php.net/package/jsonc PECL jsonc] 擴充套件。\n* æ­¤ PHP 擴充套件在 Red Hat Enterprice Linux (CentOS) 5 版與 6 版以有內含,須於 /etc/php.ini 或 /etc/php.d/json.ini 設定檔將該項目開啟。\n* 部分於 2013 å¹´ 5 月以後發佈的 Linux 並沒有此 PHP 擴充套件,可透過安裝 PECL 擴充套件 php5-json 或 php-pecl-jsonc 替代。", "config-xcache": "[http://xcache.lighttpd.net/ XCache] 已安裝", "config-apc": "[http://www.php.net/apc APC] 已安裝", "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] 已安裝", diff --git a/includes/jobqueue/jobs/DeleteLinksJob.php b/includes/jobqueue/jobs/DeleteLinksJob.php index e5357cec53..ca5d534f40 100644 --- a/includes/jobqueue/jobs/DeleteLinksJob.php +++ b/includes/jobqueue/jobs/DeleteLinksJob.php @@ -48,8 +48,10 @@ class DeleteLinksJob extends Job { return false; } + $timestamp = isset( $this->params['timestamp'] ) ? $this->params['timestamp'] : null; + $page = WikiPage::factory( $this->title ); // title when deleted - $update = new LinksDeletionUpdate( $page, $pageId ); + $update = new LinksDeletionUpdate( $page, $pageId, $timestamp ); DataUpdate::runUpdates( [ $update ] ); return true; diff --git a/includes/jobqueue/jobs/DoubleRedirectJob.php b/includes/jobqueue/jobs/DoubleRedirectJob.php index c6d8ec5920..3cd3448f54 100644 --- a/includes/jobqueue/jobs/DoubleRedirectJob.php +++ b/includes/jobqueue/jobs/DoubleRedirectJob.php @@ -179,7 +179,8 @@ class DoubleRedirectJob extends Job { * * @param Title $title * - * @return bool If the specified title is not a redirect, or if it is a circular redirect + * @return Title|bool The final Title after following all redirects, or false if + * the page is not a redirect or the redirect loops. */ public static function getFinalDestination( $title ) { $dbw = wfGetDB( DB_MASTER ); diff --git a/includes/jobqueue/jobs/HTMLCacheUpdateJob.php b/includes/jobqueue/jobs/HTMLCacheUpdateJob.php index 7acbdf2a05..a14cdd7bab 100644 --- a/includes/jobqueue/jobs/HTMLCacheUpdateJob.php +++ b/includes/jobqueue/jobs/HTMLCacheUpdateJob.php @@ -102,18 +102,15 @@ class HTMLCacheUpdateJob extends Job { return; } - // The page_touched field will need to be bumped for these pages. - // Only bump it to the present time if no "rootJobTimestamp" was known. - // If it is known, it can be used instead, which avoids invalidating output - // that was in fact generated *after* the relevant dependency change time - // (e.g. template edit). This is particularily useful since refreshLinks jobs - // save back parser output and usually run along side htmlCacheUpdate jobs; - // their saved output would be invalidated by using the current timestamp. - if ( isset( $this->params['rootJobTimestamp'] ) ) { - $touchTimestamp = $this->params['rootJobTimestamp']; - } else { - $touchTimestamp = wfTimestampNow(); - } + // Bump page_touched to the current timestamp. This used to use the root job timestamp + // (e.g. template/file edit time), which was a bit more efficient when template edits are + // rare and don't effect the same pages much. However, this way allows for better + // de-duplication, which is much more useful for wikis with high edit rates. Note that + // RefreshLinksJob, which is enqueued alongside HTMLCacheUpdateJob, saves the parser output + // since it has to parse anyway. We assume that vast majority of the cache jobs finish + // before the link jobs, so using the current timestamp instead of the root timestamp is + // not expected to invalidate these cache entries too often. + $touchTimestamp = wfTimestampNow(); $dbw = wfGetDB( DB_MASTER ); // Update page_touched (skipping pages already touched since the root job). diff --git a/includes/jobqueue/jobs/RefreshLinksJob.php b/includes/jobqueue/jobs/RefreshLinksJob.php index 88705695cb..c76ea4f9ab 100644 --- a/includes/jobqueue/jobs/RefreshLinksJob.php +++ b/includes/jobqueue/jobs/RefreshLinksJob.php @@ -129,6 +129,7 @@ class RefreshLinksJob extends Job { */ protected function runForTitle( Title $title ) { $page = WikiPage::factory( $title ); + $page->loadPageData( WikiPage::READ_LATEST ); if ( !empty( $this->params['triggeringRevisionId'] ) ) { // Fetch the specified revision; lockAndGetLatest() below detects if the page // was edited since and aborts in order to avoid corrupting the link tables @@ -147,7 +148,7 @@ class RefreshLinksJob extends Job { $stats->increment( 'refreshlinks.rev_not_found' ); $this->setLastError( "Revision not found for {$title->getPrefixedDBkey()}" ); return false; // just deleted? - } elseif ( !$revision->isCurrent() ) { + } elseif ( !$revision->isCurrent() || $revision->getPage() != $page->getId() ) { // If the revision isn't current, there's no point in doing a bunch // of work just to fail at the lockAndGetLatest() check later. $stats->increment( 'refreshlinks.rev_not_current' ); diff --git a/includes/libs/MultiHttpClient.php b/includes/libs/MultiHttpClient.php index 331f2d5e99..0371f24296 100644 --- a/includes/libs/MultiHttpClient.php +++ b/includes/libs/MultiHttpClient.php @@ -104,7 +104,7 @@ class MultiHttpClient { * - reqTimeout : post-connection timeout per request (seconds) * @return array Response array for request */ - final public function run( array $req, array $opts = [] ) { + public function run( array $req, array $opts = [] ) { return $this->runMulti( [ $req ], $opts )[0]['response']; } diff --git a/includes/libs/ReverseArrayIterator.php b/includes/libs/ReverseArrayIterator.php new file mode 100644 index 0000000000..37b68c3f85 --- /dev/null +++ b/includes/libs/ReverseArrayIterator.php @@ -0,0 +1,76 @@ +array = $array; + } elseif ( is_object( $array ) ) { + $this->array = get_object_vars( $array ); + } else { + throw new InvalidArgumentException( __METHOD__ . ' requires an array or object' ); + } + + $this->rewind(); + } + + public function current() { + return current( $this->array ); + } + + public function key() { + return key( $this->array ); + } + + public function next() { + prev( $this->array ); + } + + public function rewind() { + end( $this->array ); + } + + public function valid() { + return key( $this->array ) !== null; + } + + public function count() { + return count( $this->array ); + } +} diff --git a/includes/libs/objectcache/RESTBagOStuff.php b/includes/libs/objectcache/RESTBagOStuff.php new file mode 100644 index 0000000000..1bbfc56c19 --- /dev/null +++ b/includes/libs/objectcache/RESTBagOStuff.php @@ -0,0 +1,127 @@ + 'RESTBagOStuff', + * 'url' => 'http://localhost:7231/wikimedia.org/v1/sessions/' + * ); + * @endcode + */ +class RESTBagOStuff extends BagOStuff { + + /** + * @var MultiHttpClient + */ + private $client; + + /** + * REST URL to use for storage. + * @var string + */ + private $url; + + public function __construct( $params ) { + if ( empty( $params['url'] ) ) { + throw new InvalidArgumentException( 'URL parameter is required' ); + } + parent::__construct( $params ); + if ( empty( $params['client'] ) ) { + $this->client = new MultiHttpClient( [] ); + } else { + $this->client = $params['client']; + } + // Make sure URL ends with / + $this->url = rtrim( $params['url'], '/' ) . '/'; + } + + /** + * @param string $key + * @param integer $flags Bitfield of BagOStuff::READ_* constants [optional] + * @return mixed Returns false on failure and if the item does not exist + */ + protected function doGet( $key, $flags = 0 ) { + $req = [ + 'method' => 'GET', + 'url' => $this->url . rawurlencode( $key ), + + ]; + list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req ); + if ( $rcode === 200 ) { + if ( is_string( $rbody ) ) { + return unserialize( $rbody ); + } + return false; + } + if ( $rcode === 0 || ( $rcode >= 400 && $rcode != 404 ) ) { + return $this->handleError( "Failed to fetch $key", $rcode, $rerr ); + } + return false; + } + + /** + * Handle storage error + * @param string $msg Error message + * @param int $rcode Error code from client + * @param string $rerr Error message from client + * @return false + */ + protected function handleError( $msg, $rcode, $rerr ) { + $this->logger->error( "$msg : ({code}) {error}", [ + 'code' => $rcode, + 'error' => $rerr + ] ); + $this->setLastError( $rcode === 0 ? self::ERR_UNREACHABLE : self::ERR_UNEXPECTED ); + return false; + } + + /** + * Set an item + * + * @param string $key + * @param mixed $value + * @param int $exptime Either an interval in seconds or a unix timestamp for expiry + * @param int $flags Bitfield of BagOStuff::WRITE_* constants + * @return bool Success + */ + public function set( $key, $value, $exptime = 0, $flags = 0 ) { + $req = [ + 'method' => 'PUT', + 'url' => $this->url . rawurlencode( $key ), + 'body' => serialize( $value ) + ]; + list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req ); + if ( $rcode === 200 || $rcode === 201 ) { + return true; + } + return $this->handleError( "Failed to store $key", $rcode, $rerr ); + } + + /** + * Delete an item. + * + * @param string $key + * @return bool True if the item was deleted or not found, false on failure + */ + public function delete( $key ) { + $req = [ + 'method' => 'DELETE', + 'url' => $this->url . rawurlencode( $key ), + ]; + list( $rcode, $rdesc, $rhdrs, $rbody, $rerr ) = $this->client->run( $req ); + if ( $rcode === 200 || $rcode === 204 || $rcode === 205 ) { + return true; + } + return $this->handleError( "Failed to delete $key", $rcode, $rerr ); + } +} diff --git a/includes/libs/objectcache/WANObjectCache.php b/includes/libs/objectcache/WANObjectCache.php index 45713cc814..ab702d57be 100644 --- a/includes/libs/objectcache/WANObjectCache.php +++ b/includes/libs/objectcache/WANObjectCache.php @@ -902,7 +902,7 @@ class WANObjectCache implements IExpiringStore, LoggerAwareInterface { // For hot keys, either another thread has the lock or the lock failed; // use the INTERIM value from the last thread that regenerated it. $wrapped = $this->cache->get( self::INTERIM_KEY_PREFIX . $key ); - $value = $this->unwrap( $wrapped, microtime( true ) ); + list( $value ) = $this->unwrap( $wrapped, microtime( true ) ); if ( $value !== false && $this->isValid( $value, $versioned, $asOf, $minTime ) ) { $asOf = $wrapped[self::FLD_TIME]; diff --git a/includes/media/FormatMetadata.php b/includes/media/FormatMetadata.php index f392bd1c9e..78b029693c 100644 --- a/includes/media/FormatMetadata.php +++ b/includes/media/FormatMetadata.php @@ -418,12 +418,12 @@ class FormatMetadata extends ContextSource { case 'Flash': $flashDecode = [ - 'fired' => $val & bindec( '00000001' ), - 'return' => ( $val & bindec( '00000110' ) ) >> 1, - 'mode' => ( $val & bindec( '00011000' ) ) >> 3, - 'function' => ( $val & bindec( '00100000' ) ) >> 5, - 'redeye' => ( $val & bindec( '01000000' ) ) >> 6, -// 'reserved' => ($val & bindec( '10000000' )) >> 7, + 'fired' => $val & 0b00000001, + 'return' => ( $val & 0b00000110 ) >> 1, + 'mode' => ( $val & 0b00011000 ) >> 3, + 'function' => ( $val & 0b00100000 ) >> 5, + 'redeye' => ( $val & 0b01000000 ) >> 6, + // 'reserved' => ( $val & 0b10000000 ) >> 7, ]; $flashMsgs = []; # We do not need to handle unknown values since all are used. diff --git a/includes/page/Article.php b/includes/page/Article.php index eccf36fefb..2a6f88c577 100644 --- a/includes/page/Article.php +++ b/includes/page/Article.php @@ -467,7 +467,7 @@ class Article implements Page { * page of the given title. */ public function view() { - global $wgUseFileCache, $wgUseETag, $wgDebugToolbar, $wgMaxRedirects; + global $wgUseFileCache, $wgDebugToolbar, $wgMaxRedirects; # Get variables from query string # As side effect this will load the revision and update the title @@ -520,10 +520,6 @@ class Article implements Page { # Try client and file cache if ( !$wgDebugToolbar && $oldid === 0 && $this->mPage->checkTouched() ) { - if ( $wgUseETag ) { - $outputPage->setETag( $parserCache->getETag( $this->mPage, $parserOptions ) ); - } - # Use the greatest of the page's timestamp or the timestamp of any # redirect in the chain (bug 67849) $timestamp = $this->mPage->getTouched(); @@ -2601,8 +2597,8 @@ class Article implements Page { * Call to WikiPage function for backwards compatibility. * @see WikiPage::updateCategoryCounts */ - public function updateCategoryCounts( array $added, array $deleted ) { - return $this->mPage->updateCategoryCounts( $added, $deleted ); + public function updateCategoryCounts( array $added, array $deleted, $id = 0 ) { + return $this->mPage->updateCategoryCounts( $added, $deleted, $id ); } /** diff --git a/includes/page/ImagePage.php b/includes/page/ImagePage.php index 106911c5fe..13966851b9 100644 --- a/includes/page/ImagePage.php +++ b/includes/page/ImagePage.php @@ -222,11 +222,12 @@ class ImagePage extends Article { $out->addStyle( $css ); } } - // always show the local local Filepage.css, bug 29277 - $out->addModuleStyles( 'filepage' ); - // Add MediaWiki styles for a file page - $out->addModuleStyles( 'mediawiki.action.view.filepage' ); + $out->addModuleStyles( [ + 'filepage', // always show the local local Filepage.css, bug 29277 + 'mediawiki.action.view.filepage', // Add MediaWiki styles for a file page + ] ); + } /** diff --git a/includes/page/WikiPage.php b/includes/page/WikiPage.php index a3c3ecee4a..b06b51967a 100644 --- a/includes/page/WikiPage.php +++ b/includes/page/WikiPage.php @@ -20,6 +20,8 @@ * @file */ +use \MediaWiki\Logger\LoggerFactory; + /** * Class representing a MediaWiki article and history. * @@ -1794,8 +1796,12 @@ class WikiPage implements Page, IDBAccessObject { $this->mTimestamp = $now; } else { // Bug 32948: revision ID must be set to page {{REVISIONID}} and - // related variables correctly + // related variables correctly. Likewise for {{REVISIONUSER}} (T135261). $revision->setId( $this->getLatest() ); + $revision->setUserIdAndName( + $this->getUser( Revision::RAW ), + $this->getUserText( Revision::RAW ) + ); } if ( $changed ) { @@ -2071,7 +2077,7 @@ class WikiPage implements Page, IDBAccessObject { } else { $edit->timestamp = wfTimestampNow(); } - // @note: $cachedEdit is not used if the rev ID was referenced in the text + // @note: $cachedEdit is safely not used if the rev ID was referenced in the text $edit->revid = $revid; if ( $cachedEdit ) { @@ -2102,6 +2108,16 @@ class WikiPage implements Page, IDBAccessObject { } } ); + } else { + // Try to avoid a second parse if {{REVISIONID}} is used + $edit->popts->setSpeculativeRevIdCallback( function () { + return 1 + (int)wfGetDB( DB_MASTER )->selectField( + 'revision', + 'MAX(rev_id)', + [], + __METHOD__ + ); + } ); } $edit->output = $edit->pstContent ? $edit->pstContent->getParserOutput( $this->mTitle, $revid, $edit->popts ) @@ -2164,17 +2180,32 @@ class WikiPage implements Page, IDBAccessObject { ]; $content = $revision->getContent(); - // Parse the text - // Be careful not to do pre-save transform twice: $text is usually - // already pre-save transformed once. - if ( !$this->mPreparedEdit || $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) { - wfDebug( __METHOD__ . ": No prepared edit or vary-revision is set...\n" ); - $editInfo = $this->prepareContentForEdit( $content, $revision, $user ); + $logger = LoggerFactory::getInstance( 'SaveParse' ); + + // See if the parser output before $revision was inserted is still valid + $editInfo = false; + if ( !$this->mPreparedEdit ) { + $logger->debug( __METHOD__ . ": No prepared edit...\n" ); + } elseif ( $this->mPreparedEdit->output->getFlag( 'vary-revision' ) ) { + $logger->info( __METHOD__ . ": Prepared edit has vary-revision...\n" ); + } elseif ( $this->mPreparedEdit->output->getFlag( 'vary-revision-id' ) + && $this->mPreparedEdit->output->getSpeculativeRevIdUsed() !== $revision->getId() + ) { + $logger->info( __METHOD__ . ": Prepared edit has vary-revision-id with wrong ID...\n" ); + } elseif ( $this->mPreparedEdit->output->getFlag( 'vary-user' ) && !$options['changed'] ) { + $logger->info( __METHOD__ . ": Prepared edit has vary-user and is null...\n" ); } else { - wfDebug( __METHOD__ . ": No vary-revision, using prepared edit...\n" ); + wfDebug( __METHOD__ . ": Using prepared edit...\n" ); $editInfo = $this->mPreparedEdit; } + if ( !$editInfo ) { + // Parse the text again if needed. Be careful not to do pre-save transform twice: + // $text is usually already pre-save transformed once. Avoid using the edit stash + // as any prepared content from there or in doEditContent() was already rejected. + $editInfo = $this->prepareContentForEdit( $content, $revision, $user, null, false ); + } + // Save it to the parser cache. // Make sure the cache time matches page_touched to avoid double parsing. ParserCache::singleton()->save( @@ -3414,16 +3445,16 @@ class WikiPage implements Page, IDBAccessObject { * * @param array $added The names of categories that were added * @param array $deleted The names of categories that were deleted + * @param integer $id Page ID (this should be the original deleted page ID) */ - public function updateCategoryCounts( array $added, array $deleted ) { - $that = $this; - $method = __METHOD__; + public function updateCategoryCounts( array $added, array $deleted, $id = 0 ) { + $id = $id ?: $this->getId(); $dbw = wfGetDB( DB_MASTER ); - + $method = __METHOD__; // Do this at the end of the commit to reduce lock wait timeouts $dbw->onTransactionPreCommitOrIdle( - function () use ( $dbw, $that, $method, $added, $deleted ) { - $ns = $that->getTitle()->getNamespace(); + function () use ( $dbw, $added, $deleted, $id, $method ) { + $ns = $this->getTitle()->getNamespace(); $addFields = [ 'cat_pages = cat_pages + 1' ]; $removeFields = [ 'cat_pages = cat_pages - 1' ]; @@ -3440,7 +3471,7 @@ class WikiPage implements Page, IDBAccessObject { 'category', 'cat_title', [ 'cat_title' => $added ], - __METHOD__ + $method ); // For category rows that already exist, do a plain @@ -3451,7 +3482,7 @@ class WikiPage implements Page, IDBAccessObject { 'category', $addFields, [ 'cat_title' => $existingAdded ], - __METHOD__ + $method ); } @@ -3487,12 +3518,12 @@ class WikiPage implements Page, IDBAccessObject { foreach ( $added as $catName ) { $cat = Category::newFromName( $catName ); - Hooks::run( 'CategoryAfterPageAdded', [ $cat, $that ] ); + Hooks::run( 'CategoryAfterPageAdded', [ $cat, $this ] ); } foreach ( $deleted as $catName ) { $cat = Category::newFromName( $catName ); - Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $that ] ); + Hooks::run( 'CategoryAfterPageRemoved', [ $cat, $this, $id ] ); } } ); diff --git a/includes/parser/CacheTime.php b/includes/parser/CacheTime.php index 2451390dc2..05bcebef64 100644 --- a/includes/parser/CacheTime.php +++ b/includes/parser/CacheTime.php @@ -79,12 +79,15 @@ class CacheTime { /** * Sets the number of seconds after which this object should expire. + * * This value is used with the ParserCache. * If called with a value greater than the value provided at any previous call, * the new call has no effect. The value returned by getCacheExpiry is smaller * or equal to the smallest number that was provided as an argument to * updateCacheExpiry(). * + * Avoid using 0 if at all possible. Consider JavaScript for highly dynamic content. + * * @param int $seconds */ public function updateCacheExpiry( $seconds ) { diff --git a/includes/parser/MWTidy.php b/includes/parser/MWTidy.php index bdf3efba56..f281c25b3c 100644 --- a/includes/parser/MWTidy.php +++ b/includes/parser/MWTidy.php @@ -132,6 +132,9 @@ class MWTidy { case 'Html5Depurate': self::$instance = new MediaWiki\Tidy\Html5Depurate( $config ); break; + case 'Html5Internal': + self::$instance = new MediaWiki\Tidy\Html5Internal( $config ); + break; default: throw new MWException( "Invalid tidy driver: \"{$config['driver']}\"" ); } diff --git a/includes/parser/Parser.php b/includes/parser/Parser.php index 116b274c6a..19d68c274f 100644 --- a/includes/parser/Parser.php +++ b/includes/parser/Parser.php @@ -1264,7 +1264,9 @@ class Parser { $text, [ &$this, 'attributeStripCallback' ], false, - array_keys( $this->mTransparentTagHooks ) + array_keys( $this->mTransparentTagHooks ), + [], + [ &$this, 'addTrackingCategory' ] ); Hooks::run( 'InternalParseBeforeLinks', [ &$this, &$text, &$this->mStripState ] ); @@ -1470,10 +1472,14 @@ class Parser { ' ' => '', 'x' => 'X', ] ); - $titleObj = SpecialPage::getTitleFor( 'Booksources', $num ); - return 'ISBN $isbn"; + return $this->getLinkRenderer()->makeKnownLink( + SpecialPage::getTitleFor( 'Booksources', $num ), + "ISBN $isbn", + [ + 'class' => 'internal mw-magiclink-isbn', + 'title' => false // suppress title attribute + ] + ); } else { return $m[0]; } @@ -2296,13 +2302,9 @@ class Parser { # cloak any absolute URLs inside the image markup, so replaceExternalLinks() won't touch them $s .= $prefix . $this->armorLinks( $this->makeImage( $nt, $text, $holders ) ) . $trail; - } else { - $s .= $prefix . $trail; + continue; } - continue; - } - - if ( $ns == NS_CATEGORY ) { + } elseif ( $ns == NS_CATEGORY ) { $s = rtrim( $s . "\n" ); # bug 87 if ( $wasblank ) { @@ -2600,9 +2602,13 @@ class Parser { case 'revisionid': # Let the edit saving system know we should parse the page # *after* a revision ID has been assigned. - $this->mOutput->setFlag( 'vary-revision' ); - wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision...\n" ); + $this->mOutput->setFlag( 'vary-revision-id' ); + wfDebug( __METHOD__ . ": {{REVISIONID}} used, setting vary-revision-id...\n" ); $value = $this->mRevisionId; + if ( !$value && $this->mOptions->getSpeculativeRevIdCallback() ) { + $value = call_user_func( $this->mOptions->getSpeculativeRevIdCallback() ); + $this->mOutput->setSpeculativeRevIdUsed( $value ); + } break; case 'revisionday': # Let the edit saving system know we should parse the page @@ -2648,16 +2654,12 @@ class Parser { break; case 'revisionuser': # Let the edit saving system know we should parse the page - # *after* a revision ID has been assigned. This is for null edits. - $this->mOutput->setFlag( 'vary-revision' ); - wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-revision...\n" ); + # *after* a revision ID has been assigned for null edits. + $this->mOutput->setFlag( 'vary-user' ); + wfDebug( __METHOD__ . ": {{REVISIONUSER}} used, setting vary-user...\n" ); $value = $this->getRevisionUser(); break; case 'revisionsize': - # Let the edit saving system know we should parse the page - # *after* a revision ID has been assigned. This is for null edits. - $this->mOutput->setFlag( 'vary-revision' ); - wfDebug( __METHOD__ . ": {{REVISIONSIZE}} used, setting vary-revision...\n" ); $value = $this->getRevisionSize(); break; case 'namespace': @@ -3129,6 +3131,7 @@ class Parser { && $this->mOptions->getAllowSpecialInclusion() && $this->ot['html'] ) { + $specialPage = SpecialPageFactory::getPage( $title->getDBkey() ); // Pass the template arguments as URL parameters. // "uselang" will have no effect since the Language object // is forced to the one defined in ParserOptions. @@ -3147,15 +3150,22 @@ class Parser { $context = new RequestContext; $context->setTitle( $title ); $context->setRequest( new FauxRequest( $pageArgs ) ); - $context->setUser( $this->getUser() ); + if ( $specialPage && $specialPage->maxIncludeCacheTime() === 0 ) { + $context->setUser( $this->getUser() ); + } else { + // If this page is cached, then we better not be per user. + $context->setUser( User::newFromName( '127.0.0.1', false ) ); + } $context->setLanguage( $this->mOptions->getUserLangObj() ); - $ret = SpecialPageFactory::capturePath( $title, $context ); + $ret = SpecialPageFactory::capturePath( $title, $context, $this->getLinkRenderer() ); if ( $ret ) { $text = $context->getOutput()->getHTML(); $this->mOutput->addOutputPageMetadata( $context->getOutput() ); $found = true; $isHTML = true; - $this->disableCache(); + if ( $specialPage && $specialPage->maxIncludeCacheTime() !== false ) { + $this->mOutput->updateCacheExpiry( $specialPage->maxIncludeCacheTime() ); + } } } elseif ( MWNamespace::isNonincludable( $title->getNamespace() ) ) { $found = false; # access denied @@ -5298,6 +5308,7 @@ class Parser { /** * Set a flag in the output object indicating that the content is dynamic and * shouldn't be cached. + * @deprecated since 1.28; use getOutput()->updateCacheExpiry() */ public function disableCache() { wfDebug( "Parser output marked as uncacheable.\n" ); @@ -5637,7 +5648,7 @@ class Parser { # will change the size. if ( $revObject ) { $this->mRevisionSize = $revObject->getSize(); - } elseif ( $this->ot['wiki'] || $this->mOptions->getIsPreview() ) { + } else { $this->mRevisionSize = $this->mInputSize; } } diff --git a/includes/parser/ParserOptions.php b/includes/parser/ParserOptions.php index 91cd0f4126..891c4dde6c 100644 --- a/includes/parser/ParserOptions.php +++ b/includes/parser/ParserOptions.php @@ -117,17 +117,22 @@ class ParserOptions { private $mRemoveComments = true; /** - * Callback for current revision fetching. Used as first argument to call_user_func(). + * @var callable Callback for current revision fetching; first argument to call_user_func(). */ private $mCurrentRevisionCallback = [ 'Parser', 'statelessFetchRevision' ]; /** - * Callback for template fetching. Used as first argument to call_user_func(). + * @var callable Callback for template fetching; first argument to call_user_func(). */ private $mTemplateCallback = [ 'Parser', 'statelessFetchTemplate' ]; + /** + * @var callable|null Callback to generate a guess for {{REVISIONID}} + */ + private $mSpeculativeRevIdCallback; + /** * Enable limit report in an HTML comment on output */ @@ -302,6 +307,11 @@ class ParserOptions { return $this->mTemplateCallback; } + /** @since 1.28 */ + public function getSpeculativeRevIdCallback() { + return $this->mSpeculativeRevIdCallback; + } + public function getEnableLimitReport() { return $this->mEnableLimitReport; } @@ -483,6 +493,11 @@ class ParserOptions { return wfSetVar( $this->mCurrentRevisionCallback, $x ); } + /** @since 1.28 */ + public function setSpeculativeRevIdCallback( $x ) { + return wfSetVar( $this->mSpeculativeRevIdCallback, $x ); + } + public function setTemplateCallback( $x ) { return wfSetVar( $this->mTemplateCallback, $x ); } diff --git a/includes/parser/ParserOutput.php b/includes/parser/ParserOutput.php index 6c7ad4eb4c..3462d10c7d 100644 --- a/includes/parser/ParserOutput.php +++ b/includes/parser/ParserOutput.php @@ -208,6 +208,9 @@ class ParserOutput extends CacheTime { */ private $mFlags = []; + /** @var integer|null Assumed rev ID for {{REVISIONID}} if no revision is set */ + private $mSpeculativeRevId; + const EDITSECTION_REGEX = '#<(?:mw:)?editsection page="(.*?)" section="(.*?)"(?:/>|>(.*?)())#'; @@ -272,6 +275,19 @@ class ParserOutput extends CacheTime { return $text; } + /** + * @param integer $id + * @since 1.28 + */ + public function setSpeculativeRevIdUsed( $id ) { + $this->mSpeculativeRevId = $id; + } + + /** @since 1.28 */ + public function getSpeculativeRevIdUsed() { + return $this->mSpeculativeRevId; + } + public function &getLanguageLinks() { return $this->mLanguageLinks; } diff --git a/includes/registration/ExtensionProcessor.php b/includes/registration/ExtensionProcessor.php index 78f9370845..ea1799064f 100644 --- a/includes/registration/ExtensionProcessor.php +++ b/includes/registration/ExtensionProcessor.php @@ -10,11 +10,12 @@ class ExtensionProcessor implements Processor { protected static $globalSettings = [ 'ResourceLoaderSources', 'ResourceLoaderLESSVars', - 'ResourceLoaderLESSImportPaths', 'DefaultUserOptions', 'HiddenPrefs', 'GroupPermissions', 'RevokePermissions', + 'GrantPermissions', + 'GrantPermissionGroups', 'ImplicitGroups', 'GroupsAddToSelf', 'GroupsRemoveFromSelf', @@ -26,6 +27,8 @@ class ExtensionProcessor implements Processor { 'SessionProviders', 'AuthManagerAutoConfig', 'CentralIdLookupProviders', + 'ChangeCredentialsBlacklist', + 'RemoveCredentialsBlacklist', 'RateLimits', 'RecentChangesFlags', 'MediaHandlers', @@ -61,6 +64,7 @@ class ExtensionProcessor implements Processor { protected static $mergeStrategies = [ 'wgGroupPermissions' => 'array_plus_2d', 'wgRevokePermissions' => 'array_plus_2d', + 'wgGrantPermissions' => 'array_plus_2d', 'wgHooks' => 'array_merge_recursive', 'wgExtensionCredits' => 'array_merge_recursive', 'wgExtraGenderNamespaces' => 'array_plus', diff --git a/includes/resourceloader/ResourceLoader.php b/includes/resourceloader/ResourceLoader.php index 09535b731e..ccf764bc18 100644 --- a/includes/resourceloader/ResourceLoader.php +++ b/includes/resourceloader/ResourceLoader.php @@ -601,10 +601,8 @@ class ResourceLoader implements LoggerAwareInterface { * @return string Hash */ public static function makeHash( $value ) { - // Use base64 to output more entropy in a more compact string (default hex is only base16). - // The first 8 chars of a base64 encoded digest represent the same binary as - // the first 12 chars of a hex encoded digest. - return substr( base64_encode( sha1( $value, true ) ), 0, 8 ); + $hash = hash( 'fnv132', $value ); + return Wikimedia\base_convert( $hash, 16, 36, 7 ); } /** diff --git a/includes/resourceloader/ResourceLoaderSiteStylesModule.php b/includes/resourceloader/ResourceLoaderSiteStylesModule.php new file mode 100644 index 0000000000..6896ad79e1 --- /dev/null +++ b/includes/resourceloader/ResourceLoaderSiteStylesModule.php @@ -0,0 +1,46 @@ +getConfig()->get( 'UseSiteCss' ) ) { + $pages['MediaWiki:Common.css'] = [ 'type' => 'style' ]; + $pages['MediaWiki:' . ucfirst( $context->getSkin() ) . '.css'] = [ 'type' => 'style' ]; + $pages['MediaWiki:Print.css'] = [ 'type' => 'style', 'media' => 'print' ]; + + } + return $pages; + } +} diff --git a/includes/revisiondelete/RevDelArchiveList.php b/includes/revisiondelete/RevDelArchiveList.php index 72c460e0db..ad9259b307 100644 --- a/includes/revisiondelete/RevDelArchiveList.php +++ b/includes/revisiondelete/RevDelArchiveList.php @@ -77,7 +77,7 @@ class RevDelArchiveList extends RevDelRevisionList { return Status::newGood(); } - public function doPostCommitUpdates() { + public function doPostCommitUpdates( array $visibilityChangeMap ) { return Status::newGood(); } } diff --git a/includes/revisiondelete/RevDelFileList.php b/includes/revisiondelete/RevDelFileList.php index 75e1885b0c..00cb2e147c 100644 --- a/includes/revisiondelete/RevDelFileList.php +++ b/includes/revisiondelete/RevDelFileList.php @@ -104,7 +104,7 @@ class RevDelFileList extends RevDelList { return $status; } - public function doPostCommitUpdates() { + public function doPostCommitUpdates( array $visibilityChangeMap ) { $file = wfLocalFile( $this->title ); $file->purgeCache(); $file->purgeDescription(); diff --git a/includes/revisiondelete/RevDelList.php b/includes/revisiondelete/RevDelList.php index 87e641db54..0a86e943d8 100644 --- a/includes/revisiondelete/RevDelList.php +++ b/includes/revisiondelete/RevDelList.php @@ -132,6 +132,10 @@ abstract class RevDelList extends RevisionListBase { $virtualNewBits = 0; $logType = 'delete'; + // Will be filled with id => [old, new bits] information and + // passed to doPostCommitUpdates(). + $visibilityChangeMap = []; + // @codingStandardsIgnoreStart Generic.CodeAnalysis.ForLoopWithTestFunctionCall.NotAllowed for ( $this->reset(); $this->current(); $this->next() ) { // @codingStandardsIgnoreEnd @@ -205,6 +209,13 @@ abstract class RevDelList extends RevisionListBase { } elseif ( IP::isIPAddress( $item->getAuthorName() ) ) { $authorIPs[] = $item->getAuthorName(); } + + // Save the old and new bits in $visibilityChangeMap for + // later use. + $visibilityChangeMap[$item->getId()] = [ + 'oldBits' => $oldBits, + 'newBits' => $newBits, + ]; } else { $itemStatus->error( 'revdelete-concurrent-change', $item->formatDate(), $item->formatTime() ); @@ -255,8 +266,8 @@ abstract class RevDelList extends RevisionListBase { // Clear caches $that = $this; - $dbw->onTransactionIdle( function() use ( $that ) { - $that->doPostCommitUpdates(); + $dbw->onTransactionIdle( function() use ( $that, $visibilityChangeMap ) { + $that->doPostCommitUpdates( $visibilityChangeMap ); } ); $dbw->endAtomic( __METHOD__ ); @@ -351,9 +362,10 @@ abstract class RevDelList extends RevisionListBase { /** * A hook for setVisibility(): do any necessary updates post-commit. * STUB + * @param array [id => ['oldBits' => $oldBits, 'newBits' => $newBits], ... ] * @return Status */ - public function doPostCommitUpdates() { + public function doPostCommitUpdates( array $visibilityChangeMap ) { return Status::newGood(); } diff --git a/includes/revisiondelete/RevDelRevisionList.php b/includes/revisiondelete/RevDelRevisionList.php index 27e5148611..3486645c05 100644 --- a/includes/revisiondelete/RevDelRevisionList.php +++ b/includes/revisiondelete/RevDelRevisionList.php @@ -170,10 +170,10 @@ class RevDelRevisionList extends RevDelList { return Status::newGood(); } - public function doPostCommitUpdates() { + public function doPostCommitUpdates( array $visibilityChangeMap ) { $this->title->purgeSquid(); // Extensions that require referencing previous revisions may need this - Hooks::run( 'ArticleRevisionVisibilitySet', [ $this->title, $this->ids ] ); + Hooks::run( 'ArticleRevisionVisibilitySet', [ $this->title, $this->ids, $visibilityChangeMap ] ); return Status::newGood(); } } diff --git a/includes/search/NullIndexField.php b/includes/search/NullIndexField.php new file mode 100644 index 0000000000..933e0ad332 --- /dev/null +++ b/includes/search/NullIndexField.php @@ -0,0 +1,45 @@ +getFieldsForSearchIndex( $this ); + foreach ( $handlerFields as $fieldName => $fieldData ) { + if ( empty( $fields[$fieldName] ) ) { + $fields[$fieldName] = $fieldData; + } else { + // TODO: do we allow some clashes with the same type or reject all of them? + $mergeDef = $fields[$fieldName]->merge( $fieldData ); + if ( !$mergeDef ) { + throw new InvalidArgumentException( "Duplicate field $fieldName for model $model" ); + } + $fields[$fieldName] = $mergeDef; + } + } + } + // Hook to allow extensions to produce search mapping fields + Hooks::run( 'SearchIndexFields', [ &$fields, $this ] ); + return $fields; + } } /** diff --git a/includes/search/SearchIndexField.php b/includes/search/SearchIndexField.php new file mode 100644 index 0000000000..7499853801 --- /dev/null +++ b/includes/search/SearchIndexField.php @@ -0,0 +1,65 @@ +name = $name; + $this->type = $type; + } + + /** + * Get field name + * @return string + */ + public function getName() { + return $this->name; + } + + /** + * Get index type + * @return int + */ + public function getIndexType() { + return $this->type; + } + + /** + * Set global flag for this field. + * + * @param int $flag Bit flag to set/unset + * @param bool $unset True if flag should be unset, false by default + * @return $this + */ + public function setFlag( $flag, $unset = false ) { + if ( $unset ) { + $this->flags &= ~$flag; + } else { + $this->flags |= $flag; + } + return $this; + } + + /** + * Check if flag is set. + * @param $flag + * @return int 0 if unset, !=0 if set + */ + public function checkFlag( $flag ) { + return $this->flags & $flag; + } + + /** + * Merge two field definitions if possible. + * + * @param SearchIndexField $that + * @return SearchIndexField|false New definition or false if not mergeable. + */ + public function merge( SearchIndexField $that ) { + // TODO: which definitions may be compatible? + if ( ( $that instanceof self ) && $this->type === $that->type && + $this->flags === $that->flags && $this->type !== self::INDEX_TYPE_NESTED + ) { + return $that; + } + return false; + } + + /** + * Get subfields + * @return SearchIndexFieldDefinition[] + */ + public function getSubfields() { + return $this->subfields; + } + + /** + * Set subfields + * @param SearchIndexFieldDefinition[] $subfields + * @return $this + */ + public function setSubfields( array $subfields ) { + $this->subfields = $subfields; + return $this; + } +} diff --git a/includes/session/CookieSessionProvider.php b/includes/session/CookieSessionProvider.php index 3df0daefde..79fc720d1e 100644 --- a/includes/session/CookieSessionProvider.php +++ b/includes/session/CookieSessionProvider.php @@ -221,7 +221,7 @@ class CookieSessionProvider extends SessionProvider { if ( $value === false ) { $response->clearCookie( $key, $options ); } else { - $expirationDuration = $this->getLoginCookieExpiration( $key ); + $expirationDuration = $this->getLoginCookieExpiration( $key, $session->shouldRememberUser() ); $expiration = $expirationDuration ? $expirationDuration + time() : null; $response->setCookie( $key, (string)$value, $expiration, $options ); } @@ -271,7 +271,10 @@ class CookieSessionProvider extends SessionProvider { $response = $request->response(); if ( $set ) { if ( $backend->shouldRememberUser() ) { - $expirationDuration = $this->getLoginCookieExpiration( 'forceHTTPS' ); + $expirationDuration = $this->getLoginCookieExpiration( + 'forceHTTPS', + true + ); $expiration = $expirationDuration ? $expirationDuration + time() : null; } else { $expiration = null; @@ -397,23 +400,40 @@ class CookieSessionProvider extends SessionProvider { } public function getRememberUserDuration() { - return min( $this->getLoginCookieExpiration( 'UserID' ), - $this->getLoginCookieExpiration( 'Token' ) ) ?: null; + return min( $this->getLoginCookieExpiration( 'UserID', true ), + $this->getLoginCookieExpiration( 'Token', true ) ) ?: null; + } + + /** + * Gets the list of cookies that must be set to the 'remember me' duration, + * if $wgExtendedLoginCookieExpiration is in use. + * + * @return string[] Array of unprefixed cookie keys + */ + protected function getExtendedLoginCookies() { + return [ 'UserID', 'UserName', 'Token' ]; } /** * Returns the lifespan of the login cookies, in seconds. 0 means until the end of the session. + * + * Cookies that are session-length do not call this function. + * * @param string $cookieName + * @param boolean $shouldRememberUser Whether the user should be remembered + * long-term * @return int Cookie expiration time in seconds; 0 for session cookies */ - protected function getLoginCookieExpiration( $cookieName ) { + protected function getLoginCookieExpiration( $cookieName, $shouldRememberUser ) { + $extendedCookies = $this->getExtendedLoginCookies(); $normalExpiration = $this->config->get( 'CookieExpiration' ); - $extendedExpiration = $this->config->get( 'ExtendedLoginCookieExpiration' ); - $extendedCookies = $this->config->get( 'ExtendedLoginCookies' ); - if ( !in_array( $cookieName, $extendedCookies, true ) ) { + if ( $shouldRememberUser && in_array( $cookieName, $extendedCookies, true ) ) { + $extendedExpiration = $this->config->get( 'ExtendedLoginCookieExpiration' ); + + return ( $extendedExpiration !== null ) ? (int)$extendedExpiration : (int)$normalExpiration; + } else { return (int)$normalExpiration; } - return ( $extendedExpiration !== null ) ? (int)$extendedExpiration : (int)$normalExpiration; } } diff --git a/includes/session/SessionProvider.php b/includes/session/SessionProvider.php index 50794d0104..4d57ad9dcb 100644 --- a/includes/session/SessionProvider.php +++ b/includes/session/SessionProvider.php @@ -456,7 +456,7 @@ abstract class SessionProvider implements SessionProviderInterface, LoggerAwareI * @warning This will be called early during MediaWiki startup. Do not * use $wgUser, $wgLang, $wgOut, $wgParser, or their equivalents via * RequestContext from this method! - * @return Message + * @return \Message */ protected function describeMessage() { return wfMessage( diff --git a/includes/site/DBSiteStore.php b/includes/site/DBSiteStore.php index c1c10c2136..974789f94f 100644 --- a/includes/site/DBSiteStore.php +++ b/includes/site/DBSiteStore.php @@ -40,11 +40,6 @@ class DBSiteStore implements SiteStore { */ private $dbLoadBalancer; - /** - * @var string[] - */ - private $languageCodeMapping = []; - /** * @since 1.27 * @@ -101,17 +96,15 @@ class DBSiteStore implements SiteStore { ); foreach ( $res as $row ) { - $languageCode = $row->site_language === '' ? null : $row->site_language; - if ( isset( $this->languageCodeMapping[ $languageCode ] ) ) { - $languageCode = $this->languageCodeMapping[ $languageCode ]; - } - $site = Site::newForType( $row->site_type ); $site->setGlobalId( $row->site_global_key ); $site->setInternalId( (int)$row->site_id ); $site->setForward( (bool)$row->site_forward ); $site->setGroup( $row->site_group ); - $site->setLanguageCode( $languageCode ); + $site->setLanguageCode( $row->site_language === '' + ? null + : $row->site_language + ); $site->setSource( $row->site_source ); $site->setExtraData( unserialize( $row->site_data ) ); $site->setExtraConfig( unserialize( $row->site_config ) ); @@ -294,13 +287,4 @@ class DBSiteStore implements SiteStore { return $ok; } - /** - * Provide an array that maps language codes - * - * @param string[] $newMapping - */ - public function setLanguageCodeMapping( array $newMapping ) { - $this->languageCodeMapping = $newMapping; - } - } diff --git a/includes/site/FileBasedSiteLookup.php b/includes/site/FileBasedSiteLookup.php index 424d8e69b3..965444038f 100644 --- a/includes/site/FileBasedSiteLookup.php +++ b/includes/site/FileBasedSiteLookup.php @@ -42,11 +42,6 @@ class FileBasedSiteLookup implements SiteLookup { */ private $cacheFile; - /** - * @var string[] - */ - private $languageCodeMapping = []; - /** * @param string $cacheFile */ @@ -123,18 +118,13 @@ class FileBasedSiteLookup implements SiteLookup { * @return Site */ private function newSiteFromArray( array $data ) { - $languageCode = $data['language']; - if ( isset( $this->languageCodeMapping[ $languageCode ] ) ) { - $languageCode = $this->languageCodeMapping[ $languageCode ]; - } - $siteType = array_key_exists( 'type', $data ) ? $data['type'] : Site::TYPE_UNKNOWN; $site = Site::newForType( $siteType ); $site->setGlobalId( $data['globalid'] ); $site->setForward( $data['forward'] ); $site->setGroup( $data['group'] ); - $site->setLanguageCode( $languageCode ); + $site->setLanguageCode( $data['language'] ); $site->setSource( $data['source'] ); $site->setExtraData( $data['data'] ); $site->setExtraConfig( $data['config'] ); @@ -146,13 +136,4 @@ class FileBasedSiteLookup implements SiteLookup { return $site; } - /** - * Provide an array that maps language codes - * - * @param string[] $newMapping - */ - public function setLanguageCodeMapping( array $newMapping ) { - $this->languageCodeMapping = $newMapping; - } - } diff --git a/includes/site/MediaWikiPageNameNormalizer.php b/includes/site/MediaWikiPageNameNormalizer.php index 2f71736779..1a079b4295 100644 --- a/includes/site/MediaWikiPageNameNormalizer.php +++ b/includes/site/MediaWikiPageNameNormalizer.php @@ -34,6 +34,22 @@ use UtfNormal\Validator; */ class MediaWikiPageNameNormalizer { + /** + * @var Http + */ + private $http; + + /** + * @param Http|null $http + */ + public function __construct( Http $http = null ) { + if ( !$http ) { + $http = new Http(); + } + + $this->http = $http; + } + /** * Returns the normalized form of the given page title, using the * normalization rules of the given site. If the given title is a redirect, @@ -85,7 +101,7 @@ class MediaWikiPageNameNormalizer { // Go on call the external site // @todo we need a good way to specify a timeout here. - $ret = Http::get( $url, [], __METHOD__ ); + $ret = $this->http->get( $url, [], __METHOD__ ); if ( $ret === false ) { wfDebugLog( "MediaWikiSite", "call to external site failed: $url" ); diff --git a/includes/skins/QuickTemplate.php b/includes/skins/QuickTemplate.php index af2d5daaf8..e5d272c0cb 100644 --- a/includes/skins/QuickTemplate.php +++ b/includes/skins/QuickTemplate.php @@ -103,7 +103,6 @@ abstract class QuickTemplate { /** * @private * @param string $str - * @return string */ function text( $str ) { echo htmlspecialchars( $this->data[$str] ); @@ -112,7 +111,6 @@ abstract class QuickTemplate { /** * @private * @param string $str - * @return string */ function html( $str ) { echo $this->data[$str]; @@ -121,7 +119,6 @@ abstract class QuickTemplate { /** * @private * @param string $str - * @return string */ function msg( $str ) { echo htmlspecialchars( $this->translator->translate( $str ) ); @@ -130,7 +127,6 @@ abstract class QuickTemplate { /** * @private * @param string $str - * @return string */ function msgHtml( $str ) { echo $this->translator->translate( $str ); @@ -140,7 +136,6 @@ abstract class QuickTemplate { * An ugly, ugly hack. * @private * @param string $str - * @return string */ function msgWiki( $str ) { global $wgOut; diff --git a/includes/skins/Skin.php b/includes/skins/Skin.php index d70a6b91da..64d2f8bd45 100644 --- a/includes/skins/Skin.php +++ b/includes/skins/Skin.php @@ -141,10 +141,8 @@ abstract class Skin extends ContextSource { /** * @param OutputPage $out */ - function initPage( OutputPage $out ) { - + public function initPage( OutputPage $out ) { $this->preloadExistence(); - } /** @@ -199,30 +197,29 @@ abstract class Skin extends ContextSource { /** * Preload the existence of three commonly-requested pages in a single query */ - function preloadExistence() { + protected function preloadExistence() { $titles = []; - $user = $this->getUser(); - $title = $this->getRelevantTitle(); - // User/talk link + $user = $this->getUser(); if ( $user->isLoggedIn() ) { $titles[] = $user->getUserPage(); $titles[] = $user->getTalkPage(); } // Check, if the page can hold some kind of content, otherwise do nothing - if ( !$title->canExist() ) { - // nothing - } elseif ( $title->isTalkPage() ) { - $titles[] = $title->getSubjectPage(); - } else { - $titles[] = $title->getTalkPage(); + $title = $this->getRelevantTitle(); + if ( $title->canExist() ) { + if ( $title->isTalkPage() ) { + $titles[] = $title->getSubjectPage(); + } else { + $titles[] = $title->getTalkPage(); + } } Hooks::run( 'SkinPreloadExistence', [ &$titles, $this ] ); - if ( count( $titles ) ) { + if ( $titles ) { $lb = new LinkBatch( $titles ); $lb->setCaller( __METHOD__ ); $lb->execute(); @@ -649,19 +646,23 @@ abstract class Skin extends ContextSource { } /** + * @param OutputPage $out Defaults to $this->getOutput() if left as null * @return string */ - function subPageSubtitle() { - $out = $this->getOutput(); + function subPageSubtitle( $out = null ) { + if ( $out === null ) { + $out = $this->getOutput(); + } + $title = $out->getTitle(); $subpages = ''; if ( !Hooks::run( 'SkinSubPageSubtitle', [ &$subpages, $this, $out ] ) ) { return $subpages; } - if ( $out->isArticle() && MWNamespace::hasSubpages( $out->getTitle()->getNamespace() ) ) { - $ptext = $this->getTitle()->getPrefixedText(); - if ( preg_match( '/\//', $ptext ) ) { + if ( $out->isArticle() && MWNamespace::hasSubpages( $title->getNamespace() ) ) { + $ptext = $title->getPrefixedText(); + if ( strpos( $ptext, '/' ) !== false ) { $links = explode( '/', $ptext ); array_pop( $links ); $c = 0; @@ -1240,6 +1241,8 @@ abstract class Skin extends ContextSource { $lines = explode( "\n", $text ); $heading = ''; + $messageTitle = $this->getConfig()->get( 'EnableSidebarCache' ) + ? Title::newMainPage() : $this->getTitle(); foreach ( $lines as $line ) { if ( strpos( $line, '*' ) !== 0 ) { @@ -1256,7 +1259,7 @@ abstract class Skin extends ContextSource { $line = trim( $line, '* ' ); if ( strpos( $line, '|' ) !== false ) { // sanity check - $line = MessageCache::singleton()->transform( $line, false, null, $this->getTitle() ); + $line = MessageCache::singleton()->transform( $line, false, null, $messageTitle ); $line = array_map( 'trim', explode( '|', $line, 2 ) ); if ( count( $line ) !== 2 ) { // Second sanity check, could be hit by people doing @@ -1266,7 +1269,7 @@ abstract class Skin extends ContextSource { $extraAttribs = []; - $msgLink = $this->msg( $line[0] )->inContentLanguage(); + $msgLink = $this->msg( $line[0] )->title( $messageTitle )->inContentLanguage(); if ( $msgLink->exists() ) { $link = $msgLink->text(); if ( $link == '-' ) { @@ -1275,7 +1278,7 @@ abstract class Skin extends ContextSource { } else { $link = $line[0]; } - $msgText = $this->msg( $line[1] ); + $msgText = $this->msg( $line[1] )->title( $messageTitle ); if ( $msgText->exists() ) { $text = $msgText->text(); } else { diff --git a/includes/specialpage/AuthManagerSpecialPage.php b/includes/specialpage/AuthManagerSpecialPage.php index 9833c73be1..c889b73776 100644 --- a/includes/specialpage/AuthManagerSpecialPage.php +++ b/includes/specialpage/AuthManagerSpecialPage.php @@ -4,7 +4,6 @@ use MediaWiki\Auth\AuthenticationRequest; use MediaWiki\Auth\AuthenticationResponse; use MediaWiki\Auth\AuthManager; use MediaWiki\Logger\LoggerFactory; -use MediaWiki\Session\SessionManager; use MediaWiki\Session\Token; /** diff --git a/includes/specialpage/ChangesListSpecialPage.php b/includes/specialpage/ChangesListSpecialPage.php index 0966f80954..60f1dd81fa 100644 --- a/includes/specialpage/ChangesListSpecialPage.php +++ b/includes/specialpage/ChangesListSpecialPage.php @@ -368,7 +368,7 @@ abstract class ChangesListSpecialPage extends SpecialPage { /** * Build and output the actual changes list. * - * @param array $rows Database rows + * @param ResultWrapper $rows Database rows * @param FormOptions $opts */ abstract public function outputChangesList( $rows, $opts ); @@ -475,7 +475,10 @@ abstract class ChangesListSpecialPage extends SpecialPage { protected function addModules() { $out = $this->getOutput(); // Styles and behavior for the legend box (see makeLegend()) - $out->addModuleStyles( 'mediawiki.special.changeslist.legend' ); + $out->addModuleStyles( [ + 'mediawiki.special.changeslist.legend', + 'mediawiki.special.changeslist', + ] ); $out->addModules( 'mediawiki.special.changeslist.legend.js' ); } diff --git a/includes/specialpage/LoginSignupSpecialPage.php b/includes/specialpage/LoginSignupSpecialPage.php index d8f5e6697d..5dab221019 100644 --- a/includes/specialpage/LoginSignupSpecialPage.php +++ b/includes/specialpage/LoginSignupSpecialPage.php @@ -27,7 +27,6 @@ use MediaWiki\Auth\AuthManager; use MediaWiki\Auth\Throttler; use MediaWiki\Logger\LoggerFactory; use MediaWiki\Session\SessionManager; -use Psr\Log\LogLevel; /** * Holds shared logic for login and account creation pages. @@ -620,7 +619,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { // add pre/post text // header used by ConfirmEdit, CondfirmAccount, Persona, WikimediaIncubator, SemanticSignup // should be above the error message but HTMLForm doesn't support that - $form->addHeaderText( $fakeTemplate->html( 'header' ) ); + $form->addHeaderText( $fakeTemplate->get( 'header' ) ); // FIXME the old form used this for error/warning messages which does not play well with // HTMLForm (maybe it could with a subclass?); for now only display it for signups @@ -633,7 +632,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { } // header used by MobileFrontend - $form->addHeaderText( $fakeTemplate->html( 'formheader' ) ); + $form->addHeaderText( $fakeTemplate->get( 'formheader' ) ); // blank signup footer for site customization if ( $this->isSignup() && $this->showExtraInformation() ) { @@ -854,7 +853,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { !isset( $coreField['baseField'] ) || !isset( $fieldInfo[$coreField['baseField']] ) ) && !in_array( $fieldName, $specialFields, true ) - && $coreField['type'] !== 'submit' + && ( !isset( $coreField['type'] ) || $coreField['type'] !== 'submit' ) ) { $coreFieldDescriptors[$fieldName] = null; continue; @@ -1025,6 +1024,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { 'rememberMe' => [ // option for saving the user token to a cookie 'type' => 'check', + 'name' => 'wpRemember', 'label-message' => $this->msg( 'userlogin-remembermypassword' ) ->numParams( $expirationDays ), 'id' => 'wpRemember', @@ -1032,7 +1032,6 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage { 'loginattempt' => [ // submit button 'type' => 'submit', - 'name' => 'wpRemember', 'default' => $this->msg( 'pt-login-' . $continuePart . 'button' )->text(), 'id' => 'wpLoginAttempt', 'weight' => 100, diff --git a/includes/specialpage/SpecialPage.php b/includes/specialpage/SpecialPage.php index 408c726030..35ecc6e4b6 100644 --- a/includes/specialpage/SpecialPage.php +++ b/includes/specialpage/SpecialPage.php @@ -1,6 +1,4 @@ mIncludable; } + /** + * How long to cache page when it is being included. + * + * @note If cache time is not 0, then the current user becomes an anon + * if you want to do any per-user customizations, than this method + * must be overriden to return 0. + * @since 1.26 + * @return int Time in seconds, 0 to disable caching altogether, + * false to use the parent page's cache settings + */ + public function maxIncludeCacheTime() { + return $this->getConfig()->get( 'MiserMode' ) ? $this->getCacheTTL() : 0; + } + + /** + * @return int Seconds that this page can be cached + */ + protected function getCacheTTL() { + return 60 * 60; + } + /** * Whether the special page is being evaluated via transclusion * @param bool $x @@ -805,4 +831,24 @@ class SpecialPage { wfTransactionalTimeLimit(); } } + + /** + * @since 1.28 + * @return LinkRenderer + */ + protected function getLinkRenderer() { + if ( $this->linkRenderer ) { + return $this->linkRenderer; + } else { + return MediaWikiServices::getInstance()->getLinkRenderer(); + } + } + + /** + * @since 1.28 + * @param LinkRenderer $linkRenderer + */ + public function setLinkRenderer( LinkRenderer $linkRenderer ) { + $this->linkRenderer = $linkRenderer; + } } diff --git a/includes/specialpage/SpecialPageFactory.php b/includes/specialpage/SpecialPageFactory.php index 73efa4e894..b69b28afb4 100644 --- a/includes/specialpage/SpecialPageFactory.php +++ b/includes/specialpage/SpecialPageFactory.php @@ -21,6 +21,7 @@ * @ingroup SpecialPage * @defgroup SpecialPage SpecialPage */ +use MediaWiki\Linker\LinkRenderer; /** * Factory for handling the special page list and generating SpecialPage objects. @@ -523,10 +524,13 @@ class SpecialPageFactory { * @param Title $title * @param IContextSource $context * @param bool $including Bool output is being captured for use in {{special:whatever}} + * @param LinkRenderer|null $linkRenderer (since 1.28) * * @return bool */ - public static function executePath( Title &$title, IContextSource &$context, $including = false ) { + public static function executePath( Title &$title, IContextSource &$context, $including = false, + LinkRenderer $linkRenderer = null + ) { // @todo FIXME: Redirects broken due to this call $bits = explode( '/', $title->getDBkey(), 2 ); $name = $bits[0]; @@ -586,6 +590,9 @@ class SpecialPageFactory { } $page->including( $including ); + if ( $linkRenderer ) { + $page->setLinkRenderer( $linkRenderer ); + } // Execute special page $page->run( $par ); @@ -605,9 +612,12 @@ class SpecialPageFactory { * * @param Title $title * @param IContextSource $context + * @param LinkRenderer|null $linkRenderer (since 1.28) * @return string HTML fragment */ - public static function capturePath( Title $title, IContextSource $context ) { + public static function capturePath( + Title $title, IContextSource $context, LinkRenderer $linkRenderer = null + ) { global $wgTitle, $wgOut, $wgRequest, $wgUser, $wgLang; $main = RequestContext::getMain(); @@ -640,7 +650,7 @@ class SpecialPageFactory { $main->setLanguage( $context->getLanguage() ); // The useful part - $ret = self::executePath( $title, $context, true ); + $ret = self::executePath( $title, $context, true, $linkRenderer ); // Restore old globals and context $wgTitle = $glob['title']; diff --git a/includes/specials/SpecialBotPasswords.php b/includes/specials/SpecialBotPasswords.php index 1027f1f6e8..7e330aa63f 100644 --- a/includes/specials/SpecialBotPasswords.php +++ b/includes/specials/SpecialBotPasswords.php @@ -162,6 +162,7 @@ class SpecialBotPasswords extends FormSpecialPage { ]; } else { + $linkRenderer = $this->getLinkRenderer(); $dbr = BotPassword::getDB( DB_SLAVE ); $res = $dbr->select( 'bot_passwords', @@ -174,12 +175,9 @@ class SpecialBotPasswords extends FormSpecialPage { 'section' => 'existing', 'type' => 'info', 'raw' => true, - 'default' => Linker::link( + 'default' => $linkRenderer->makeKnownLink( $this->getPageTitle( $row->bp_app_id ), - htmlspecialchars( $row->bp_app_id ), - [], - [], - [ 'known' ] + $row->bp_app_id ), ]; } diff --git a/includes/specials/SpecialCategories.php b/includes/specials/SpecialCategories.php index d7d338ccf9..84d1f7c7fd 100644 --- a/includes/specials/SpecialCategories.php +++ b/includes/specials/SpecialCategories.php @@ -26,11 +26,6 @@ */ class SpecialCategories extends SpecialPage { - /** - * @var PageLinkRenderer - */ - protected $linkRenderer = null; - public function __construct() { parent::__construct( 'Categories' ); @@ -39,42 +34,18 @@ class SpecialCategories extends SpecialPage { // using the initServices() method. } - /** - * Initialize or override the PageLinkRenderer SpecialCategories collaborates with. - * Useful mainly for testing. - * - * @todo the pager should also be injected, and de-coupled from the rendering logic. - * - * @param PageLinkRenderer $linkRenderer - */ - public function setPageLinkRenderer( - PageLinkRenderer $linkRenderer - ) { - $this->linkRenderer = $linkRenderer; - } - - /** - * Initialize any services we'll need (unless it has already been provided via a setter). - * This allows for dependency injection even though we don't control object creation. - */ - private function initServices() { - if ( !$this->linkRenderer ) { - $lang = $this->getContext()->getLanguage(); - $titleFormatter = new MediaWikiTitleCodec( $lang, GenderCache::singleton() ); - $this->linkRenderer = new MediaWikiPageLinkRenderer( $titleFormatter ); - } - } - public function execute( $par ) { - $this->initServices(); - $this->setHeaders(); $this->outputHeader(); $this->getOutput()->allowClickjacking(); $from = $this->getRequest()->getText( 'from', $par ); - $cap = new CategoryPager( $this->getContext(), $from, $this->linkRenderer ); + $cap = new CategoryPager( + $this->getContext(), + $from, + $this->getLinkRenderer() + ); $cap->doQuery(); $this->getOutput()->addHTML( diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php index ac7e62ed2e..cce88b9c2c 100644 --- a/includes/specials/SpecialContributions.php +++ b/includes/specials/SpecialContributions.php @@ -37,7 +37,10 @@ class SpecialContributions extends IncludableSpecialPage { $this->setHeaders(); $this->outputHeader(); $out = $this->getOutput(); - $out->addModuleStyles( 'mediawiki.special' ); + $out->addModuleStyles( [ + 'mediawiki.special', + 'mediawiki.special.changeslist', + ] ); $this->addHelpLink( 'Help:User contributions' ); $this->opts = []; diff --git a/includes/specials/SpecialCreateAccount.php b/includes/specials/SpecialCreateAccount.php index b046bf967f..d01751e239 100644 --- a/includes/specials/SpecialCreateAccount.php +++ b/includes/specials/SpecialCreateAccount.php @@ -23,7 +23,6 @@ use MediaWiki\Auth\AuthManager; use MediaWiki\Logger\LoggerFactory; -use Psr\Log\LogLevel; /** * Implements Special:CreateAccount @@ -160,7 +159,7 @@ class SpecialCreateAccount extends LoginSignupSpecialPage { } protected function logAuthResult( $success, $status = null ) { - LoggerFactory::getInstance( 'authmanager-stats' )->info( 'Account creation attempt', [ + LoggerFactory::getInstance( 'authmanager' )->info( 'Account creation attempt', [ 'event' => 'accountcreation', 'successful' => $success, 'status' => $status, diff --git a/includes/specials/SpecialLinkSearch.php b/includes/specials/SpecialLinkSearch.php index 1ecbee007e..d4886f026b 100644 --- a/includes/specials/SpecialLinkSearch.php +++ b/includes/specials/SpecialLinkSearch.php @@ -30,11 +30,6 @@ class LinkSearchPage extends QueryPage { /** @var array|bool */ private $mungedQuery = false; - /** - * @var PageLinkRenderer - */ - protected $linkRenderer = null; - function setParams( $params ) { $this->mQuery = $params['query']; $this->mNs = $params['namespace']; @@ -49,39 +44,11 @@ class LinkSearchPage extends QueryPage { // using the setServices() method. } - /** - * Initialize or override the PageLinkRenderer LinkSearchPage collaborates with. - * Useful mainly for testing. - * - * @todo query logic and rendering logic should be split and also injected - * - * @param PageLinkRenderer $linkRenderer - */ - public function setPageLinkRenderer( - PageLinkRenderer $linkRenderer - ) { - $this->linkRenderer = $linkRenderer; - } - - /** - * Initialize any services we'll need (unless it has already been provided via a setter). - * This allows for dependency injection even though we don't control object creation. - */ - private function initServices() { - global $wgContLang; - if ( !$this->linkRenderer ) { - $titleFormatter = new MediaWikiTitleCodec( $wgContLang, GenderCache::singleton() ); - $this->linkRenderer = new MediaWikiPageLinkRenderer( $titleFormatter ); - } - } - function isCacheable() { return false; } public function execute( $par ) { - $this->initServices(); - $this->setHeaders(); $this->outputHeader(); @@ -277,7 +244,7 @@ class LinkSearchPage extends QueryPage { */ function formatResult( $skin, $result ) { $title = new TitleValue( (int)$result->namespace, $result->title ); - $pageLink = $this->linkRenderer->renderHtmlLink( $title ); + $pageLink = $this->getLinkRenderer()->makeLink( $title ); $url = $result->url; $urlLink = Linker::makeExternalLink( $url, $url ); diff --git a/includes/specials/SpecialListredirects.php b/includes/specials/SpecialListredirects.php index ace6d02cb2..d034a6ca77 100644 --- a/includes/specials/SpecialListredirects.php +++ b/includes/specials/SpecialListredirects.php @@ -83,7 +83,10 @@ class ListredirectsPage extends QueryPage { $batch = new LinkBatch; foreach ( $res as $row ) { $batch->add( $row->namespace, $row->title ); - $batch->addObj( $this->getRedirectTarget( $row ) ); + $redirTarget = $this->getRedirectTarget( $row ); + if ( $redirTarget ) { + $batch->addObj( $redirTarget ); + } } $batch->execute(); @@ -91,6 +94,10 @@ class ListredirectsPage extends QueryPage { $res->seek( 0 ); } + /** + * @param stdClass $row + * @return Title|null + */ protected function getRedirectTarget( $row ) { if ( isset( $row->rd_title ) ) { return Title::makeTitle( $row->rd_namespace, @@ -111,9 +118,10 @@ class ListredirectsPage extends QueryPage { * @return string */ function formatResult( $skin, $result ) { + $linkRenderer = $this->getLinkRenderer(); # Make a link to the redirect itself $rd_title = Title::makeTitle( $result->namespace, $result->title ); - $rd_link = Linker::link( + $rd_link = $linkRenderer->makeLink( $rd_title, null, [], @@ -126,7 +134,7 @@ class ListredirectsPage extends QueryPage { # Make a link to the destination page $lang = $this->getLanguage(); $arr = $lang->getArrow() . $lang->getDirMark(); - $targetLink = Linker::link( $target ); + $targetLink = $linkRenderer->makeLink( $target ); return "$rd_link $arr $targetLink"; } else { diff --git a/includes/specials/SpecialMergeHistory.php b/includes/specials/SpecialMergeHistory.php index 162ef60d8f..b916c1fc78 100644 --- a/includes/specials/SpecialMergeHistory.php +++ b/includes/specials/SpecialMergeHistory.php @@ -28,14 +28,38 @@ * @ingroup SpecialPage */ class SpecialMergeHistory extends SpecialPage { - /** @var FormOptions */ - protected $mOpts; + /** @var string */ + protected $mAction; - /** @var Status */ - protected $mStatus; + /** @var string */ + protected $mTarget; - /** @var Title|null */ - protected $mTargetObj, $mDestObj; + /** @var string */ + protected $mDest; + + /** @var string */ + protected $mTimestamp; + + /** @var int */ + protected $mTargetID; + + /** @var int */ + protected $mDestID; + + /** @var string */ + protected $mComment; + + /** @var bool Was posted? */ + protected $mMerge; + + /** @var bool Was submitted? */ + protected $mSubmitted; + + /** @var Title */ + protected $mTargetObj; + + /** @var Title */ + protected $mDestObj; /** @var int[] */ public $prevId; @@ -48,107 +72,124 @@ class SpecialMergeHistory extends SpecialPage { return true; } + /** + * @return void + */ + private function loadRequestParams() { + $request = $this->getRequest(); + $this->mAction = $request->getVal( 'action' ); + $this->mTarget = $request->getVal( 'target' ); + $this->mDest = $request->getVal( 'dest' ); + $this->mSubmitted = $request->getBool( 'submitted' ); + + $this->mTargetID = intval( $request->getVal( 'targetID' ) ); + $this->mDestID = intval( $request->getVal( 'destID' ) ); + $this->mTimestamp = $request->getVal( 'mergepoint' ); + if ( !preg_match( '/[0-9]{14}/', $this->mTimestamp ) ) { + $this->mTimestamp = ''; + } + $this->mComment = $request->getText( 'wpComment' ); + + $this->mMerge = $request->wasPosted() + && $this->getUser()->matchEditToken( $request->getVal( 'wpEditToken' ) ); + + // target page + if ( $this->mSubmitted ) { + $this->mTargetObj = Title::newFromText( $this->mTarget ); + $this->mDestObj = Title::newFromText( $this->mDest ); + } else { + $this->mTargetObj = null; + $this->mDestObj = null; + } + } + public function execute( $par ) { $this->useTransactionalTimeLimit(); $this->checkPermissions(); $this->checkReadOnly(); + $this->loadRequestParams(); + $this->setHeaders(); $this->outputHeader(); - $this->addHelpLink( 'Help:Merge history' ); - - $opts = new FormOptions(); - - $opts->add( 'target', '' ); - $opts->add( 'dest', '' ); - $opts->add( 'target', '' ); - $opts->add( 'mergepoint', '' ); - $opts->add( 'reason', '' ); - $opts->add( 'merge', false ); - - $opts->fetchValuesFromRequest( $this->getRequest() ); - - $target = $opts->getValue( 'target' ); - $dest = $opts->getValue( 'dest' ); - $targetObj = Title::newFromText( $target ); - $destObj = Title::newFromText( $dest ); - $status = Status::newGood(); - - $this->mOpts = $opts; - $this->mTargetObj = $targetObj; - $this->mDestObj = $destObj; - - if ( $opts->getValue( 'merge' ) && $targetObj && - $destObj && $opts->getValue( 'mergepoint' ) !== '' ) { + if ( $this->mTargetID && $this->mDestID && $this->mAction == 'submit' && $this->mMerge ) { $this->merge(); return; } - if ( $target === '' && $dest === '' ) { + if ( !$this->mSubmitted ) { $this->showMergeForm(); return; } - if ( !$targetObj instanceof Title ) { - $status->merge( Status::newFatal( 'mergehistory-invalid-source' ) ); - } elseif ( !$targetObj->exists() ) { - $status->merge( Status::newFatal( 'mergehistory-no-source', - wfEscapeWikiText( $targetObj->getPrefixedText() ) - ) ); + $errors = []; + if ( !$this->mTargetObj instanceof Title ) { + $errors[] = $this->msg( 'mergehistory-invalid-source' )->parseAsBlock(); + } elseif ( !$this->mTargetObj->exists() ) { + $errors[] = $this->msg( 'mergehistory-no-source', + wfEscapeWikiText( $this->mTargetObj->getPrefixedText() ) + )->parseAsBlock(); } - if ( !$destObj instanceof Title ) { - $status->merge( Status::newFatal( 'mergehistory-invalid-destination' ) ); - } elseif ( !$destObj->exists() ) { - $status->merge( Status::newFatal( 'mergehistory-no-destination', - wfEscapeWikiText( $destObj->getPrefixedText() ) - ) ); + if ( !$this->mDestObj instanceof Title ) { + $errors[] = $this->msg( 'mergehistory-invalid-destination' )->parseAsBlock(); + } elseif ( !$this->mDestObj->exists() ) { + $errors[] = $this->msg( 'mergehistory-no-destination', + wfEscapeWikiText( $this->mDestObj->getPrefixedText() ) + )->parseAsBlock(); } - if ( $targetObj && $destObj && $targetObj->equals( $destObj ) ) { - $status->merge( Status::newFatal( 'mergehistory-same-destination' ) ); + if ( $this->mTargetObj && $this->mDestObj && $this->mTargetObj->equals( $this->mDestObj ) ) { + $errors[] = $this->msg( 'mergehistory-same-destination' )->parseAsBlock(); } - $this->mStatus = $status; - - $this->showMergeForm(); - - if ( $status->isOK() ) { + if ( count( $errors ) ) { + $this->showMergeForm(); + $this->getOutput()->addHTML( implode( "\n", $errors ) ); + } else { $this->showHistory(); } } function showMergeForm() { - $formDescriptor = [ - 'target' => [ - 'type' => 'title', - 'name' => 'target', - 'label-message' => 'mergehistory-from', - 'required' => true, - ], - - 'dest' => [ - 'type' => 'title', - 'name' => 'dest', - 'label-message' => 'mergehistory-into', - 'required' => true, - ], - ]; - - $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ) - ->setIntro( $this->msg( 'mergehistory-header' ) ) - ->setWrapperLegendMsg( 'mergehistory-box' ) - ->setSubmitTextMsg( 'mergehistory-go' ) - ->setMethod( 'post' ) - ->prepareForm() - ->displayForm( $this->mStatus ); + $out = $this->getOutput(); + $out->addWikiMsg( 'mergehistory-header' ); + + $out->addHTML( + Xml::openElement( 'form', [ + 'method' => 'get', + 'action' => wfScript() ] ) . + '
    ' . + Xml::element( 'legend', [], + $this->msg( 'mergehistory-box' )->text() ) . + Html::hidden( 'title', $this->getPageTitle()->getPrefixedDBkey() ) . + Html::hidden( 'submitted', '1' ) . + Html::hidden( 'mergepoint', $this->mTimestamp ) . + Xml::openElement( 'table' ) . + ' + ' . Xml::label( $this->msg( 'mergehistory-from' )->text(), 'target' ) . ' + ' . Xml::input( 'target', 30, $this->mTarget, [ 'id' => 'target' ] ) . ' + + ' . Xml::label( $this->msg( 'mergehistory-into' )->text(), 'dest' ) . ' + ' . Xml::input( 'dest', 30, $this->mDest, [ 'id' => 'dest' ] ) . ' + ' . + Xml::submitButton( $this->msg( 'mergehistory-go' )->text() ) . + '' . + Xml::closeElement( 'table' ) . + '
    ' . + '' + ); + + $this->addHelpLink( 'Help:Merge history' ); } private function showHistory() { + $this->showMergeForm(); + # List all stored revisions $revisions = new MergeHistoryPager( $this, [], $this->mTargetObj, $this->mDestObj @@ -156,46 +197,62 @@ class SpecialMergeHistory extends SpecialPage { $haveRevisions = $revisions && $revisions->getNumRows() > 0; $out = $this->getOutput(); - $header = '

    ' . - $this->msg( 'mergehistory-list' )->escaped() . "

    \n"; + $titleObj = $this->getPageTitle(); + $action = $titleObj->getLocalURL( [ 'action' => 'submit' ] ); + # Start the form here + $top = Xml::openElement( + 'form', + [ + 'method' => 'post', + 'action' => $action, + 'id' => 'merge' + ] + ); + $out->addHTML( $top ); + + if ( $haveRevisions ) { + # Format the user-visible controls (comment field, submission button) + # in a nice little table + $table = + Xml::openElement( 'fieldset' ) . + $this->msg( 'mergehistory-merge', $this->mTargetObj->getPrefixedText(), + $this->mDestObj->getPrefixedText() )->parse() . + Xml::openElement( 'table', [ 'id' => 'mw-mergehistory-table' ] ) . + ' + ' . + Xml::label( $this->msg( 'mergehistory-reason' )->text(), 'wpComment' ) . + ' + ' . + Xml::input( 'wpComment', 50, $this->mComment, [ 'id' => 'wpComment' ] ) . + ' + + +   + ' . + Xml::submitButton( + $this->msg( 'mergehistory-submit' )->text(), + [ 'name' => 'merge', 'id' => 'mw-merge-submit' ] + ) . + ' + ' . + Xml::closeElement( 'table' ) . + Xml::closeElement( 'fieldset' ); + + $out->addHTML( $table ); + } + + $out->addHTML( + '

    ' . + $this->msg( 'mergehistory-list' )->escaped() . "

    \n" + ); if ( $haveRevisions ) { - $hiddenFields = [ - 'merge' => true, - 'target' => $this->mOpts->getValue( 'target' ), - 'dest' => $this->mOpts->getValue( 'dest' ), - ]; - - $formDescriptor = [ - 'reason' => [ - 'type' => 'text', - 'name' => 'reason', - 'label-message' => 'mergehistory-reason', - ], - ]; - - $mergeText = $this->msg( 'mergehistory-merge', - $this->mTargetObj->getPrefixedText(), - $this->mDestObj->getPrefixedText() - )->parse(); - - $history = $header . - $revisions->getNavigationBar() . - '
      ' . - $revisions->getBody() . - '
    ' . - $revisions->getNavigationBar(); - - $form = HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() ) - ->addHiddenFields( $hiddenFields ) - ->setPreText( $mergeText ) - ->setFooterText( $history ) - ->setSubmitTextMsg( 'mergehistory-submit' ) - ->setMethod( 'post' ) - ->prepareForm() - ->displayForm( false ); + $out->addHTML( $revisions->getNavigationBar() ); + $out->addHTML( '
      ' ); + $out->addHTML( $revisions->getBody() ); + $out->addHTML( '
    ' ); + $out->addHTML( $revisions->getNavigationBar() ); } else { - $out->addHTML( $header ); $out->addWikiMsg( 'mergehistory-empty' ); } @@ -203,6 +260,18 @@ class SpecialMergeHistory extends SpecialPage { $mergeLogPage = new LogPage( 'merge' ); $out->addHTML( '

    ' . $mergeLogPage->getName()->escaped() . "

    \n" ); LogEventsList::showLogExtract( $out, 'merge', $this->mTargetObj ); + + # When we submit, go by page ID to avoid some nasty but unlikely collisions. + # Such would happen if a page was renamed after the form loaded, but before submit + $misc = Html::hidden( 'targetID', $this->mTargetObj->getArticleID() ); + $misc .= Html::hidden( 'destID', $this->mDestObj->getArticleID() ); + $misc .= Html::hidden( 'target', $this->mTarget ); + $misc .= Html::hidden( 'dest', $this->mDest ); + $misc .= Html::hidden( 'wpEditToken', $this->getUser()->getEditToken() ); + $misc .= Xml::closeElement( 'form' ); + $out->addHTML( $misc ); + + return true; } function formatRevisionRow( $row ) { @@ -212,7 +281,7 @@ class SpecialMergeHistory extends SpecialPage { $last = $this->msg( 'last' )->escaped(); $ts = wfTimestamp( TS_MW, $row->rev_timestamp ); - $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mOpts->getValue( 'mergepoint' ) === $ts ) ); + $checkBox = Xml::radio( 'mergepoint', $ts, ( $this->mTimestamp === $ts ) ); $user = $this->getUser(); @@ -267,24 +336,23 @@ class SpecialMergeHistory extends SpecialPage { * @return bool Success */ function merge() { - $opts = $this->mOpts; - # Get the titles directly from the IDs, in case the target page params # were spoofed. The queries are done based on the IDs, so it's best to # keep it consistent... - $targetObj = $this->mTargetObj; - $destObj = $this->mDestObj; - - if ( is_null( $targetObj ) || is_null( $destObj ) || - $targetObj->getArticleID() == $destObj->getArticleID() ) { + $targetTitle = Title::newFromID( $this->mTargetID ); + $destTitle = Title::newFromID( $this->mDestID ); + if ( is_null( $targetTitle ) || is_null( $destTitle ) ) { + return false; // validate these + } + if ( $targetTitle->getArticleID() == $destTitle->getArticleID() ) { return false; } // MergeHistory object - $mh = new MergeHistory( $targetObj, $destObj, $opts->getValue( 'mergepoint' ) ); + $mh = new MergeHistory( $targetTitle, $destTitle, $this->mTimestamp ); // Merge! - $mergeStatus = $mh->merge( $this->getUser(), $opts->getValue( 'reason' ) ); + $mergeStatus = $mh->merge( $this->getUser(), $this->mComment ); if ( !$mergeStatus->isOK() ) { // Failed merge $this->getOutput()->addWikiMsg( $mergeStatus->getMessage() ); @@ -292,7 +360,7 @@ class SpecialMergeHistory extends SpecialPage { } $targetLink = Linker::link( - $targetObj, + $targetTitle, null, [], [ 'redirect' => 'no' ] @@ -300,7 +368,7 @@ class SpecialMergeHistory extends SpecialPage { $this->getOutput()->addWikiMsg( $this->msg( 'mergehistory-done' ) ->rawParams( $targetLink ) - ->params( $destObj->getPrefixedText() ) + ->params( $destTitle->getPrefixedText() ) ->numParams( $mh->getMergedRevisionCount() ) ); diff --git a/includes/specials/SpecialMovepage.php b/includes/specials/SpecialMovepage.php index f49d730009..20a508d47e 100644 --- a/includes/specials/SpecialMovepage.php +++ b/includes/specials/SpecialMovepage.php @@ -601,13 +601,14 @@ class MovePageForm extends UnlistedSpecialPage { $out = $this->getOutput(); $out->setPageTitle( $this->msg( 'pagemovedsub' ) ); - $oldLink = Linker::link( + $linkRenderer = $this->getLinkRenderer(); + $oldLink = $linkRenderer->makeLink( $ot, null, [ 'id' => 'movepage-oldlink' ], [ 'redirect' => 'no' ] ); - $newLink = Linker::linkKnown( + $newLink = $linkRenderer->makeKnownLink( $nt, null, [ 'id' => 'movepage-newlink' ] @@ -723,7 +724,7 @@ class MovePageForm extends UnlistedSpecialPage { # be longer than 255 characters. $newSubpage = Title::makeTitleSafe( $newNs, $newPageName ); if ( !$newSubpage ) { - $oldLink = Linker::linkKnown( $oldSubpage ); + $oldLink = $linkRenderer->makeKnownLink( $oldSubpage ); $extraOutput[] = $this->msg( 'movepage-page-unmoved' )->rawParams( $oldLink ) ->params( Title::makeName( $newNs, $newPageName ) )->escaped(); continue; @@ -731,7 +732,7 @@ class MovePageForm extends UnlistedSpecialPage { # This was copy-pasted from Renameuser, bleh. if ( $newSubpage->exists() && !$oldSubpage->isValidMoveTarget( $newSubpage ) ) { - $link = Linker::linkKnown( $newSubpage ); + $link = $linkRenderer->makeKnownLink( $newSubpage ); $extraOutput[] = $this->msg( 'movepage-page-exists' )->rawParams( $link )->escaped(); } else { $success = $oldSubpage->moveTo( $newSubpage, true, $this->reason, $createRedirect ); @@ -740,14 +741,14 @@ class MovePageForm extends UnlistedSpecialPage { if ( $this->fixRedirects ) { DoubleRedirectJob::fixRedirects( 'move', $oldSubpage, $newSubpage ); } - $oldLink = Linker::link( + $oldLink = $linkRenderer->makeLink( $oldSubpage, null, [], [ 'redirect' => 'no' ] ); - $newLink = Linker::linkKnown( $newSubpage ); + $newLink = $linkRenderer->makeKnownLink( $newSubpage ); $extraOutput[] = $this->msg( 'movepage-page-moved' ) ->rawParams( $oldLink, $newLink )->escaped(); ++$count; @@ -759,8 +760,8 @@ class MovePageForm extends UnlistedSpecialPage { break; } } else { - $oldLink = Linker::linkKnown( $oldSubpage ); - $newLink = Linker::link( $newSubpage ); + $oldLink = $linkRenderer->makeKnownLink( $oldSubpage ); + $newLink = $linkRenderer->makeLink( $newSubpage ); $extraOutput[] = $this->msg( 'movepage-page-unmoved' ) ->rawParams( $oldLink, $newLink )->escaped(); } @@ -804,8 +805,9 @@ class MovePageForm extends UnlistedSpecialPage { $out->addWikiMsg( 'movesubpagetext', $this->getLanguage()->formatNum( $count ) ); $out->addHTML( "
      \n" ); + $linkRenderer = $this->getLinkRenderer(); foreach ( $subpages as $subpage ) { - $link = Linker::link( $subpage ); + $link = $linkRenderer->makeLink( $subpage ); $out->addHTML( "
    • $link
    • \n" ); } $out->addHTML( "
    \n" ); diff --git a/includes/specials/SpecialNewpages.php b/includes/specials/SpecialNewpages.php index c24b054750..718a6dc794 100644 --- a/includes/specials/SpecialNewpages.php +++ b/includes/specials/SpecialNewpages.php @@ -188,9 +188,13 @@ class SpecialNewpages extends IncludableSpecialPage { unset( $changed['offset'] ); // Reset offset if query type changes $self = $this->getPageTitle(); + $linkRenderer = $this->getLinkRenderer(); foreach ( $filters as $key => $msg ) { $onoff = 1 - $this->opts->getValue( $key ); - $link = Linker::link( $self, $showhide[$onoff], [], + $link = $linkRenderer->makeLink( + $self, + new HtmlArmor( $showhide[$onoff] ), + [], [ $key => $onoff ] + $changed ); $links[$key] = $this->msg( $msg )->rawParams( $link )->escaped(); @@ -307,28 +311,25 @@ class SpecialNewpages extends IncludableSpecialPage { $spanTime = Html::element( 'span', [ 'class' => 'mw-newpages-time' ], $lang->userTimeAndDate( $result->rc_timestamp, $this->getUser() ) ); - $time = Linker::linkKnown( + $linkRenderer = $this->getLinkRenderer(); + $time = $linkRenderer->makeKnownLink( $title, - $spanTime, + new HtmlArmor( $spanTime ), [], - [ 'oldid' => $result->rc_this_oldid ], - [] + [ 'oldid' => $result->rc_this_oldid ] ); $query = $title->isRedirect() ? [ 'redirect' => 'no' ] : []; - // Linker::linkKnown() uses 'known' and 'noclasses' options. - // This breaks the colouration for stubs. - $plink = Linker::link( + $plink = $linkRenderer->makeKnownLink( $title, null, [ 'class' => 'mw-newpages-pagename' ], - $query, - [ 'known' ] + $query ); - $histLink = Linker::linkKnown( + $histLink = $linkRenderer->makeKnownLink( $title, - $this->msg( 'hist' )->escaped(), + $this->msg( 'hist' )->text(), [], [ 'action' => 'history' ] ); @@ -478,4 +479,8 @@ class SpecialNewpages extends IncludableSpecialPage { protected function getGroupName() { return 'changes'; } + + protected function getCacheTTL() { + return 60 * 5; + } } diff --git a/includes/specials/SpecialRandomInCategory.php b/includes/specials/SpecialRandomInCategory.php index efb1748913..a5e538f161 100644 --- a/includes/specials/SpecialRandomInCategory.php +++ b/includes/specials/SpecialRandomInCategory.php @@ -47,10 +47,15 @@ * @ingroup SpecialPage */ class SpecialRandomInCategory extends FormSpecialPage { + /** @var string[] */ protected $extra = []; // Extra SQL statements + /** @var Title|false */ protected $category = false; // Title object of category + /** @var int */ protected $maxOffset = 30; // Max amount to fudge randomness by. + /** @var int|null */ private $maxTimestamp = null; + /** @var int|null */ private $minTimestamp = null; public function __construct( $name = 'RandomInCategory' ) { diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index b6398cb567..d4fb72ca98 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -310,7 +310,7 @@ class SpecialRecentChanges extends ChangesListSpecialPage { /** * Build and output the actual changes list. * - * @param array $rows Database rows + * @param ResultWrapper $rows Database rows * @param FormOptions $opts */ public function outputChangesList( $rows, $opts ) { @@ -794,4 +794,9 @@ class SpecialRecentChanges extends ChangesListSpecialPage { public function isIncludable() { return true; } + + protected function getCacheTTL() { + return 60 * 5; + } + } diff --git a/includes/specials/SpecialSearch.php b/includes/specials/SpecialSearch.php index 36ea983893..aed2fa61e7 100644 --- a/includes/specials/SpecialSearch.php +++ b/includes/specials/SpecialSearch.php @@ -485,7 +485,9 @@ class SpecialSearch extends SpecialPage { protected function getDidYouMeanHtml( SearchResultSet $textMatches ) { # mirror Go/Search behavior of original request .. $params = [ 'search' => $textMatches->getSuggestionQuery() ]; - if ( $this->fulltext != null ) { + if ( $this->fulltext === null ) { + $params['fulltext'] = 'Search'; + } else { $params['fulltext'] = $this->fulltext; } $stParams = array_merge( $params, $this->powerSearchOptions() ); @@ -519,7 +521,9 @@ class SpecialSearch extends SpecialPage { // Search instead for '$orig' $params = [ 'search' => $textMatches->getQueryAfterRewrite() ]; - if ( $this->fulltext != null ) { + if ( $this->fulltext === null ) { + $params['fulltext'] = 'Search'; + } else { $params['fulltext'] = $this->fulltext; } $stParams = array_merge( $params, $this->powerSearchOptions() ); @@ -716,7 +720,7 @@ class SpecialSearch extends SpecialPage { $out .= "
      \n"; while ( $result ) { - $out .= $this->showHit( $result, $terms, ++$pos ); + $out .= $this->showHit( $result, $terms, $pos++ ); $result = $matches->next(); } $out .= "
    \n"; diff --git a/includes/specials/SpecialTrackingCategories.php b/includes/specials/SpecialTrackingCategories.php index f2eb88d154..4c892b29ee 100644 --- a/includes/specials/SpecialTrackingCategories.php +++ b/includes/specials/SpecialTrackingCategories.php @@ -53,6 +53,7 @@ class SpecialTrackingCategories extends SpecialPage { 'node-count-exceeded-category', 'expansion-depth-exceeded-category', 'restricted-displaytitle-ignored', + 'deprecated-self-close-category', ]; function execute( $par ) { diff --git a/includes/specials/SpecialUnusedtemplates.php b/includes/specials/SpecialUnusedtemplates.php index b0a2579fe0..f73be43839 100644 --- a/includes/specials/SpecialUnusedtemplates.php +++ b/includes/specials/SpecialUnusedtemplates.php @@ -71,16 +71,17 @@ class UnusedtemplatesPage extends QueryPage { * @return string */ function formatResult( $skin, $result ) { + $linkRenderer = $this->getLinkRenderer(); $title = Title::makeTitle( NS_TEMPLATE, $result->title ); - $pageLink = Linker::linkKnown( + $pageLink = $linkRenderer->makeKnownLink( $title, null, [], [ 'redirect' => 'no' ] ); - $wlhLink = Linker::linkKnown( + $wlhLink = $linkRenderer->makeKnownLink( SpecialPage::getTitleFor( 'Whatlinkshere', $title->getPrefixedText() ), - $this->msg( 'unusedtemplateswlh' )->escaped() + $this->msg( 'unusedtemplateswlh' )->text() ); return $this->getLanguage()->specialList( $pageLink, $wlhLink ); diff --git a/includes/specials/SpecialUpload.php b/includes/specials/SpecialUpload.php index 4b731cb994..0ef6af161f 100644 --- a/includes/specials/SpecialUpload.php +++ b/includes/specials/SpecialUpload.php @@ -535,7 +535,7 @@ class SpecialUpload extends SpecialPage { ); if ( !$status->isGood() ) { - $this->showUploadError( $this->getOutput()->parse( $status->getWikiText() ) ); + $this->showRecoverableUploadError( $this->getOutput()->parse( $status->getWikiText() ) ); return; } diff --git a/includes/specials/SpecialUserLogin.php b/includes/specials/SpecialUserLogin.php index 28c68aa6c2..db20d8771f 100644 --- a/includes/specials/SpecialUserLogin.php +++ b/includes/specials/SpecialUserLogin.php @@ -23,7 +23,6 @@ use MediaWiki\Auth\AuthManager; use MediaWiki\Logger\LoggerFactory; -use Psr\Log\LogLevel; /** * Implements Special:UserLogin @@ -154,7 +153,7 @@ class SpecialUserLogin extends LoginSignupSpecialPage { } protected function logAuthResult( $success, $status = null ) { - LoggerFactory::getInstance( 'authmanager-stats' )->info( 'Login attempt', [ + LoggerFactory::getInstance( 'authmanager' )->info( 'Login attempt', [ 'event' => 'login', 'successful' => $success, 'status' => $status, diff --git a/includes/specials/pagers/AllMessagesTablePager.php b/includes/specials/pagers/AllMessagesTablePager.php index 8e4fbaaad2..60f642d9c3 100644 --- a/includes/specials/pagers/AllMessagesTablePager.php +++ b/includes/specials/pagers/AllMessagesTablePager.php @@ -306,9 +306,8 @@ class AllMessagesTablePager extends TablePager { 'title' => 'Special:SearchTranslations', 'group' => 'mediawiki', 'grouppath' => 'mediawiki', - 'query' => 'language:' . $this->getLanguage()->getCode() . '^25 ' . - 'messageid:"MediaWiki:' . $value . '"^10 "' . - $this->msg( $value )->inLanguage( 'en' )->plain() . '"' + 'language' => $this->getLanguage()->getCode(), + 'query' => $value . ' ' . $this->msg( $value )->plain() ] ), $this->msg( 'allmessages-filter-translate' )->text() ); diff --git a/includes/specials/pagers/CategoryPager.php b/includes/specials/pagers/CategoryPager.php index cba4952b6f..b78fed89d5 100644 --- a/includes/specials/pagers/CategoryPager.php +++ b/includes/specials/pagers/CategoryPager.php @@ -18,6 +18,7 @@ * @file * @ingroup Pager */ +use MediaWiki\Linker\LinkRenderer; /** * @ingroup Pager @@ -25,16 +26,16 @@ class CategoryPager extends AlphabeticPager { /** - * @var PageLinkRenderer + * @var LinkRenderer */ protected $linkRenderer; /** * @param IContextSource $context * @param string $from - * @param PageLinkRenderer $linkRenderer + * @param LinkRenderer $linkRenderer */ - public function __construct( IContextSource $context, $from, PageLinkRenderer $linkRenderer + public function __construct( IContextSource $context, $from, LinkRenderer $linkRenderer ) { parent::__construct( $context ); $from = str_replace( ' ', '_', $from ); @@ -74,7 +75,7 @@ class CategoryPager extends AlphabeticPager { $this->mResult->rewind(); foreach ( $this->mResult as $row ) { - $batch->addObj( Title::makeTitleSafe( NS_CATEGORY, $row->cat_title ) ); + $batch->addObj( new TitleValue( NS_CATEGORY, $row->cat_title ) ); } $batch->execute(); $this->mResult->rewind(); @@ -85,7 +86,7 @@ class CategoryPager extends AlphabeticPager { function formatRow( $result ) { $title = new TitleValue( NS_CATEGORY, $result->cat_title ); $text = $title->getText(); - $link = $this->linkRenderer->renderHtmlLink( $title, $text ); + $link = $this->linkRenderer->makeLink( $title, $text ); $count = $this->msg( 'nmembers' )->numParams( $result->cat_pages )->escaped(); return Html::rawElement( 'li', null, $this->getLanguage()->specialList( $link, $count ) ) . "\n"; diff --git a/includes/specials/pagers/ContribsPager.php b/includes/specials/pagers/ContribsPager.php index 8620eb1b3d..fe0b4fea4b 100644 --- a/includes/specials/pagers/ContribsPager.php +++ b/includes/specials/pagers/ContribsPager.php @@ -371,8 +371,9 @@ class ContribsPager extends ReverseChronologicalPager { # Mark current revisions $topmarktext = ''; $user = $this->getUser(); - if ( $row->rev_id == $row->page_latest ) { + if ( $row->rev_id === $row->page_latest ) { $topmarktext .= '' . $this->messages['uctop'] . ''; + $classes[] = 'mw-contributions-current'; # Add rollback link if ( !$row->page_is_new && $page->quickUserCan( 'rollback', $user ) && $page->quickUserCan( 'edit', $user ) @@ -478,6 +479,8 @@ class ContribsPager extends ReverseChronologicalPager { ); $classes = array_merge( $classes, $newClasses ); + Hooks::run( 'SpecialContributions::formatRow::flags', [ $this->getContext(), $row, &$flags ] ); + $templateParams = [ 'del' => $del, 'timestamp' => $d, diff --git a/includes/tidy/Balancer.php b/includes/tidy/Balancer.php new file mode 100644 index 0000000000..ed92238c36 --- /dev/null +++ b/includes/tidy/Balancer.php @@ -0,0 +1,3214 @@ + [ + 'html' => true, 'head' => true, 'body' => true, 'frameset' => true, + 'form' => true, 'frame' => true, + 'plaintext' => true, 'isindex' => true, 'textarea' => true, + 'xmp' => true, 'iframe' => true, 'noembed' => true, + 'noscript' => true, 'select' => true, 'script' => true, + 'title' => true + ] + ]; + + public static $emptyElementSet = [ + self::HTML_NAMESPACE => [ + 'area' => true, 'base' => true, 'basefont' => true, + 'bgsound' => true, 'br' => true, 'col' => true, 'command' => true, + 'embed' => true, 'frame' => true, 'hr' => true, 'img' => true, + 'input' => true, 'keygen' => true, 'link' => true, 'meta' => true, + 'param' => true, 'source' => true, 'track' => true, 'wbr' => true + ] + ]; + + public static $headingSet = [ + self::HTML_NAMESPACE => [ + 'h1' => true, 'h2' => true, 'h3' => true, + 'h4' => true, 'h5' => true, 'h6' => true + ] + ]; + + public static $specialSet = [ + self::HTML_NAMESPACE => [ + 'address' => true, 'applet' => true, 'area' => true, + 'article' => true, 'aside' => true, 'base' => true, + 'basefont' => true, 'bgsound' => true, 'blockquote' => true, + 'body' => true, 'br' => true, 'button' => true, 'caption' => true, + 'center' => true, 'col' => true, 'colgroup' => true, 'dd' => true, + 'details' => true, 'dir' => true, 'div' => true, 'dl' => true, + 'dt' => true, 'embed' => true, 'fieldset' => true, + 'figcaption' => true, 'figure' => true, 'footer' => true, + 'form' => true, 'frame' => true, 'frameset' => true, 'h1' => true, + 'h2' => true, 'h3' => true, 'h4' => true, 'h5' => true, + 'h6' => true, 'head' => true, 'header' => true, 'hgroup' => true, + 'hr' => true, 'html' => true, 'iframe' => true, 'img' => true, + 'input' => true, 'isindex' => true, 'li' => true, 'link' => true, + 'listing' => true, 'main' => true, 'marquee' => true, + 'menu' => true, 'menuitem' => true, 'meta' => true, 'nav' => true, + 'noembed' => true, 'noframes' => true, 'noscript' => true, + 'object' => true, 'ol' => true, 'p' => true, 'param' => true, + 'plaintext' => true, 'pre' => true, 'script' => true, + 'section' => true, 'select' => true, 'source' => true, + 'style' => true, 'summary' => true, 'table' => true, + 'tbody' => true, 'td' => true, 'template' => true, + 'textarea' => true, 'tfoot' => true, 'th' => true, 'thead' => true, + 'title' => true, 'tr' => true, 'track' => true, 'ul' => true, + 'wbr' => true, 'xmp' => true + ], + self::SVG_NAMESPACE => [ + 'foreignobject' => true, 'desc' => true, 'title' => true + ], + self::MATHML_NAMESPACE => [ + 'mi' => true, 'mo' => true, 'mn' => true, 'ms' => true, + 'mtext' => true, 'annotation-xml' => true + ] + ]; + + public static $addressDivPSet = [ + self::HTML_NAMESPACE => [ + 'address' => true, 'div' => true, 'p' => true + ] + ]; + + public static $tableSectionRowSet = [ + self::HTML_NAMESPACE => [ + 'table' => true, 'thead' => true, 'tbody' => true, + 'tfoot' => true, 'tr' => true + ] + ]; + + public static $impliedEndTagsSet = [ + self::HTML_NAMESPACE => [ + 'dd' => true, 'dt' => true, 'li' => true, 'optgroup' => true, + 'option' => true, 'p' => true, 'rb' => true, 'rp' => true, + 'rt' => true, 'rtc' => true + ] + ]; + + public static $thoroughImpliedEndTagsSet = [ + self::HTML_NAMESPACE => [ + 'caption' => true, 'colgroup' => true, 'dd' => true, 'dt' => true, + 'li' => true, 'optgroup' => true, 'option' => true, 'p' => true, + 'rb' => true, 'rp' => true, 'rt' => true, 'rtc' => true, + 'tbody' => true, 'td' => true, 'tfoot' => true, 'th' => true, + 'thead' => true, 'tr' => true + ] + ]; + + public static $tableCellSet = [ + self::HTML_NAMESPACE => [ + 'td' => true, 'th' => true + ] + ]; + public static $tableContextSet = [ + self::HTML_NAMESPACE => [ + 'table' => true, 'template' => true, 'html' => true + ] + ]; + + public static $tableBodyContextSet = [ + self::HTML_NAMESPACE => [ + 'tbody' => true, 'tfoot' => true, 'thead' => true, + 'template' => true, 'html' => true + ] + ]; + + public static $tableRowContextSet = [ + self::HTML_NAMESPACE => [ + 'tr' => true, 'template' => true, 'html' => true + ] + ]; + + # OMITTED: formAssociatedSet, since we don't allow
    + + public static $inScopeSet = [ + self::HTML_NAMESPACE => [ + 'applet' => true, 'caption' => true, 'html' => true, + 'marquee' => true, 'object' => true, + 'table' => true, 'td' => true, 'template' => true, + 'th' => true + ], + self::SVG_NAMESPACE => [ + 'foreignobject' => true, 'desc' => true, 'title' => true + ], + self::MATHML_NAMESPACE => [ + 'mi' => true, 'mo' => true, 'mn' => true, 'ms' => true, + 'mtext' => true, 'annotation-xml' => true + ] + ]; + + private static $inListItemScopeSet = null; + public static function inListItemScopeSet() { + if ( self::$inListItemScopeSet === null ) { + self::$inListItemScopeSet = self::$inScopeSet; + self::$inListItemScopeSet[self::HTML_NAMESPACE]['ol'] = true; + self::$inListItemScopeSet[self::HTML_NAMESPACE]['ul'] = true; + } + return self::$inListItemScopeSet; + } + + private static $inButtonScopeSet = null; + public static function inButtonScopeSet() { + if ( self::$inButtonScopeSet === null ) { + self::$inButtonScopeSet = self::$inScopeSet; + self::$inButtonScopeSet[self::HTML_NAMESPACE]['button'] = true; + } + return self::$inButtonScopeSet; + } + + public static $inTableScopeSet = [ + self::HTML_NAMESPACE => [ + 'html' => true, 'table' => true, 'template' => true + ] + ]; + + public static $mathmlTextIntegrationPointSet = [ + self::MATHML_NAMESPACE => [ + 'mi' => true, 'mo' => true, 'mn' => true, 'ms' => true, + 'mtext' => true + ] + ]; + + public static $htmlIntegrationPointSet = [ + self::SVG_NAMESPACE => [ + 'foreignobject' => true, + 'desc' => true, + 'title' => true + ] + ]; + + // For tidy compatibility. + public static $tidyPWrapSet = [ + self::HTML_NAMESPACE => [ + 'body' => true, 'blockquote' => true, + // We parse with as the fragment context, but the top-level + // element on the stack is actually . We could use the + // "adjusted current node" everywhere to work around this, but it's + // easier just to add to the p-wrap set. + 'html' => true, + ], + ]; + public static $tidyInlineSet = [ + self::HTML_NAMESPACE => [ + 'a' => true, 'abbr' => true, 'acronym' => true, 'applet' => true, + 'b' => true, 'basefont' => true, 'bdo' => true, 'big' => true, + 'br' => true, 'button' => true, 'cite' => true, 'code' => true, + 'dfn' => true, 'em' => true, 'font' => true, 'i' => true, + 'iframe' => true, 'img' => true, 'input' => true, 'kbd' => true, + 'label' => true, 'legend' => true, 'map' => true, 'object' => true, + 'param' => true, 'q' => true, 'rb' => true, 'rbc' => true, + 'rp' => true, 'rt' => true, 'rtc' => true, 'ruby' => true, + 's' => true, 'samp' => true, 'select' => true, 'small' => true, + 'span' => true, 'strike' => true, 'strong' => true, 'sub' => true, + 'sup' => true, 'textarea' => true, 'tt' => true, 'u' => true, + 'var' => true, + ], + ]; +} + +/** + * A BalanceElement is a simplified version of a DOM Node. The main + * difference is that we only keep BalanceElements around for nodes + * currently on the BalanceStack of open elements. As soon as an + * element is closed, with some minor exceptions relating to the + * tree builder "adoption agency algorithm", the element and all its + * children are serialized to a string using the flatten() method. + * This keeps our memory usage low. + * + * @ingroup Parser + * @since 1.27 + */ +class BalanceElement { + /** + * The namespace of the element. + * @var string $namespaceURI + */ + public $namespaceURI; + /** + * The lower-cased name of the element. + * @var string $localName + */ + public $localName; + /** + * Attributes for the element, in array form + * @var array $attribs + */ + public $attribs; + + /** + * Parent of this element, or the string "flat" if this element has + * already been flattened into its parent. + * @var string|null $parent + */ + public $parent; + + /** + * An array of children of this element. Typically only the last + * child will be an actual BalanceElement object; the rest will + * be strings, representing either text nodes or flattened + * BalanceElement objects. + * @var array $children + */ + public $children; + + /** + * A unique string identifier for Noah's Ark purposes, lazy initialized + */ + private $noahKey; + + /** + * The next active formatting element in the list, or null if this is the + * end of the AFE list or if the element is not in the AFE list. + */ + public $nextAFE; + + /** + * The previous active formatting element in the list, or null if this is + * the start of the list or if the element is not in the AFE list. + */ + public $prevAFE; + + /** + * The next element in the Noah's Ark species bucket. + */ + public $nextNoah; + + /** + * Make a new BalanceElement corresponding to the HTML DOM Element + * with the given localname, namespace, and attributes. + * + * @param string $namespaceURI The namespace of the element. + * @param string $localName The lowercased name of the tag. + * @param array $attribs Attributes of the element + */ + public function __construct( $namespaceURI, $localName, array $attribs ) { + Assert::parameterType( 'string', $namespaceURI, '$namespaceURI' ); + Assert::parameterType( 'string', $localName, '$localName' ); + + $this->localName = $localName; + $this->namespaceURI = $namespaceURI; + $this->attribs = $attribs; + $this->contents = ''; + $this->parent = null; + $this->children = []; + } + + /** + * Remove the given child from this element. + * @param BalanceElement $elt + */ + private function removeChild( $elt ) { + Assert::precondition( + $this->parent !== 'flat', "Can't removeChild after flattening $this" + ); + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement', $elt, '$elt' ); + Assert::parameter( + $elt->parent === $this, 'elt', 'must have $this as a parent' + ); + $idx = array_search( $elt, $this->children, true ); + Assert::parameter( $idx !== false, '$elt', 'must be a child of $this' ); + $elt->parent = null; + array_splice( $this->children, $idx, 1 ); + } + + /** + * Find $a in the list of children and insert $b before it. + * @param BalanceElement $a + * @param BalanceElement|string $b + */ + public function insertBefore( $a, $b ) { + Assert::precondition( + $this->parent !== 'flat', "Can't insertBefore after flattening." + ); + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement', $a, '$a' ); + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement|string', $b, '$b' ); + $idx = array_search( $a, $this->children, true ); + Assert::parameter( $idx !== false, '$a', 'must be a child of $this' ); + if ( is_string( $b ) ) { + array_splice( $this->children, $idx, 0, [ $b ] ); + } else { + Assert::parameter( $b->parent !== 'flat', '$b', "Can't be flat" ); + if ( $b->parent !== null ) { + $b->parent->removeChild( $b ); + } + array_splice( $this->children, $idx, 0, [ $b ] ); + $b->parent = $this; + } + } + + /** + * Append $elt to the end of the list of children. + * @param BalanceElement|string $elt + */ + public function appendChild( $elt ) { + Assert::precondition( + $this->parent !== 'flat', "Can't appendChild after flattening." + ); + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement|string', $elt, '$elt' ); + if ( is_string( $elt ) ) { + array_push( $this->children, $elt ); + return; + } + // Remove $elt from parent, if it had one. + if ( $elt->parent !== null ) { + $elt->parent->removeChild( $elt ); + } + array_push( $this->children, $elt ); + $elt->parent = $this; + } + + /** + * Transfer all of the children of $elt to $this. + * @param BalanceElement $elt + */ + public function adoptChildren( $elt ) { + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement', $elt, '$elt' ); + Assert::precondition( + $elt->parent !== 'flat', "Can't adoptChildren after flattening." + ); + foreach ( $elt->children as $child ) { + if ( !is_string( $child ) ) { + // This is an optimization which avoids an O(n^2) set of + // array_splice operations. + $child->parent = null; + } + $this->appendChild( $child ); + } + $elt->children = []; + } + + /** + * Flatten this node and all of its children into a string, as specified + * by the HTML serialization specification, and replace this node + * in its parent by that string. + * + * @see __toString() + */ + public function flatten( $tidyCompat = false ) { + Assert::parameter( $this->parent !== null, '$this', 'must be a child' ); + Assert::parameter( $this->parent !== 'flat', '$this', 'already flat' ); + $idx = array_search( $this, $this->parent->children, true ); + Assert::parameter( + $idx !== false, '$this', 'must be a child of its parent' + ); + if ( $tidyCompat ) { + $blank = true; + foreach ( $this->children as $elt ) { + if ( !is_string( $elt ) ) { + $elt = $elt->flatten( $tidyCompat ); + } + if ( $blank && preg_match( '/[^\t\n\f\r ]/', $elt ) ) { + $blank = false; + } + } + if ( $this->isA( 'mw:p-wrap' ) ) { + $this->localName = 'p'; + } elseif ( $blank ) { + // Add 'mw-empty-elt' class so elements can be hidden via CSS + // for compatibility with legacy tidy. + if ( !count( $this->attribs ) && + ( $this->localName === 'tr' || $this->localName === 'li' ) + ) { + $this->attribs = [ 'class' => "mw-empty-elt" ]; + } + $blank = false; + } + $flat = $blank ? '' : "{$this}"; + } else { + $flat = "{$this}"; + } + $this->parent->children[$idx] = $flat; + $this->parent = 'flat'; # for assertion checking + return $flat; + } + + /** + * Serialize this node and all of its children to a string, as specified + * by the HTML serialization specification. + * + * @return string The serialization of the BalanceElement + * @see https://html.spec.whatwg.org/multipage/syntax.html#serialising-html-fragments + */ + public function __toString() { + $encAttribs = ''; + foreach ( $this->attribs as $name => $value ) { + $encValue = Sanitizer::encodeAttribute( $value ); + $encAttribs .= " $name=\"$encValue\""; + } + if ( !$this->isA( BalanceSets::$emptyElementSet ) ) { + $out = "<{$this->localName}{$encAttribs}>"; + // flatten children + foreach ( $this->children as $elt ) { + $out .= "{$elt}"; + } + $out .= "localName}>"; + } else { + $out = "<{$this->localName}{$encAttribs} />"; + Assert::invariant( + count( $this->children ) === 0, + "Empty elements shouldn't have children." + ); + } + return $out; + } + + # Utility functions on BalanceElements. + + /** + * Determine if $this represents a specific HTML tag, is a member of + * a tag set, or is equal to another BalanceElement. + * + * @param BalanceElement|array|string $set The target BalanceElement, + * set (from the BalanceSets class), or string (HTML tag name). + * @return bool + */ + public function isA( $set ) { + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement|array|string', $set, '$set' ); + if ( $set instanceof BalanceElement ) { + return $this === $set; + } elseif ( is_array( $set ) ) { + return isset( $set[$this->namespaceURI] ) && + isset( $set[$this->namespaceURI][$this->localName] ); + } else { + # assume this is an HTML element name. + return $this->isHtml() && $this->localName === $set; + } + } + + /** + * Determine if $this represents an element in the HTML namespace. + * + * @return bool + */ + public function isHtml() { + return $this->namespaceURI === BalanceSets::HTML_NAMESPACE; + } + + /** + * Determine if $this represents a MathML text integration point, + * as defined in the HTML5 specification. + * + * @return bool + * @see https://html.spec.whatwg.org/multipage/syntax.html#mathml-text-integration-point + */ + public function isMathmlTextIntegrationPoint() { + return $this->isA( BalanceSets::$mathmlTextIntegrationPointSet ); + } + + /** + * Determine if $this represents an HTML integration point, + * as defined in the HTML5 specification. + * + * @return bool + * @see https://html.spec.whatwg.org/multipage/syntax.html#html-integration-point + */ + public function isHtmlIntegrationPoint() { + if ( $this->isA( BalanceSets::$htmlIntegrationPointSet ) ) { + return true; + } + if ( + $this->namespaceURI === BalanceSets::MATHML_NAMESPACE && + $this->localName === 'annotation-xml' && + isset( $this->attribs['encoding'] ) && + ( strcasecmp( $this->attribs['encoding'], 'text/html' ) == 0 || + strcasecmp( $this->attribs['encoding'], 'application/xhtml+xml' ) == 0 ) + ) { + return true; + } + return false; + } + + /** + * Get a string key for the Noah's Ark algorithm + */ + public function getNoahKey() { + if ( $this->noahKey === null ) { + $attribs = $this->attribs; + ksort( $attribs ); + $this->noahKey = serialize( [ $this->namespaceURI, $this->localName, $attribs ] ); + } + return $this->noahKey; + } +} + +/** + * The "stack of open elements" as defined in the HTML5 tree builder + * spec. This contains methods to ensure that content (start tags, text) + * are inserted at the correct place in the output string, and to + * flatten BalanceElements are they are closed to avoid holding onto + * a complete DOM tree for the document in memory. + * + * The stack defines a PHP iterator to traverse it in "reverse order", + * that is, the most-recently-added element is visited first in a + * foreach loop. + * + * @ingroup Parser + * @since 1.27 + * @see https://html.spec.whatwg.org/multipage/syntax.html#the-stack-of-open-elements + */ +class BalanceStack implements IteratorAggregate { + /** + * Backing storage for the stack. + * @var array $elements + */ + private $elements = []; + /** + * Foster parent mode determines how nodes are inserted into the + * stack. + * @var bool $fosterParentMode + * @see https://html.spec.whatwg.org/multipage/syntax.html#foster-parent + */ + public $fosterParentMode = false; + /** + * Tidy compatibility mode, determines behavior of body/blockquote + */ + public $tidyCompat = false; + + /** + * Create a new BalanceStack with a single BalanceElement on it, + * representing the root <html> node. + */ + public function __construct() { + # always a root element on the stack + array_push( + $this->elements, + new BalanceElement( BalanceSets::HTML_NAMESPACE, 'html', [] ) + ); + } + + /** + * Return a string representing the output of the tree builder: + * all the children of the root <html> node. + * @return string + */ + public function getOutput() { + // Don't include the outer '....' + $out = ''; + foreach ( $this->elements[0]->children as $elt ) { + $out .= is_string( $elt ) ? $elt : + $elt->flatten( $this->tidyCompat ); + } + return $out; + } + + /** + * Insert text at the appropriate place for inserting a node. + * @param string $value + * @see https://html.spec.whatwg.org/multipage/syntax.html#appropriate-place-for-inserting-a-node + */ + public function insertText( $value ) { + Assert::parameterType( 'string', $value, '$value' ); + if ( + $this->fosterParentMode && + $this->currentNode()->isA( BalanceSets::$tableSectionRowSet ) + ) { + $this->fosterParent( $value ); + } elseif ( + $this->tidyCompat && + $this->currentNode()->isA( BalanceSets::$tidyPWrapSet ) + ) { + $this->insertHTMLELement( 'mw:p-wrap', [] ); + return $this->insertText( $value ); + } else { + $this->currentNode()->appendChild( $value ); + } + } + + /** + * Insert a BalanceElement at the appropriate place, pushing it + * on to the open elements stack. + * @param string $namespaceURI The element namespace + * @param string $tag The tag name + * @param string $attribs Normalized attributes, as a string. + * @return BalanceElement + * @see https://html.spec.whatwg.org/multipage/syntax.html#insert-a-foreign-element + */ + public function insertForeignElement( $namespaceURI, $tag, $attribs ) { + return $this->insertElement( + new BalanceElement( $namespaceURI, $tag, $attribs ) + ); + } + + /** + * Insert an HTML element at the appropriate place, pushing it on to + * the open elements stack. + * @param string $tag The tag name + * @param string $attribs Normalized attributes, as a string. + * @return BalanceElement + * @see https://html.spec.whatwg.org/multipage/syntax.html#insert-an-html-element + */ + public function insertHTMLElement( $tag, $attribs ) { + return $this->insertForeignElement( + BalanceSets::HTML_NAMESPACE, $tag, $attribs + ); + } + + /** + * Insert an element at the appropriate place and push it on to the + * open elements stack. + * @param BalanceElement $elt + * @return BalanceElement + * @see https://html.spec.whatwg.org/multipage/syntax.html#appropriate-place-for-inserting-a-node + */ + public function insertElement( $elt ) { + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement', $elt, '$elt' ); + if ( + $this->currentNode()->isA( 'mw:p-wrap' ) && + !$elt->isA( BalanceSets::$tidyInlineSet ) + ) { + // Tidy compatibility. + $this->pop(); + } + if ( + $this->fosterParentMode && + $this->currentNode()->isA( BalanceSets::$tableSectionRowSet ) + ) { + $elt = $this->fosterParent( $elt ); + } else { + $this->currentNode()->appendChild( $elt ); + } + Assert::invariant( $elt->parent !== null, "$elt must be in tree" ); + Assert::invariant( $elt->parent !== 'flat', "$elt must not have been previous flattened" ); + array_push( $this->elements, $elt ); + return $elt; + } + + /** + * Determine if the stack has $tag in scope. + * @param BalanceElement|array|string $tag + * @return bool + * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-scope + */ + public function inScope( $tag ) { + return $this->inSpecificScope( $tag, BalanceSets::$inScopeSet ); + } + + /** + * Determine if the stack has $tag in button scope. + * @param BalanceElement|array|string $tag + * @return bool + * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-button-scope + */ + public function inButtonScope( $tag ) { + return $this->inSpecificScope( $tag, BalanceSets::inButtonScopeSet() ); + } + + /** + * Determine if the stack has $tag in list item scope. + * @param BalanceElement|array|string $tag + * @return bool + * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-list-item-scope + */ + public function inListItemScope( $tag ) { + return $this->inSpecificScope( $tag, BalanceSets::inListItemScopeSet() ); + } + + /** + * Determine if the stack has $tag in table scope. + * @param BalanceElement|array|string $tag + * @return bool + * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-table-scope + */ + public function inTableScope( $tag ) { + return $this->inSpecificScope( $tag, BalanceSets::$inTableScopeSet ); + } + + /** + * Determine if the stack has $tag in a specific scope, $set. + * @param BalanceElement|array|string $tag + * @param BalanceElement|array|string $set + * @return bool + * @see https://html.spec.whatwg.org/multipage/syntax.html#has-an-element-in-the-specific-scope + */ + public function inSpecificScope( $tag, $set ) { + foreach ( $this as $elt ) { + if ( $elt->isA( $tag ) ) { + return true; + } + if ( $elt->isA( $set ) ) { + return false; + } + } + return false; + } + + /** + * Generate implied end tags. + * @param BalanceElement|array|string|null $butnot + * @param bool $thorough True if we should generate end tags thoroughly. + * @see https://html.spec.whatwg.org/multipage/syntax.html#generate-implied-end-tags + */ + public function generateImpliedEndTags( $butnot = null, $thorough = false ) { + $endTagSet = $thorough ? + BalanceSets::$thoroughImpliedEndTagsSet : + BalanceSets::$impliedEndTagsSet; + while ( $this->length() > 0 ) { + if ( $butnot !== null && $this->currentNode()->isA( $butnot ) ) { + break; + } + if ( !$this->currentNode()->isA( $endTagSet ) ) { + break; + } + $this->pop(); + } + } + + /** + * Return the current node (the element in the stack with the largest + * index). + * @return BalanceElement + * @see https://html.spec.whatwg.org/multipage/syntax.html#current-node + */ + public function currentNode() { + return $this->node( count( $this->elements ) - 1 ); + } + + /** + * Return the adjusted current node. + */ + public function adjustedCurrentNode( $fragmentContext ) { + return ( $fragmentContext && $this->length() === 1 ) ? + $fragmentContext : $this->currentNode(); + } + + /** + * Return an iterator over this stack which visits the current node + * first, and the root node last. + * @return Iterator + */ + public function getIterator() { + return new ReverseArrayIterator( $this->elements ); + } + + /** + * Return the BalanceElement at the given position $idx, where + * position 0 represents the root element. + * @param int $idx + * @return BalanceElement + */ + public function node( $idx ) { + return $this->elements[ $idx ]; + } + + /** + * Replace the element at position $idx in the BalanceStack with $elt. + * @param int $idx + * @param BalanceElement $elt + */ + public function replaceAt( $idx, $elt ) { + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement', $elt, '$elt' ); + Assert::precondition( + $this->elements[$idx]->parent !== 'flat', + 'Replaced element should not have already been flattened.' + ); + Assert::precondition( + $elt->parent !== 'flat', + 'New element should not have already been flattened.' + ); + $this->elements[$idx] = $elt; + } + + /** + * Return the position of the given BalanceElement, set, or + * HTML tag name string in the BalanceStack. + * @param BalanceElement|array|string $tag + * @return int + */ + public function indexOf( $tag ) { + for ( $i = count( $this->elements ) - 1; $i >= 0; $i-- ) { + if ( $this->elements[$i]->isA( $tag ) ) { + return $i; + } + } + return -1; + } + + /** + * Return the number of elements currently in the BalanceStack. + * @return int + */ + public function length() { + return count( $this->elements ); + } + + /** + * Remove the current node from the BalanceStack, flattening it + * in the process. + */ + public function pop() { + $elt = array_pop( $this->elements ); + if ( !$elt->isA( 'mw:p-wrap' ) ) { + $elt->flatten( $this->tidyCompat ); + } + } + + /** + * Remove all nodes up to and including position $idx from the + * BalanceStack, flattening them in the process. + * @param int $idx + */ + public function popTo( $idx ) { + while ( $this->length() > $idx ) { + $this->pop(); + } + } + + /** + * Pop elements off the stack up to and including the first + * element with the specified HTML tagname (or matching the given + * set). + * @param BalanceElement|array|string $tag + */ + public function popTag( $tag ) { + while ( $this->length() > 0 ) { + if ( $this->currentNode()->isA( $tag ) ) { + $this->pop(); + break; + } + $this->pop(); + } + } + + /** + * Pop elements off the stack *not including* the first element + * in the specified set. + * @param BalanceElement|array|string $set + */ + public function clearToContext( $set ) { + // Note that we don't loop to 0. Never pop the elt off. + while ( $this->length() > 1 ) { + if ( $this->currentNode()->isA( $set ) ) { + break; + } + $this->pop(); + } + } + + /** + * Remove the given $elt from the BalanceStack, optionally + * flattening it in the process. + * @param BalanceElement $elt The element to remove. + * @param bool $flatten Whether to flatten the removed element. + */ + public function removeElement( $elt, $flatten = true ) { + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement', $elt, '$elt' ); + Assert::parameter( + $elt->parent !== 'flat', + '$elt', + '$elt should not already have been flattened.' + ); + Assert::parameter( + $elt->parent->parent !== 'flat', + '$elt', + 'The parent of $elt should not already have been flattened.' + ); + $idx = array_search( $elt, $this->elements, true ); + Assert::parameter( $idx !== false, '$elt', 'must be in stack' ); + array_splice( $this->elements, $idx, 1 ); + if ( $flatten ) { + // serialize $elt into its parent + // otherwise, it will eventually serialize when the parent + // is serialized, we just hold onto the memory for its + // tree of objects a little longer. + $elt->flatten( $this->tidyCompat ); + } + Assert::postcondition( + array_search( $elt, $this->elements, true ) === false, + '$elt should no longer be in open elements stack' + ); + } + + /** + * Find $a in the BalanceStack and insert $b after it. + * @param BalanceElement $a + * @param BalanceElement $b + */ + public function insertAfter( $a, $b ) { + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement', $a, '$a' ); + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement', $b, '$b' ); + $idx = $this->indexOf( $a ); + Assert::parameter( $idx !== false, '$a', 'must be in stack' ); + array_splice( $this->elements, $idx + 1, 0, [ $b ] ); + } + + # Fostering and adoption. + + /** + * Foster parent the given $elt in the stack of open elements. + * @param BalanceElement|string $elt + * @see https://html.spec.whatwg.org/multipage/syntax.html#foster-parent + */ + private function fosterParent( $elt ) { + Assert::parameterType( 'MediaWiki\Tidy\BalanceElement|string', $elt, '$elt' ); + $lastTable = $this->indexOf( 'table' ); + $lastTemplate = $this->indexOf( 'template' ); + $parent = null; + $before = null; + + if ( $lastTemplate >= 0 && ( $lastTable < 0 || $lastTemplate > $lastTable ) ) { + $parent = $this->elements[$lastTemplate]; + } elseif ( $lastTable >= 0 ) { + $parent = $this->elements[$lastTable]->parent; + # Assume all tables have parents, since we're not running scripts! + Assert::invariant( + $parent !== null, "All tables should have parents" + ); + $before = $this->elements[$lastTable]; + } else { + $parent = $this->elements[0]; // the `html` element. + } + + if ( $this->tidyCompat ) { + if ( is_string( $elt ) ) { + // We're fostering text: do we need a p-wrapper? + if ( $parent->isA( BalanceSets::$tidyPWrapSet ) ) { + $this->insertHTMLElement( 'mw:p-wrap', [] ); + $this->insertText( $elt ); + return $elt; + } + } else { + // We're fostering an element; do we need to merge p-wrappers? + if ( $elt->isA( 'mw:p-wrap' ) ) { + $idx = $before ? + array_search( $before, $parent->children, true ) : + count( $parent->children ); + $after = $idx > 0 ? $parent->children[$idx - 1] : ''; + if ( + $after instanceof BalanceElement && + $after->isA( 'mw:p-wrap' ) + ) { + return $after; // Re-use existing p-wrapper. + } + } + } + } + + if ( $before ) { + $parent->insertBefore( $before, $elt ); + } else { + $parent->appendChild( $elt ); + } + return $elt; + } + + /** + * Run the "adoption agency algoritm" (AAA) for the given subject + * tag name. + * @param string $tag The subject tag name. + * @param BalanceActiveFormattingElements $afe The current + * active formatting elements list. + * @return true if the adoption agency algorithm "did something", false + * if more processing is required by the caller. + * @see https://html.spec.whatwg.org/multipage/syntax.html#adoption-agency-algorithm + */ + public function adoptionAgency( $tag, $afe ) { + // If the current node is an HTML element whose tag name is subject, + // and the current node is not in the list of active formatting + // elements, then pop the current node off the stack of open + // elements and abort these steps. + if ( + $this->currentNode()->isA( $tag ) && + !$afe->isInList( $this->currentNode() ) + ) { + $this->pop(); + return true; // no more handling required + } + + // Let outer loop counter be zero. + $outer = 0; + + // Outer loop: If outer loop counter is greater than or + // equal to eight, then abort these steps. + while ( $outer < 8 ) { + // Increment outer loop counter by one. + $outer++; + + // Let the formatting element be the last element in the list + // of active formatting elements that: is between the end of + // the list and the last scope marker in the list, if any, or + // the start of the list otherwise, and has the same tag name + // as the token. + $fmtelt = $afe->findElementByTag( $tag ); + + // If there is no such node, then abort these steps and instead + // act as described in the "any other end tag" entry below. + if ( !$fmtelt ) { + return false; // false means handle by the default case + } + + // Otherwise, if there is such a node, but that node is not in + // the stack of open elements, then this is a parse error; + // remove the element from the list, and abort these steps. + $index = $this->indexOf( $fmtelt ); + if ( $index < 0 ) { + $afe->remove( $fmtelt ); + return true; // true means no more handling required + } + + // Otherwise, if there is such a node, and that node is also in + // the stack of open elements, but the element is not in scope, + // then this is a parse error; ignore the token, and abort + // these steps. + if ( !$this->inScope( $fmtelt ) ) { + return true; + } + + // Let the furthest block be the topmost node in the stack of + // open elements that is lower in the stack than the formatting + // element, and is an element in the special category. There + // might not be one. + $furthestblock = null; + $furthestblockindex = -1; + $stacklen = $this->length(); + for ( $i = $index+1; $i < $stacklen; $i++ ) { + if ( $this->node( $i )->isA( BalanceSets::$specialSet ) ) { + $furthestblock = $this->node( $i ); + $furthestblockindex = $i; + break; + } + } + + // If there is no furthest block, then the UA must skip the + // subsequent steps and instead just pop all the nodes from the + // bottom of the stack of open elements, from the current node + // up to and including the formatting element, and remove the + // formatting element from the list of active formatting + // elements. + if ( !$furthestblock ) { + $this->popTag( $fmtelt ); + $afe->remove( $fmtelt ); + return true; + } else { + // Let the common ancestor be the element immediately above + // the formatting element in the stack of open elements. + $ancestor = $this->node( $index-1 ); + + // Let a bookmark note the position of the formatting + // element in the list of active formatting elements + // relative to the elements on either side of it in the + // list. + $BOOKMARK = new BalanceElement( '[bookmark]', '[bookmark]', [] ); + $afe->insertAfter( $fmtelt, $BOOKMARK ); + + // Let node and last node be the furthest block. + $node = $furthestblock; + $lastnode = $furthestblock; + $nodeindex = $furthestblockindex; + $isAFE = false; + + // Let inner loop counter be zero. + $inner = 0; + + while ( true ) { + + // Increment inner loop counter by one. + $inner++; + + // Let node be the element immediately above node in + // the stack of open elements, or if node is no longer + // in the stack of open elements (e.g. because it got + // removed by this algorithm), the element that was + // immediately above node in the stack of open elements + // before node was removed. + $node = $this->node( --$nodeindex ); + + // If node is the formatting element, then go + // to the next step in the overall algorithm. + if ( $node === $fmtelt ) break; + + // If the inner loop counter is greater than three and node + // is in the list of active formatting elements, then remove + // node from the list of active formatting elements. + $isAFE = $afe->isInList( $node ); + if ( $inner > 3 && $isAFE ) { + $afe->remove( $node ); + $isAFE = false; + } + + // If node is not in the list of active formatting + // elements, then remove node from the stack of open + // elements and then go back to the step labeled inner + // loop. + if ( !$isAFE ) { + // Don't flatten here, since we're about to relocate + // parts of this $node. + $this->removeElement( $node, false ); + continue; + } + + // Create an element for the token for which the + // element node was created with common ancestor as + // the intended parent, replace the entry for node + // in the list of active formatting elements with an + // entry for the new element, replace the entry for + // node in the stack of open elements with an entry for + // the new element, and let node be the new element. + $newelt = new BalanceElement( + $node->namespaceURI, $node->localName, $node->attribs ); + $afe->replace( $node, $newelt ); + $this->replaceAt( $nodeindex, $newelt ); + $node = $newelt; + + // If last node is the furthest block, then move the + // aforementioned bookmark to be immediately after the + // new node in the list of active formatting elements. + if ( $lastnode === $furthestblock ) { + $afe->remove( $BOOKMARK ); + $afe->insertAfter( $newelt, $BOOKMARK ); + } + + // Insert last node into node, first removing it from + // its previous parent node if any. + $node->appendChild( $lastnode ); + + // Let last node be node. + $lastnode = $node; + } + + // If the common ancestor node is a table, tbody, tfoot, + // thead, or tr element, then, foster parent whatever last + // node ended up being in the previous step, first removing + // it from its previous parent node if any. + if ( + $this->fosterParentMode && + $ancestor->isA( BalanceSets::$tableSectionRowSet ) + ) { + $this->fosterParent( $lastnode ); + } else { + // Otherwise, append whatever last node ended up being in + // the previous step to the common ancestor node, first + // removing it from its previous parent node if any. + $ancestor->appendChild( $lastnode ); + } + + // Create an element for the token for which the + // formatting element was created, with furthest block + // as the intended parent. + $newelt2 = new BalanceElement( + $fmtelt->namespaceURI, $fmtelt->localName, $fmtelt->attribs ); + + // Take all of the child nodes of the furthest block and + // append them to the element created in the last step. + $newelt2->adoptChildren( $furthestblock ); + + // Append that new element to the furthest block. + $furthestblock->appendChild( $newelt2 ); + + // Remove the formatting element from the list of active + // formatting elements, and insert the new element into the + // list of active formatting elements at the position of + // the aforementioned bookmark. + $afe->remove( $fmtelt ); + $afe->replace( $BOOKMARK, $newelt2 ); + + // Remove the formatting element from the stack of open + // elements, and insert the new element into the stack of + // open elements immediately below the position of the + // furthest block in that stack. + $this->removeElement( $fmtelt ); + $this->insertAfter( $furthestblock, $newelt2 ); + } + } + + return true; + } + + /** + * Return the contents of the open elements stack as a string for + * debugging. + * @return string + */ + public function __toString() { + $r = []; + foreach ( $this->elements as $elt ) { + array_push( $r, $elt->localName ); + } + return implode( $r, ' ' ); + } +} + +/** + * A pseudo-element used as a marker in the list of active formatting elements + * + * @ingroup Parser + * @since 1.27 + */ +class BalanceMarker { + public $nextAFE; + public $prevAFE; +} + +/** + * The list of active formatting elements, which is used to handle + * mis-nested formatting element tags in the HTML5 tree builder + * specification. + * + * @ingroup Parser + * @since 1.27 + * @see https://html.spec.whatwg.org/multipage/syntax.html#list-of-active-formatting-elements + */ +class BalanceActiveFormattingElements { + /** The last (most recent) element in the list */ + private $tail; + + /** The first (least recent) element in the list */ + private $head; + + /** + * An array of arrays representing the population of elements in each bucket + * according to the Noah's Ark clause. The outer array is stack-like, with each + * integer-indexed element representing a segment of the list, bounded by + * markers. The first element represents the segment of the list before the + * first marker. + * + * The inner arrays are indexed by "Noah key", which is a string which uniquely + * identifies each bucket according to the rules in the spec. The value in + * the inner array is the first (least recently inserted) element in the bucket, + * and subsequent members of the bucket can be found by iterating through the + * singly-linked list via $node->nextNoah. + * + * This is optimised for the most common case of inserting into a bucket + * with zero members, and deleting a bucket containing one member. In the + * worst case, iteration through the list is still O(1) in the document + * size, since each bucket can have at most 3 members. + */ + private $noahTableStack = [ [] ]; + + public function __destruct() { + for ( $node = $this->head; $node; $node = $next ) { + $next = $node->nextAFE; + $node->prevAFE = $node->nextAFE = $node->nextNoah = null; + } + $this->head = $this->tail = $this->noahTableStack = null; + } + + public function insertMarker() { + $elt = new BalanceMarker; + if ( $this->tail ) { + $this->tail->nextAFE = $elt; + $elt->prevAFE = $this->tail; + } else { + $this->head = $elt; + } + $this->tail = $elt; + $this->noahTableStack[] = []; + } + + /** + * Follow the steps required when the spec requires us to "push onto the + * list of active formatting elements". + * @param BalanceElement $elt + */ + public function push( BalanceElement $elt ) { + // Must not be in the list already + if ( $elt->prevAFE !== null || $this->head === $elt ) { + throw new ParameterAssertionException( '$elt', + 'Cannot insert a node into the AFE list twice' ); + } + + // "Noah's Ark clause" -- if there are already three copies of + // this element before we encounter a marker, then drop the last + // one. + $noahKey = $elt->getNoahKey(); + $table =& $this->noahTableStack[ count( $this->noahTableStack ) - 1 ]; + if ( !isset( $table[$noahKey] ) ) { + $table[$noahKey] = $elt; + } else { + $count = 1; + $head = $tail = $table[$noahKey]; + while ( $tail->nextNoah ) { + $tail = $tail->nextNoah; + $count++; + } + if ( $count >= 3 ) { + $this->remove( $head ); + } + $tail->nextNoah = $elt; + } + // Add to the main AFE list + if ( $this->tail ) { + $this->tail->nextAFE = $elt; + $elt->prevAFE = $this->tail; + } else { + $this->head = $elt; + } + $this->tail = $elt; + } + + /** + * Follow the steps required when the spec asks us to "clear the list of + * active formatting elements up to the last marker". + */ + public function clearToMarker() { + // Iterate back through the list starting from the tail + $tail = $this->tail; + while ( $tail && !( $tail instanceof BalanceMarker ) ) { + // Unlink the element + $prev = $tail->prevAFE; + $tail->prevAFE = null; + if ( $prev ) { + $prev->nextAFE = null; + } + $tail->nextNoah = null; + $tail = $prev; + } + // If we finished on a marker, unlink it and pop it off the Noah table stack + if ( $tail ) { + $prev = $tail->prevAFE; + if ( $prev ) { + $prev->nextAFE = null; + } + $tail = $prev; + array_pop( $this->noahTableStack ); + } else { + // No marker: wipe the top-level Noah table (which is the only one) + $this->noahTableStack[0] = []; + } + // If we removed all the elements, clear the head pointer + if ( !$tail ) { + $this->head = null; + } + $this->tail = $tail; + } + + /** + * Find and return the last element with the specified tag between the + * end of the list and the last marker on the list. + * Used when parsing <a> "in body mode". + */ + public function findElementByTag( $tag ) { + $elt = $this->tail; + while ( $elt && !( $elt instanceof BalanceMarker ) ) { + if ( $elt->localName === $tag ) { + return $elt; + } + $elt = $elt->prevAFE; + } + return null; + } + + /** + * Determine whether an element is in the list of formatting elements. + * @return boolean + */ + public function isInList( BalanceElement $elt ) { + return $this->head === $elt || $elt->prevAFE; + } + + /** + * Find the element $elt in the list and remove it. + * Used when parsing <a> in body mode. + */ + public function remove( BalanceElement $elt ) { + if ( $this->head !== $elt && !$elt->prevAFE ) { + throw new ParameterAssertionException( '$elt', + "Attempted to remove an element which is not in the AFE list" ); + } + // Update head and tail pointers + if ( $this->head === $elt ) { + $this->head = $elt->nextAFE; + } + if ( $this->tail === $elt ) { + $this->tail = $elt->prevAFE; + } + // Update previous element + if ( $elt->prevAFE ) { + $elt->prevAFE->nextAFE = $elt->nextAFE; + } + // Update next element + if ( $elt->nextAFE ) { + $elt->nextAFE->prevAFE = $elt->prevAFE; + } + // Clear pointers so that isInList() etc. will work + $elt->prevAFE = $elt->nextAFE = null; + // Update Noah list + $this->removeFromNoahList( $elt ); + } + + private function addToNoahList( BalanceElement $elt ) { + $noahKey = $elt->getNoahKey(); + $table =& $this->noahTableStack[ count( $this->noahTableStack ) - 1 ]; + if ( !isset( $table[$noahKey] ) ) { + $table[$noahKey] = $elt; + } else { + $tail = $table[$noahKey]; + while ( $tail->nextNoah ) { + $tail = $tail->nextNoah; + } + $tail->nextNoah = $elt; + } + } + + private function removeFromNoahList( BalanceElement $elt ) { + $table =& $this->noahTableStack[ count( $this->noahTableStack ) - 1 ]; + $key = $elt->getNoahKey(); + $noahElt = $table[$key]; + if ( $noahElt === $elt ) { + if ( $noahElt->nextNoah ) { + $table[$key] = $noahElt->nextNoah; + $noahElt->nextNoah = null; + } else { + unset( $table[$key] ); + } + } else { + do { + $prevNoahElt = $noahElt; + $noahElt = $prevNoahElt->nextNoah; + if ( $noahElt === $elt ) { + // Found it, unlink + $prevNoahElt->nextNoah = $elt->nextNoah; + $elt->nextNoah = null; + break; + } + } while ( $noahElt ); + } + } + + /** + * Find element $a in the list and replace it with element $b + */ + public function replace( BalanceElement $a, BalanceElement $b ) { + if ( $this->head !== $a && !$a->prevAFE ) { + throw new ParameterAssertionException( '$a', + "Attempted to replace an element which is not in the AFE list" ); + } + // Update head and tail pointers + if ( $this->head === $a ) { + $this->head = $b; + } + if ( $this->tail === $a ) { + $this->tail = $b; + } + // Update previous element + if ( $a->prevAFE ) { + $a->prevAFE->nextAFE = $b; + } + // Update next element + if ( $a->nextAFE ) { + $a->nextAFE->prevAFE = $b; + } + $b->prevAFE = $a->prevAFE; + $b->nextAFE = $a->nextAFE; + $a->nextAFE = $a->prevAFE = null; + // Update Noah list + $this->removeFromNoahList( $a ); + $this->addToNoahList( $b ); + } + + /** + * Find $a in the list and insert $b after it. + */ + public function insertAfter( BalanceElement $a, BalanceElement $b ) { + if ( $this->head !== $a && !$a->prevAFE ) { + throw new ParameterAssertionException( '$a', + "Attempted to insert after an element which is not in the AFE list" ); + } + if ( $this->tail === $a ) { + $this->tail = $b; + } + if ( $a->nextAFE ) { + $a->nextAFE->prevAFE = $b; + } + $b->nextAFE = $a->nextAFE; + $b->prevAFE = $a; + $a->nextAFE = $b; + $this->addToNoahList( $b ); + } + + // @codingStandardsIgnoreStart Generic.Files.LineLength.TooLong + /** + * Reconstruct the active formatting elements. + * @param BalanceStack $stack The open elements stack + * @see https://html.spec.whatwg.org/multipage/syntax.html#reconstruct-the-active-formatting-elements + */ + // @codingStandardsIgnoreEnd + public function reconstruct( $stack ) { + $entry = $this->tail; + // If there are no entries in the list of active formatting elements, + // then there is nothing to reconstruct + if ( !$entry ) { + return; + } + // If the last is a marker, do nothing. + if ( $entry instanceof BalanceMarker ) { + return; + } + // Or if it is an open element, do nothing. + if ( $stack->indexOf( $entry ) >= 0 ) { + return; + } + + // Loop backward through the list until we find a marker or an + // open element + while ( $entry->prevAFE ) { + $entry = $entry->prevAFE; + if ( $entry instanceof BalanceMarker || $stack->indexOf( $entry ) >= 0 ) { + break; + } + } + + // Now loop forward, starting from the element after the current one (or + // the first element if we didn't find a marker or open element), + // recreating formatting elements and pushing them back onto the list + // of open elements. + if ( $entry->prevAFE ) { + $entry = $entry->nextAFE; + } + do { + $newElement = $stack->insertHTMLElement( + $entry->localName, + $entry->attribs ); + $this->replace( $entry, $newElement ); + $entry = $newElement->nextAFE; + } while ( $entry ); + } + + /** + * Get a string representation of the AFE list, for debugging + */ + public function __toString() { + $prev = null; + $s = ''; + for ( $node = $this->head; $node; $prev = $node, $node = $node->nextAFE ) { + if ( $node instanceof BalanceMarker ) { + $s .= "MARKER\n"; + continue; + } + $s .= $node->localName . '#' . substr( md5( spl_object_hash( $node ) ), 0, 8 ); + if ( $node->nextNoah ) { + $s .= " (noah sibling: {$node->nextNoah->localName}#" . + substr( md5( spl_object_hash( $node->nextNoah ) ), 0, 8 ) . + ')'; + } + if ( $node->nextAFE && $node->nextAFE->prevAFE !== $node ) { + $s .= " (reverse link is wrong!)"; + } + $s .= "\n"; + } + if ( $prev !== $this->tail ) { + $s .= "(tail pointer is wrong!)\n"; + } + return $s; + } +} + +/** + * An implementation of the tree building portion of the HTML5 parsing + * spec. + * + * This is used to balance and tidy output so that the result can + * always be cleanly serialized/deserialized by an HTML5 parser. It + * does *not* guarantee "conforming" output -- the HTML5 spec contains + * a number of constraints which are not enforced by the HTML5 parsing + * process. But the result will be free of gross errors: misnested or + * unclosed tags, for example, and will be unchanged by spec-complient + * parsing followed by serialization. + * + * The tree building stage is structured as a state machine. + * When comparing the implementation to + * https://www.w3.org/TR/html5/syntax.html#tree-construction + * note that each state is implemented as a function with a + * name ending in `Mode` (because the HTML spec refers to them + * as insertion modes). The current insertion mode is held by + * the $parseMode property. + * + * The following simplifications have been made: + * - We handle body content only (ie, we start `in body`.) + * - The document is never in "quirks mode". + * - All occurrences of < and > have been entity escaped, so we + * can parse tags by simply splitting on those two characters. + * Similarly, all attributes have been "cleaned" and are double-quoted + * and escaped. + * - All comments and null characters are assumed to have been removed. + * - We don't alter linefeeds after
    /.
    + * - The following elements are disallowed: , , , ,
    + *   , , , <isindex>, <textarea>, <xmp>, <iframe>,
    + *   <noembed>, <noscript>, <select>, <script>, <title>.  As a result,
    + *   further simplifications can be made:
    + *   - `frameset-ok` is not tracked.
    + *   - `form element pointer` is not tracked.
    + *   - `head element pointer` is not tracked (but presumed non-null)
    + *   - Tokenizer has only a single mode.
    + *
    + *   We generally mark places where we omit cases from the spec due to
    + *   disallowed elements with a comment: `# OMITTED: <element-name>`.
    + *
    + *   The HTML spec keeps a flag during the parsing process to track
    + *   whether or not a "parse error" has been encountered.  We don't
    + *   bother to track that flag, we just implement the error-handling
    + *   process as specified.
    + *
    + * @ingroup Parser
    + * @since 1.27
    + * @see https://html.spec.whatwg.org/multipage/syntax.html#tree-construction
    + */
    +class Balancer {
    +	private $parseMode;
    +	private $bitsIterator;
    +	private $allowedHtmlElements;
    +	private $afe;
    +	private $stack;
    +	private $strict;
    +	private $tidyCompat;
    +
    +	private $textIntegrationMode = false;
    +	private $pendingTableText;
    +	private $originalInsertionMode;
    +	private $fragmentContext;
    +
    +	/**
    +	 * Create a new Balancer.
    +	 * @param array $config Balancer configuration.  Includes:
    +	 *     'strict' : boolean, defaults to false.
    +	 *         When true, enforces syntactic constraints on input:
    +	 *         all non-tag '<' must be escaped, all attributes must be
    +	 *         separated by a single space and double-quoted.  This is
    +	 *         consistent with the output of the Sanitizer.
    +	 *     'allowedHtmlElements' : array, defaults to null.
    +	 *         When present, the keys of this associative array give
    +	 *         the acceptable HTML tag names.  When not present, no
    +	 *         tag sanitization is done.
    +	 *     'tidyCompat' : boolean, defaults to false.
    +	 *         When true, the serialization algorithm is tweaked to
    +	 *         provide historical compatibility with the old "tidy"
    +	 *         program: <p>-wrapping is done to the children of
    +	 *         <body> and <blockquote> elements, and empty elements
    +	 *         are removed.
    +	 */
    +	public function __construct( array $config = [] ) {
    +		$config = $config + [
    +			'strict' => false,
    +			'allowedHtmlElements' => null,
    +			'tidyCompat' => false,
    +		];
    +		$this->allowedHtmlElements = $config['allowedHtmlElements'];
    +		$this->strict = $config['strict'];
    +		$this->tidyCompat = $config['tidyCompat'];
    +		if ( $this->allowedHtmlElements !== null ) {
    +			# Sanity check!
    +			$bad = array_uintersect_assoc(
    +				$this->allowedHtmlElements,
    +				BalanceSets::$unsupportedSet[BalanceSets::HTML_NAMESPACE],
    +				function( $a, $b ) {
    +					// Ignore the values (just intersect the keys) by saying
    +					// all values are equal to each other.
    +					return 0;
    +				}
    +			);
    +			if ( count( $bad ) > 0 ) {
    +				$badstr = implode( array_keys( $bad ), ',' );
    +				throw new ParameterAssertionException(
    +					'$config',
    +					'Balance attempted with sanitization including ' .
    +					"unsupported elements: {$badstr}"
    +				);
    +			}
    +		}
    +	}
    +
    +	/**
    +	 * Return a balanced HTML string for the HTML fragment given by $text,
    +	 * subject to the caveats listed in the class description.  The result
    +	 * will typically be idempotent -- that is, rebalancing the output
    +	 * would result in no change.
    +	 *
    +	 * @param string $text The markup to be balanced
    +	 * @param callable $processingCallback Callback to do any variable or
    +	 *   parameter replacements in HTML attributes values
    +	 * @param array|bool $processingArgs Arguments for the processing callback
    +	 * @return string The balanced markup
    +	 */
    +	public function balance( $text, $processingCallback = null, $processingArgs = [] ) {
    +		$this->parseMode = 'inBodyMode';
    +		$this->bitsIterator = new ExplodeIterator( '<', $text );
    +		$this->afe = new BalanceActiveFormattingElements();
    +		$this->stack = new BalanceStack();
    +		$this->stack->tidyCompat = $this->tidyCompat;
    +		$this->processingCallback = $processingCallback;
    +		$this->processingArgs = $processingArgs;
    +
    +		# The stack is constructed with an <html> element already on it.
    +		# Set this up as a fragment parsed with <body> as the context.
    +		$this->fragmentContext =
    +			new BalanceElement( BalanceSets::HTML_NAMESPACE, 'body', [] );
    +		$this->resetInsertionMode();
    +
    +		// First element is text not tag
    +		$x = $this->bitsIterator->current();
    +		$this->bitsIterator->next();
    +		$this->insertToken( 'text', str_replace( '>', '&gt;', $x ) );
    +		// Now process each tag.
    +		while ( $this->bitsIterator->valid() ) {
    +			$this->advance();
    +		}
    +		$this->insertToken( 'eof', null );
    +		$result = $this->stack->getOutput();
    +		// Free memory before returning.
    +		$this->bitsIterator = null;
    +		$this->afe = null;
    +		$this->stack = null;
    +		$this->fragmentContext = null;
    +		return $result;
    +	}
    +
    +	/**
    +	 * Pass a token to the tree builder.  The $token will be one of the
    +	 * strings "tag", "endtag", or "text".
    +	 */
    +	private function insertToken( $token, $value, $attribs = null, $selfclose = false ) {
    +		// validate tags against $unsupportedSet
    +		if ( $token === 'tag' || $token === 'endtag' ) {
    +			if ( isset( BalanceSets::$unsupportedSet[BalanceSets::HTML_NAMESPACE][$value] ) ) {
    +				# As described in "simplifications" above, these tags are
    +				# not supported in the balancer.
    +				Assert::invariant(
    +					!$this->strict,
    +					"Unsupported $token <$value> found."
    +				);
    +				return false;
    +			}
    +		} elseif ( $token === 'text' && $value === '' ) {
    +			# Don't actually inject the empty string as a text token.
    +			return true;
    +		}
    +		// Some hoops we have to jump through
    +		$adjusted = $this->stack->adjustedCurrentNode( $this->fragmentContext );
    +
    +		$isForeign = true;
    +		if (
    +			$this->stack->length() === 0 ||
    +			$adjusted->isHtml() ||
    +			$token === 'eof'
    +		) {
    +			$isForeign = false;
    +		} elseif ( $adjusted->isMathmlTextIntegrationPoint() ) {
    +			if ( $token === 'text' ) {
    +				$isForeign = false;
    +			} elseif (
    +				$token === 'tag' &&
    +				$value !== 'mglyph' && $value !== 'malignmark'
    +			) {
    +				$isForeign = false;
    +			}
    +		} elseif (
    +			$adjusted->namespaceURI === BalanceSets::MATHML_NAMESPACE &&
    +			$adjusted->localName === 'annotation-xml' &&
    +			$token === 'tag' && $value === 'svg'
    +		) {
    +			$isForeign = false;
    +		} elseif (
    +			$adjusted->isHtmlIntegrationPoint() &&
    +			( $token === 'tag' || $token === 'text' )
    +		) {
    +			$isForeign = false;
    +		}
    +		if ( $isForeign ) {
    +			return $this->insertForeignToken( $token, $value, $attribs, $selfclose );
    +		} else {
    +			$func = $this->parseMode;
    +			return $this->$func( $token, $value, $attribs, $selfclose );
    +		}
    +	}
    +
    +	private function insertForeignToken( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'text' ) {
    +			$this->stack->insertText( $value );
    +			return true;
    +		} elseif ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			case 'font':
    +				if ( isset( $attribs['color'] )
    +					|| isset( $attribs['face'] )
    +					|| isset( $attribs['size'] )
    +				) {
    +					break;
    +				}
    +				/* otherwise, fall through */
    +			case 'b':
    +			case 'big':
    +			case 'blockquote':
    +			case 'body':
    +			case 'br':
    +			case 'center':
    +			case 'code':
    +			case 'dd':
    +			case 'div':
    +			case 'dl':
    +			case 'dt':
    +			case 'em':
    +			case 'embed':
    +			case 'h1':
    +			case 'h2':
    +			case 'h3':
    +			case 'h4':
    +			case 'h5':
    +			case 'h6':
    +			case 'head':
    +			case 'hr':
    +			case 'i':
    +			case 'img':
    +			case 'li':
    +			case 'listing':
    +			case 'menu':
    +			case 'meta':
    +			case 'nobr':
    +			case 'ol':
    +			case 'p':
    +			case 'pre':
    +			case 'ruby':
    +			case 's':
    +			case 'small':
    +			case 'span':
    +			case 'strong':
    +			case 'strike':
    +			case 'sub':
    +			case 'sup':
    +			case 'table':
    +			case 'tt':
    +			case 'u':
    +			case 'ul':
    +			case 'var':
    +				if ( $this->fragmentContext ) {
    +					break;
    +				}
    +				while ( true ) {
    +					$this->stack->pop();
    +					$node = $this->stack->currentNode();
    +					if (
    +						$node->isMathmlTextIntegrationPoint() ||
    +						$node->isHtmlIntegrationPoint() ||
    +						$node->isHtml()
    +					) {
    +						break;
    +					}
    +				}
    +				return $this->insertToken( $token, $value, $attribs, $selfclose );
    +			}
    +			// "Any other start tag"
    +			$adjusted = ( $this->fragmentContext && $this->stack->length()===1 ) ?
    +				$this->fragmentContext : $this->stack->currentNode();
    +			$this->stack->insertForeignElement(
    +				$adjusted->namespaceURI, $value, $attribs
    +			);
    +			if ( $selfclose ) {
    +				$this->stack->pop();
    +			}
    +			return true;
    +		} elseif ( $token === 'endtag' ) {
    +			$first = true;
    +			foreach ( $this->stack as $i => $node ) {
    +				if ( $node->isHtml() && !$first ) {
    +					// process the end tag as HTML
    +					$func = $this->parseMode;
    +					return $this->$func( $token, $value, $attribs, $selfclose );
    +				} elseif ( $i === 0 ) {
    +					return true;
    +				} elseif ( $node->localName === $value ) {
    +					$this->stack->popTag( $node );
    +					return true;
    +				}
    +				$first = false;
    +			}
    +		}
    +	}
    +
    +	/**
    +	 * Grab the next "token" from $bitsIterator.  This is either a open/close
    +	 * tag or text, depending on whether the Sanitizer approves.
    +	 */
    +	private function advance() {
    +		$x = $this->bitsIterator->current();
    +		$this->bitsIterator->next();
    +		$regs = [];
    +		# $slash: Does the current element start with a '/'?
    +		# $t: Current element name
    +		# $attribStr: String between element name and >
    +		# $brace: Ending '>' or '/>'
    +		# $rest: Everything until the next element from the $bitsIterator
    +		if ( preg_match( Sanitizer::ELEMENT_BITS_REGEX, $x, $regs ) ) {
    +			list( /* $qbar */, $slash, $t, $attribStr, $brace, $rest ) = $regs;
    +			$t = strtolower( $t );
    +			if ( $this->strict ) {
    +				/* Verify that attributes are all properly double-quoted */
    +				Assert::invariant(
    +					preg_match(
    +						'/^( [:_A-Z0-9][-.:_A-Z0-9]*="[^"]*")*[ ]*$/i', $attribStr
    +					),
    +					"Bad attribute string found"
    +				);
    +			}
    +		} else {
    +			Assert::invariant(
    +				!$this->strict, "< found which does not start a valid tag"
    +			);
    +			$slash = $t = $attribStr = $brace = $rest = null;
    +		}
    +		$goodtag = $t;
    +		$sanitize = $this->allowedHtmlElements !== null;
    +		if ( $sanitize ) {
    +			$goodtag = $t && isset( $this->allowedHtmlElements[$t] );
    +		}
    +		if ( $goodtag ) {
    +			if ( is_callable( $this->processingCallback ) ) {
    +				call_user_func_array( $this->processingCallback, [ &$attribStr, $this->processingArgs ] );
    +			}
    +			if ( $sanitize ) {
    +				$goodtag = Sanitizer::validateTag( $attribStr, $t );
    +			}
    +		}
    +		if ( $goodtag ) {
    +			if ( $sanitize ) {
    +				$attribs = Sanitizer::decodeTagAttributes( $attribStr );
    +				$attribs = Sanitizer::validateTagAttributes( $attribs, $t );
    +			} else {
    +				$attribs = Sanitizer::decodeTagAttributes( $attribStr );
    +			}
    +			$goodtag = $this->insertToken(
    +				$slash ? 'endtag' : 'tag', $t, $attribs, $brace === '/>'
    +			);
    +		}
    +		if ( $goodtag ) {
    +			$rest = str_replace( '>', '&gt;', $rest );
    +			$this->insertToken( 'text', str_replace( '>', '&gt;', $rest ) );
    +		} else {
    +			# bad tag; serialize entire thing as text.
    +			$this->insertToken( 'text', '&lt;' . str_replace( '>', '&gt;', $x ) );
    +		}
    +	}
    +
    +	private function switchMode( $mode ) {
    +		Assert::parameter(
    +			substr( $mode, -4 )==='Mode', '$mode', 'should end in Mode'
    +		);
    +		$oldMode = $this->parseMode;
    +		$this->parseMode = $mode;
    +		return $oldMode;
    +	}
    +
    +	private function switchModeAndReprocess( $mode, $token, $value, $attribs, $selfclose ) {
    +		$this->switchMode( $mode );
    +		return $this->insertToken( $token, $value, $attribs, $selfclose );
    +	}
    +
    +	private function resetInsertionMode() {
    +		$last = false;
    +		foreach ( $this->stack as $i => $node ) {
    +			if ( $i === 0 ) {
    +				$last = true;
    +				if ( $this->fragmentContext ) {
    +					$node = $this->fragmentContext;
    +				}
    +			}
    +			if ( $node->isHtml() ) {
    +				switch ( $node->localName ) {
    +				# OMITTED: <select>
    +				/*
    +				case 'select':
    +					$stacklen = $this->stack->length();
    +					for ( $j = $i + 1; $j < $stacklen-1; $j++ ) {
    +						$ancestor = $this->stack->node( $stacklen-$j-1 );
    +						if ( $ancestor->isA( 'template' ) ) {
    +							break;
    +						}
    +						if ( $ancestor->isA( 'table' ) ) {
    +							$this->switchMode( 'inSelectInTableMode' );
    +							return;
    +						}
    +					}
    +					$this->switchMode( 'inSelectMode' );
    +					return;
    +				*/
    +				case 'tr':
    +					$this->switchMode( 'inRowMode' );
    +					return;
    +				case 'tbody':
    +				case 'tfoot':
    +				case 'thead':
    +					$this->switchMode( 'inTableBodyMode' );
    +					return;
    +				case 'caption':
    +					$this->switchMode( 'inCaptionMode' );
    +					return;
    +				case 'colgroup':
    +					$this->switchMode( 'inColumnGroupMode' );
    +					return;
    +				case 'table':
    +					$this->switchMode( 'inTableMode' );
    +					return;
    +				case 'template':
    +					$this->switchMode(
    +						array_slice( $this->templateInsertionModes, -1 )[0]
    +					);
    +					return;
    +				case 'body':
    +					$this->switchMode( 'inBodyMode' );
    +					return;
    +				# OMITTED: <frameset>
    +				# OMITTED: <html>
    +				# OMITTED: <head>
    +				default:
    +					if ( !$last ) {
    +						# OMITTED: <head>
    +						if ( $node->isA( BalanceSets::$tableCellSet ) ) {
    +							$this->switchMode( 'inCellMode' );
    +							return;
    +						}
    +					}
    +				}
    +			}
    +			if ( $last ) {
    +				$this->switchMode( 'inBodyMode' );
    +				return;
    +			}
    +		}
    +	}
    +
    +	private function stopParsing() {
    +		# Most of the spec methods are inapplicable, other than step 2:
    +		# "pop all the nodes off the stack of open elements".
    +		# We're going to keep the top-most <html> element on the stack, though.
    +
    +		# Clear the AFE list first, otherwise the element objects will stay live
    +		# during serialization, potentially using O(N^2) memory. Note that
    +		# popping the stack will never result in reconstructing the active
    +		# formatting elements.
    +		$this->afe = null;
    +		$this->stack->popTo( 1 );
    +	}
    +
    +	private function parseRawText( $value, $attribs = null ) {
    +		$this->stack->insertHTMLElement( $value, $attribs );
    +		// XXX switch tokenizer to rawtext state?
    +		$this->originalInsertionMode = $this->switchMode( 'inTextMode' );
    +		return true;
    +	}
    +
    +	private function inTextMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'text' ) {
    +			$this->stack->insertText( $value );
    +			return true;
    +		} elseif ( $token === 'eof' ) {
    +			$this->stack->pop();
    +			return $this->switchModeAndReprocess(
    +				$this->originalInsertionMode, $token, $value, $attribs, $selfclose
    +			);
    +		} elseif ( $token === 'endtag' ) {
    +			$this->stack->pop();
    +			$this->switchMode( $this->originalInsertionMode );
    +			return true;
    +		}
    +		return true;
    +	}
    +
    +	private function inHeadMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'text' ) {
    +			if ( preg_match( '/^[\x09\x0A\x0C\x0D\x20]+/', $value, $matches ) ) {
    +				$this->stack->insertText( $matches[0] );
    +				$value = substr( $value, strlen( $matches[0] ) );
    +			}
    +			if ( strlen( $value ) === 0 ) {
    +				return true; // All text handled.
    +			}
    +			// Fall through to handle non-whitespace below.
    +		} elseif ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			case 'meta':
    +				# OMITTED: in a full HTML parser, this might change the encoding.
    +				/* falls through */
    +			# OMITTED: <html>
    +			case 'base':
    +			case 'basefont':
    +			case 'bgsound':
    +			case 'link':
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->stack->pop();
    +				return true;
    +			# OMITTED: <title>
    +			# OMITTED: <noscript>
    +			case 'noframes':
    +			case 'style':
    +				return $this->parseRawText( $value, $attribs );
    +			# OMITTED: <script>
    +			case 'template':
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->afe->insertMarker();
    +				# OMITTED: frameset_ok
    +				$this->switchMode( 'inTemplateMode' );
    +				$this->templateInsertionModes[] = $this->parseMode;
    +				return true;
    +			# OMITTED: <head>
    +			}
    +		} elseif ( $token === 'endtag' ) {
    +			switch ( $value ) {
    +			# OMITTED: <head>
    +			# OMITTED: <body>
    +			# OMITTED: <html>
    +			case 'br':
    +				break; // handle at the bottom of the function
    +			case 'template':
    +				if ( $this->stack->indexOf( $value ) < 0 ) {
    +					return true; // Ignore the token.
    +				}
    +				$this->stack->generateImpliedEndTags( null, true /* thorough */ );
    +				$this->stack->popTag( $value );
    +				$this->afe->clearToMarker();
    +				array_pop( $this->templateInsertionModes );
    +				$this->resetInsertionMode();
    +				return true;
    +			default:
    +				// ignore any other end tag
    +				return true;
    +			}
    +		}
    +
    +		// If not handled above
    +		$this->inHeadMode( 'endtag', 'head' ); // synthetic </head>
    +		// Then redo this one
    +		return $this->insertToken( $token, $value, $attribs, $selfclose );
    +	}
    +
    +	private function inBodyMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'text' ) {
    +			$this->afe->reconstruct( $this->stack );
    +			$this->stack->insertText( $value );
    +			return true;
    +		} elseif ( $token === 'eof' ) {
    +			if ( !empty( $this->templateInsertionModes ) ) {
    +				return $this->inTemplateMode( $token, $value, $attribs, $selfclose );
    +			}
    +			$this->stopParsing();
    +			return true;
    +		} elseif ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			# OMITTED: <html>
    +			case 'base':
    +			case 'basefont':
    +			case 'bgsound':
    +			case 'link':
    +			case 'meta':
    +			case 'noframes':
    +			# OMITTED: <script>
    +			case 'style':
    +			case 'template':
    +			# OMITTED: <title>
    +				return $this->inHeadMode( $token, $value, $attribs, $selfclose );
    +			# OMITTED: <body>
    +			# OMITTED: <frameset>
    +
    +			case 'address':
    +			case 'article':
    +			case 'aside':
    +			case 'blockquote':
    +			case 'center':
    +			case 'details':
    +			case 'dialog':
    +			case 'dir':
    +			case 'div':
    +			case 'dl':
    +			case 'fieldset':
    +			case 'figcaption':
    +			case 'figure':
    +			case 'footer':
    +			case 'header':
    +			case 'hgroup':
    +			case 'main':
    +			case 'menu':
    +			case 'nav':
    +			case 'ol':
    +			case 'p':
    +			case 'section':
    +			case 'summary':
    +			case 'ul':
    +				if ( $this->stack->inButtonScope( 'p' ) ) {
    +					$this->inBodyMode( 'endtag', 'p' );
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				return true;
    +
    +			case 'h1':
    +			case 'h2':
    +			case 'h3':
    +			case 'h4':
    +			case 'h5':
    +			case 'h6':
    +				if ( $this->stack->inButtonScope( 'p' ) ) {
    +					$this->inBodyMode( 'endtag', 'p' );
    +				}
    +				if ( $this->stack->currentNode()->isA( BalanceSets::$headingSet ) ) {
    +					$this->stack->pop();
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				return true;
    +
    +			case 'pre':
    +			case 'listing':
    +				if ( $this->stack->inButtonScope( 'p' ) ) {
    +					$this->inBodyMode( 'endtag', 'p' );
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				# As described in "simplifications" above:
    +				# 1. We don't touch the next token, even if it's a linefeed.
    +				# 2. OMITTED: frameset_ok
    +				return true;
    +
    +			# OMITTED: <form>
    +
    +			case 'li':
    +				# OMITTED: frameset_ok
    +				foreach ( $this->stack as $node ) {
    +					if ( $node->isA( 'li' ) ) {
    +						$this->inBodyMode( 'endtag', 'li' );
    +						break;
    +					}
    +					if (
    +						$node->isA( BalanceSets::$specialSet ) &&
    +						!$node->isA( BalanceSets::$addressDivPSet )
    +					) {
    +						break;
    +					}
    +				}
    +				if ( $this->stack->inButtonScope( 'p' ) ) {
    +					$this->inBodyMode( 'endtag', 'p' );
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				return true;
    +
    +			case 'dd':
    +			case 'dt':
    +				# OMITTED: frameset_ok
    +				foreach ( $this->stack as $node ) {
    +					if ( $node->isA( 'dd' ) ) {
    +						$this->inBodyMode( 'endtag', 'dd' );
    +						break;
    +					}
    +					if ( $node->isA( 'dt' ) ) {
    +						$this->inBodyMode( 'endtag', 'dt' );
    +						break;
    +					}
    +					if (
    +						$node->isA( BalanceSets::$specialSet ) &&
    +						!$node->isA( BalanceSets::$addressDivPSet )
    +					) {
    +						break;
    +					}
    +				}
    +				if ( $this->stack->inButtonScope( 'p' ) ) {
    +					$this->inBodyMode( 'endtag', 'p' );
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				return true;
    +
    +			# OMITTED: <plaintext>
    +
    +			case 'button':
    +				if ( $this->stack->inScope( 'button' ) ) {
    +					$this->inBodyMode( 'endtag', 'button' );
    +					return $this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				$this->afe->reconstruct( $this->stack );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				return true;
    +
    +			case 'a':
    +				$activeElement = $this->afe->findElementByTag( 'a' );
    +				if ( $activeElement ) {
    +					$this->inBodyMode( 'endtag', 'a' );
    +					if ( $this->afe->isInList( $activeElement ) ) {
    +						$this->afe->remove( $activeElement );
    +						// Don't flatten here, since when we fall
    +						// through below we might foster parent
    +						// the new <a> tag inside this one.
    +						$this->stack->removeElement( $activeElement, false );
    +					}
    +				}
    +				/* Falls through */
    +			case 'b':
    +			case 'big':
    +			case 'code':
    +			case 'em':
    +			case 'font':
    +			case 'i':
    +			case 's':
    +			case 'small':
    +			case 'strike':
    +			case 'strong':
    +			case 'tt':
    +			case 'u':
    +				$this->afe->reconstruct( $this->stack );
    +				$this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ), $attribs );
    +				return true;
    +
    +			case 'nobr':
    +				$this->afe->reconstruct( $this->stack );
    +				if ( $this->stack->inScope( 'nobr' ) ) {
    +					$this->inBodyMode( 'endtag', 'nobr' );
    +					$this->afe->reconstruct( $this->stack );
    +				}
    +				$this->afe->push( $this->stack->insertHTMLElement( $value, $attribs ), $attribs );
    +				return true;
    +
    +			case 'applet':
    +			case 'marquee':
    +			case 'object':
    +				$this->afe->reconstruct( $this->stack );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->afe->insertMarker();
    +				# OMITTED: frameset_ok
    +				return true;
    +
    +			case 'table':
    +				# The document is never in "quirks mode"; see simplifications
    +				# above.
    +				if ( $this->stack->inButtonScope( 'p' ) ) {
    +					$this->inBodyMode( 'endtag', 'p' );
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				# OMITTED: frameset_ok
    +				$this->switchMode( 'inTableMode' );
    +				return true;
    +
    +			case 'area':
    +			case 'br':
    +			case 'embed':
    +			case 'img':
    +			case 'keygen':
    +			case 'wbr':
    +				$this->afe->reconstruct( $this->stack );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->stack->pop();
    +				# OMITTED: frameset_ok
    +				return true;
    +
    +			case 'input':
    +				$this->afe->reconstruct( $this->stack );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->stack->pop();
    +				# OMITTED: frameset_ok
    +				# (hence we don't need to examine the tag's "type" attribute)
    +				return true;
    +
    +			case 'menuitem':
    +			case 'param':
    +			case 'source':
    +			case 'track':
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->stack->pop();
    +				return true;
    +
    +			case 'hr':
    +				if ( $this->stack->inButtonScope( 'p' ) ) {
    +					$this->inBodyMode( 'endtag', 'p' );
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->stack->pop();
    +				return true;
    +
    +			case 'image':
    +				# warts!
    +				return $this->inBodyMode( $token, 'img', $attribs, $selfclose );
    +
    +			# OMITTED: <isindex>
    +			# OMITTED: <textarea>
    +			# OMITTED: <xmp>
    +			# OMITTED: <iframe>
    +			# OMITTED: <noembed>
    +			# OMITTED: <noscript>
    +
    +			# OMITTED: <select>
    +			/*
    +			case 'select':
    +				$this->afe->reconstruct( $this->stack );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				switch ( $this->parseMode ) {
    +				case 'inTableMode':
    +				case 'inCaptionMode':
    +				case 'inTableBodyMode':
    +				case 'inRowMode':
    +				case 'inCellMode':
    +					$this->switchMode( 'inSelectInTableMode' );
    +					return true;
    +				default:
    +					$this->switchMode( 'inSelectMode' );
    +					return true;
    +				}
    +			*/
    +
    +			case 'optgroup':
    +			case 'option':
    +				if ( $this->stack->currentNode()->isA( 'option' ) ) {
    +					$this->inBodyMode( 'endtag', 'option' );
    +				}
    +				$this->afe->reconstruct( $this->stack );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				return true;
    +
    +			case 'rb':
    +			case 'rtc':
    +				if ( $this->stack->inScope( 'ruby' ) ) {
    +					$this->stack->generateImpliedEndTags();
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				return true;
    +
    +			case 'rp':
    +			case 'rt':
    +				if ( $this->stack->inScope( 'ruby' ) ) {
    +					$this->stack->generateImpliedEndTags( 'rtc' );
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				return true;
    +
    +			case 'math':
    +				$this->afe->reconstruct( $this->stack );
    +				# We skip the spec's "adjust MathML attributes" and
    +				# "adjust foreign attributes" steps, since the browser will
    +				# do this later when it parses the output and it doesn't affect
    +				# balancing.
    +				$this->stack->insertForeignElement(
    +					BalanceSets::MATHML_NAMESPACE, $value, $attribs
    +				);
    +				if ( $selfclose ) {
    +					# emit explicit </math> tag.
    +					$this->stack->pop();
    +				}
    +				return true;
    +
    +			case 'svg':
    +				$this->afe->reconstruct( $this->stack );
    +				# We skip the spec's "adjust SVG attributes" and
    +				# "adjust foreign attributes" steps, since the browser will
    +				# do this later when it parses the output and it doesn't affect
    +				# balancing.
    +				$this->stack->insertForeignElement(
    +					BalanceSets::SVG_NAMESPACE, $value, $attribs
    +				);
    +				if ( $selfclose ) {
    +					# emit explicit </svg> tag.
    +					$this->stack->pop();
    +				}
    +				return true;
    +
    +			case 'caption':
    +			case 'col':
    +			case 'colgroup':
    +			# OMITTED: <frame>
    +			case 'head':
    +			case 'tbody':
    +			case 'td':
    +			case 'tfoot':
    +			case 'th':
    +			case 'thead':
    +			case 'tr':
    +				// Ignore table tags if we're not inTableMode
    +				return true;
    +			}
    +
    +			// Handle any other start tag here
    +			$this->afe->reconstruct( $this->stack );
    +			$this->stack->insertHTMLElement( $value, $attribs );
    +			return true;
    +		} elseif ( $token === 'endtag' ) {
    +			switch ( $value ) {
    +			# </body>,</html> are unsupported.
    +
    +			case 'template':
    +				return $this->inHeadMode( $token, $value, $attribs, $selfclose );
    +
    +			case 'address':
    +			case 'article':
    +			case 'aside':
    +			case 'blockquote':
    +			case 'button':
    +			case 'center':
    +			case 'details':
    +			case 'dialog':
    +			case 'dir':
    +			case 'div':
    +			case 'dl':
    +			case 'fieldset':
    +			case 'figcaption':
    +			case 'figure':
    +			case 'footer':
    +			case 'header':
    +			case 'hgroup':
    +			case 'listing':
    +			case 'main':
    +			case 'menu':
    +			case 'nav':
    +			case 'ol':
    +			case 'pre':
    +			case 'section':
    +			case 'summary':
    +			case 'ul':
    +				// Ignore if there is not a matching open tag
    +				if ( !$this->stack->inScope( $value ) ) {
    +					return true;
    +				}
    +				$this->stack->generateImpliedEndTags();
    +				$this->stack->popTag( $value );
    +				return true;
    +
    +			# OMITTED: <form>
    +
    +			case 'p':
    +				if ( !$this->stack->inButtonScope( 'p' ) ) {
    +					$this->inBodyMode( 'tag', 'p', [] );
    +					return $this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				$this->stack->generateImpliedEndTags( $value );
    +				$this->stack->popTag( $value );
    +				return true;
    +
    +			case 'li':
    +				if ( !$this->stack->inListItemScope( $value ) ) {
    +					return true; # ignore
    +				}
    +				$this->stack->generateImpliedEndTags( $value );
    +				$this->stack->popTag( $value );
    +				return true;
    +
    +			case 'dd':
    +			case 'dt':
    +				if ( !$this->stack->inScope( $value ) ) {
    +					return true; # ignore
    +				}
    +				$this->stack->generateImpliedEndTags( $value );
    +				$this->stack->popTag( $value );
    +				return true;
    +
    +			case 'h1':
    +			case 'h2':
    +			case 'h3':
    +			case 'h4':
    +			case 'h5':
    +			case 'h6':
    +				if ( !$this->stack->inScope( BalanceSets::$headingSet ) ) {
    +					return;
    +				}
    +				$this->stack->generateImpliedEndTags();
    +				$this->stack->popTag( BalanceSets::$headingSet );
    +				return true;
    +
    +			case 'sarcasm':
    +				# Take a deep breath, then:
    +				break;
    +
    +			case 'a':
    +			case 'b':
    +			case 'big':
    +			case 'code':
    +			case 'em':
    +			case 'font':
    +			case 'i':
    +			case 'nobr':
    +			case 's':
    +			case 'small':
    +			case 'strike':
    +			case 'strong':
    +			case 'tt':
    +			case 'u':
    +				if ( $this->stack->adoptionAgency( $value, $this->afe ) ) {
    +					return true; # If we did something, we're done.
    +				}
    +				break; # Go to the "any other end tag" case.
    +
    +			case 'applet':
    +			case 'marquee':
    +			case 'object':
    +				if ( !$this->stack->inScope( $value ) ) {
    +					return true; # ignore
    +				}
    +				$this->stack->generateImpliedEndTags();
    +				$this->stack->popTag( $value );
    +				$this->afe->clearToMarker();
    +				return true;
    +
    +			case 'br':
    +				# Turn </br> into <br>
    +				return $this->inBodyMode( 'tag', $value, [] );
    +			}
    +
    +			// Any other end tag goes here
    +			foreach ( $this->stack as $i => $node ) {
    +				if ( $node->isA( $value ) ) {
    +					$this->stack->generateImpliedEndTags( $value );
    +					$this->stack->popTo( $i ); # including $i
    +					break;
    +				} elseif ( $node->isA( BalanceSets::$specialSet ) ) {
    +					return true; // ignore this close token.
    +				}
    +			}
    +			return true;
    +		} else {
    +			Assert::invariant( false, "Bad token type: $token" );
    +		}
    +	}
    +
    +	private function inTableMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'text' ) {
    +			if ( $this->textIntegrationMode ) {
    +				return $this->inBodyMode( $token, $value, $attribs, $selfclose );
    +			} elseif ( $this->stack->currentNode()->isA( BalanceSets::$tableSectionRowSet ) ) {
    +				$this->pendingTableText = '';
    +				$this->originalInsertionMode = $this->parseMode;
    +				return $this->switchModeAndReprocess( 'inTableTextMode', $token, $value, $attribs, $selfclose );
    +			}
    +			// fall through to default case.
    +		} elseif ( $token === 'eof' ) {
    +			$this->stopParsing();
    +			return true;
    +		} elseif ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			case 'caption':
    +				$this->afe->insertMarker();
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->switchMode( 'inCaptionMode' );
    +				return true;
    +			case 'colgroup':
    +				$this->stack->clearToContext( BalanceSets::$tableContextSet );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->switchMode( 'inColumnGroupMode' );
    +				return true;
    +			case 'col':
    +				$this->inTableMode( 'tag', 'colgroup', [] );
    +				return $this->insertToken( $token, $value, $attribs, $selfclose );
    +			case 'tbody':
    +			case 'tfoot':
    +			case 'thead':
    +				$this->stack->clearToContext( BalanceSets::$tableContextSet );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->switchMode( 'inTableBodyMode' );
    +				return true;
    +			case 'td':
    +			case 'th':
    +			case 'tr':
    +				$this->inTableMode( 'tag', 'tbody', [] );
    +				return $this->insertToken( $token, $value, $attribs, $selfclose );
    +			case 'table':
    +				if ( !$this->stack->inTableScope( $value ) ) {
    +					return true; // Ignore this tag.
    +				}
    +				$this->inTableMode( 'endtag', $value );
    +				return $this->insertToken( $token, $value, $attribs, $selfclose );
    +
    +			case 'style':
    +			# OMITTED: <script>
    +			case 'template':
    +				return $this->inHeadMode( $token, $value, $attribs, $selfclose );
    +
    +			case 'input':
    +				if ( !isset( $attribs['type'] ) || strcasecmp( $attribs['type'], 'hidden' ) !== 0 ) {
    +					break; // Handle this as "everything else"
    +				}
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->stack->pop();
    +				return true;
    +
    +			# OMITTED: <form>
    +			}
    +			// Fall through for "anything else" clause.
    +		} elseif ( $token === 'endtag' ) {
    +			switch ( $value ) {
    +			case 'table':
    +				if ( !$this->stack->inTableScope( $value ) ) {
    +					return true; // Ignore.
    +				}
    +				$this->stack->popTag( $value );
    +				$this->resetInsertionMode();
    +				return true;
    +			# OMITTED: <body>
    +			case 'caption':
    +			case 'col':
    +			case 'colgroup':
    +			# OMITTED: <html>
    +			case 'tbody':
    +			case 'td':
    +			case 'tfoot':
    +			case 'th':
    +			case 'thead':
    +			case 'tr':
    +				return true; // Ignore the token.
    +			case 'template':
    +				return $this->inHeadMode( $token, $value, $attribs, $selfclose );
    +			}
    +			// Fall through for "anything else" clause.
    +		}
    +		// This is the "anything else" case:
    +		$this->stack->fosterParentMode = true;
    +		$this->inBodyMode( $token, $value, $attribs, $selfclose );
    +		$this->stack->fosterParentMode = false;
    +		return true;
    +	}
    +
    +	private function inTableTextMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'text' ) {
    +			$this->pendingTableText .= $value;
    +			return true;
    +		}
    +		// Non-text token:
    +		$text = $this->pendingTableText;
    +		$this->pendingTableText = '';
    +		if ( preg_match( '/[^\x09\x0A\x0C\x0D\x20]/', $text ) ) {
    +			// This should match the "anything else" case inTableMode
    +			$this->stack->fosterParentMode = true;
    +			$this->inBodyMode( 'text', $text );
    +			$this->stack->fosterParentMode = false;
    +		} else {
    +			// Pending text is just whitespace.
    +			$this->stack->insertText( $text );
    +		}
    +		return $this->switchModeAndReprocess(
    +			$this->originalInsertionMode, $token, $value, $attribs, $selfclose
    +		);
    +	}
    +
    +	// helper for inCaptionMode
    +	private function endCaption() {
    +		if ( !$this->stack->inTableScope( 'caption' ) ) {
    +			return false;
    +		}
    +		$this->stack->generateImpliedEndTags();
    +		$this->stack->popTag( 'caption' );
    +		$this->afe->clearToMarker();
    +		$this->switchMode( 'inTableMode' );
    +		return true;
    +	}
    +
    +	private function inCaptionMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			case 'caption':
    +			case 'col':
    +			case 'colgroup':
    +			case 'tbody':
    +			case 'td':
    +			case 'tfoot':
    +			case 'th':
    +			case 'thead':
    +			case 'tr':
    +				if ( $this->endCaption() ) {
    +					$this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				return true;
    +			}
    +			// Fall through to "anything else" case.
    +		} elseif ( $token === 'endtag' ) {
    +			switch ( $value ) {
    +			case 'caption':
    +				$this->endCaption();
    +				return true;
    +			case 'table':
    +				if ( $this->endCaption() ) {
    +					$this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				return true;
    +			case 'body':
    +			case 'col':
    +			case 'colgroup':
    +			# OMITTED: <html>
    +			case 'tbody':
    +			case 'td':
    +			case 'tfoot':
    +			case 'th':
    +			case 'thead':
    +			case 'tr':
    +				// Ignore the token
    +				return true;
    +			}
    +			// Fall through to "anything else" case.
    +		}
    +		// The Anything Else case
    +		return $this->inBodyMode( $token, $value, $attribs, $selfclose );
    +	}
    +
    +	private function inColumnGroupMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'text' ) {
    +			if ( preg_match( '/^[\x09\x0A\x0C\x0D\x20]+/', $value, $matches ) ) {
    +				$this->stack->insertText( $matches[0] );
    +				$value = substr( $value, strlen( $matches[0] ) );
    +			}
    +			if ( strlen( $value ) === 0 ) {
    +				return true; // All text handled.
    +			}
    +			// Fall through to handle non-whitespace below.
    +		} elseif ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			# OMITTED: <html>
    +			case 'col':
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->stack->pop();
    +				return true;
    +			case 'template':
    +				return $this->inHeadMode( $token, $value, $attribs, $selfclose );
    +			}
    +			// Fall through for "anything else".
    +		} elseif ( $token === 'endtag' ) {
    +			switch ( $value ) {
    +			case 'colgroup':
    +				if ( !$this->stack->currentNode()->isA( 'colgroup' ) ) {
    +					return true; // Ignore the token.
    +				}
    +				$this->stack->pop();
    +				$this->switchMode( 'inTableMode' );
    +				return true;
    +			case 'col':
    +				return true; // Ignore the token.
    +			case 'template':
    +				return $this->inHeadMode( $token, $value, $attribs, $selfclose );
    +			}
    +			// Fall through for "anything else".
    +		} elseif ( $token === 'eof' ) {
    +			return $this->inBodyMode( $token, $value, $attribs, $selfclose );
    +		}
    +
    +		// Anything else
    +		if ( !$this->stack->currentNode()->isA( 'colgroup' ) ) {
    +			return true; // Ignore the token.
    +		}
    +		$this->inColumnGroupMode( 'endtag', 'colgroup' );
    +		return $this->insertToken( $token, $value, $attribs, $selfclose );
    +	}
    +
    +	// Helper function for inTableBodyMode
    +	private function endSection() {
    +		if ( !(
    +			$this->stack->inTableScope( 'tbody' ) ||
    +			$this->stack->inTableScope( 'thead' ) ||
    +			$this->stack->inTableScope( 'tfoot' )
    +		) ) {
    +			return false;
    +		}
    +		$this->stack->clearToContext( BalanceSets::$tableBodyContextSet );
    +		$this->stack->pop();
    +		$this->switchMode( 'inTableMode' );
    +		return true;
    +	}
    +	private function inTableBodyMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			case 'tr':
    +				$this->stack->clearToContext( BalanceSets::$tableBodyContextSet );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->switchMode( 'inRowMode' );
    +				return true;
    +			case 'th':
    +			case 'td':
    +				$this->inTableBodyMode( 'tag', 'tr', [] );
    +				$this->insertToken( $token, $value, $attribs, $selfclose );
    +				return true;
    +			case 'caption':
    +			case 'col':
    +			case 'colgroup':
    +			case 'tbody':
    +			case 'tfoot':
    +			case 'thead':
    +				if ( $this->endSection() ) {
    +					$this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				return true;
    +			}
    +		} elseif ( $token === 'endtag' ) {
    +			switch ( $value ) {
    +			case 'table':
    +				if ( $this->endSection() ) {
    +					$this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				return true;
    +			case 'tbody':
    +			case 'tfoot':
    +			case 'thead':
    +				if ( $this->stack->inTableScope( $value ) ) {
    +					$this->endSection();
    +				}
    +				return true;
    +			# OMITTED: <body>
    +			case 'caption':
    +			case 'col':
    +			case 'colgroup':
    +			# OMITTED: <html>
    +			case 'td':
    +			case 'th':
    +			case 'tr':
    +				return true; // Ignore the token.
    +			}
    +		}
    +		// Anything else:
    +		return $this->inTableMode( $token, $value, $attribs, $selfclose );
    +	}
    +
    +	// Helper function for inRowMode
    +	private function endRow() {
    +		if ( !$this->stack->inTableScope( 'tr' ) ) {
    +			return false;
    +		}
    +		$this->stack->clearToContext( BalanceSets::$tableRowContextSet );
    +		$this->stack->pop();
    +		$this->switchMode( 'inTableBodyMode' );
    +		return true;
    +	}
    +	private function inRowMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			case 'th':
    +			case 'td':
    +				$this->stack->clearToContext( BalanceSets::$tableRowContextSet );
    +				$this->stack->insertHTMLElement( $value, $attribs );
    +				$this->switchMode( 'inCellMode' );
    +				$this->afe->insertMarker();
    +				return true;
    +			case 'caption':
    +			case 'col':
    +			case 'colgroup':
    +			case 'tbody':
    +			case 'tfoot':
    +			case 'thead':
    +			case 'tr':
    +				if ( $this->endRow() ) {
    +					$this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				return true;
    +			}
    +		} elseif ( $token === 'endtag' ) {
    +			switch ( $value ) {
    +			case 'tr':
    +				$this->endRow();
    +				return true;
    +			case 'table':
    +				if ( $this->endRow() ) {
    +					$this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				return true;
    +			case 'tbody':
    +			case 'tfoot':
    +			case 'thead':
    +				if (
    +					$this->stack->inTableScope( $value ) &&
    +					$this->endRow()
    +				) {
    +					$this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				return true;
    +			# OMITTED: <body>
    +			case 'caption':
    +			case 'col':
    +			case 'colgroup':
    +			# OMITTED: <html>
    +			case 'td':
    +			case 'th':
    +				return true; // Ignore the token.
    +			}
    +		}
    +		// Anything else:
    +		return $this->inTableMode( $token, $value, $attribs, $selfclose );
    +	}
    +
    +	// Helper for inCellMode
    +	private function endCell() {
    +		if ( $this->stack->inTableScope( 'td' ) ) {
    +			$this->inCellMode( 'endtag', 'td' );
    +			return true;
    +		} elseif ( $this->stack->inTableScope( 'th' ) ) {
    +			$this->inCellMode( 'endtag', 'th' );
    +			return true;
    +		} else {
    +			return false;
    +		}
    +	}
    +	private function inCellMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			case 'caption':
    +			case 'col':
    +			case 'colgroup':
    +			case 'tbody':
    +			case 'td':
    +			case 'tfoot':
    +			case 'th':
    +			case 'thead':
    +			case 'tr':
    +				if ( $this->endCell() ) {
    +					$this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				return true;
    +			}
    +		} elseif ( $token === 'endtag' ) {
    +			switch ( $value ) {
    +			case 'td':
    +			case 'th':
    +				if ( $this->stack->inTableScope( $value ) ) {
    +					$this->stack->generateImpliedEndTags();
    +					$this->stack->popTag( $value );
    +					$this->afe->clearToMarker();
    +					$this->switchMode( 'inRowMode' );
    +				}
    +				return true;
    +			# OMITTED: <body>
    +			case 'caption':
    +			case 'col':
    +			case 'colgroup':
    +			# OMITTED: <html>
    +				return true;
    +
    +			case 'table':
    +			case 'tbody':
    +			case 'tfoot':
    +			case 'thead':
    +			case 'tr':
    +				if ( $this->stack->inTableScope( $value ) ) {
    +					$this->stack->generateImpliedEndTags();
    +					$this->stack->popTag( BalanceSets::$tableCellSet );
    +					$this->afe->clearToMarker();
    +					$this->switchMode( 'inRowMode' );
    +					$this->insertToken( $token, $value, $attribs, $selfclose );
    +				}
    +				return true;
    +			}
    +		}
    +		// Anything else:
    +		return $this->inBodyMode( $token, $value, $attribs, $selfclose );
    +	}
    +
    +	# OMITTED: <select>
    +	/*
    +	private function inSelectMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		Assert::invariant( false, 'Unimplemented' );
    +	}
    +
    +	private function inSelectInTableMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		Assert::invariant( false, 'Unimplemented' );
    +	}
    +	*/
    +
    +	private function inTemplateMode( $token, $value, $attribs = null, $selfclose = false ) {
    +		if ( $token === 'text' ) {
    +			return $this->inBodyMode( $token, $value, $attribs, $selfclose );
    +		} elseif ( $token === 'eof' ) {
    +			if ( $this->stack->indexOf( 'template' ) < 0 ) {
    +				$this->stopParsing();
    +			} else {
    +				$this->stack->popTag( 'template' );
    +				$this->afe->clearToMarker();
    +				array_pop( $this->templateInsertionModes );
    +				$this->resetInsertionMode();
    +				$this->insertToken( $token, $value, $attribs, $selfclose );
    +			}
    +			return true;
    +		} elseif ( $token === 'tag' ) {
    +			switch ( $value ) {
    +			case 'base':
    +			case 'basefont':
    +			case 'bgsound':
    +			case 'link':
    +			case 'meta':
    +			case 'noframes':
    +			# OMITTED: <script>
    +			case 'style':
    +			case 'template':
    +			# OMITTED: <title>
    +				return $this->inHeadMode( $token, $value, $attribs, $selfclose );
    +
    +			case 'caption':
    +			case 'colgroup':
    +			case 'tbody':
    +			case 'tfoot':
    +			case 'thead':
    +				return $this->switchModeAndReprocess(
    +					'inTableMode', $token, $value, $attribs, $selfclose
    +				);
    +
    +			case 'col':
    +				return $this->switchModeAndReprocess(
    +					'inColumnGroupMode', $token, $value, $attribs, $selfclose
    +				);
    +
    +			case 'tr':
    +				return $this->switchModeAndReprocess(
    +					'inTableBodyMode', $token, $value, $attribs, $selfclose
    +				);
    +
    +			case 'td':
    +			case 'th':
    +				return $this->switchModeAndReprocess(
    +					'inRowMode', $token, $value, $attribs, $selfclose
    +				);
    +			}
    +			return $this->switchModeAndReprocess(
    +				'inBodyMode', $token, $value, $attribs, $selfclose
    +			);
    +		} elseif ( $token === 'endtag' ) {
    +			switch ( $value ) {
    +			case 'template':
    +				return $this->inHeadMode( $token, $value, $attribs, $selfclose );
    +			}
    +			return true;
    +		} else {
    +			Assert::invariant( false, "Bad token type: $token" );
    +		}
    +	}
    +}
    diff --git a/includes/tidy/Html5Internal.php b/includes/tidy/Html5Internal.php
    new file mode 100644
    index 0000000000..4ad820021f
    --- /dev/null
    +++ b/includes/tidy/Html5Internal.php
    @@ -0,0 +1,18 @@
    +<?php
    +
    +namespace MediaWiki\Tidy;
    +
    +class Html5Internal extends TidyDriverBase {
    +	private $balancer;
    +	public function __construct( array $config ) {
    +		parent::__construct( $config + [
    +			'strict' => true,
    +			'tidyCompat' => true,
    +		] );
    +		$this->balancer = new Balancer( $this->config );
    +	}
    +
    +	public function tidy( $text ) {
    +		return $this->balancer->balance( $text );
    +	}
    +}
    diff --git a/includes/tidy/RaggettInternalHHVM.php b/includes/tidy/RaggettInternalHHVM.php
    index 2a3986dfdb..bb83d6a325 100644
    --- a/includes/tidy/RaggettInternalHHVM.php
    +++ b/includes/tidy/RaggettInternalHHVM.php
    @@ -14,7 +14,7 @@ class RaggettInternalHHVM extends RaggettBase {
     	 */
     	protected function cleanWrapped( $text, $stderr = false, &$retval = null ) {
     		if ( $stderr ) {
    -			throw new Exception( "\$stderr cannot be used with RaggettInternalHHVM" );
    +			throw new \Exception( "\$stderr cannot be used with RaggettInternalHHVM" );
     		}
     		$cleansource = tidy_repair_string( $text, $this->config['tidyConfigFile'], 'utf8' );
     		if ( $cleansource === false ) {
    diff --git a/includes/tidy/TidyDriverBase.php b/includes/tidy/TidyDriverBase.php
    index 06775ef021..96ee8c394f 100644
    --- a/includes/tidy/TidyDriverBase.php
    +++ b/includes/tidy/TidyDriverBase.php
    @@ -27,7 +27,7 @@ abstract class TidyDriverBase {
     	 * @return bool Whether the HTML is valid
     	 */
     	public function validate( $text, &$errorStr ) {
    -		throw new MWException( get_class( $this ) . " does not support validate()" );
    +		throw new \MWException( get_class( $this ) . " does not support validate()" );
     	}
     
     	/**
    diff --git a/includes/title/MediaWikiPageLinkRenderer.php b/includes/title/MediaWikiPageLinkRenderer.php
    deleted file mode 100644
    index a565271019..0000000000
    --- a/includes/title/MediaWikiPageLinkRenderer.php
    +++ /dev/null
    @@ -1,134 +0,0 @@
    -<?php
    -/**
    - * A service for generating links from page titles
    - *
    - * This program is free software; you can redistribute it and/or modify
    - * it under the terms of the GNU General Public License as published by
    - * the Free Software Foundation; either version 2 of the License, or
    - * (at your option) any later version.
    - *
    - * This program is distributed in the hope that it will be useful,
    - * but WITHOUT ANY WARRANTY; without even the implied warranty of
    - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    - * GNU General Public License for more details.
    - *
    - * You should have received a copy of the GNU General Public License along
    - * with this program; if not, write to the Free Software Foundation, Inc.,
    - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    - * http://www.gnu.org/copyleft/gpl.html
    - *
    - * @file
    - * @license GPL 2+
    - * @author Daniel Kinzler
    - */
    -use MediaWiki\Linker\LinkTarget;
    -
    -/**
    - * A service for generating links from page titles.
    - *
    - * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
    - * @since 1.23
    - */
    -class MediaWikiPageLinkRenderer implements PageLinkRenderer {
    -	/**
    -	 * @var TitleFormatter
    -	 */
    -	protected $formatter;
    -
    -	/**
    -	 * @var string
    -	 */
    -	protected $baseUrl;
    -
    -	/**
    -	 * @note $formatter and $baseUrl are currently not used for generating links,
    -	 * since we still rely on the Linker class to generate the actual HTML.
    -	 * Once this is reversed so that  Linker becomes a legacy interface to
    -	 * HtmlPageLinkRenderer, we will be using them, so it seems prudent to
    -	 * already declare the dependency and inject them.
    -	 *
    -	 * @param TitleFormatter $formatter Formatter for generating the target title string
    -	 * @param string $baseUrl (currently unused, pending refactoring of Linker).
    -	 *        Defaults to $wgArticlePath.
    -	 */
    -	public function __construct( TitleFormatter $formatter, $baseUrl = null ) {
    -		if ( $baseUrl === null ) {
    -			$baseUrl = $GLOBALS['wgArticlePath'];
    -		}
    -
    -		$this->formatter = $formatter;
    -		$this->baseUrl = $baseUrl;
    -	}
    -
    -	/**
    -	 * Returns the (partial) URL for the given page (including any section identifier).
    -	 *
    -	 * @param LinkTarget $page The link's target
    -	 * @param array $params Any additional URL parameters.
    -	 *
    -	 * @return string
    -	 */
    -	public function getPageUrl( LinkTarget $page, $params = [] ) {
    -		// TODO: move the code from Linker::linkUrl here!
    -		// The below is just a rough estimation!
    -
    -		$name = $this->formatter->getPrefixedText( $page );
    -		$name = str_replace( ' ', '_', $name );
    -		$name = wfUrlencode( $name );
    -
    -		$url = $this->baseUrl . $name;
    -
    -		if ( $params ) {
    -			$separator = ( strpos( $url, '?' ) ) ? '&' : '?';
    -			$url .= $separator . wfArrayToCgi( $params );
    -		}
    -
    -		$fragment = $page->getFragment();
    -		if ( $fragment !== '' ) {
    -			$url = $url . '#' . wfUrlencode( $fragment );
    -		}
    -
    -		return $url;
    -	}
    -
    -	/**
    -	 * Returns an HTML link to the given page, using the given surface text.
    -	 *
    -	 * @param LinkTarget $linkTarget The link's target
    -	 * @param string $text The link's surface text (will be derived from $page if not given).
    -	 *
    -	 * @return string
    -	 */
    -	public function renderHtmlLink( LinkTarget $linkTarget, $text = null ) {
    -		if ( $text === null ) {
    -			$text = $this->formatter->getFullText( $linkTarget );
    -		}
    -
    -		// TODO: move the logic implemented by Linker here,
    -		// using $this->formatter and $this->baseUrl, and
    -		// re-implement Linker to use a HtmlPageLinkRenderer.
    -
    -		$title = Title::newFromLinkTarget( $linkTarget );
    -		$link = Linker::link( $title, htmlspecialchars( $text ) );
    -
    -		return $link;
    -	}
    -
    -	/**
    -	 * Returns a wikitext link to the given page, using the given surface text.
    -	 *
    -	 * @param LinkTarget $page The link's target
    -	 * @param string $text The link's surface text (will be derived from $page if not given).
    -	 *
    -	 * @return string
    -	 */
    -	public function renderWikitextLink( LinkTarget $page, $text = null ) {
    -		if ( $text === null ) {
    -			$text = $this->formatter->getFullText( $page );
    -		}
    -
    -		$name = $this->formatter->getFullText( $page );
    -
    -		return '[[:' . $name . '|' . wfEscapeWikiText( $text ) . ']]';
    -	}
    -}
    diff --git a/includes/title/PageLinkRenderer.php b/includes/title/PageLinkRenderer.php
    deleted file mode 100644
    index e26fe1a2d5..0000000000
    --- a/includes/title/PageLinkRenderer.php
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -<?php
    -/**
    - * Represents a link rendering service for %MediaWiki.
    - *
    - * This program is free software; you can redistribute it and/or modify
    - * it under the terms of the GNU General Public License as published by
    - * the Free Software Foundation; either version 2 of the License, or
    - * (at your option) any later version.
    - *
    - * This program is distributed in the hope that it will be useful,
    - * but WITHOUT ANY WARRANTY; without even the implied warranty of
    - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    - * GNU General Public License for more details.
    - *
    - * You should have received a copy of the GNU General Public License along
    - * with this program; if not, write to the Free Software Foundation, Inc.,
    - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    - * http://www.gnu.org/copyleft/gpl.html
    - *
    - * @file
    - * @license GPL 2+
    - * @author Daniel Kinzler
    - */
    -use MediaWiki\Linker\LinkTarget;
    -
    -/**
    - * Represents a link rendering service for %MediaWiki.
    - *
    - * This is designed to encapsulate the knowledge about how page titles map to
    - * URLs, and how links are encoded in a given output format.
    - *
    - * @see https://www.mediawiki.org/wiki/Requests_for_comment/TitleValue
    - * @since 1.23
    - */
    -interface PageLinkRenderer {
    -	/**
    -	 * Returns the URL for the given page.
    -	 *
    -	 * @todo expand this to cover the functionality of Linker::linkUrl
    -	 *
    -	 * @param LinkTarget $page The link's target
    -	 * @param array $params Any additional URL parameters.
    -	 *
    -	 * @return string
    -	 */
    -	public function getPageUrl( LinkTarget $page, $params = [] );
    -
    -	/**
    -	 * Returns an HTML link to the given page, using the given surface text.
    -	 *
    -	 * @todo expand this to cover the functionality of Linker::link
    -	 *
    -	 * @param LinkTarget $page The link's target
    -	 * @param string $text The link's surface text (will be derived from $page if not given).
    -	 *
    -	 * @return string
    -	 */
    -	public function renderHtmlLink( LinkTarget $page, $text = null );
    -
    -	/**
    -	 * Returns a wikitext link to the given page, using the given surface text.
    -	 *
    -	 * @param LinkTarget $page The link's target
    -	 * @param string $text The link's surface text (will be derived from $page if not given).
    -	 *
    -	 * @return string
    -	 */
    -	public function renderWikitextLink( LinkTarget $page, $text = null );
    -}
    diff --git a/includes/upload/UploadBase.php b/includes/upload/UploadBase.php
    index ba5171f523..71d032fb86 100644
    --- a/includes/upload/UploadBase.php
    +++ b/includes/upload/UploadBase.php
    @@ -353,7 +353,7 @@ abstract class UploadBase {
     
     		$error = '';
     		if ( !Hooks::run( 'UploadVerification',
    -			[ $this->mDestName, $this->mTempPath, &$error ] )
    +			[ $this->mDestName, $this->mTempPath, &$error ], '1.28' )
     		) {
     			return [ 'status' => self::HOOK_ABORTED, 'error' => $error ];
     		}
    @@ -467,9 +467,13 @@ abstract class UploadBase {
     			}
     		}
     
    -		Hooks::run( 'UploadVerifyFile', [ $this, $mime, &$status ] );
    -		if ( $status !== true ) {
    -			return $status;
    +		$error = true;
    +		Hooks::run( 'UploadVerifyFile', [ $this, $mime, &$error ] );
    +		if ( $error !== true ) {
    +			if ( !is_array( $error ) ) {
    +				$error = [ $error ];
    +			}
    +			return $error;
     		}
     
     		wfDebug( __METHOD__ . ": all clear; passing.\n" );
    @@ -717,13 +721,23 @@ abstract class UploadBase {
     	 */
     	public function performUpload( $comment, $pageText, $watch, $user, $tags = [] ) {
     		$this->getLocalFile()->load( File::READ_LATEST );
    +		$props = $this->mFileProps;
    +
    +		$error = null;
    +		Hooks::run( 'UploadVerifyUpload', [ $this, $user, $props, $comment, $pageText, &$error ] );
    +		if ( $error ) {
    +			if ( !is_array( $error ) ) {
    +				$error = [ $error ];
    +			}
    +			return call_user_func_array( 'Status::newFatal', $error );
    +		}
     
     		$status = $this->getLocalFile()->upload(
     			$this->mTempPath,
     			$comment,
     			$pageText,
     			File::DELETE_SOURCE,
    -			$this->mFileProps,
    +			$props,
     			false,
     			$user,
     			$tags
    @@ -1416,7 +1430,10 @@ abstract class UploadBase {
     				return [ 'uploaded-event-handler-on-svg', $attrib, $value ];
     			}
     
    -			# href with non-local target (don't allow http://, javascript:, etc)
    +			# Do not allow relative links, or unsafe url schemas.
    +			# For <a> tags, only data:, http: and https: and same-document
    +			# fragment links are allowed. For all other tags, only data:
    +			# and fragment are allowed.
     			if ( $stripped == 'href'
     				&& strpos( $value, 'data:' ) !== 0
     				&& strpos( $value, '#' ) !== 0
    diff --git a/includes/user/PasswordReset.php b/includes/user/PasswordReset.php
    index 60144bb5d6..bc87cd03dd 100644
    --- a/includes/user/PasswordReset.php
    +++ b/includes/user/PasswordReset.php
    @@ -153,7 +153,7 @@ class PasswordReset {
     			'Capture' => $displayPassword ? '1' : null,
     		];
     		if ( !Hooks::run( 'SpecialPasswordResetOnSubmit', [ &$users, $data, &$error ] ) ) {
    -			return StatusValue::newFatal( wfMessage( $error ) );
    +			return StatusValue::newFatal( Message::newFromSpecifier( $error ) );
     		}
     
     		if ( !$users ) {
    diff --git a/includes/user/User.php b/includes/user/User.php
    index cc4c6d0c97..4a92f6586e 100644
    --- a/includes/user/User.php
    +++ b/includes/user/User.php
    @@ -806,7 +806,7 @@ class User implements IDBAccessObject {
     	}
     
     	/**
    -	 * Does the string match an anonymous IPv4 address?
    +	 * Does the string match an anonymous IP address?
     	 *
     	 * This function exists for username validation, in order to reject
     	 * usernames which are similar in form to IP addresses. Strings such
    @@ -1524,16 +1524,19 @@ class User implements IDBAccessObject {
     		global $wgNamespacesToBeSearchedDefault, $wgDefaultUserOptions, $wgContLang, $wgDefaultSkin;
     
     		static $defOpt = null;
    -		if ( !defined( 'MW_PHPUNIT_TEST' ) && $defOpt !== null ) {
    -			// Disabling this for the unit tests, as they rely on being able to change $wgContLang
    -			// mid-request and see that change reflected in the return value of this function.
    -			// Which is insane and would never happen during normal MW operation
    +		static $defOptLang = null;
    +
    +		if ( $defOpt !== null && $defOptLang === $wgContLang->getCode() ) {
    +			// $wgContLang does not change (and should not change) mid-request,
    +			// but the unit tests change it anyway, and expect this method to
    +			// return values relevant to the current $wgContLang.
     			return $defOpt;
     		}
     
     		$defOpt = $wgDefaultUserOptions;
     		// Default language setting
    -		$defOpt['language'] = $wgContLang->getCode();
    +		$defOptLang = $wgContLang->getCode();
    +		$defOpt['language'] = $defOptLang;
     		foreach ( LanguageConverter::$languagesWithVariants as $langCode ) {
     			$defOpt[$langCode == $wgContLang->getCode() ? 'variant' : "variant-$langCode"] = $langCode;
     		}
    diff --git a/includes/utils/IP.php b/includes/utils/IP.php
    index 4a2205eebb..8676baf49c 100644
    --- a/includes/utils/IP.php
    +++ b/includes/utils/IP.php
    @@ -53,7 +53,7 @@ define( 'RE_IPV6_BLOCK', RE_IPV6_ADD . '\/' . RE_IPV6_PREFIX );
     define( 'RE_IPV6_GAP', ':(?:0+:)*(?::(?:0+:)*)?' );
     define( 'RE_IPV6_V4_PREFIX', '0*' . RE_IPV6_GAP . '(?:ffff:)?' );
     
    -// This might be useful for regexps used elsewhere, matches any IPv6 or IPv6 address or network
    +// This might be useful for regexps used elsewhere, matches any IPv4 or IPv6 address or network
     define( 'IP_ADDRESS_STRING',
     	'(?:' .
     		RE_IP_ADD . '(?:\/' . RE_IP_PREFIX . ')?' . // IPv4
    diff --git a/includes/utils/MWCryptHKDF.php b/includes/utils/MWCryptHKDF.php
    index 9469c41f60..1376fa7bb9 100644
    --- a/includes/utils/MWCryptHKDF.php
    +++ b/includes/utils/MWCryptHKDF.php
    @@ -156,7 +156,7 @@ class MWCryptHKDF {
     
     	/**
     	 * Return a singleton instance, based on the global configs.
    -	 * @return HKDF
    +	 * @return self
     	 * @throws MWException
     	 */
     	protected static function singleton() {
    diff --git a/includes/widget/SearchInputWidget.php b/includes/widget/SearchInputWidget.php
    old mode 100755
    new mode 100644
    index 6baaff05cf..dcd54154f6
    --- a/includes/widget/SearchInputWidget.php
    +++ b/includes/widget/SearchInputWidget.php
    @@ -48,7 +48,7 @@ class SearchInputWidget extends TitleInputWidget {
     			$this->performSearchOnClick = $config['performSearchOnClick'];
     		}
     
    -		if ( $config['dataLocation'] ) {
    +		if ( isset( $config['dataLocation'] ) ) {
     			// identifies the location of the search bar for tracking purposes
     			$this->dataLocation = $config['dataLocation'];
     		}
    diff --git a/languages/Language.php b/languages/Language.php
    index 0a6ccd3eb2..37f4137a7e 100644
    --- a/languages/Language.php
    +++ b/languages/Language.php
    @@ -30,8 +30,6 @@ if ( !defined( 'MEDIAWIKI' ) ) {
     	exit( 1 );
     }
     
    -mb_internal_encoding( 'UTF-8' );
    -
     use CLDRPluralRuleParser\Evaluator;
     
     /**
    @@ -1089,7 +1087,7 @@ class Language {
     	 * @throws MWException
     	 * @return string
     	 */
    -	public function sprintfDate( $format, $ts, DateTimeZone $zone = null, &$ttl = null ) {
    +	public function sprintfDate( $format, $ts, DateTimeZone $zone = null, &$ttl = 'unused' ) {
     		$s = '';
     		$raw = false;
     		$roman = false;
    @@ -1454,7 +1452,9 @@ class Language {
     			}
     		}
     
    -		if ( $usedSecond ) {
    +		if ( $ttl === 'unused' ) {
    +			// No need to calculate the TTL, the caller wont use it anyway.
    +		} elseif ( $usedSecond ) {
     			$ttl = 1;
     		} elseif ( $usedMinute ) {
     			$ttl = 60 - substr( $ts, 12, 2 );
    diff --git a/languages/data/Names.php b/languages/data/Names.php
    index a7de1f9184..73f57e4a78 100644
    --- a/languages/data/Names.php
    +++ b/languages/data/Names.php
    @@ -78,6 +78,7 @@ class Names {
     		'az' => 'azərbaycanca', # Azerbaijani
     		'azb' => 'تۆرکجه', # South Azerbaijani
     		'ba' => 'башҡортса', # Bashkir
    +		'ban' => 'Basa Bali', # Balinese
     		'bar' => 'Boarisch', # Bavarian (Austro-Bavarian and South Tyrolean)
     		'bat-smg' => 'žemaitėška', # Samogitian (deprecated code, 'sgs' in ISO 693-3 since 2010-06-30 )
     		'bbc' => 'Batak Toba', # Batak Toba (falls back to bbc-latn)
    diff --git a/languages/data/ZhConversion.php b/languages/data/ZhConversion.php
    index b7943ede82..87e957df76 100644
    --- a/languages/data/ZhConversion.php
    +++ b/languages/data/ZhConversion.php
    @@ -3567,6 +3567,8 @@ public static $zh2Hant = [
     '于康震' => '于康震',
     '于广洲' => '于廣洲',
     '于廣洲' => '于廣洲',
    +'于建嵘' => '于建嶸',
    +'于建嶸' => '于建嶸',
     '于式枚' => '于式枚',
     '于从濂' => '于從濂',
     '于從濂' => '于從濂',
    @@ -5141,6 +5143,7 @@ public static $zh2Hant = [
     '吊贺迎送' => '弔賀迎送',
     '吊头' => '弔頭',
     '吊鹤' => '弔鶴',
    +'引发' => '引發',
     '引斗' => '引鬥',
     '弘历' => '弘曆',
     '弘历史' => '弘歷史',
    @@ -5154,6 +5157,7 @@ public static $zh2Hant = [
     '张柏芝' => '張栢芝',
     '张乐于张徐' => '張樂于張徐',
     '張樂于張徐' => '張樂于張徐',
    +'強制' => '強制',
     '强制' => '強制',
     '强制作用' => '強制作用',
     '强奸' => '強姦',
    @@ -5262,8 +5266,6 @@ public static $zh2Hant = [
     '心系一' => '心繫一',
     '心系世' => '心繫世',
     '心系中' => '心繫中',
    -'心系乔' => '心繫乔',
    -'心繫乔' => '心繫乔',
     '心系五' => '心繫五',
     '心系京' => '心繫京',
     '心系人' => '心繫人',
    @@ -5288,6 +5290,7 @@ public static $zh2Hant = [
     '心系和' => '心繫和',
     '心系哪' => '心繫哪',
     '心系唐' => '心繫唐',
    +'心系乔' => '心繫喬',
     '心系嘱' => '心繫囑',
     '心系四' => '心繫四',
     '心系困' => '心繫困',
    @@ -5625,7 +5628,6 @@ public static $zh2Hant = [
     '挌斗' => '挌鬥',
     '挑大梁' => '挑大樑',
     '挑斗' => '挑鬥',
    -'振荡' => '振蕩',
     '捉奸徒' => '捉奸徒',
     '捉奸细' => '捉奸細',
     '捉奸贼' => '捉奸賊',
    @@ -6070,9 +6072,8 @@ public static $zh2Hant = [
     '李連杰' => '李連杰',
     '材干' => '材幹',
     '村落发' => '村落發',
    -'村里' => '村裡',
    -'村里長' => '村里長',
    -'村里长' => '村里長',
    +'村里有' => '村裡有',
    +'村里的' => '村裡的',
     '杜老志道' => '杜老誌道',
     '杞宋无征' => '杞宋無徵',
     '束发' => '束髮',
    @@ -6627,7 +6628,7 @@ public static $zh2Hant = [
     '营干' => '營幹',
     '烩面' => '燴麵',
     '烬余' => '燼餘',
    -'爆发指数' => '爆發指數',
    +'爆发' => '爆發',
     '争奇斗妍' => '爭奇鬥妍',
     '争奇斗异' => '爭奇鬥異',
     '争奇斗艳' => '爭奇鬥豔',
    @@ -6989,6 +6990,7 @@ public static $zh2Hant = [
     '谷保家商' => '穀保家商',
     '谷仓' => '穀倉',
     '谷圭' => '穀圭',
    +'谷城县' => '穀城縣',
     '谷场' => '穀場',
     '谷子' => '穀子',
     '谷日' => '穀日',
    @@ -7583,6 +7585,7 @@ public static $zh2Hant = [
     '姜老辣' => '薑老辣',
     '姜茶' => '薑茶',
     '姜蓉' => '薑蓉',
    +'姜还是老的辣' => '薑還是老的辣',
     '姜饼' => '薑餅',
     '姜黄' => '薑黃',
     '薙发' => '薙髮',
    @@ -8433,7 +8436,6 @@ public static $zh2Hant = [
     '里海茨' => '里海茨',
     '里铺' => '里舖',
     '重回' => '重回',
    -'重折' => '重摺',
     '重于' => '重於',
     '重罗面' => '重羅麵',
     '重制' => '重製',
    @@ -8674,6 +8676,7 @@ public static $zh2Hant = [
     '陈杰' => '陳杰',
     '陳杰' => '陳杰',
     '陈炼' => '陳鍊',
    +'陶制' => '陶製',
     '阳春面' => '陽春麵',
     '阳历' => '陽曆',
     '阳历史' => '陽歷史',
    @@ -8725,6 +8728,7 @@ public static $zh2Hant = [
     '雪里红' => '雪裡紅',
     '雪里蕻' => '雪裡蕻',
     '云吞' => '雲吞',
    +'云吞面' => '雲吞麵',
     '云笈七签' => '雲笈七籤',
     '云里雾里' => '雲裡霧裡',
     '云游' => '雲遊',
    @@ -14287,6 +14291,7 @@ public static $zh2TW = [
     '鼠标' => '滑鼠',
     '汉诺威' => '漢諾瓦',
     '漢诺威' => '漢諾瓦',
    +'乌冬面' => '烏龍麵',
     '烤烟' => '烤菸',
     '烤煙' => '烤菸',
     '无烟日' => '無菸日',
    @@ -15006,6 +15011,7 @@ public static $zh2HK = [
     '來著述' => '來著述',
     '來著錄' => '來著錄',
     '侵占' => '侵佔',
    +'促著' => '促着',
     '俄占' => '俄佔',
     '保障著' => '保障着',
     '保障著作' => '保障著作',
    @@ -15085,8 +15091,6 @@ public static $zh2HK = [
     '凶殘' => '兇殘',
     '凶殺' => '兇殺',
     '先占' => '先佔',
    -'雪鐵龍' => '先進',
    -'雪铁龙' => '先進',
     '光著' => '光着',
     '光著作' => '光著作',
     '光著名' => '光著名',
    @@ -15275,6 +15279,7 @@ public static $zh2HK = [
     '咖哩' => '咖喱',
     '麥克風' => '咪高峰',
     '麦克风' => '咪高峰',
    +'咬著' => '咬着',
     '哥特式' => '哥德式',
     '哥斯大黎加' => '哥斯達黎加',
     '哪里' => '哪裏',
    @@ -16105,7 +16110,8 @@ public static $zh2HK = [
     '本著述' => '本著述',
     '本著錄' => '本著錄',
     '里瓦尔多' => '李華度',
    -'村里' => '村裏',
    +'村里有' => '村裏有',
    +'村里的' => '村裏的',
     '杜塞道夫' => '杜塞爾多夫',
     '迪拜' => '杜拜',
     '東協助' => '東協助',
    @@ -16343,6 +16349,7 @@ public static $zh2HK = [
     '為著者' => '為著者',
     '為著述' => '為著述',
     '為著錄' => '為著錄',
    +'烏龍麵' => '烏冬麵',
     '菸' => '煙',
     '照占' => '照佔',
     '照著' => '照着',
    @@ -17768,6 +17775,7 @@ public static $zh2CN = [
     '麗著者' => '丽著者',
     '麗著述' => '丽著述',
     '麼著' => '么着',
    +'烏龍麵' => '乌冬面',
     '樂著' => '乐着',
     '樂著書' => '乐著书',
     '樂著作' => '乐著作',
    @@ -17897,7 +17905,9 @@ public static $zh2CN = [
     '側著述' => '侧著述',
     '可攜式' => '便携式',
     '攜帶型' => '便携式',
    +'促著' => '促着',
     '保護著' => '保护着',
    +'保鑣' => '保镖',
     '保障著' => '保障着',
     '保障著書' => '保障著书',
     '保障著作' => '保障著作',
    @@ -18233,6 +18243,7 @@ public static $zh2CN = [
     '味著述' => '味著述',
     '咖哩' => '咖喱',
     '諮' => '咨',
    +'咬著' => '咬着',
     '響著' => '响着',
     '響著書' => '响著书',
     '響著作' => '响著作',
    diff --git a/languages/i18n/ace.json b/languages/i18n/ace.json
    index 1cf554b781..699185e80c 100644
    --- a/languages/i18n/ace.json
    +++ b/languages/i18n/ace.json
    @@ -518,7 +518,7 @@
     	"newarticle": "(Barô)",
     	"newarticletext": "Droëneuh ka neuseutöt peunawôt u laman nyang goh na.\nKeu neupeugöt laman nyan, neukeutik lam plôk di yup (eu [$1 laman beunantu] keu haba leubèh le).\nMeunyö droëneuh trôk keunoë hana neusaja, neuteugön tèk '''back''' bak ''browser'''droëneuh.",
     	"anontalkpagetext": "----''Nyoe nakeuh ôn marit ureueng ngui nyang hana tamöng atawa hana geungui.''\nSaweub nyan, kamoe payah meukubah alamat IP-geuh keu meuparéksa. \nAlamat IP mungkén jingui lé padum-padum droe ureueng.\nMeunyoe droeneuh ureueng nyang hana tamöng nyan, tulông [[Special:CreateAccount|peugöt nan ureueng ngui]] atawa [[Special:UserLogin|tamöng log]] mangat meuteugah nibak bhah nyang hana meuphôm bak uroe la'én.",
    -	"noarticletext": "Hana naseukah jinoë lam laman nyoë.\nJi Droëneuh jeuët [[Special:Search/{{PAGENAME}}|neumita keu nan ôn nyoë]] bak ôn-ôn la’én, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} log nyang na hubôngan], atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} neu'andam ôn nyoë]</span>.",
    +	"noarticletext": "Hana naseukah jinoë lam miëng nyoë.\nDroëneuh jeuët [[Special:Search/{{PAGENAME}}|neuseutöt nan miëng nyoë]] bak miëng-miëng la’én, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} neuseutöt log nyang na hubôngan], atawa [{{fullurl:{{FULLPAGENAME}}|action=edit}} neupeugöt miëng nyoë]</span>.",
     	"noarticletext-nopermission": "Hana asoë bak laman nyoë jinoë.\nDroëneuh jeuët [[Special:Search/{{PAGENAME}}|neumita keu nan ôn nyoë]] bak laman-laman la'én,\natawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} neumita log nyang na meuhubông]</span>, tapi Droëneuh hana idin keu neupeugöt laman nyoë",
     	"userpage-userdoesnotexist-view": "Ureueng ngui \"$1\" hana teudapeuta.",
     	"updated": "(Seubarô)",
    @@ -766,6 +766,7 @@
     	"recentchanges-label-minor": "Nyoe neuandam ubeut",
     	"recentchanges-label-bot": "Neuandam nyoe geupubuet le bot",
     	"recentchanges-label-unpatrolled": "Neuandam nyoe goh lom geukalon",
    +	"recentchanges-label-plusminus": "Seunipat miëng geugantoë lé jeumeulah bita nyoë",
     	"recentchanges-legend-heading": "<strong>Hareutoë:</strong>",
     	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (eu cit [[Special:NewPages|dapeuta laman barô]])",
     	"rcnotefrom": "Di yup nyoë nakeuh neuubah yôh <strong>$2</strong> (geupeudeuh trôh ‘an <strong>$1</strong> neuubah).",
    @@ -1026,7 +1027,9 @@
     	"undelete-search-submit": "Mita",
     	"namespace": "Ruweuëng nan:",
     	"invert": "Peubalék peuniléh",
    +	"tooltip-invert": "Neuceuë kutak nyoë keu neupeusom neuubah miëng lam ruweuëng nan nyang neupiléh (ngön ruweuëng nan teukaw`èt meunyö neuceuë)",
     	"namespace_association": "Ruweuëng nan meuhubông",
    +	"tooltip-namespace_association": "Neuceuë kutak nyoë keu neupeurôh ruweuëng nan marit atawa bhaih nyang teukaw`èt ngön ruweuëng nan teupiléh",
     	"blanknamespace": "(Keuë)",
     	"contributions": "Beuneuri {{GENDER:$1|ureuëng ngui}}",
     	"contributions-title": "Beuneuri ureuëng ngui keu $1",
    @@ -1213,6 +1216,7 @@
     	"tags": "Tag neuubah nyang sah",
     	"tag-filter": "Saréng [[Special:Tags|tag]]:",
     	"tag-filter-submit": "Saréng",
    +	"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
     	"logentry-newusers-create": "$1 {{GENDER:$2|geupeugöt}} akun ureuëng ngui",
     	"searchsuggest-search": "Mita",
     	"duration-seconds": "{{PLURAL:$1|deutik}}",
    diff --git a/languages/i18n/af.json b/languages/i18n/af.json
    index 73c4c8f9e0..7bdc09701c 100644
    --- a/languages/i18n/af.json
    +++ b/languages/i18n/af.json
    @@ -135,6 +135,8 @@
     	"october-date": "$1 Oktober",
     	"november-date": "$1 November",
     	"december-date": "$1 Desember",
    +	"period-am": "AM",
    +	"period-pm": "PM",
     	"pagecategories": "{{PLURAL:$1|Kategorie|Kategorieë}}",
     	"category_header": "Bladsye in kategorie \"$1\"",
     	"subcategories": "Subkategorieë",
    @@ -160,7 +162,7 @@
     	"morenotlisted": "Die lys is nie volledig nie.",
     	"mypage": "Gebruikersblad",
     	"mytalk": "Bespreking",
    -	"anontalk": "Besprekingsblad vir hierdie IP",
    +	"anontalk": "Bespreking",
     	"navigation": "Navigasie",
     	"and": "&#32;en",
     	"qbfind": "Vind",
    @@ -494,6 +496,12 @@
     	"retypenew": "Tik nuwe wagwoord weer in",
     	"resetpass_submit": "Stel wagwoord en meld aan",
     	"changepassword-success": "U wagwoord is suksesvol gewysig!",
    +	"botpasswords-label-create": "Skep",
    +	"botpasswords-label-update": "Opdateer",
    +	"botpasswords-label-cancel": "Kanselleer",
    +	"botpasswords-label-delete": "Skrap",
    +	"botpasswords-label-resetpassword": "Herstel wagwoord",
    +	"botpasswords-label-grants": "Toepaslike regte:",
     	"resetpass_forbidden": "Wagwoorde kannie gewysig word nie.",
     	"resetpass-no-info": "U moet ingeteken wees om hierdie bladsy direk te kan gebruik.",
     	"resetpass-submit-loggedin": "Verander wagwoord",
    @@ -546,10 +554,13 @@
     	"sig_tip": "Handtekening met datum",
     	"hr_tip": "Horisontale streep (selde nodig)",
     	"summary": "Opsomming:",
    -	"subject": "Onderwerp/opskrif:",
    +	"subject": "Onderwerp:",
     	"minoredit": "Klein wysiging",
     	"watchthis": "Hou bladsy dop",
     	"savearticle": "Stoor bladsy",
    +	"savechanges": "Stoor wysigings",
    +	"publishpage": "Publiseer bladsy",
    +	"publishchanges": "Publiseer wysigings",
     	"preview": "Voorskou",
     	"showpreview": "Wys voorskou",
     	"showdiff": "Wys veranderings",
    @@ -1117,6 +1128,7 @@
     	"recentchanges-label-plusminus": "Bladsy is met die aantal grepe gewysig",
     	"recentchanges-legend-heading": "<strong>Sleutel:</strong>",
     	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (sien ook die [[Special:NewPages|lys van nuwe bladsye]])",
    +	"recentchanges-submit": "Wys",
     	"rcnotefrom": "Wysigings sedert <strong>$2</strong> (maksimum van <strong>$1</strong> word gewys).",
     	"rclistfrom": "Vertoon wysigings vanaf $3 $2",
     	"rcshowhideminor": "$1 klein wysigings",
    @@ -1504,6 +1516,7 @@
     	"mostrevisions": "Artikels met meeste wysigings",
     	"prefixindex": "Alle bladsye (voorvoegselindeks)",
     	"prefixindex-namespace": "Alle bladsye met die voorvoegsel (naamruimte $1)",
    +	"prefixindex-submit": "Wys",
     	"shortpages": "Kort bladsye",
     	"longpages": "Lang bladsye",
     	"deadendpages": "Doodloopbladsye",
    @@ -1546,8 +1559,10 @@
     	"apisandbox": "API-sandput",
     	"apisandbox-api-disabled": "API is afgeskakel op hierdie webwerf.",
     	"apisandbox-intro": "Gebruik hierdie bladsy om te eksperimenteer met die '''MediaWiki-API'''.\nSien die [https://www.mediawiki.org/wiki/API:Main_page API-dokumentasie] vir verdere details oor die gebruik van die API. Voorbeeld: [https://www.mediawiki.org/wiki/API#A_simple_example hoe die inhoud van 'n Tuisblad te laai]. Kies 'n handeling om meer voorbeelde te sien.",
    +	"apisandbox-unfullscreen": "Wys bladsy",
     	"apisandbox-submit": "Maak versoek",
     	"apisandbox-reset": "Vee uit",
    +	"apisandbox-retry": "Herprobeer",
     	"apisandbox-examples": "Voorbeeld",
     	"apisandbox-results": "Resultaat",
     	"apisandbox-request-url-label": "Versoek-URL:",
    @@ -1560,11 +1575,16 @@
     	"specialloguserlabel": "Uitvoerende gebruiker:",
     	"speciallogtitlelabel": "Teiken (bladsy of gebruiker):",
     	"log": "Logboeke",
    +	"logeventslist-submit": "Wys",
     	"all-logs-page": "Alle openbare logboeke",
     	"alllogstext": "Vertoon 'n samestelling van alle boekstawings van {{SITENAME}}.\nU kan die resultate vernou deur 'n boekstaaftipe, gebruikersnaam (kas-sensitief) of spesifieke blad (ook kas-sensitief) te kies.",
     	"logempty": "Geen inskrywings in die logboek voldoen aan die kriteria nie.",
     	"log-title-wildcard": "Soek bladsye wat met die naam begin",
     	"showhideselectedlogentries": "Wys/versteek gekose logboekreëls",
    +	"checkbox-select": "Selekteer: $1",
    +	"checkbox-all": "Alle",
    +	"checkbox-none": "Geen",
    +	"checkbox-invert": "Omkeer",
     	"allpages": "Alle bladsye",
     	"nextpage": "Volgende blad ($1)",
     	"prevpage": "Vorige bladsye ($1)",
    @@ -1581,6 +1601,7 @@
     	"cachedspecial-viewing-cached-ts": "U kyk na 'n gekasde weergawe ban die bladsy, wat moontlik nie volledig bygewerk is nie.",
     	"cachedspecial-refresh-now": "Wys nuutste.",
     	"categories": "Kategorieë",
    +	"categories-submit": "Wys",
     	"categoriespagetext": "Die volgende {{PLURAL:$1|kategorie|kategorieë}} bevat bladsye of media.\n[[Special:UnusedCategories|Ongebruikte kategorieë]] word nie gewys nie.\nSien ook [[Special:WantedCategories|nie-bestaande kategorieë met verwysings]].",
     	"categoriesfrom": "Wys kategorieë vanaf:",
     	"deletedcontributions": "Geskrapte gebruikersbydraes",
    @@ -1680,6 +1701,7 @@
     	"wlnote": "Hier volg die laaste {{PLURAL:$1|verandering|'''$1''' veranderings}} binne die laaste {{PLURAL:$2|uur|'''$2''' ure}}, soos vanaf $3 om $4.",
     	"wlshowlast": "Wys afgelope $1 ure, $2 dae of",
     	"watchlist-hide": "Versteek",
    +	"watchlist-submit": "Wys",
     	"wlshowtime": "Wys laaste:",
     	"wlshowhideminor": "klein wysigings",
     	"wlshowhidebots": "robotte",
    @@ -1717,6 +1739,7 @@
     	"delete-confirm": "Skrap \"$1\"",
     	"delete-legend": "Skrap",
     	"historywarning": "'''Waarskuwing:''' Die bladsy wat u wil verwyder het 'n geskiedenis met ongeveer $1 {{PLURAL:$1|weergawe|weergawes}}:",
    +	"historyaction-submit": "Wys",
     	"confirmdeletetext": "U staan op die punt om 'n bladsy of prent, insluitende hul geskiedenis, uit die databasis te skrap.\nBevestig asseblief dat u dit wil doen, dat u die gevolge verstaan en dat u dit doen in ooreenstemming met die [[{{MediaWiki:Policy-url}}|beleid]].",
     	"actioncomplete": "Aksie uitgevoer",
     	"actionfailed": "Aksie het gefaal",
    @@ -1746,6 +1769,7 @@
     	"sessionfailure-title": "Sessie het gefaal",
     	"sessionfailure": "Dit lyk of daar 'n probleem met u sessie is.\nHierdie aksie is gekanselleer omdat dit 'n veiligheidsrisiko is (moontlike kaping van u sessie).\nGaan een bladsy terug, herlaai die bladsy en probeer dan weer.",
     	"changecontentmodel-reason-label": "Rede:",
    +	"changecontentmodel-submit": "Wysig",
     	"protectlogpage": "Beskermingboekstaaf",
     	"protectlogtext": "Hieronder is 'n lys van veranderinge wat aan die beveilig van bladsye aangebring is.\nSien die [[Special:ProtectedPages|lys van beveiligde bladsye]] vir alle bladsye wat tans operasioneel beveilig is.",
     	"protectedarticle": "het [[$1]] beskerm",
    @@ -2734,6 +2758,7 @@
     	"confirm-watch-top": "Voeg hierdie bladsy by u dophoulys?",
     	"confirm-unwatch-button": "OK",
     	"confirm-unwatch-top": "Verwyder hierdie bladsy van u dophoulys?",
    +	"confirm-rollback-button": "OK",
     	"quotation-marks": "\"$1\"",
     	"imgmultipageprev": "← vorige bladsy",
     	"imgmultipagenext": "volgende bladsy →",
    @@ -2783,6 +2808,7 @@
     	"watchlisttools-edit": "Bekyk en wysig dophoulys",
     	"watchlisttools-raw": "Wysig bronkode",
     	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kontak]])",
    +	"timezone-local": "Lokaal",
     	"duplicate-defaultsort": "Waarskuwing: Die standaardsortering \"$2\" kry voorrang voor die sortering \"$1\".",
     	"version": "Weergawe",
     	"version-extensions": "Uitbreidings geïnstalleer",
    @@ -2890,6 +2916,7 @@
     	"tags-activate-reason": "Rede:",
     	"tags-activate-submit": "Aktiveer",
     	"tags-deactivate-reason": "Rede:",
    +	"tags-deactivate-submit": "Deaktiveer",
     	"tags-edit-existing-tags-none": "''Geen''",
     	"tags-edit-reason": "Rede:",
     	"comparepages": "Vergelyk bladsye",
    @@ -3061,10 +3088,12 @@
     	"pagelang-language": "Taal",
     	"pagelang-use-default": "Gebruik standaard taal",
     	"pagelang-select-lang": "Kies taal",
    +	"pagelang-submit": "Dien in",
     	"right-pagelang": "Wysig die taal van die bladsy",
     	"log-name-pagelang": "Logboek van taalwysigings",
     	"log-description-pagelang": "Hierdie is 'n logboek van wysigings van die taal van bladsye.",
     	"logentry-pagelang-pagelang": "$1 wysig die taal van bladsy '$3' van $4 na $5.",
    +	"default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>afgeskakel</strong>)",
     	"mediastatistics": "Mediastatistieke",
     	"mediastatistics-nbytes": "{{PLURAL:$1|$1 greep|$1 grepe}} ($2; $3%)",
     	"mediastatistics-table-mimetype": "MIME-tipe",
    @@ -3078,6 +3107,7 @@
     	"mediastatistics-header-text": "Tekslêers",
     	"mediastatistics-header-executable": "Uitvoerbare lêers",
     	"mediastatistics-header-archive": "Gekompakteerde lêers",
    +	"mediastatistics-header-total": "Alle lêers",
     	"json-error-syntax": "Sintaksfout",
     	"headline-anchor-title": "Skakel na die afdeling",
     	"special-characters-group-latin": "Latyns",
    @@ -3105,5 +3135,6 @@
     	"mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
     	"mw-widgets-titleinput-description-new-page": "bladsy bestaan nog nie",
     	"mw-widgets-titleinput-description-redirect": "aanstuur na $1",
    -	"api-error-blacklisted": "Kies asseblief 'n ander, beskrywende titel."
    +	"log-action-filter-all": "Alle",
    +	"authprovider-resetpass-skip-label": "Slaan oor"
     }
    diff --git a/languages/i18n/ar.json b/languages/i18n/ar.json
    index 5b46fa83d1..8edf06f006 100644
    --- a/languages/i18n/ar.json
    +++ b/languages/i18n/ar.json
    @@ -60,7 +60,8 @@
     			"ASammour",
     			"Maroen1990",
     			"Sonic N800",
    -			"Jdforrester"
    +			"Jdforrester",
    +			"Alaa"
     		]
     	},
     	"tog-underline": "سطر تحت الوصلات:",
    @@ -103,7 +104,7 @@
     	"tog-ccmeonemails": "أرسل إلي نسخا من الرسائل الإلكترونية التي أرسلها إلى المستخدمين الآخرين",
     	"tog-diffonly": "لا تعرض محتوى الصفحة أسفل الفرق",
     	"tog-showhiddencats": "أظهر التصنيفات المخفية",
    -	"tog-norollbackdiff": "أزل الفرق بعد إحداث استرجاع",
    +	"tog-norollbackdiff": "عدم إظهار الاختلافات بعد تنفيذ التراجع",
     	"tog-useeditwarning": "حذّرني عندما أغادر تحرير صفحة فيها تغييرات لم أحفظها",
     	"tog-prefershttps": "دائما استخدم اتصالا آمنا بعد الدخول",
     	"underline-always": "دائما",
    @@ -454,6 +455,7 @@
     	"password-change-forbidden": "أنت لا يمكنك تغيير كلمات السر على هذا الويكي.",
     	"externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
     	"login": "تسجيل الدخول",
    +	"login-security": "توكيد هويتك",
     	"nav-login-createaccount": "دخول / إنشاء حساب",
     	"userlogin": "دخول / إنشاء حساب",
     	"userloginnocreate": "تسجيل الدخول",
    @@ -471,6 +473,7 @@
     	"userlogin-resetpassword-link": "نسيت كلمة مرورك؟",
     	"userlogin-helplink2": "المساعدة في الدخول",
     	"userlogin-loggedin": "أنت {{GENDER:$1|مسجل|مسجلة}} الدخول مسبقًا باسم $1. {{GENDER:$1|استخدم|استخدمي}} النموذج بالأسفل لتسجيل الدخول بحساب آخر.",
    +	"userlogin-reauth": "عليك الدخول مرة أخرى لتؤكد أنك {{GENDER:$1|$1}}.",
     	"userlogin-createanother": "إنشاء حساب آخر",
     	"createacct-emailrequired": "عنوان البريد الإلكتروني",
     	"createacct-emailoptional": "البريد الإلكتروني (اختياري)",
    @@ -483,6 +486,8 @@
     	"createacct-reason-ph": "لماذا تقوم بإنشاء حساب آخر",
     	"createacct-submit": "افتح الحساب",
     	"createacct-another-submit": "أنشئ حسابا",
    +	"createacct-continue-submit": "مواصلة إنشاء الحساب",
    +	"createacct-another-continue-submit": "مواصلة إنشاء الحساب",
     	"createacct-benefit-heading": "{{SITENAME}} موقع يساهم فيه أشخاص مثلك.",
     	"createacct-benefit-body1": "{{PLURAL:$1|تحريرا|تحريرات}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|صفحة}}",
    @@ -594,7 +599,7 @@
     	"resetpass-abort-generic": "منعت مُلحقة إتمام صيرورة تغيير كلمة السّر.",
     	"resetpass-expired": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة لتسجيل الدخول.",
     	"resetpass-expired-soft": "انتهت مدة صلاحية كلمة السر الخاصة بك. الرجاء تعيين كلمة سر جديدة الآن أو النقر على زر إلغاء لإعادة تعيين كلمة السر لاحقاً.",
    -	"resetpass-validity-soft": "كلمة السر الخاصة بك غير مقبولة :  $1 \n\nرجاءا اختر كلمة سر جديدة الآن، أو انقر فوق \"{{int:authprovider-resetpass-skip-label}}\" لتغييرها في وقت لاحق.",
    +	"resetpass-validity-soft": "كلمة السر الخاصة بك غير صالحة :  $1 \n\nرجاءا اختر كلمة سر جديدة الآن، أو انقر فوق \"{{int:authprovider-resetpass-skip-label}}\" لتغييرها في وقت لاحق.",
     	"passwordreset": "إعادة ضبط كلمة السر",
     	"passwordreset-text-one": "أكمل هذا النموذج لإعادة ضبط كلمة السر الخاصة بك.",
     	"passwordreset-text-many": "{{PLURAL:$1||املأ الحقل لتستعيد كلمة السر|املأ أحد الحقلين لتستعيد كلمة السر|املأ أحد الحقول لتستعيد كلمة السر}}.",
    @@ -654,7 +659,9 @@
     	"minoredit": "هذا تعديل طفيف",
     	"watchthis": "راقب هذه الصفحة",
     	"savearticle": "احفظ الصفحة",
    +	"savechanges": "احفظ التغييرات",
     	"publishpage": "نشر الصفحة",
    +	"publishchanges": "انشر التغييرات",
     	"preview": "عرض مسبق",
     	"showpreview": "أظهر معاينة",
     	"showdiff": "عرض التغييرات",
    @@ -840,7 +847,7 @@
     	"rev-delundel": "أظهر/أخف",
     	"rev-showdeleted": "أظهر",
     	"revisiondelete": "حذف/استرجاع المراجعات",
    -	"revdelete-nooldid-title": "مراجعة هدف غير صحيحة",
    +	"revdelete-nooldid-title": "النسخة المطلوبة غير محددة",
     	"revdelete-nooldid-text": "إما أنك لم تحدد مراجعة معينة هدفا لهذه الوظيفة، أو أن المراجعة المحددة غير موجودة، أو أنك تحاول إخفاء المراجعة الحالية.",
     	"revdelete-no-file": "الملف المحدد غير موجود.",
     	"revdelete-show-file-confirm": "هل أنت متأكد أنك تريد رؤية مراجعة محذوفة للملف \"<nowiki>$1</nowiki>\" بتاريخ $2 الساعة $3؟",
    @@ -927,7 +934,7 @@
     	"lineno": "سطر $1:",
     	"compareselectedversions": "قارن بين النسختين المختارتين",
     	"showhideselectedversions": "أظهر/أخف المراجعات المختارة",
    -	"editundo": "رجوع",
    +	"editundo": "تراجع",
     	"diff-empty": "(لا فرق)",
     	"diff-multi-sameuser": "({{PLURAL:$1|لا مراجعات متوسطة|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة نفس المستخدم غير {{PLURAL:$1|معروضة|معروضة|معروضتين|معروضة}})",
     	"diff-multi-otherusers": "({{PLURAL:$1|لا مراجعات|مراجعة متوسطة واحدة|مراجعتان متوسطتان|$1 مراجعات متوسطة|$1 مراجعة متوسطة}} بواسطة {{PLURAL:$2|ولا مستخدم|مستخدم واحد آخر|مستخدمين اثنين آخرين|$2 مستخدمين|$2 مستخدماً|$2 مستخدم}} غير {{PLURAL:$1|معروضة|معروضة|معروضتين|معروضة}})",
    @@ -1240,7 +1247,7 @@
     	"rightslogtext": "هذا سجل بالتغييرات في صلاحيات المستخدمين.",
     	"action-read": "قراءة هذه الصفحة",
     	"action-edit": "تعديل هذه الصفحة",
    -	"action-createpage": "إنشاء الصفحات",
    +	"action-createpage": "إنشاء هذه الصفحة",
     	"action-createtalk": "إنشاء صفحات النقاش",
     	"action-createaccount": "إنشاء حساب المستخدم هذا",
     	"action-autocreateaccount": "تلقائيا إنشاء هذا الحساب مستخدم خارجي",
    @@ -1939,7 +1946,7 @@
     	"watching": "يراقب...",
     	"unwatching": "إزالة المراقبة...",
     	"watcherrortext": "حدث خطأ أثناء تغيير إعدادات الرصد الخاصة بك \"$1\".",
    -	"enotif_reset": "علم على كل الصفحات كمزارة",
    +	"enotif_reset": "علم على كل الصفحات كمَزُورة",
     	"enotif_impersonal_salutation": "مستخدم {{SITENAME}}",
     	"enotif_subject_deleted": "الصفحة {{SITENAME}} $1 حذفها {{الجنس: $2 | $2 }}",
     	"enotif_subject_created": "الصفحة {{SITENAME}}  $1  أنشأها {{الجنس: $2 | $2 }}",
    @@ -1983,7 +1990,7 @@
     	"delete-warning-toobig": "لهذه الصفحة تاريخ تعديل طويل، أكثر من {{PLURAL:$1||مراجعة واحدة|مراجعتين|$1 مراجعات|$1 مراجعة}}.\nقد يؤدي حذفها إلى اضطراب عمليات قاعدة البيانات في {{SITENAME}}؛\nاستمر مع الحذر.",
     	"deleteprotected": "لا يمكنك حذف هذه الصفحة لأنها محمية.",
     	"deleting-backlinks-warning": "[[Special:WhatLinksHere/{{FULLPAGENAME}}|تتصل صفحات أخرى]] بالصفحة التي تريد حذفها.",
    -	"rollback": "استرجاع التعديلات",
    +	"rollback": "التراجع عن التعديلات",
     	"rollbacklink": "استرجع",
     	"rollbacklinkcount": "استرجع {{PLURAL:$1|لا تعديلات|تعديلا واحدا|تعديلين|$1 تعديلات|$1 تعديلاً|تعديل}}",
     	"rollbacklinkcount-morethan": "استرجاع أكثر من {{PLURAL:$1|تعديل|تعديل|تعديلين|$1 تعديلات|$1 تعديلاً|$1 تعديل}}",
    @@ -1995,7 +2002,7 @@
     	"revertpage-nouser": "استرجع تعديلات مستخدم مخفيّ حتى آخر مراجعة ل{{GENDER:$1|[[User:$1|$1]]}}",
     	"rollback-success": "استرجع تعديلات $1؛\nاسترجع حتى آخر نسخة بواسطة $2.",
     	"sessionfailure-title": "فشل في الجلسة",
    -	"sessionfailure": "يبدو أنه هناك مشكلة في هذه جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
    +	"sessionfailure": "يبدو أنه هناك مشكلة في جلسة الدخول الخاصة بك؛\nلذلك فقد ألغيت هذه العملية كإجراء احترازي ضد الاختراق.\nمن فضلك اضغط على مفتاح \"رجوع\" لتحميل الصفحة التي جئت منها، ثم حاول مرة أخرى.",
     	"changecontentmodel": "غير نموذج المحتوى لصفحة",
     	"changecontentmodel-legend": "غير نموذج المحتوى",
     	"changecontentmodel-title-label": "عنوان الصفحة",
    @@ -2137,6 +2144,7 @@
     	"sp-contributions-username": "عنوان أيبي أو اسم مستخدم:",
     	"sp-contributions-toponly": "أظهر أعلى المراجعات فقط",
     	"sp-contributions-newonly": "أظهر إنشاء الصفحات فقط",
    +	"sp-contributions-hideminor": "أخف التعديلات الطفيفة",
     	"sp-contributions-submit": "بحث",
     	"whatlinkshere": "ماذا يصل هنا",
     	"whatlinkshere-title": "الصفحات التي تصل إلى \"$1\"",
    @@ -2355,7 +2363,7 @@
     	"allmessagesname": "الاسم",
     	"allmessagesdefault": "النص الافتراضي",
     	"allmessagescurrent": "النص الحالي",
    -	"allmessagestext": "هذه قائمة برسائل النظام المتوفرة في نطاق ميدياويكي.\nمن فضلك زر [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation ترجمة ميدياويكي] و [https://translatewiki.net ترانسليت ويكي دوت نت] لو كنت ترغب في المساهمة في ترجمة ميدياويكي الأساسية.",
    +	"allmessagestext": "هذه قائمة برسائل النظام المتوفرة في نطاق ميدياويكي.\nيرجى زيارة :\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] و [https://translatewiki.net translatewiki.net]\nإازا كنت ترغب في المساهمة بتعريب ميديا ويكي",
     	"allmessagesnotsupportedDB": "هذه الصفحة لا يمكن استخدامها لأن '''$wgUseDatabaseMessages''' تم تعطيله.",
     	"allmessages-filter-legend": "المرشح",
     	"allmessages-filter": "رشح حسب حالة التخصيص:",
    @@ -3245,7 +3253,7 @@
     	"version-libraries-license": "الترخيص",
     	"version-libraries-description": "الوصف",
     	"version-libraries-authors": "المؤلفون",
    -	"redirect": "تحويل حسب  الملف , المستخدم ,الصفحة , معرف الدخول",
    +	"redirect": "تحويل حسب الملف أو المستخدم أو الصفحة أو معرف الدخول",
     	"redirect-summary": "هذه الصفحة الخاصة تحوّل إلى ملف (باسمه) أو صفحة (برقم إحدى مراجعاتها) أو إلى صفحة مستخدم (برقمه التعريفي). الاستخدام [[{{#Special:Redirect}}/file/Example.jpg]] أو [[{{#Special:Redirect}}/revision/328429]] أو [[{{#Special:Redirect}}/user/101]].",
     	"redirect-submit": "حوّل",
     	"redirect-lookup": "ابحث في:",
    @@ -3363,6 +3371,7 @@
     	"tags-edit-success": "طبقت التغييرات.",
     	"tags-edit-failure": "التغييرات لم تطبق: $1",
     	"tags-edit-nooldid-title": "مراجعة هدف غير صالحة",
    +	"tags-edit-nooldid-text": "لم تحدد النسخة التي تريد تطبيق العملية عليها أو لا توجد تلك النسخة",
     	"tags-edit-none-selected": "من فضلك اختر على الأقل وسما واحدا للإضافة أو الإزالة.",
     	"comparepages": "قارن صفحات",
     	"compare-page1": "صفحة 1",
    @@ -3444,7 +3453,7 @@
     	"logentry-protect-unprotect": "{{GENDER:$2|رفع|رفعت}} $1 الحماية عن $3",
     	"logentry-protect-protect": "$1 {{GENDER:$2|حمى|حمت}} $3 $4",
     	"logentry-protect-protect-cascade": "$1 {{GENDER:$2|حمى|حمت}} $3 $4 [مضمنة]",
    -	"logentry-protect-modify": "{{GENDER:$2|غير|غيرت}} $1 مستوى الحماية ل$3 $4",
    +	"logentry-protect-modify": "{{GENDER:$2|غير|غيرت}} $1 مستوى حماية $3 $4",
     	"logentry-rights-rights": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3 من $4 إلى $5",
     	"logentry-rights-rights-legacy": "{{GENDER:$2|غيّر|غيّرت}} $1 عضوية $3",
     	"logentry-rights-autopromote": "تمت تلقائيا ترقية {{GENDER:$2|المستخدم|المستخدمة}} $1 من  $4 إلى $5",
    @@ -3482,6 +3491,7 @@
     	"searchsuggest-containing": "يحتوي...",
     	"api-error-badaccess-groups": "لا يسمح لك بتحميل الملفات إلى هذه الويكي.",
     	"api-error-badtoken": "خطأ داخلي: رمز مميز غير صحيح.",
    +	"api-error-blocked": "لقد منعت من التحرير.",
     	"api-error-copyuploaddisabled": "تم تعطيل تحميل من رابط على هذا الخادم.",
     	"api-error-duplicate": "هناك {{PLURAL:$1|هو ملف آخر|كذلك$2 بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون.",
     	"api-error-duplicate-archive": "هناك {{PLURAL:$1|كان ملف آخر |كذلك بعض الملفات الأخرى}} مسبقاً على الموقع بنفس المضمون، ولكن {{PLURAL:$1|أنه تم | إجراء}} الحذف لها.",
    @@ -3613,6 +3623,7 @@
     	"special-characters-group-ipa": "صوتية دولية",
     	"special-characters-group-symbols": "رموز",
     	"special-characters-group-greek": "يونانية",
    +	"special-characters-group-greekextended": "يونانية موسعة",
     	"special-characters-group-cyrillic": "كيريلية",
     	"special-characters-group-arabic": "عربية",
     	"special-characters-group-arabicextended": "عربية موسعة",
    @@ -3633,7 +3644,6 @@
     	"mw-widgets-dateinput-no-date": "لا تاريخ تم اختياره",
     	"mw-widgets-titleinput-description-new-page": "الصفحة غير موجودة بعد",
     	"mw-widgets-titleinput-description-redirect": "تحويل إلى $1",
    -	"api-error-blacklisted": "اختر عنوانا مختلفا ومفهوما.",
     	"sessionmanager-tie": "لا يمكن جمع أنواع استيثاق متعددة: $1.",
     	"sessionprovider-generic": "جلسات $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "جلسات قائمة على ملفات تعريف الارتباط (كوكيز)",
    @@ -3666,6 +3676,8 @@
     	"log-action-filter-rights-rights": "تغيير يدوي",
     	"log-action-filter-upload-upload": "رفع جديد",
     	"log-action-filter-upload-overwrite": "إعادة الرفع",
    +	"authmanager-create-disabled": "إنشاء الحسابات معطل.",
    +	"authmanager-create-from-login": "لإنشاء حساب، برجاء ملء الحقول أدناه.",
     	"authmanager-email-label": "البريد الإلكتروني",
     	"authmanager-email-help": "عنوان البريد الإلكتروني",
     	"authmanager-realname-label": "الاسم الحقيقي",
    diff --git a/languages/i18n/ast.json b/languages/i18n/ast.json
    index af794a8531..fb709a376f 100644
    --- a/languages/i18n/ast.json
    +++ b/languages/i18n/ast.json
    @@ -409,6 +409,7 @@
     	"password-change-forbidden": "Nun se pueden camudar les contraseñes nesta wiki.",
     	"externaldberror": "O hebo un fallu d'autenticación de la base de datos o nun tienes permisu p'anovar la to cuenta esterna.",
     	"login": "Entrar",
    +	"login-security": "Comprobación d'identidá",
     	"nav-login-createaccount": "Entrar / crear cuenta",
     	"userlogin": "Entrar / crear cuenta",
     	"userloginnocreate": "Aniciar sesión",
    @@ -426,18 +427,23 @@
     	"userlogin-resetpassword-link": "¿Escaeció la contraseña?",
     	"userlogin-helplink2": "Ayuda del aniciu de sesión",
     	"userlogin-loggedin": "Yá anició sesión como {{GENDER:$1|$1}}.\nUtilice'l formulariu de más abaxo p'aniciar sesión como otru usuariu.",
    +	"userlogin-reauth": "Tienes d'aniciar sesión de nueves pa comprobar que yes {{GENDER:$1|$1}}.",
     	"userlogin-createanother": "Crear otra cuenta",
     	"createacct-emailrequired": "Direición de corréu electrónicu",
     	"createacct-emailoptional": "Direición de corréu electrónicu (opcional)",
     	"createacct-email-ph": "Escriba la so direición de corréu electrónicu",
     	"createacct-another-email-ph": "Escriba la direición de corréu electrónicu",
     	"createaccountmail": "Usar una contraseña al debalu temporal y unviala a la direición de corréu electrónicu conseñada",
    +	"createaccountmail-help": "Pue usase pa crear una cuenta pa otra persona ensin saber la contraseña.",
     	"createacct-realname": "Nome real (opcional)",
     	"createaccountreason": "Motivu:",
     	"createacct-reason": "Motivu",
     	"createacct-reason-ph": "Por qué quier crear otra cuenta",
    +	"createacct-reason-help": "Mensaxe que s'amuesa nel rexistru de creación de cuentes",
     	"createacct-submit": "Crear la cuenta",
     	"createacct-another-submit": "Crear una cuenta",
    +	"createacct-continue-submit": "Siguir cola creación de la cuenta",
    +	"createacct-another-continue-submit": "Siguir cola creación de la cuenta",
     	"createacct-benefit-heading": "{{SITENAME}} failu xente como vusté.",
     	"createacct-benefit-body1": "{{PLURAL:$1|edición|ediciones}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|páxina|páxines}}",
    @@ -451,6 +457,7 @@
     	"nocookiesnew": "La cuenta d'usuariu ta creada, pero nun anició sesión.\n{{SITENAME}} usa «cookies» pa identificar a los usuarios.\nTien les «cookies» desactivaes.\nPor favor activeles y anicie sesión col nuevu nome d'usuariu y contraseña.",
     	"nocookieslogin": "{{SITENAME}} usa «cookies» pa identificar a los usuarios.\nTien les «cookies» desactivaes.\nPor favor activeles y vuelva a intentalo.",
     	"nocookiesfornew": "La cuenta nun se creó porque nun pudimos confirmar l'orixe.\nComprueba que tienes activaes les «cookies», recarga esta páxina y vuelvi a intentalo.",
    +	"createacct-loginerror": "La cuenta creóse correchamente, pero nun pudo aniciase sesión automáticamente. Sigui col [[Special:UserLogin|accesu manual]].",
     	"noname": "Nun conseñasti un nome d'usuariu válidu.",
     	"loginsuccesstitle": "Identificáu",
     	"loginsuccess": "'''Aniciasti sesión en {{SITENAME}} como «$1».'''",
    @@ -495,6 +502,7 @@
     	"createacct-another-realname-tip": "El nome real ye opcional.\nSi decide conseñalu, va usase p'atribuir el trabayu al usuariu.",
     	"pt-login": "Entrar",
     	"pt-login-button": "Aniciar sesión",
    +	"pt-login-continue-button": "Siguir l'aniciu de sesión",
     	"pt-createaccount": "Crear una cuenta",
     	"pt-userlogout": "Salir",
     	"php-mail-error-unknown": "Fallu desconocíu na función mail() de PHP.",
    @@ -542,6 +550,7 @@
     	"botpasswords-invalid-name": "El nome d'usuariu especificáu nun contien el separador de contraseña de bot («$1»).",
     	"botpasswords-not-exist": "L'usuariu «$1» nun tien una contraseña de bot llamada «$2».",
     	"resetpass_forbidden": "Nun puen camudase les contraseñes",
    +	"resetpass_forbidden-reason": "Les contraseñes nun pueden camudase: $1",
     	"resetpass-no-info": "Tienes d'aniciar sesión pa entrar direutamente a esta páxina.",
     	"resetpass-submit-loggedin": "Camudar la contraseña",
     	"resetpass-submit-cancel": "Encaboxar",
    @@ -571,6 +580,8 @@
     	"passwordreset-emailsentusername": "Si hai una direición de corréu electrónicu asociada con esti nome d'usuariu, unviaráse un corréu electrónicu pa reaniciar la contraseña.",
     	"passwordreset-emailsent-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo.",
     	"passwordreset-emailerror-capture": "Unvióse un corréu electrónicu pa reaniciar la contraseña, que s'amuesa abaxo, pero falló l'unviu {{GENDER:$2|al usuariu|a la usuaria}}: $1",
    +	"passwordreset-invalideamil": "Direición de corréu inválida",
    +	"passwordreset-nodata": "Nun s'apurrió nin un nome d'usuariu nin una dirección de corréu electrónicu",
     	"changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
     	"changeemail-header": "Completa esti formulariu pa camudar la dirección de corréu electrónicu. Si quies desaniciar l'asociación de cualquier dirección de corréu electrónicu de la to cuenta, dexa en blancu la nueva dirección de corréu electrónicu cuando unvies el formulariu.",
     	"changeemail-passwordrequired": "Vas tener qu'escribir la contraseña pa confirmar esti cambéu.",
    @@ -643,7 +654,7 @@
     	"accmailtext": "Unvióse a $2 una contraseña xenerada al debalu pal usuariu [[User talk:$1|$1]]. Pue camudase na páxina ''[[Special:ChangePassword|camudar contraseña]]'' depués d'aniciar sesión.",
     	"newarticle": "(Nuevu)",
     	"newarticletext": "Siguisti un enllaz a un artículu qu'inda nun esiste.\nPa crear la páxina, empecipia a escribir nel cuadru d'embaxo (mira la [$1 páxina d'ayuda] pa más información).\nSi llegasti equí por enquivocu, calca nel botón <strong>atrás</strong> del to restolador.",
    -	"anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPola mor d'ello ha usase la direición numbérica IP pa identificalu/la.\nTala IP pue compartise por varios usuarios.\nSi yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:CreateAccount|crea una cuenta]] o [[Special:CreateAccount|identifícate]] pa torgar futures confusiones con otros usuarios anónimos.",
    +	"anontalkpagetext": "----\n''Esta ye la páxina d'alderique pa un usuariu anónimu qu'inda nun creó una cuenta o que nun la usa.''\nPola mor d'ello ha usase la direición numbérica IP pa identificalu/la.\nTala IP pue compartise por varios usuarios.\nSi yes un usuariu anónimu y notes qu'hai comentarios irrelevantes empobinaos pa ti, por favor [[Special:CreateAccount|crea una cuenta]] o [[Special:UserLogin|anicia sesiín]] pa torgar futures confusiones con otros usuarios anónimos.",
     	"noarticletext": "Nestos momentos nun hai testu nesta páxina.\nPuedes [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear esta páxina]</span>.",
     	"noarticletext-nopermission": "Nestos momentos nun hai testu nesta páxina.\nPue [[Special:Search/{{PAGENAME}}|buscar esti títulu de páxina]] n'otres páxines o <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} buscar los rexistros rellacionaos]</span>, pero nun tiene permisu pa crear esta páxina.",
     	"missing-revision": "La revisión #$1 de la páxina llamada \"{{FULLPAGENAME}}\" nun esiste.\n\nDe vezu la causa d'esto ye siguir un enllaz antiguu del historial a una páxina que se desanició.\nSe puen alcontrar más detalles nel [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rexistru de desanicios].",
    @@ -1426,6 +1437,8 @@
     	"upload-http-error": "Hebo un error HTTP: $1",
     	"upload-copy-upload-invalid-domain": "La xubida de copies nun ta disponible dende esti dominiu.",
     	"upload-foreign-cant-upload": "Esta wiki nun ta configurada pa xubir ficheros al estoyu de ficheros esternu solicitáu.",
    +	"upload-foreign-cant-load-config": "Falló la carga de la configuración de xuba de ficheros pal estoyu esternu de ficheros.",
    +	"upload-dialog-disabled": "Nesta wiki tán desactivaes les xubíes de ficheros por aciu d'esti diálogu.",
     	"upload-dialog-title": "Xubir ficheru",
     	"upload-dialog-button-cancel": "Encaboxar",
     	"upload-dialog-button-done": "Fecho",
    @@ -1988,12 +2001,14 @@
     	"rollbacklinkcount": "revertir $1 {{PLURAL:$1|edición|ediciones}}",
     	"rollbacklinkcount-morethan": "revertir más de $1 {{PLURAL:$1|edición|ediciones}}",
     	"rollbackfailed": "Falló la reversión",
    +	"rollback-missingparam": "Faltan parámetros riquíos na solicitú.",
     	"cantrollback": "Nun se pue revertir la edición; el postrer collaborador ye l'únicu autor d'esta páxina.",
     	"alreadyrolled": "Nun se pue revertir la postrer edición de [[:$1]] fecha por [[User:$2|$2]] ([[User talk:$2|alderique]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\ndaquién más yá editó o revirtió la páxina.\n\nLa postrer edición foi fecha por [[User:$3|$3]] ([[User talk:$3|alderique]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     	"editcomment": "El resume de la edición yera: <em>$1</em>.",
     	"revertpage": "Revertíes les ediciones de [[Special:Contributions/$2|$2]] ([[User talk:$2|alderique]]) hasta la cabera versión de [[User:$1|$1]]",
     	"revertpage-nouser": "Revertíes les ediciones de (usuariu desaniciáu) a la cabera revisión de {{GENDER:$1|[[User:$1|$1]]}}",
     	"rollback-success": "Revertíes les ediciones de $1; camudáu a la última versión de $2.",
    +	"rollback-success-notify": "Revertíes les ediciones de $1 a la última revisión de $2. [$3 Ver cambeos]",
     	"sessionfailure-title": "Fallu de sesión",
     	"sessionfailure": "Paez qu'hai un problema cola to sesión; por precaución\ncancelóse l'aición que pidisti. Da-y al botón \"Atrás\" del\nnavegador pa cargar otra vuelta la páxina y vuelve a intentalo.",
     	"changecontentmodel": "Cambiar el modelu de conteníu d'una páxina",
    @@ -2141,6 +2156,7 @@
     	"sp-contributions-username": "Direición IP o nome d'usuariu:",
     	"sp-contributions-toponly": "Amosar namái les ediciones que son les caberes revisiones",
     	"sp-contributions-newonly": "Amosar namái les ediciones que son creaciones de páxines",
    +	"sp-contributions-hideminor": "Despintar les ediciones menores",
     	"sp-contributions-submit": "Buscar",
     	"whatlinkshere": "Lo qu'enllaza equí",
     	"whatlinkshere-title": "Páxines qu’enllacien a «$1»",
    @@ -2154,9 +2170,9 @@
     	"whatlinkshere-prev": "{{PLURAL:$1|anterior|anteriores $1}}",
     	"whatlinkshere-next": "{{PLURAL:$1|siguiente|siguientes $1}}",
     	"whatlinkshere-links": "← enllaces",
    -	"whatlinkshere-hideredirs": "$1 redireiciones",
    -	"whatlinkshere-hidetrans": "$1 tresclusiones",
    -	"whatlinkshere-hidelinks": "$1 enllaces",
    +	"whatlinkshere-hideredirs": "$1 les redireiciones",
    +	"whatlinkshere-hidetrans": "$1 les tresclusiones",
    +	"whatlinkshere-hidelinks": "$1 los enllaces",
     	"whatlinkshere-hideimages": "$1 los enllaces al ficheru",
     	"whatlinkshere-filters": "Peñeres",
     	"whatlinkshere-submit": "Dir",
    @@ -3052,6 +3068,8 @@
     	"confirm-watch-top": "¿Amestar esta páxina a la to llista de vixilancia?",
     	"confirm-unwatch-button": "Aceutar",
     	"confirm-unwatch-top": "¿Desaniciar esta páxina de la to llista de vixilancia?",
    +	"confirm-rollback-button": "Aceutar",
    +	"confirm-rollback-top": "¿Revertir les ediciones a esta páxina?",
     	"quotation-marks": "«$1»",
     	"imgmultipageprev": "← páxina anterior",
     	"imgmultipagenext": "páxina siguiente →",
    @@ -3632,5 +3650,34 @@
     	"log-action-filter-suppress-block": "Supresión d'usuariu por bloquéu",
     	"log-action-filter-suppress-reblock": "Supresión d'usuariu por rebloquéu",
     	"log-action-filter-upload-upload": "Nueva carga",
    -	"log-action-filter-upload-overwrite": "Recargar"
    +	"log-action-filter-upload-overwrite": "Recargar",
    +	"authmanager-authn-no-primary": "Les credenciales apurríes nun pudieron autentificase.",
    +	"authmanager-authn-no-local-user": "Les credenciales apurríes nun tán asociaes con nengún usuariu nesta wiki.",
    +	"authmanager-authn-autocreate-failed": "Falló la creación automática d'una cuenta local: $1",
    +	"authmanager-authplugin-setpass-bad-domain": "Dominiu inválidu.",
    +	"authmanager-autocreate-noperm": "Nun se permite la creación automática de cuentes.",
    +	"authmanager-autocreate-exception": "La creación automática de cuentes desactivóse temporalmente por cuenta d'errores previos.",
    +	"authmanager-userdoesnotexist": "La cuenta d'usuariu «$1» nun ta rexistrada.",
    +	"authmanager-userlogin-remembermypassword-help": "Si tien de recordase la contraseña por más tiempu del que dura la sesión.",
    +	"authmanager-username-help": "Nome d'usuariu pa l'autenticación.",
    +	"authmanager-password-help": "Contraseña pa l'autenticación.",
    +	"authmanager-domain-help": "Dominiu pa l'autenticación esterna.",
    +	"authmanager-retype-help": "Otra vuelta la contraseña pa confirmar.",
    +	"authmanager-email-label": "Corréu",
    +	"authmanager-email-help": "Direición de corréu electrónicu",
    +	"authmanager-realname-label": "Nome real",
    +	"authmanager-realname-help": "Nome real del usuariu",
    +	"authmanager-provider-password": "Autenticación basada en contraseña",
    +	"authmanager-provider-password-domain": "Autenticación basada en contraseña y dominiu",
    +	"authmanager-provider-temporarypassword": "Contraseña temporal",
    +	"authprovider-resetpass-skip-label": "Saltar",
    +	"authprovider-resetpass-skip-help": "Saltar el reaniciu de la contraseña.",
    +	"credentialsform-account": "Nome de la cuenta:",
    +	"cannotlink-no-provider-title": "Nun hai cuentes enllazables",
    +	"cannotlink-no-provider": "Nun hai cuentes enllazables.",
    +	"linkaccounts": "Enllazar cuentes",
    +	"linkaccounts-success-text": "Enllazóse la cuenta.",
    +	"linkaccounts-submit": "Enllazar cuentes",
    +	"unlinkaccounts": "Desenllazar cuentes",
    +	"unlinkaccounts-success": "Desenllazóse la cuenta."
     }
    diff --git a/languages/i18n/azb.json b/languages/i18n/azb.json
    index 10b4a94f53..58955dc3b8 100644
    --- a/languages/i18n/azb.json
    +++ b/languages/i18n/azb.json
    @@ -26,7 +26,8 @@
     	"tog-hideminor": "سوْن دییشیکلیکلرده کیچیکلری گیزلت",
     	"tog-hidepatrolled": "سوْن دییشیکلیکلرده نظارتلنمیش دَییشیکلیکلری گیزلت",
     	"tog-newpageshidepatrolled": "یوْخلانمیش صفحه‌لری یئنی صفحه‌لر لیستیندن گیزلت",
    -	"tog-extendwatchlist": "ایزله‌دیک‌لری، یالنیز یئنی‌لر اۆچون یوْخ، بۆتون دییشیک‌لیک‌لری گؤرستمک اۆچون، گنیشلندیر.",
    +	"tog-hidecategorization": "صفحه بؤلمه‌لرینی گیزلت",
    +	"tog-extendwatchlist": "ایزله‌دیک‌لری تکجه یئنی‌لر اۆچون دئییل، بۆتون دییشیک‌لیک‌لری گؤسترمک اۆچون گئنیشلندیر.",
     	"tog-usenewrc": "دَییشیک‌لیک‌لری سوْن دَییشیک‌لیک‌لر صفحه‌سینده ایزله‌دیک‌لر صفحه‌سینده قروپ‌لا (جاوااسکریپت گرک‌دیر)",
     	"tog-numberheadings": "باشلیق‌لاری اوْتوماتیک نۆمره‌له",
     	"tog-showtoolbar": "دَییشدیرمه آراج-چۇبوغونو گؤستر",
    @@ -36,6 +37,7 @@
     	"tog-watchdefault": "دَییشدیردیگیم صفحه‌‌لری و فايل‌لاری، ایزله‌دیک‌لریمه آرتیر",
     	"tog-watchmoves": "داشیدیغیم صفحه‌‌لری و فايللاری ایزله‌دیکلریمه آرتیر",
     	"tog-watchdeletion": "سیلدیگیم صفحه‌‌لری و فايللاری ایزله‌دیکلریمه آرتیر",
    +	"tog-watchuploads": "یئنی یۆکله‌دیگیم فایل‌لاری ایزله‌دیک‌لریمه آرتیر",
     	"tog-watchrollback": "قایتاریلمیش صفحه‌لری ایزله‌دیکلریمه آرتیر",
     	"tog-minordefault": "دیفالت اوْلاراق، بۆتون دَییشدیر‌مه‌لری کیچیک کیمی علامتله",
     	"tog-previewontop": "اؤن‌گؤستریشی، يازماق قۇتوسوندان قاباق گؤستر",
    @@ -50,7 +52,7 @@
     	"tog-uselivepreview": "دیری اؤن‌گؤستریش ایشلت (تِست مرحله‌سینده)",
     	"tog-forceeditsummary": "دَییشیکلیک قیساسی بوْش قالمیشسا منه بیلیندیر",
     	"tog-watchlisthideown": "منیم دَییشیک‌لیک‌لریمی ایزله‌دیک‌لردن گیزلت",
    -	"tog-watchlisthidebots": "بوْت دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
    +	"tog-watchlisthidebots": "روْبات دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
     	"tog-watchlisthideminor": "کیچیک دَییشیک‌لیک‌لری ایزله‌دیک‌لردن گیزلت",
     	"tog-watchlisthideliu": "گیریش ائتمیش ایشلدن‌لرین دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
     	"tog-watchlisthideanons": "تانینمامیش ایشلدن‌لرین دَییشیک‌لیک‌لرینی ایزله‌دیک‌لردن گیزلت",
    @@ -131,6 +133,8 @@
     	"october-date": "اوْکتوبرون $1-ی",
     	"november-date": "نوْوامبرین $1-ی",
     	"december-date": "دسامبرین $1-ی",
    +	"period-am": "صۆبح",
    +	"period-pm": "آخشام",
     	"pagecategories": "{{PLURAL:$1|بؤلمه|بؤلمه‌لر}}",
     	"category_header": "«$1» بؤلمه‌سینده صفحه‌لر",
     	"subcategories": "آلت‌بؤلمه‌لر",
    @@ -156,7 +160,7 @@
     	"morenotlisted": "بۇ لیست کامل دئییل.",
     	"mypage": "صفحه",
     	"mytalk": "دانیشیق",
    -	"anontalk": "بو آی‌پی آدرسینه دانیشیق",
    +	"anontalk": "دانیشیق",
     	"navigation": "دوْلانماق",
     	"and": "&#32;و",
     	"qbfind": "تاپ",
    @@ -219,7 +223,7 @@
     	"viewhelppage": "یاردیم صحیفه‌سینه باخ",
     	"categorypage": "بؤلمه صحیفه‌‌سینه باخ",
     	"viewtalkpage": "دانیشیغا باخ",
    -	"otherlanguages": "باشقا دیل‌لرده",
    +	"otherlanguages": "آیری دیل‌لرده",
     	"redirectedfrom": "($1-دن يوْل‌لاندیریلمیش)",
     	"redirectpagesub": "یوْللاندیرما صفحه‌سی",
     	"redirectto": "مسیزپرین دَییشیب:",
    @@ -290,7 +294,7 @@
     	"site-atom-feed": "$1 آتوم فید",
     	"page-rss-feed": "«$1» آراِس‌اِس فید",
     	"page-atom-feed": "«$1» آتوم فید",
    -	"red-link-title": "$1 (صفحه یوْخ‌دور)",
    +	"red-link-title": "$1 (صفحه یوْخدور)",
     	"sort-descending": "آزالان سیرالاماق",
     	"sort-ascending": "چوْخالان سیرالاماق",
     	"nstab-main": "صفحه",
    @@ -379,9 +383,11 @@
     	"virus-scanfailed": "یوخلاماق باشا چاتمادی (کود $1)",
     	"virus-unknownscanner": "تانینمامیش آنتی‌ویروس:",
     	"logouttext": "<strong>سیز ایندی سیستِم‌دن چیخدینیز.</strong>\n\nبونا دیقت ائدین کی وب حافیظه نیزی سیلمه ین،بعضی صحیفه‌لر کَش-ینیزی سیلمه‌میش کیمی، هله ده سیزین گیریش ائتدیگینیز کیمی گؤستریله‌جکلر.",
    +	"cannotlogoutnow-title": "ایندی چیخیش اوْلونمازدیر",
    +	"cannotlogoutnow-text": "$1-ی ایشلدرکن چیخیش اوْلونمازدیر.",
     	"welcomeuser": "خوش گلمیسینیز، $1!",
     	"welcomecreation-msg": "حسابینیز آچیلدی.\n[[Special:Preferences|{{SITENAME}}ترجیحلر]] دییشدیرمیی اونوتمایین.",
    -	"yourname": "ایستیفاده‌چی آدی:",
    +	"yourname": "ایشلدن آدی:",
     	"userlogin-yourname": "ایشلدن آدی",
     	"userlogin-yourname-ph": "ایشلدن آدینیزی یازین",
     	"createacct-another-username-ph": "ایشلدن آدینیزی یازین",
    @@ -395,10 +401,13 @@
     	"remembermypassword": "بو بیلگی‌سایاردا منیم گیریشیمی (چوخو $1 {{PLURAL:$1|گون}}ه قدر) یاددا ساخلا",
     	"userlogin-remembermypassword": "منی ایچری‌ده ساخلا",
     	"userlogin-signwithsecure": "آرخایین باغلانتی ایشلدین",
    +	"cannotloginnow-title": "ایندی گیریش اوْلونمازدیر",
    +	"cannotloginnow-text": "$1-ی ایشلدرکن گیریش اوْلونمازدیر",
     	"yourdomainname": "سیزین دامنه:",
     	"password-change-forbidden": "بو ویکی‌ده رمزلری دَییشه بیلنمه‌سینیز.",
     	"externaldberror": "بیر دیتابیس دوغرولاما خطاسی اولدو، یوخسا سیزین ائشیک حسابینیزی گونجل‌لدمگه ایجازه‌نیز یوخدور.",
     	"login": "گیریش",
    +	"login-security": "کیملیگینیزی تائید ائدین",
     	"nav-login-createaccount": "گیریش / حساب یارات",
     	"userlogin": "گیریش / حساب یارات",
     	"userloginnocreate": "گیریش",
    @@ -416,6 +425,7 @@
     	"userlogin-resetpassword-link": "رمزینیزی اونوتموسوز مو؟",
     	"userlogin-helplink2": "گیریش ایله کؤمک",
     	"userlogin-loggedin": "سیر حال حاضیردا {{GENDER:$1|$1}} عونوانیندا گیریش ائدیب سیز.\nآشاغیداکی فورمودان بیر آیری ایشلدن عونوانیندا گیریش اوچون ایشلدین.",
    +	"userlogin-reauth": "{{GENDER:$1|$1}} اوْلدوغونوزو تأیید ائتمک اۆچون یئنه گیرمه‌لیسینیز.",
     	"userlogin-createanother": "بیر باشقا حساب یارات",
     	"createacct-emailrequired": "ایمیل آدرسی",
     	"createacct-emailoptional": "ایمیل آدرسی (ایستگه باغلی)",
    @@ -428,6 +438,7 @@
     	"createacct-reason-ph": "ندن سیز باشقا حساب یارادیرسینیز",
     	"createacct-submit": "حسابینیزی یارادین",
     	"createacct-another-submit": "حساب یارات",
    +	"createacct-continue-submit": "حساب یاراتماغین دالی‌سینی توت",
     	"createacct-benefit-heading": "{{SITENAME}} سیزین کیمی آدام‌لارین الی ایله یارانیب‌دیر.",
     	"createacct-benefit-body1": "{{PLURAL:$1|دَییشیکلیک}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
    @@ -441,13 +452,13 @@
     	"nocookieslogin": "{{SITENAME}} ایشلدنلری گیردیرمک اوچون، کوکی‌لری ایشلدیر.\nسیزین کوکی‌لریز باغلانیب‌دیر.\nلوطفا اونلاری آچین و یئنی‌دن چالیشین.",
     	"nocookiesfornew": "قایناغینی دوغرو اولدوغونو بیلمه‌مک اوچون، ایشلدن حسابی یارادیلمادی.\nکوکی‌لرینیزین آچیق اولدوغون دان آرخایین اولوب، بو یارپاغی یئنی‌دن یوکله‌ییب، یئنی‌دن چالیشین.",
     	"noname": "گئچرلی ایستیفاده‌چی آدی وئرمه‌دینیز.",
    -	"loginsuccesstitle": "گیریش اوغورلو",
    +	"loginsuccesstitle": "گیریلدینیز",
     	"loginsuccess": "'''سیز ایندی {{SITENAME}} سایتینا، «$1» آدی‌له گیرمیسینیز.'''",
     	"nosuchuser": "«$1» آدلا ایستیفاده‌چی یوخدور.\nایستیفاده‌چی آدلاری، حرفلرین بؤیوک/کیچیک‌لیگینه حساس‌دیلار.\nیازدیغینیزا یئنی‌دن باخین، یوخسا [[Special:CreateAccount|یئنی بیر حساب آچین]].",
     	"nosuchusershort": "\"$1\" آدلا ایستیفاده‌چی یوخدور.\nدوزگون یازدیغینیزدان آرخایین اولون.",
     	"nouserspecified": "بیر ایستیفاده‌چی آدی وئرمه‌لیسینیز.",
     	"login-userblocked": "بو ایستیفاده چی باغلانیب‌دیر. گیریشه ایجازه یوخدور.",
    -	"wrongpassword": "یانلیش رمز وئریلدی.\nیئنی‌دن یازین.",
    +	"wrongpassword": "غلط رمز وئریلدی.\nیئنی‌دن یازین.",
     	"wrongpasswordempty": "بوش رمز وئردینیز.\nیئنی‌دن یازین.",
     	"passwordtooshort": "رمز، آزی {{PLURAL:$1|بیر|$1}} کاراکتئر اولمالی‌دیر.",
     	"passwordtoolong": "رمز،سوزو چوخلوغو {{PLURAL:$1|۱ سوز|$1 سوز}} کاراکتئر اولمامالی‌دیر.",
    @@ -459,7 +470,7 @@
     	"noemail": "«$1» ایستیفاده‌چی‌یه ایمیل آدرسی قئید اولماییب‌دیر.",
     	"noemailcreate": "دوزگون بیر ایمیل آدرسی وئرمه‌لیسینیز",
     	"passwordsent": "«$1»-نا قئید اولونان ایمیل آدرسینه، یئنی بیر رمز گؤندریلدی.\nاونا آلان‌دان سونرا یئنی‌دن گیرین.",
    -	"blocked-mailpassword": "سیزین آی‌پی آدرسینیزین دییشدیرمه ائده بیلمه‌سی باغلانمیشدیر. سوءایستیفاده قارشی‌سینی آلماق اۆچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوْخدور.",
    +	"blocked-mailpassword": "سیزین آی‌پی آدرسینیزین دییشدیرمه ائده بیلمه‌سی باغلانمیشدیر. سوءایستیفاده قاباغینی آلماق اۆچون، رمزی یئنی‌دن اله گتیرمک ایمکانینا ایجازه‌نیز یوْخدور.",
     	"eauthentsent": "سیزین سئچیلمیش ایمیل آدرسینه، دوغرولاماق اوچون بیر ایمیل گؤندریلدی.\nهر یئنی بیر ایمیل گؤندرمک‌دن اؤنجه، بو حسابین دوغرودان سیزین اولدوغونو گؤسترمک اوچون، او ایمیل‌ده‌کی ایشلری گؤرمه‌لیسینیز.",
     	"throttled-mailpassword": "سون {{PLURAL:$1|ساعات|$1 ساعات}}‌دا سیزه بیر رمز یئنیله‌مه ایمیلی گؤندریلیب‌دیر.\nسوءاستفاده قاباغین آلماق اوچون، هر {{PLURAL:$1|ساعات|$1 ساعات}}‌دا یالنیز بیر رمز یئنیله‌مه ایمیلی گؤندریلر.",
     	"mailerror": "ایمیل گؤندرمه خطاسی: $1",
    @@ -483,6 +494,7 @@
     	"createacct-another-realname-tip": "اصلی آد ایستگینیزه باغلی‌دیر.\nاگر اونو وئرماغی سئچسز، سیزین ایشلرینیزی سیزه مونتسب ائدن‌ده، بو اصلی آد ایشلنه‌جک‌دیر.",
     	"pt-login": "گیریش ائت",
     	"pt-login-button": "گیریش ائت",
    +	"pt-login-continue-button": "گیریشین دالینی توت",
     	"pt-createaccount": "حساب یارات",
     	"pt-userlogout": "چیخیش",
     	"php-mail-error-unknown": "پی‌اچ‌پی‌نین mail() فونکسیاسیندا تانینمامیش خطا.",
    @@ -497,9 +509,15 @@
     	"resetpass_submit": "رمز یارادین و گیریش ائدین",
     	"changepassword-success": "رمزینیز باجارییلا دَییشدیرلدی!",
     	"changepassword-throttled": "سیزین چوخ گیریش چالیشماغینیز اولوب‌دور.\nلوطفاً یئنی‌دن چالیشماق‌دان اؤنجه $1 دؤزون.",
    +	"botpasswords": "روبات رمزی",
    +	"botpasswords-createnew": "روبات رمزی یارات",
    +	"botpasswords-label-appid": "روبات آدی:",
     	"botpasswords-label-create": "یارات",
    +	"botpasswords-label-update": "آپدیت ائت",
     	"botpasswords-label-cancel": "وازگئچ",
     	"botpasswords-label-delete": "سیل",
    +	"botpasswords-label-resetpassword": "رمزی یئنی‌له",
    +	"botpasswords-label-grants-column": "وئریلدی",
     	"resetpass_forbidden": "رمزلر دَییشیلمز",
     	"resetpass-no-info": "بو صحیفه‌نی دوغرو گؤردوگونوز اوچون سیستمه گیرمه‌لیسینیز.",
     	"resetpass-submit-loggedin": "رمزی دَییشدیر",
    @@ -511,7 +529,7 @@
     	"resetpass-abort-generic": "رمز دَییشدیرمک، بیر اوزانتی ایله یاریدا کسیلیب‌دیر.",
     	"resetpass-expired": "گیریش رمزینیز بایات اولوب.لطفا گیریشینیز اوچون یئنی بیر گیریش رمزی سئچین.",
     	"resetpass-expired-soft": "گیریش رمزینیز بایات اولوب و یئنی دن تنظیم اولونمالی دیر. لوطفا ایندی بیر یئنی رمز سئچیب یا دا یئنی دن تنظیم ائتمک اوچون سونرالیقدا\"{{int:authprovider-resetpass-skip-label}}\" دویمه سین باسین.",
    -	"resetpass-validity-soft": "گیریش رمزینیز دوز دئیییل:$1\nلوطفا ایندی بیر یئنی گیریش رمزی سئچین یا دا\"{{int:authprovider-resetpass-skip-label}}\" باسین کی سونرا اونو یئنی دن سئچرسیز.",
    +	"resetpass-validity-soft": "گیریش رمزینیز دۆز دئییل:$1\nلۆطفاً ایندی یئنی بیر گیریش رمزی سئچین یا دا داها سوْنرا اوْنو یئنیدن سئچمه‌نیز اۆچون \"{{int:authprovider-resetpass-skip-label}}\" اۆستونده کیلیک ائدین.",
     	"passwordreset": "رمزی یئنی‌له",
     	"passwordreset-text-one": "رمزینیزی صیفیرلاماق اوچون بو فورمو باشا چاتدیرین.",
     	"passwordreset-text-many": "{{PLURAL:$1|رمزینیزی صیفیرلاماق اوچون، بیرینی دولدورون.}}",
    @@ -567,12 +585,14 @@
     	"minoredit": "بو بیر کیچیک دَییشدیرمه‌دیر",
     	"watchthis": "بو صفحه‌نی ایزله",
     	"savearticle": "صفحه‌نی ذخیره ائت",
    +	"savechanges": "دَییشیکلیکلری ذخیره ائت",
    +	"publishchanges": "دَییشیکلیکلری یای",
     	"preview": "اؤن‌گؤستریش",
     	"showpreview": "سیناق گؤستریش",
     	"showdiff": "دَییشیکلیکلری گؤستر",
     	"blankarticle": "<strong>دیققت:</strong>سیز بیر بوش صفحه نین یاراتماق حالیندا سیز .\nایر«{{int:savearticle}}» بیر ده باسایلا،بوش صفحه یاراناجاق.",
    -	"anoneditwarning": "<strong>دیقت:</strong> سیز سیستئمه گیرمه‌میسینیز. سیزین آی‌پی آدرسینیز بو صفحه‌نین دییشیک تاریخچه‌سین‌ده یازیلب و گورسنجک.هر دَییشدیرمه ائتسز.<strong>[$1 گیریش ائتسز]</strong> یا <strong>[$2 بیر ایشلدن حسابی آچاسیز]</strong>, دَییشدیرمه لرینیز سیزین ایشلدن حساب آدینیزا نیسبت وئریلجک و آرتیق مزیت لرله.",
    -	"anonpreviewwarning": "''سیستمه گیرمه‌میسینیز. قئید ائتمک‌له، سیزین آی‌پی آدرسینیز بو صحیفه‌نین گئچمیشین‌ده ثبت اولوناجاقدیر.''",
    +	"anoneditwarning": "<strong>دیقت:</strong> سیز سیستمه گیرمه‌میسینیز. سیزین آی‌پی آدرسینیز بۇ صفحه‌نین دییشیک گئچمیشینده یازیلب و گؤروشه‌جک.هر دَییشدیرمه ائتسز.<strong>[$1 گیریش ائتسز]</strong> یا <strong>[$2 بیر ایشلدن حسابی آچاسیز]</strong>, دَییشدیرمه‌لرینیز سیزین ایشلدن حساب آدینیزا نیسبت وئریله‌جک و آرتیق مزیتلرله.",
    +	"anonpreviewwarning": "<em> سیستمه گیرمه‌میسینیز. ذخیره ائتمک‌له، سیزین آی‌پی آدرسینیز بو صفحه‌نین گئچمیشینده ثبت اولوناجاقدیر.</em>",
     	"missingsummary": "'''یادا سالما:''' سیز بیر دَییشیکلیک قیساسی یازمامیسینیز. «{{int:savearticle}}» دویمه‌سینی تیک‌لاسازسا، دَییشیکلیگینیز، قیسا شرح‌سیز اولاراق قئید اولوناجاق.",
     	"selfredirect": "<strong>دیققت:</strong>سیز صفحه نین یولون اوزونه دَییشدیریمک حالیندا سیز.\nایمکانی وار یانلیش سون بیر یئری یولون دَییشمک اوچون سئچیب سیز،یا دا صفحه نی یانلیش دَییشدیرسیز.\nایر\"{{int:savearticle}}\" اوستون یئنی دن باساسینیز یولون دَییشیکلیگی دوزلجک.",
     	"missingcommenttext": "لوطفاً آشاغی‌دا بیر یوروم یازین.",
    @@ -594,7 +614,7 @@
     	"accmailtitle": "رمز گؤندریلدی",
     	"accmailtext": "[[User talk:$1|$1]] اوچون بیر راست‌گله رمز یارادیلیب و $2-ه گؤندریلدی.\n\nبو یئنی حسابین رمزی، گیرندن سونرا <em>[[Special:ChangePassword|رمز دَییشدیرمه]]</em> صحیفه‌سیندن دَییشیله بیلر.",
     	"newarticle": "(یئنی)",
    -	"newarticletext": "مؤوجود اوْلمايان صحیفه‌‌يه اوْلان کئچیدی ایزله‌دینیز. \nآشاغیداکی ساحه‌‌يه مظمونونو يازاراق بۇ صحیفه‌‌نی '''سیز''' يارادا بیلرسینیز. (علاوه‌‌ معلومات اۆچون [$1 کؤمک صحیفه‌‌سینه] باخین). اگر بۇ صحیفه‌‌يه سهون گلمیسینیزسه ساده‌جه اوْلاراق براوزئرین '''گئری''' دۆيمه‌سینه وۇرون.",
    +	"newarticletext": "مووجود اوْلمايان صفحه‌‌يه اوْلان لینکی ایزله‌دینیز. \nآشاغیداکی یئره یازیلارینیزی يازیب، بۇ صفحه‌‌نی '''سیز''' يارادا بیلرسینیز. (آرتیق معلومات اۆچون [$1 کؤمک صفحه‌‌سینه] باخین). اگر بۇ صفحه‌‌يه ایشتباه گلمیسینیزسه تکجه براوزرین '''قایید''' دۆيمه‌سینه وۇرون.",
     	"anontalkpagetext": "''بو صحیفه قئیدیات‌دان کئچممیش و یا داخیل اولمامیش آنونیم ایستیفادچییه عایید موذاکیره صحیفه‌سی‌دیر.\nاونا گؤره بو ایستیفادچینی رقم‌لردن عبارت ایپ اونوانی ایله معین ائتمک مجبوریتیندییک.\nبئله ایپ اونوان بیر نئچه فرد طرفین‌دن ایستیفاده‌ده اولا بیلر.\nاگر سیز آنونیم ایستیفادچیسینیزسه و بو مئساژین سیزه عایید اولمادیغینی دوشونورسونوزسه، اوندا  [[Special:CreateAccount|قئیدیات‌دان کئچین]] و یا [[Special:UserLogin|داخی اولون]].''",
     	"noarticletext": "ایندی بو صفحه‌ده یازی یوخدور.\nسیز آیری صفحه‌‌لرده [[Special:Search/{{PAGENAME}}|بو باشلیق اوچون آختارا بیلرسیز]]،\nیا دا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باغلی قئیدلری آختارا بیلرسیز]،\nیا دا [{{fullurl:{{FULLPAGENAME}}|action=edit}} بو صفحه‌نی دَییشدیره بیلرسیز]</span>.",
     	"noarticletext-nopermission": "بو صحیفه‌‌ ایندی بوشدور. \nباشقا صحیفه‌‌لرده عینی آددا صحیفه‌‌نی  [[Special:Search/{{PAGENAME}}| آختار]], علاقه‌‌لی قئيدلره \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} باخا],\nو يا صحیفه‌‌نی  [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktə]</span> ائده بیلرسینیز.",
    @@ -660,7 +680,7 @@
     	"edit-no-change": "سیزین دییشدیر قئیده آلینمامیش‌دیر. بئله کی، متنده هئچ بیر دییشدیر ائدیلممیش‌دیر.",
     	"postedit-confirmation-created": "بۇ صفحه یارانیب‌دیر.",
     	"postedit-confirmation-restored": "صفحه گئری یوکلندی.",
    -	"postedit-confirmation-saved": "سیزین دَییشدیرمه‌نیز قئید اولونوب‌دور.",
    +	"postedit-confirmation-saved": "سیزین دَییشدیرمه‌نیز ذخیره اولدو.",
     	"edit-already-exists": "یئنی صحیفنی یاراتماق مومکون دئییل.\nبئله کی، بو آددا صحیفه آرتیق مؤوجوددور.",
     	"defaultmessagetext": "دفالت دانیشیق متنی",
     	"content-failed-to-parse": "تجزیه محتوای $2  مدل اوچون $1: $3 موفقیت اله گلمه دی",
    @@ -816,11 +836,11 @@
     	"mergehistory-comment": "[[:$1]]، [[:$2]] ایله بیرلشدیریلدی: $3",
     	"mergehistory-same-destination": "قایناق و مقصد صحیفه‌لر، بیر اولانمازلار",
     	"mergehistory-reason": "ندن",
    -	"mergelog": "بیرلشدیرمه سیاهی‌سی",
    +	"mergelog": "بیرلشدیرمه ژورنالی",
     	"revertmerge": "آيیر",
    -	"mergelogpagetext": "آشاغدی‌دا، ان سون صحیفه بیرلشدیریلمه‌لری گؤستریلیر.",
    +	"mergelogpagetext": "آشاغیدا، ان سون صفحه گئچمیشلری بیرلشدیریلمه‌لری سیرالانیر.",
     	"history-title": "«$1»-ین گئچمیشی",
    -	"difference-title": "«$1» نوسخه‌لرینین آراسینداکی فرقلری",
    +	"difference-title": "«$1» نوسخه‌لری‌نین آراسینداکی فرقلری",
     	"difference-title-multipage": "«$1» و «$2» صحیفه‌لرین آراسینداکی فرقلر",
     	"difference-multipage": "(صفحه‌لر آراسینداکی فرق‌لر)",
     	"lineno": "خط $1:",
    @@ -832,14 +852,14 @@
     	"diff-multi-otherusers": "({{PLURAL:$1|۱ میانی نوسخه لر|$1 میانی نوسخه لر}} دَییک اولونموش {{PLURAL:$2|۱ ایشلدچی|$2 ایشلدچی}}طرفیندن گوستریلمیر)",
     	"diff-multi-manyusers": "{{PLURAL:$2|بیر|$2}}-دن چوخ ایستیفاده‌چی یارادان {{PLURAL:$1|بیر|$1}} نوسخه، گؤستریلمه‌ییب‌دیر",
     	"difference-missing-revision": "بو فرقین ($1) {{PLURAL:$2|بیر|$2}} نوسخه‌سی تاپیلانمادی.\n\nعموماً بو خطا، سیلینن بیر صحیفه‌یه واختی گئچمیش بیر فرق باغلانتی‌سیلا گلمک ایله آرا گلر.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}}سیلمک سیاهی‌سی]ندا باشقا بیلگیلر اولا بیلر.",
    -	"searchresults": "آختاریش سونوجلاری",
    -	"searchresults-title": "«$1» اوچون آختاریش سونوجلاری",
    +	"searchresults": "آختاریش نتیجه‌لری",
    +	"searchresults-title": "«$1» اوچون آختاریش نتیجه‌لری",
     	"titlematches": "صحیفه‌‌ آدی عینیدیر",
     	"textmatches": "یازی عینی‌دیر",
     	"notextmatches": "هئچ بیر بنزر صحیفه یازی‌سی تاپیلمادی",
    -	"prevn": "اؤنجه‌کی {{PLURAL:$1|$1}}",
    +	"prevn": "قاباقکی {{PLURAL:$1|$1}}",
     	"nextn": "سونراکی {{PLURAL:$1|$1}}",
    -	"prev-page": "قاباغکی صحیفه",
    +	"prev-page": "قاباقکی صفحه",
     	"next-page": "سونراکی صفحه",
     	"prevn-title": "قاباقکی {{PLURAL:$1|بیر|$1}} نتیجه",
     	"nextn-title": "سونراکی {{PLURAL:$1|بیر|$1}} سونوج",
    @@ -884,13 +904,13 @@
     	"preferences": "ترجیحلر",
     	"mypreferences": "ترجیحلر",
     	"prefs-edits": "دَییشمه‌لرین سایی:",
    -	"prefsnologintext2": "خواهیش اولونور تنظیملرینیزی دَییشمک اوچون گیریش ائدین.",
    +	"prefsnologintext2": "لوطفا تنظیملرینیزی دَییشمک اوچون گیریش ائدین.",
     	"prefs-skin": "قابیق",
     	"skin-preview": "اؤن‌گؤستریش",
     	"datedefault": "سئچیم‌سیز",
    -	"prefs-labs": "آزماییشی اؤزل‌لیکلر",
    +	"prefs-labs": "تست خۆصۇصیتلر",
     	"prefs-user-pages": "ایستیفاده‌چی صحیفه‌لری",
    -	"prefs-personal": "ایشلدن وئری‌لری",
    +	"prefs-personal": "ایشلدن پروفایلی",
     	"prefs-rc": "سوْن دَییشیکلیکلر",
     	"prefs-watchlist": "ایزله‌دیکلر",
     	"prefs-editwatchlist": "ایزله‌دیکلریم صفحه‌‌لری دَییشدیر",
    @@ -898,9 +918,9 @@
     	"prefs-editwatchlist-edit": "ایزلدیکلرینیزدن گورمک هابئله باشلیق لارین سیلمک",
     	"prefs-editwatchlist-raw": "ایزله‌دیگیم خام لیستی دَییشدیر",
     	"prefs-editwatchlist-clear": "ایزله دیگیم لیستی سیلمک",
    -	"prefs-watchlist-days": "ایزله‌دیک‌لریمده گؤرسدیلن گۆن‌لر",
    +	"prefs-watchlist-days": "ایزله‌دیک‌لریمده گؤستریلن گۆنلر:",
     	"prefs-watchlist-days-max": "چوخو {{PLURAL:$1|بیر|$1}} گون",
    -	"prefs-watchlist-edits": "گنیشلنمیش ایزله‌ دیک لرده گؤرسدیلن دَییشیک‌لیک‌لرین چوْخو:",
    +	"prefs-watchlist-edits": "گئنیشلنمیش ایزله‌‌دیک‌لرده گؤستریلن دَییشیک‌لیک‌لرین ان چوْخو:",
     	"prefs-watchlist-edits-max": "چوخ سایی: ۱۰۰۰",
     	"prefs-watchlist-token": "ایزله‌دیک‌لر آدرسی:",
     	"prefs-misc": "باشقا",
    @@ -916,8 +936,9 @@
     	"columns": "سوتون‌لار",
     	"searchresultshead": "آختار",
     	"stub-threshold": "<a href=\"#\" class=\"stub\">باغلانتی‌سیز لینکی</a> دییشدیرمک اوچون حدود (بایت‌لارلا):",
    +	"stub-threshold-sample-link": "میثال",
     	"stub-threshold-disabled": "چالیشمایان",
    -	"recentchangesdays": "سوْن دییشیک‌‌لرده گؤرسدیلن گۆن‌لر:",
    +	"recentchangesdays": "سوْن دییشیک‌‌لرده گؤستریلن گۆنلر:",
     	"recentchangesdays-max": "ماکسیموم $1 {{PLURAL:$1|گون |گون}}",
     	"recentchangescount": "سوْن ديَیشیک‌لیک‌لرده باشلیق سايی:",
     	"prefs-help-recentchangescount": "بورایا یئنی دییشیک‌لیک‌لر، صحیفه‌لرین و ژورنال‌لارین تاریخچه‌سی داخیل‌دیر.",
    @@ -939,7 +960,7 @@
     	"timezoneregion-europe": "اوروپا",
     	"timezoneregion-indian": "هیند اوقیانوسو",
     	"timezoneregion-pacific": "بؤیوک اوقیانوس",
    -	"allowemail": "باشقا ایشلدن‌لردن ایمیل آلماغی آچ",
    +	"allowemail": "آیری ایشلدنلردن ایمئیل آلماغی آچ",
     	"prefs-searchoptions": "آختار",
     	"prefs-namespaces": "آدلار فضاسی:",
     	"default": "فرض ائدیلن",
    @@ -958,21 +979,21 @@
     	"yourvariant": "دیل واریانتی:",
     	"prefs-help-variant": "بو ویکی‌نین ایچینده‌کیلری‌نین گؤستریلدیگی اوچون سئچدیگینیز واریانت یوخسا اورتوقرافی.",
     	"yournick": "یئنی ایمضا:",
    -	"prefs-help-signature": "دانیشیق صحیفه‌لرینده یاخیشلار گرک «<nowiki>~~~~</nowiki>» ایله ایمضالانالار. بو نیشان اوتوماتیک‌جه سیزین آدینیز و تاریخه دؤنه‌جک‌دیر.",
    +	"prefs-help-signature": "دانیشیق صفحه‌لرینده یازیلان باخیشلار گرک «<nowiki>~~~~</nowiki>» ایله ایمضالانا. بۇ علامت اوتوماتیک‌ شیکلده سیزین آدینیزلا تاریخه دؤنه‌جکدیر.",
     	"badsig": "یانلیش خام ایمضا.\nاچ‌تی‌ام‌ال تگ‌لرینی یوخلایین.",
     	"badsiglength": "ایمضانیز چوخ اوزون‌دور.\nاو گرک {{PLURAL:$1|بیر|$1}} حرف‌دن اوزون اولمایا.",
     	"yourgender": "ترجیح وئریرسینیز نئجه توصیف اولونسون؟",
     	"gender-unknown": "ترجیح وئریرم بیلیندیرمییم",
     	"gender-male": "کیشی",
    -	"gender-female": "خانیم",
    -	"prefs-help-gender": "بو ترجیح ایستگه باغلی‌دیر.\nبونون میقداری، سیزی باشقالارا دوزگون آدرس وئرمک اوچون ایشلنه‌جکدیر.\nبو بیلگی، عمومی اولاجاق‌دیر.",
    +	"gender-female": "قادین",
    +	"prefs-help-gender": "بو ترجیح ایستگه باغلی‌دیر.\nبونون میقداری، سیزی آیریلارلا دوزگون آدرس وئرمک اوچون ایشلنه‌جکدیر.\nبو ایطلاعات، عمومی اولاجاق‌دیر.",
     	"email": "ایمیل",
     	"prefs-help-realname": "اصلی آد ایختیاری دیر.\nاگر اونو وئرماغی سئچسز، سیزین ایشلرینیزی سیزه مونتسب ائدن‌ده، بو اصلی آد ایشلنه‌جک‌دیر.",
     	"prefs-help-email": "ایمیل آدرسی ایستگه باغلی‌دیر، آنجاق رمزینیزی اونوتدوغونوز واخت، سیزه يئنی رمز گؤندرمگه گرکلی‌دیر.",
     	"prefs-help-email-others": "سیز هم‌ده آیری ایستیفاده‌چیلره ایجازه وئره بیلرسیز، سیزین ایستیفاده‌چی یا دانیشیق صحیفه‌نیزده بیر باغلانتی ایله، سیزله ایلگی قورسونلار.\nآیری ایستیفاده‌چیلر سیزینله ایلگی قوراندا، سیزین ایمیل آدرسیز گؤستریلمه‌یه‌جک‌دیر.",
     	"prefs-help-email-required": "ایمیل آدرس گرکلی‌دیر.",
     	"prefs-info": "کؤک بیلگی‌لر",
    -	"prefs-i18n": "اولوسلارآراسی‌لاشدیرما",
    +	"prefs-i18n": "میلتلرآراسیلاشدیرماق",
     	"prefs-signature": "ایمضا",
     	"prefs-dateformat": "تاریخ فورمتی",
     	"prefs-timeoffset": "چاغ بؤلگه‌سینین فرقی",
    @@ -1009,7 +1030,7 @@
     	"userrights-unchangeable-col": "ديَیشدیره بیلمه‌دیگینیز قروپلار",
     	"userrights-conflict": "ایستیفاده‌چی حاقلاری توققوشماسی! لوطفاً گوزله ین و دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.",
     	"userrights-removed-self": "سیز باشاریلیق‌لا اؤز حاق‌لارینیزی قالدیردینیز. اونا گؤره داها بو صحیفه‌یه یول تاپماغا قادیر دئییل‌سینیز.",
    -	"group": "قروپ:",
    +	"group": "گروه:",
     	"group-user": "ایستفاده‌چیلر",
     	"group-autoconfirmed": "اوتوماتیک دوغرولانمیش ایستیفاده‌چیلر",
     	"group-bot": "بوتلار",
    @@ -1099,10 +1120,11 @@
     	"right-override-export-depth": "ایچری باغلانتیلاری اولان صحیفه‌لری، چوخو ۵ درجه درینلیگی ایله، ایخراج ائت",
     	"right-sendemail": "باشقا ایستیفاده‌چیلره ایمیل گؤندر",
     	"right-passwordreset": "رمز یئنی‌له‌مه ایمیل‌لرینه باخ",
    -	"newuserlogpage": "ایشلدن یارادیلما قئیدی",
    +	"grant-group-email": "ایمئیل گؤندر",
    +	"newuserlogpage": "ایشلدن یارادیلما ژورنالی",
     	"newuserlogpagetext": "بۇ ایشلدن یارادماق لیستی‌دیر.",
    -	"rightslog": "ایستیفاده‌چی حاقلاری سیاهی‌سی",
    -	"rightslogtext": "بو، ایستیفاده‌چی حاقلارینا اولان دَییشیکلیکلر سیاهی‌سی‌دیر.",
    +	"rightslog": "ایشلدن حاقلاری ژورنالی",
    +	"rightslogtext": "بو، ایشلدن حاقلارینا اولان دَییشیکلیکلر ژورنالیدیر.",
     	"action-read": "بو صحیفه‌نی اوخو",
     	"action-edit": "بو صحیفه‌نی دَییشدیر",
     	"action-createpage": "صفحه یارات",
    @@ -1151,11 +1173,11 @@
     	"recentchanges": "سوْن دَییشیکلیکلر",
     	"recentchanges-legend": "سون دَییشیکلیکلر سئچمه‌لری",
     	"recentchanges-summary": "بۇ صفحه‌ده، بۇ ویکیده وئریلن ان سوْن دَییشیکلیکلری ایزله‌یین.",
    -	"recentchanges-noresult": "وئریلمیش دؤنم‌ده، بو معیارلارا تطبیق اولان دَییشدیرمه یوخدور.",
    +	"recentchanges-noresult": "وئریلمیش مودتده، بو معیارلارا تطبیق اولان دَییشدیرمه یوخدور.",
     	"recentchanges-feed-description": "ویکی‌ده‌کی ان سون ديَیشیکلیک‌لری بو يايیم کانالیندان ایزله‌يین.",
     	"recentchanges-label-newpage": "بو دییشیک یئنی بیر صفحه یاراتدی",
     	"recentchanges-label-minor": "بو بیر کیچیک دَییشدیرمه‌دیر",
    -	"recentchanges-label-bot": "بو دییشیک بیر بوت طرفیندن ائدیلیب‌دیر",
    +	"recentchanges-label-bot": "بۇ دَییشیک بیر روْبات طرفیندن ائدیلیب‌دیر",
     	"recentchanges-label-unpatrolled": "بو دییشیکلیک هله گؤزدن گئچیریلمه‌ییب‌دیر",
     	"recentchanges-label-plusminus": "صفحه‌نین اؤلچوسو بایت میقداری ایله تعیین ائدیلیر",
     	"recentchanges-legend-heading": "<strong>قیسالتمالار:</strong>",
    @@ -1165,7 +1187,7 @@
     	"rcshowhideminor": "کیچیک دَییشیکلری $1",
     	"rcshowhideminor-show": "گؤستر",
     	"rcshowhideminor-hide": "گیزلت",
    -	"rcshowhidebots": "بوتلاری $1",
    +	"rcshowhidebots": "روباتلاری $1",
     	"rcshowhidebots-show": "گؤستر",
     	"rcshowhidebots-hide": "گیزلت",
     	"rcshowhideliu": "یازیلمیش ایشلدنلری $1",
    @@ -1180,6 +1202,7 @@
     	"rcshowhidemine": "منیم دَییشیکلریمی $1",
     	"rcshowhidemine-show": "گؤستر",
     	"rcshowhidemine-hide": "گیزلت",
    +	"rcshowhidecategorization": "صفحه‌لر بؤلمه‌لندیرمه‌سی $1",
     	"rcshowhidecategorization-hide": "گیزلت",
     	"rclinks": "سون $2 گون عرضینده‌کی سون  $1 ديَیشیکلیگی گؤستر <br />$3",
     	"diff": "فرق",
    @@ -1192,15 +1215,15 @@
     	"number_of_watching_users_pageview": "[{{PLURAL:$1|بیر|$1}} ایزله‌ین ایستیفاده‌چی]",
     	"rc_categories": "بؤلمه‌لره محدودلاشدیر («|» ایله آییر)",
     	"rc_categories_any": "سئچیلمیشلرین هر بیریسی",
    -	"rc-change-size-new": "دَییشیکلیک‌دن سونرا {{PLURAL:|بیر|$1}} بایت",
    +	"rc-change-size-new": "دَییشیکلیک‌دن سوْنرا {{PLURAL:|بیر|$1}} بایت",
     	"newsectionsummary": "/* $1 */ یئنی بؤلمه",
     	"rc-enhanced-expand": "تفصیل‌لری گؤستر",
     	"rc-enhanced-hide": "تفصیل‌لری گیزلت",
     	"rc-old-title": "ایلک‌جه «$1» آدی‌له یارانمیشدیر",
    -	"recentchangeslinked": "باغلی دَییشیکلیکلر",
    -	"recentchangeslinked-feed": "باغلی دَییشیکلیکلر",
    -	"recentchangeslinked-toolbox": "باغلی دَییشیکلیکلر",
    -	"recentchangeslinked-title": "''$1'' ایله ایلگی‌لی دییشیکلر",
    +	"recentchangeslinked": "باغلی دَییشیکلیک‌لر",
    +	"recentchangeslinked-feed": "باغلی دَییشیکلیک‌لر",
    +	"recentchangeslinked-toolbox": "باغلی دَییشیکلیک‌لر",
    +	"recentchangeslinked-title": "''$1'' ایله باغلی دییشیکلر",
     	"recentchangeslinked-summary": "آشاغیداکی سیياهی، قئيد اوْلونان صحیفه‌‌يه (و يا قئيد اوْلونان کاتئقوْرياداکی صحیفه‌‌لره) داخیلی کئچید وئرن صحیفه‌‌لرده ائدیلمیش سوْن ديَیشیکلیکلرین سیياهیسیدیر. \n[[Special:Watchlist|ایزله‌مه سیياهینیزداکی]] صحیفه‌‌لر '''قالین''' شریفتله گؤستریلمیشدیر.",
     	"recentchangeslinked-page": "صفحه آدی:",
     	"recentchangeslinked-to": "قئيد اوْلونان صحیفه‌‌ده‌کی دئيیل، اوْنا داخیلی کئچید وئرن صحیفه‌‌لرده‌کی ديَیشیکلیکلری گؤستر",
    @@ -1218,8 +1241,8 @@
     	"upload-permitted": "{{PLURAL:$2|تیپ|تیپ لر}} مجاز پرونده لر: $1.",
     	"upload-preferred": "ترجیح وئریلن فايل تیپلری{{PLURAL:$2|تیپ|تیپ لر}}: $1.",
     	"upload-prohibited": "ایجازه وئریلمه‌ين فايل تیپلری{{PLURAL:$2|تیپ|تیپ لر}}: $1.",
    -	"uploadlogpage": "یوکلمه قئیدلری",
    -	"uploadlogpagetext": "آشاغیدا ان سون یوکله‌نیلن فایل‌لارین لیستی گؤستریلیر.\nداها گؤرونوش‌لو گؤسترمک اوچون، [[Special:NewFiles|یئنی فایل‌لار گالئری‌سینه]] باخین.",
    +	"uploadlogpage": "یۆکله‌مه‌لر ژورنالی",
    +	"uploadlogpagetext": "آشاغیدا ان سوْن یوکله‌نیلن فایللارین لیستی گؤستریلیر.\nداها گؤرونوش‌لو یوْخلاماق اوچون، [[Special:NewFiles|یئنی فایللار قالری‌سینه]] باخین.",
     	"filename": "فایل آدی",
     	"filedesc": "قیساسی",
     	"fileuploadsummary": "قیساسی:",
    @@ -1381,19 +1404,19 @@
     	"upload_source_url": "(سیز دوزگون، هر کسین داخیل اولا بیلجیی اورل سئچدینیز)",
     	"upload_source_file": "(بیلگی‌سایارینیزدان بیر فایل سئچیلیب دیر)",
     	"listfiles-delete": "سیل",
    -	"listfiles-summary": "بۇ اؤزل صحیفه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
    +	"listfiles-summary": "بۇ اؤزل صفحه، بۆتون یۆکله‌نیلن فایل‌لاری گؤستریر.",
     	"listfiles_search_for": "مئدیا آدی اوچون آختار:",
     	"listfiles-userdoesnotexist": "«$1» ایشلدن حسابی ثبت اولونماییب‌دیر.",
     	"imgfile": "فایل",
     	"listfiles": "فایل لیستی",
    -	"listfiles_thumb": "کیچیک شکیل",
    +	"listfiles_thumb": "کیچیک عکس",
     	"listfiles_date": "تاریخ",
     	"listfiles_name": "آد",
     	"listfiles_user": "ایشلدن",
     	"listfiles_size": "اؤلچو",
     	"listfiles_description": "شرح",
     	"listfiles_count": "نوسخه‌لر",
    -	"listfiles-show-all": "عکسلرین اسکی نۆسخه‌لرینی ایچینه آل.",
    +	"listfiles-show-all": "عکسلرین قاباقکی نۆسخه‌لرینی ایچینه آل.",
     	"listfiles-latestversion": "ایندیکی نۆسخه",
     	"listfiles-latestversion-yes": "بلی",
     	"listfiles-latestversion-no": "یوخ",
    @@ -1405,7 +1428,7 @@
     	"filehist-revert": "قایتار",
     	"filehist-current": "ایندیکی",
     	"filehist-datetime": "تاریخ/واخت",
    -	"filehist-thumb": "کیچیک شکیل",
    +	"filehist-thumb": "کیچیک عکس",
     	"filehist-thumbtext": "$1 تاریخینده‌کی سۆروموندن کیچیک گؤرونتوسو",
     	"filehist-nothumb": "کیچیک شکیل یوخدو",
     	"filehist-user": "ایشلدن",
    @@ -1468,7 +1491,7 @@
     	"unusedtemplateswlh": "باشقا باغلانتیلار",
     	"randompage": "تصادوفی صفحه",
     	"randompage-nopages": "بو {{PLURAL:$2|آدفضاسیندا|آدفضالاریندا}} هئچ صحیفه یوخدور: $1.",
    -	"randomincategory": "بؤلمه‌ده راست‌گله صحیفه",
    +	"randomincategory": "بؤلمه‌ده تصادوفی صفحه",
     	"randomincategory-invalidcategory": "«$1» بیر گئچرلی بؤلمه آدی دئییل.",
     	"randomincategory-nopages": "[[:Category:$1|$1]] بؤلمه‌سین‌ده، هئچ صحیفه یوخدور.",
     	"randomincategory-category": "بؤلمه:",
    @@ -1480,7 +1503,7 @@
     	"statistics-header-pages": "صفحه آمارلاری",
     	"statistics-header-edits": "دَییشمه آمارلاری",
     	"statistics-header-users": "ایشلدن‌لر آمارلاری",
    -	"statistics-header-hooks": "باشقا آمارلار",
    +	"statistics-header-hooks": "آیری آمارلار",
     	"statistics-articles": "مقاله‌لر",
     	"statistics-pages": "صفحه‌لر:",
     	"statistics-pages-desc": "بۇ ویکی‌ده بۆتون صفحه‌لر، او جومله‌دن دانیشیق صفحه‌لری، یوْل‌لاندیرمالار و غیره.",
    @@ -1490,8 +1513,8 @@
     	"statistics-users": "یازیلمیش [[Special:ListUsers|ایشلدنلر]]",
     	"statistics-users-active": "چالیشقان ایشلدنلر",
     	"statistics-users-active-desc": "سوْن {{PLURAL:$1|بیر|$1}} گۆن‌ده بیر ایش گؤرن ایشلدنلر",
    -	"pageswithprop": "صحیفه اؤزل‌لیگی اولان صحیفه‌لر",
    -	"pageswithprop-legend": "صحیفه اؤزل‌لیگی اولان صحیفه‌لر",
    +	"pageswithprop": "صفحه خصوصیتی اولان صفحه‌لر",
    +	"pageswithprop-legend": "صفحه خصوصیتی اولان صفحه‌لر",
     	"pageswithprop-text": "بو صحیفه‌ده، بیر خاص صحیفه اؤزل‌لیگی ایشلدن صحیفه‌لرین لیستی واردیر.",
     	"pageswithprop-prop": "اؤزل‌لیک آدی:",
     	"pageswithprop-submit": "گئت",
    @@ -1507,7 +1530,7 @@
     	"brokenredirects-edit": "دَییشدیر",
     	"brokenredirects-delete": "سیل",
     	"withoutinterwiki": "دیل باغلانتیلاری اولمایان صحیفه‌لر",
    -	"withoutinterwiki-summary": "آشاغیداکی صحیفه‌لر، باشقا دیل‌لره باغلانتیلاری یوخدور.",
    +	"withoutinterwiki-summary": "آشاغیداکی صفحه‌لر، آیری دیل‌لره باغلانتیلاری یوخدور.",
     	"withoutinterwiki-legend": "اؤن‌اَک",
     	"withoutinterwiki-submit": "گؤستر",
     	"fewestrevisions": "ان آز دَییشدیریلن صفحه‌لر",
    @@ -1521,23 +1544,23 @@
     	"nimagelinks": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونمور",
     	"ntransclusions": "$1 ده{{PLURAL:$1|صحیفه‌ده}}ایستیفاده اولونور",
     	"specialpage-empty": "بو صحیفه بوشدور",
    -	"lonelypages": "يئتیم صحیفه‌‌لر",
    +	"lonelypages": "يئتیم صفحه‌‌لر",
     	"lonelypagestext": "آشاغی‌داکی صحیفه‌لره {{SITENAME}} سایتین‌داکی دیگر صحیفه‌لردن علاقه وئریلممیش یا دا چارپاز داخیل ائدیلممیش.",
     	"uncategorizedpages": "بؤلمه‌سیز صفحه‌لر",
     	"uncategorizedcategories": "بؤلمه‌سیز بؤلمه‌لر",
     	"uncategorizedimages": "بؤلمه‌سیز فایللار",
     	"uncategorizedtemplates": "بؤلمه‌سیز شابلونلار",
    -	"unusedcategories": "ایستیفاده ائدیلمه‌میش بؤلمه‌لر",
    -	"unusedimages": "ایشلنمه‌میش فایل‌لار",
    +	"unusedcategories": "ایشلدیلمه‌میش بؤلمه‌لر",
    +	"unusedimages": "ایشلدیلمه‌میش فایل‌لار",
     	"wantedcategories": "یسته نن بؤلمه‌لر",
    -	"wantedpages": "ایسته‌نیلن صحیفه‌لر",
    +	"wantedpages": "ایسته‌نیلن صفحه‌لر",
     	"wantedpages-badtitle": "مراجعت زامانتی يانلیش باشلیق: $1",
    -	"wantedfiles": "ایسته نن فایللار",
    +	"wantedfiles": "ایسته‌نیلن فایللار",
     	"wantedfiletext-cat": "آشاغیداکی فایل‌لار ایشله‌نیبلر اما یوخدورلار. ائشیک آنباردا اولان فایل‌لار دا اولدوقلارینا باخمایاراق، لیست‌ده گلیبلر. ائله یانلیش باخیشلار <del>خطلنه‌جکلر</del>. هم‌ده، اولمایان فایل‌لاری ایشلدن صحیفه‌لر ده [[:$1]]-ده لیست اولونوبلار.",
     	"wantedfiletext-cat-noforeign": "آشاغی دا کی اولان فایل لار ایستفاده اولونور سانکی یوخدولار. بوندان اونجه فایل لاری اولموش صفحه لر [[:$1]] ده لیست اولوب لار.",
     	"wantedfiletext-nocat": "اشاغی داکی فایل لار ایستفاده اولور سانکی یوخدولار.حتی مومکین دیر خارجی حویض مخزن لریندن اولماق  ایله بو ردا فهرست اولا . وهر مثب رتبه سی یانلیش <del> خط یئمیش اولاجاق.</del>",
     	"wantedfiletext-nocat-noforeign": "آشاغی داکی فایل لار ایشلنیلیر سانکی یوخدورلار.",
    -	"wantedtemplates": "ایسته نن شابلونلار",
    +	"wantedtemplates": "ایسته‌نیلن شابلونلار",
     	"mostlinked": "ان چوخ کئچیدلنن صحیفه‌‌لر",
     	"mostlinkedcategories": "ان چوخ مقاله‌سی اولان بولمه لر",
     	"mostlinkedtemplates": "ان چوخ ایستیفاده اولونان صفحه لر",
    @@ -1548,7 +1571,7 @@
     	"prefixindex": "بوتون اؤن‌اَکلی صحیفه‌لر",
     	"prefixindex-namespace": "بوتون صفحه لر (آد فضاسی$1) قاباق دان یاپیشیقی وار",
     	"prefixindex-strip": "لیست‌ده، اؤن‌اَکی قوْپارت",
    -	"shortpages": "قیسا صحیفه‌‌لر",
    +	"shortpages": "قیسا صفحه‌‌لر",
     	"longpages": "اۇزون صفحه‌‌لر",
     	"deadendpages": "کئچید وئرمه‌ين صحیفه‌‌لر",
     	"deadendpagestext": "آشاغیداکی صحیفه‌‌لردن بو ویکیپئدیياداکی دیگر صحیفه‌‌لره هئچ بیر کئچید يوخدور.",
    @@ -1593,7 +1616,7 @@
     	"apihelp": "API یاردیمی",
     	"apihelp-no-such-module": "«$1» ماژول تاپیلمادی.",
     	"apisandbox-reset": "تمیزله",
    -	"apisandbox-examples": "میثال",
    +	"apisandbox-examples": "میثاللار",
     	"apisandbox-results": "نتیجه",
     	"apisandbox-request-time": "زامان ایستمک:$1",
     	"booksources": "کیتاب قایناقلاری",
    @@ -1603,18 +1626,18 @@
     	"booksources-invalid-isbn": "وئریلن ISBN اعتبارسیز کیمی گؤرونور؛ اورجینال قایناق‌دان کوپیالاما اشکالار اوچون نظارت ائدین.",
     	"specialloguserlabel": "ائدن:",
     	"speciallogtitlelabel": "مقصد(باشلیق یوْخسا {{ns:user}}:ایشلدن اۆچون ایشلدن آدی):",
    -	"log": "قئیدلر",
    -	"all-logs-page": "بوتون اجتماعی قئيدلر",
    -	"alllogstext": "{{SITENAME}} اوچون بوتون مؤوجود قئیدلرین بیرگه گؤستریشی.\nقئید نؤوو، ایستیفاده‌چی آدی و یا تأثیر ائدیلمیش صحیفنی سئچمکله داها ایسپئسیفیک اولا بیلرسینیز.",
    -	"logempty": "ژورنالدا اويغون قئيد تاپیلمادی.",
    +	"log": "ژورناللار",
    +	"all-logs-page": "بوتون عمومی ژورناللار",
    +	"alllogstext": "{{SITENAME}} اوچون بوتون مؤوجود ژورناللارین بیر یئرده گؤستریشی.\nژورنال نوعو، ایشلدن آدی یوخسا دییشدیریلمیش صفحه لری سئچمکله داها محدودلاشدیرا بیلرسینیز.",
    +	"logempty": "ژورنالدا بیر نتیجه تاپیلمادی.",
     	"log-title-wildcard": "بو متنله باشلایان باش‌لیق‌لاری آختار",
     	"showhideselectedlogentries": "گؤستریش/گیزلمه سییاهه ده سئچیلمیش‌لر اوچون",
    -	"allpages": "بوتون صحیفه‌لر",
    -	"nextpage": "سونراکی صحیفه‌‌ ($1)",
    -	"prevpage": "اولکی صحیفه ($1)",
    -	"allpagesfrom": "بو حرفله باشلایان صحیفه‌لری گؤستر:",
    -	"allpagesto": "بو حرفله باشلایان صحیفه لری گؤستر:",
    -	"allarticles": "بوتون صحیفه‌لر",
    +	"allpages": "بوتون صفحه‌لر",
    +	"nextpage": "سونراکی صفحه‌‌ ($1)",
    +	"prevpage": "قاباقکی صفحه ($1)",
    +	"allpagesfrom": "بو حرفله باشلایان صفحه‌لری گؤستر:",
    +	"allpagesto": "بو حرفله قورتولان صفحه لری گؤستر:",
    +	"allarticles": "بوتون صفحه‌لر",
     	"allinnamespace": "بوتون صحیفه‌لر ($1 صحیفه‌لری)",
     	"allpagessubmit": "گئت",
     	"allpagesprefix": "بورا یازدیغینیز حرف‌لرله باشلایان صحیفه‌لری سیاهی‌سینی:",
    @@ -1652,7 +1675,7 @@
     	"listgrouprights": "ایستیفاده‌چی قروپ حاقلاری",
     	"listgrouprights-summary": "آشاغیدا، بو ویکی‌ده تانیلان ایستیفاده‌چی گروپلاری و اونلارین حاقلاری گؤستریلیر.\nتک حاقلار اوچون ده، [[{{MediaWiki:Listgrouprights-helppage}}|آرتیق بیلگیلر]] اولا بیلر.",
     	"listgrouprights-key": "یوْل گؤستری:\n* <span class=\"listgrouprights-granted\">وئریلمیش حاق</span>\n* <span class=\"listgrouprights-revoked\">قایتاریلمیش حاق</span>",
    -	"listgrouprights-group": "قروپ",
    +	"listgrouprights-group": "گروه",
     	"listgrouprights-rights": "حاقلار",
     	"listgrouprights-helppage": "Help:قروپ حاقلاری",
     	"listgrouprights-members": "(عضولرین لیستی)",
    @@ -1691,7 +1714,7 @@
     	"nowikiemailtext": "بو ایستیفاده‌چی، باشقا ایستیفاده‌چیلردن ایمیل آلماماغینی بیلدیریب‌دیر.",
     	"emailnotarget": "آلان اوچون، اولمایان یوخسا گئچرسیز ایستیفاده‌چی آدی.",
     	"emailtarget": "آلانین ایستیفاده‌چی آدینی دَییشدیر",
    -	"emailusername": "ایستیفاده‌چی آدی:",
    +	"emailusername": "ایشلدن آدی:",
     	"emailusernamesubmit": "گؤندر",
     	"email-legend": "باشقا {{SITENAME}} ایستیفاده‌چیسینه ایمیل گؤندر",
     	"emailfrom": "کیم‌دن:",
    @@ -1729,6 +1752,12 @@
     	"wlheader-showupdated": "سون گؤروشونوزدن سوْنرا ائدیلن دییشیکلیکلر '''قالین''' گؤرسدیلیب‌دیر.",
     	"wlnote": "آشاغیداکی {{PLURAL:$1|بیر ديَیشیک‌لیک|<strong>$1</strong> ديَیشیک‌لیک}}  سون {{PLURAL:$2|ساعتدا|<strong>$2</strong> ساعتدا}} ائدیلمیشدیر. $3، $4",
     	"wlshowlast": "سون $1 ساعات $2 گون گؤستر",
    +	"watchlist-hide": "گیزلت",
    +	"wlshowtime": "بو تاریخه قدر گؤستر:",
    +	"wlshowhideminor": "کیچیک دَییشدیرمه‌لر",
    +	"wlshowhideliu": "یازیلمیش ایشلدنلر",
    +	"wlshowhidemine": "منیم دَییشدیرمه‌لریم",
    +	"wlshowhidecategorization": "صفحه‌ بؤلمه‌لندیرمه‌سی",
     	"watchlist-options": "ایزله‌دیکلر سئچمه‌لری",
     	"watching": "ایزله‌نیلیر...",
     	"unwatching": "ایزله‌مه...",
    @@ -1763,8 +1792,8 @@
     	"actioncomplete": "چالیشما سوناچاتدی",
     	"actionfailed": "چالیشما اوغورسوز اولدو",
     	"deletedtext": "\"$1\" سیلیندی.\nسونونجو سیلینمه‌لره باخ: $2.",
    -	"dellogpage": "سیلمه قئیدی",
    -	"dellogpagetext": "ان سون سیلینمیش صحیفه‌لرین سیاهی‌سی.",
    +	"dellogpage": "سیلمه ژورنالی",
    +	"dellogpagetext": "بو، ان سون سیلینمیش صفحه‌لرین لیستیدیر.",
     	"deletionlog": "سیلمه سییاهه‌سی",
     	"reverted": "داها اوولکی وئرسیا برپا ائدیلدی",
     	"deletecomment": "ندن:",
    @@ -1793,7 +1822,7 @@
     	"changecontentmodel-reason-label": "ندن:",
     	"logentry-contentmodel-change-revertlink": "قایتار",
     	"logentry-contentmodel-change-revert": "قایتار",
    -	"protectlogpage": "قوروما قئیدلری",
    +	"protectlogpage": "قوروما ژورنالی",
     	"protectlogtext": "آشاغی‌داکی، صحیفه قوروما‌لارینا دییشیک‌لیک‌لرین بیر سیاهی‌سی‌دیر.\nحال-حاضردا تطبیق اولونان صحیفه قوروما‌لاری اوچون [[Special:ProtectedPages| قوروما آلتینا آلینمیش صحیفه‌لر سیاهی‌سینا]] باخا بیلرسینیز.",
     	"protectedarticle": "«[[$1]]» قوْروندو",
     	"modifiedarticleprotection": "\"[[$1]]\" صحیفه‌سی اوچون محافظه سویه‌سی دییشیلدی",
    @@ -1817,7 +1846,7 @@
     	"protect-locked-dblock": "وئریلن‌لر بازاسی کیلیدلی اولدوغو اوچون محافظه سویه‌سی دییشیله بیلمز.\n'$1 صحیفه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
     	"protect-locked-access": "سیزین حسابینیزین محافظه سویه‌سینی دییشمه‌یه ایختیاری یوخ‌دور.\n'$1 صحیفه‌سینده حال-حاضردا ائده بیلجیینیز عملیات‌لار بون‌لاردیر:",
     	"protect-cascadeon": "بو صحیفه محافظه‌لی‌دیر، چونکی بو صفحه {{PLURAL:$1|باشقا بیر}} صفحه‌دن کاسکاد محافظه ائدیلمیش‌دیر. سیز بو صفحه‌نین محافظه سویه‌سینی دییشدیره بیلرسینیز، بو کاسکاد محافظه‌یه تأثیر ائتمه‌یه‌جک.",
    -	"protect-default": "بوتون ایستیفاده‌چی‌لره ایجازه وئر",
    +	"protect-default": "بوتون ایشلدنلره ایجازه وئر",
     	"protect-fallback": "یالنیز «$1» ایجازه‌سی اولان ایستیفاده‌چیلره ایجازه وئر",
     	"protect-level-autoconfirmed": "تکجه اوْتوماتیک تأیید اوْلموش ایشلدن‌لره ایجازه وئر",
     	"protect-level-sysop": "یالنیز ایداره‌چیلره ایجازه وئر",
    @@ -1899,14 +1928,14 @@
     	"anoncontribs": "چالیشمالار",
     	"contribsub2": "{{GENDER:$3|$1}} اوچون ($2)",
     	"contributions-userdoesnotexist": "«$1» ایشلدن حسابی ثبت اولونماییب‌دیر.",
    -	"nocontribs": "بو موشخصاتا اویغون دییشدیر تاپیلمادی",
    +	"nocontribs": "بو موشخصاتا اویان دییشیکلیک تاپیلمادی.",
     	"uctop": "(ایندیکی)",
     	"month": "بۇ آی‌دان (و قاباقجا):",
     	"year": "بۇ ایل‌دن (و قاباقجا):",
     	"sp-contributions-newbies": "تکجه یئنی ایشلدنلرین چالیشمالارینی گؤستر",
     	"sp-contributions-newbies-sub": "یئنی ایستیفاده‌چی‌لر اوچون",
     	"sp-contributions-newbies-title": "یئنی حساب‌لار اوچون ایستیفاده‌چی فالیت‌لری",
    -	"sp-contributions-blocklog": "باغلاما قئیدلری",
    +	"sp-contributions-blocklog": "باغلاما ژورنالی",
     	"sp-contributions-suppresslog": "باسدیریلمیش ایشلدن فعالیت‌لری",
     	"sp-contributions-deleted": "سیلینمیش ایشلدن چالیشمالاری",
     	"sp-contributions-uploads": "یوکله‌نَنلر",
    @@ -1921,10 +1950,10 @@
     	"sp-contributions-newonly": "تکجه صفحه یاراتماق دَییشیکلیکلرینی گؤستر",
     	"sp-contributions-submit": "آختار",
     	"whatlinkshere": "بۇ صفحه‌‌يه باغلانتیلار",
    -	"whatlinkshere-title": "«$1»-ه باغلانان صحیفه‌لر",
    +	"whatlinkshere-title": "«$1»-ه باغلانان صفحه‌لر",
     	"whatlinkshere-page": "صفحه:",
     	"linkshere": "آشاغیداکی صفحه‌لر '''[[:$1]]'''-ه باغلانیب:",
    -	"nolinkshere": "'''[[:$1]]'''-ه هئچ بیر صحیفه باغلانماییب‌دیر.",
    +	"nolinkshere": "<strong>[[:$1]]</strong>-ه هئچ بیر صفحه باغلانماییب‌دیر.",
     	"nolinkshere-ns": "سئچیلمیش آدفضاسیندا، هئچ صحیفه '''[[:$1]]'''-ه باغلانتی‌سی یوخدور.",
     	"isredirect": "یوللاندیرما صفحه‌سی",
     	"istemplate": "داخیل اولموش",
    @@ -1932,9 +1961,9 @@
     	"whatlinkshere-prev": "{{PLURAL:$1|قاباقکی|قاباقکی $1}}",
     	"whatlinkshere-next": "{{PLURAL:$1|سونراکی|سونراکی $1}}",
     	"whatlinkshere-links": "← باغلانتیلار",
    -	"whatlinkshere-hideredirs": "یول‌لاندیرمالاری $1",
    -	"whatlinkshere-hidetrans": "علاوه‌لری $1",
    -	"whatlinkshere-hidelinks": "باغلانتیلاری $1",
    +	"whatlinkshere-hideredirs": "$1 یول‌لاندیرمالاری",
    +	"whatlinkshere-hidetrans": "$1 علاوه‌لری",
    +	"whatlinkshere-hidelinks": "$1 باغلانتیلاری",
     	"whatlinkshere-hideimages": "فایل باغلانتیلارینی $1",
     	"whatlinkshere-filters": "سۆزگَجلر",
     	"autoblockid": "اوتوماتیک باغلانما #$1",
    @@ -1943,7 +1972,7 @@
     	"blockip": " {{GENDER:$1|ایشلدن}}ی باغلا",
     	"blockip-legend": "ایستیفادچی نی باغلا",
     	"blockiptext": "آشاغی‌داکی فورمو ایستیفاده ائده‌رک مۆعیّن بیر آی‌پی‌نین و یا قئیدیات‌دان کئچمیش ایستیفاده‌چی‌نین دییشیک‌لیک ائتمه‌سینی مانعه تؤره‌ده بیلرسینیز. بۇ یالنیز واندالیزمین قارشی‌سینی آلماق اۆچون و [[{{MediaWiki:Policy-url}}|قایدا‌لارا]] اۇیغون اوْلا‌راق ائدیلمه‌لی. آشاغی‌یا مۆطلق قاداغا ایله علاقه‌دار بیر شرح یازین. (اؤرنک:-بۇ-صفحه‌لرده واندالیزم ائتمیشدیر).",
    -	"ipaddressorusername": "آی-پی عونوانی و یا ایستیفاده‌چی آدی",
    +	"ipaddressorusername": "آی‌پی آدرسی یوخسا ایشلدن آدی",
     	"ipbexpiry": "بیتمه مدتی:",
     	"ipbreason": "ندن:",
     	"ipbreason-dropdown": "*باغلانما سبب‌لری:\n** یالان معلومات‌لارین علاوه ائدیلمه‌سی\n** صحیفه‌نین مزمونونون سیلینمه‌سی\n** خاریجی سایت‌لارا ایسپام-کئچیدلر\n** صحیفه‌یه معنا‌سیز و یارارسیز علاوه‌لره گؤره\n** حده و تعقیب‌لره گؤره\n** تحقیره گؤره\n** چوخسای‌لی حساب‌دان سوی ایستیفاده‌یه گؤره\n** قاداغان اولونموش ایستیفاده‌چی آدینا گؤره",
    @@ -1977,18 +2006,18 @@
     	"unblocked-range": "$1-نین بلوکو گؤتورولدو",
     	"unblocked-id": "$1-نین بلوکو گؤتورولدو",
     	"unblocked-ip": "[[Special:Contributions/$1|$1]] قاداغاسی قالدیریلدی.",
    -	"blocklist": "بلوکلانمیش ایستیفاده‌چیلر",
    -	"ipblocklist": "باغلانمیش ایستیفاده‌چیلر",
    -	"ipblocklist-legend": "بلوکلانمیش ایستیفاده‌چینی آختار",
    +	"blocklist": "باغلانمیش ایشلدنلر",
    +	"ipblocklist": "باغلانمیش ایشلدنلر",
    +	"ipblocklist-legend": "باغلانمیش ایشلدنی آختار",
     	"blocklist-userblocks": "حساب بلوکلارینی گیزلت",
     	"blocklist-tempblocks": "مووققتی بلوکلاری گیزله",
     	"blocklist-addressblocks": "تک ای‌پی بلوکلارینی گیزله",
     	"blocklist-rangeblocks": "ایندیکی بلوکلاری گیزله",
     	"blocklist-timestamp": "واخت",
     	"blocklist-target": "هدف",
    -	"blocklist-expiry": "بیتیش تاریخی",
    -	"blocklist-by": "بلوکلامیش ایداره‌چی",
    -	"blocklist-params": "بلوک پارامئترلری",
    +	"blocklist-expiry": "قورتولما تاریخی",
    +	"blocklist-by": "باغلایان ایداره‌چی",
    +	"blocklist-params": "باغلاما معیارلاری",
     	"blocklist-reason": "نَدَن‌لیک",
     	"ipblocklist-submit": "آختار",
     	"ipblocklist-localblock": "يئرلی بلوک",
    @@ -2008,12 +2037,12 @@
     	"contribslink": "چالیشمالار",
     	"emaillink": "ایمیل گؤندر",
     	"autoblocker": "یاخینلیقدا سیزین آی‌پی آدرسیز «[[User:$1|$1]]» ایله ایشلدیلمک اوچون، اوتوماتیک اولاراق باغلانیلمیسیز.\n$1-ین وئریلمیش باغلانماق سببی: «$2»",
    -	"blocklogpage": "باغلاما قئیدلری",
    +	"blocklogpage": "باغلاما ژورنالی",
     	"blocklog-showlog": "بو ایستیفاده‌چی داها اول بلوکلانمیش‌دیر. بلوکلاما گونده‌لیگی رئفئرانس اوچون آشاغیدا گؤستریلیب:",
     	"blocklog-showsuppresslog": "بو ایستیفاده‌چی داها اول باغلانمیش‌دیر. باغلانما گونده‌لیگی رئفئرانس اوچون آشاغیدا گؤستریلیب:",
     	"blocklogentry": "[[$1]]-ی $2 واختینه قدر بلوْکلادی $3",
     	"reblock-logentry": "[[$1]] اوچون سون تاریخی $2 $3 اولماق اوزره بلوک پارامئترلری دییشدیریلدی",
    -	"blocklogtext": "ایستیفاده‌چی‌لرین باغلانماسی و باغلانماقین گؤتورولمه‌سی سیاهی‌سی.\nآوتوماتیک باغلانمیش ای پی-عنوان‌لار بورادا گؤستریلمیر.\nحال-هازیرکی [[Special:BlockList|قاداغا‌لارین و بلوکلاما‌لارین سیاهی‌سی]]نا باخ.",
    +	"blocklogtext": "بۇ ایشلدنلرین باغلانما ایله آچیلما لیستی‌دیر.\nاوْتوماتیک باغلانمیش آی‌پی آدرسلری بۇرادا سیرالانماییب‌دیر.\nایندیکی تحریملر ایله باغلانمالار لیستی اۆچون [[Special:BlockList|باغلاتما لیستینه]]  باخین.",
     	"unblocklogentry": "$1 اوزرین‌دکی آچیلدی",
     	"block-log-flags-anononly": "\nتکجه تایید اوْلونمامیش ایشلدنلر",
     	"block-log-flags-nocreate": "حساب یاراتماق اولماز",
    @@ -2085,7 +2114,7 @@
     	"movepage-page-moved": "$1 صحیفه‌سی $2 صحیفه‌سینه کؤچورولوب.",
     	"movepage-page-unmoved": "$1 صحیفه‌سی $2 صحیفه‌سینه کؤچوروله بیلینمیر.",
     	"movepage-max-pages": "ان چوخ $1 {{PLURAL:$1|صحیفه |صحیفه}} داشیندی و داها چوخو آوتوماتیک اولا‌راق تاشیناماز.",
    -	"movelogpage": "آد ديیشدیرمک قئیدی",
    +	"movelogpage": "آد دَيیشدیرمک ژورنالی",
     	"movelogpagetext": "آشاغی‌دا اوْلان لیست آدی دَییشدیریلمیش صفحه‌لری سیرالاییر.",
     	"movesubpage": "{{PLURAL:$1|آلتینداکی صحیفه}}",
     	"movesubpagetext": "بو صحیفه‌نین آشاغیدا گؤستریلن $1 {{PLURAL:$1 | آلت صحیفه سی | آلت صحیفه اسی}} وار.",
    @@ -2115,17 +2144,18 @@
     	"export": "صفحه‌‌لری ائشیگه چیخارت",
     	"exporttext": "مویین بیر صحیفه و یا صحیفه کومانداسینین متنی و دییشدیرمه کئچمیشینی خمل ایله ساری‌لی اولا‌راق خاریجه کؤچوره بیلرسینیز.\nبو، مئدیاویکی ایستیفاده باشقا بیر ویکی [[Special:Import|ایچه کؤچورمه صحیفه‌سی]] ایله ایچه کؤچوروله بیلر.\n\nصحیفه‌لری خاریجه کؤچورمک اوچون، باش‌لیق‌لاری آشاغی‌داکی متن قوتوسونا داخیل ائدین، هر سطره بیر دنه، و کؤهنه سوروملئرلئ بیرلیکده ایندیکی وئرسیاسی، صحیفه کئچمیشی سطرلرینی، یا دا سون دییشیک‌لیک ملوماتییلا بیرلیکده آکتوال وئرسیاسی ایسته‌ییب ایستمدیگینیزی قئید ائدین.\n\nسونونجو حالدا، بیر لینک ده ایستیفاده ائده بیلرسینیز، هؤر: \"[[{{MediaWiki:Mainpage}}]]\" صحیفه‌سی اوچون [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
     	"exportall": "بوتون صحیفه‌لری خاریجه کؤچور",
    -	"exportcuronly": "بوتون تاریخچنی دئییل، یالنیز حال-هازیرکی نوسخه نی داخیل ائت",
    +	"exportcuronly": "بوتون گئچمیشی یوخ، تکجه ایندیکی نوسخه نی گیردیر",
     	"exportnohistory": "هدف‌لنن قایناق صحیفه‌سی (ایسته‌یه باغ‌لی):",
     	"exportlistauthors": "هر صحیفه‌‌ اوچون دَییشدیرمه ائدن سیياهیسینی اؤزونده ساخلايین",
    -	"export-submit": "ایخراج",
    -	"export-addcattext": "صحیفه‌لری بو بولمه دن علاوه ائت:",
    +	"export-submit": "ائشیگه چیخارت",
    +	"export-addcattext": "صفحه‌لری بو بؤلمه‌دن آرتیر:",
     	"export-addcat": "آرتیر",
     	"export-addnstext": "صحیفه‌لری آدلار فزاسین‌دان علاوه ائت:",
     	"export-addns": "آرتیر",
    -	"export-download": "فایلی قئید ائت",
    -	"export-templates": "شابلون‌لاری داخیل ائت",
    +	"export-download": "فایل کیمی ذخیره ائت",
    +	"export-templates": "شابلونلاری گیردیر",
     	"export-pagelinks": "باغ‌لی صحیفه‌لری داخیل درین‌لیک:",
    +	"export-manual": "ال ایله صفحه‌لری آرتیر:",
     	"allmessages": "سیستئم معلومات‌لاری",
     	"allmessagesname": "آد",
     	"allmessagesdefault": "دفالت دانیشیق متنی",
    @@ -2195,7 +2225,7 @@
     	"import-options-wrong": "{{PLURAL:$2|جزئیات| جزئیات}} یانلیش: <nowiki>$1</nowiki>",
     	"import-rootpage-invalid": "وئریلن کؤک صحیفه‌‌سی اعتبارسیز آددیر.",
     	"import-rootpage-nosubpage": "آد فضا سی  \"$1\" آنا باسئ ٔآلت صحیفه اوچون اجازه وئرمیر.",
    -	"importlogpage": "چیخاریلما گونده‌لیگی",
    +	"importlogpage": "چیخاریلما ژورنالی",
     	"importlogpagetext": "آیری ویکیلردن، دَییشیکلیک گئچمیشلریله بیرلیک‌ده گتیریلمیش صفحه‌لر.",
     	"import-logentry-upload-detail": "{{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
     	"import-logentry-interwiki-detail": "$2-دن {{PLURAL:$1|بیر|$1}} نوسخه ایچری گتیریلدی",
    @@ -2241,7 +2271,7 @@
     	"tooltip-feed-atom": "بو صحیفه‌‌ اوچون آتوم يايیمی",
     	"tooltip-t-contributions": "{{GENDER:$1|بۇ ایشلدنین}} وئردیگی دییشیکلر لیستی",
     	"tooltip-t-emailuser": "بو ایستیفاده‌چی‌یه بیر ایمیل گؤندر",
    -	"tooltip-t-info": "بو صفحه‌یه گؤره آرتیق بیلگی",
    +	"tooltip-t-info": "بو صفحه‌یه گؤره آرتیق ایطلاعات",
     	"tooltip-t-upload": "فایل‌لار یوکله",
     	"tooltip-t-specialpages": "بوتون اؤزل صفحه‌لرین لیستی",
     	"tooltip-t-print": "بو صفحه‌‌نین چاپ ائدیلن سۆرومو",
    @@ -2288,33 +2318,33 @@
     	"spam_blanking": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، بوشادیلیر",
     	"spam_deleting": "$1-ه باغلانتیلاری اولان بوتون نوسخه‌لر، سیلینیر",
     	"simpleantispam-label": "ضد اِسپم یوخلاماسی.\nبورانی <strong>دولدورمایین</strong>!",
    -	"pageinfo-title": "«$1» اوچون بیلگیلر",
    +	"pageinfo-title": "«$1» اوچون ایطلاعات",
     	"pageinfo-not-current": "تأسفله بو بیلگیلری اسکی نوسخه‌لره وئرمک اولانماز بیر ایش‌دیر.",
    -	"pageinfo-header-basic": "اساس معلومات‌لار",
    -	"pageinfo-header-edits": "تاریخچه نی دییشدیر",
    -	"pageinfo-header-restrictions": "صفحه دن محافظت ائله مک",
    +	"pageinfo-header-basic": "اصلی ایطلاعات",
    +	"pageinfo-header-edits": "دَییشدیرمه گئچمیشی",
    +	"pageinfo-header-restrictions": "صفحه قوْروماسی",
     	"pageinfo-header-properties": "صفحه خصوصیتلری",
     	"pageinfo-display-title": "گؤستریلن باشلیق",
     	"pageinfo-default-sort": "فرض ائدیلن سیرالاما آچاری",
    -	"pageinfo-length": "صحیفه‌‌ اوزونلوغو (بايت)",
    -	"pageinfo-article-id": "صحیفه آی‌دی-سی",
    -	"pageinfo-language": "صحیفه مضمونونون دیلی",
    +	"pageinfo-length": "صفحه‌‌ اوزونلوغو (بايت)",
    +	"pageinfo-article-id": "صفحه آی‌دی-سی",
    +	"pageinfo-language": "صفحه مضمونونون دیلی",
     	"pageinfo-robot-policy": "بوتلارلا ایندِکسلنیر",
     	"pageinfo-robot-index": "ایجازه‌لی",
     	"pageinfo-robot-noindex": "ایجازه‌سیز",
    -	"pageinfo-watchers": "صحیفه‌نین تاماشا‌چی سایی",
    +	"pageinfo-watchers": "صفحه‌نین تاماشا‌چی سایی",
     	"pageinfo-few-watchers": "$1-دن آز {{PLURAL:$1|ایزله‌ین}}",
     	"pageinfo-redirects-name": "بو صحیفه‌یه یول‌لاندیرما سایی‌سی",
     	"pageinfo-subpages-name": "بو صحیفه‌نین آلت‌صحیفه‌لری",
     	"pageinfo-subpages-value": "$1 ({{PLURAL:$2|بیر|$2}} یول‌لاندیرما؛ {{PLURAL:$3|بیر|$3}} قِیری-یول‌لاندیرما)",
    -	"pageinfo-firstuser": "صحیفنی یارا‌دان",
    -	"pageinfo-firsttime": "صحیفه‌نین یارانما تاریخی",
    +	"pageinfo-firstuser": "صفحه‌نی یارا‌دان",
    +	"pageinfo-firsttime": "صفحه‌نین یارانما تاریخی",
     	"pageinfo-lastuser": "سونونجو دییشدیرن",
     	"pageinfo-lasttime": "سونونجو دییشدیر‌نین تاریخی",
     	"pageinfo-edits": "دییشدیر‌لرین سایی",
     	"pageinfo-authors": "فرق‌لی مؤلف‌لرین سایی",
    -	"pageinfo-recent-edits": "سون زامانلارداکی تنزیمله‌مه‌لر (سون $1)",
    -	"pageinfo-recent-authors": "فرقلی يازارلارین سون سايی",
    +	"pageinfo-recent-edits": "سون دَییشدیرمه‌لر سایی (سون $1)",
    +	"pageinfo-recent-authors": "فرقلی يازانلارین سون سايی",
     	"pageinfo-magic-words": "سیحیرلی {{PLURAL:$1|بیر|$1}} سؤزجوک ($1)",
     	"pageinfo-hidden-categories": "گیزلی {{PLURAL:$1|بؤلمه|بؤلمه‌لر}} ($1)",
     	"pageinfo-templates": "ایشله‌دیلمیش {{PLURAL:$1|بیر|$1}} شابلون ($1)",
    @@ -2342,9 +2372,10 @@
     	"markedaspatrollederror-noautopatrol": "اؤز دییشیک‌لیک‌لرینیزی یوخلاییب ایشاره‌له‌یه بیلمزسینیز.",
     	"markedaspatrollednotify": "$1-اوستونده ديَیشیکلیک قئيد ائدیلمیشدیر، نئجه کی پاترول کئشیگی چکدی.",
     	"markedaspatrollederrornotify": "دولانماق برچسبی مووفقیت سیز اولدو",
    -	"patrol-log-page": "پاترول گونده‌لیگی",
    -	"patrol-log-header": "بو یوخلانمیش دییشیک‌لیک‌لرین گونده‌لیگی‌دیر.",
    +	"patrol-log-page": "دولانما ژورنالی",
    +	"patrol-log-header": "بو یوخلانمیش دییشیک‌لیک‌لرین ژورنالی‌دیر.",
     	"log-show-hide-patrol": "$1 پاترول گونده‌لیگی",
    +	"log-show-hide-tag": "اِتیکت ژورنالی $1",
     	"deletedrevision": "کؤهنه نوسخه لری سیلیندی $1.",
     	"filedeleteerror-short": "فایل سیلینرکن ختا: $1",
     	"filedeleteerror-long": "فایل سیلینرکن اوزه چیخان ختا‌لار:\n\n$1",
    @@ -2376,12 +2407,12 @@
     	"file-info-png-frames": "$1 {{PLURAL:$1|فرامئ|چرچیوه}}",
     	"file-no-thumb-animation": "'''قئید:تئکنیکی مسئله‌لر سببیندن قاباق دان گورسنمه فایل متحرک شکیلی گؤرستمیر .",
     	"file-no-thumb-animation-gif": "'''قئید:فنی مسائیله گوره GIF  فایلارین و اونا تای اولانان لار  قالباق دان گورستمه پروقرمی متحرک حالیندا گورسدیلمیجک.'''",
    -	"newimages": "یئنی فایل‌لارین سیاهی‌سی",
    +	"newimages": "یئنی فایللارین لیستی",
     	"imagelisttext": "آشاغی‌داکی سیاهی '$2 گؤره دوزولموش {{PLURAL:$1|ادد فایلی| ادد فای‌لی}} گؤستریر.",
     	"newimages-summary": "بو خصوصی صحیفه، ان سون یوک‌لنن فایل‌لاری گؤستریر.",
     	"newimages-legend": "سۆزگَج",
     	"newimages-label": "فایلین (و یا اونون بیر حیسه‌سی‌نین) آدی:",
    -	"newimages-showbots": "بوت یوکله‌مه‌لرینی گؤستر",
    +	"newimages-showbots": "روبات یوکله‌مه‌لرینی گؤستر",
     	"noimages": "هئچ نیی گؤرممک.",
     	"ilsubmit": "آختار",
     	"bydate": "تاریخین اوستوندن",
    @@ -2779,15 +2810,15 @@
     	"confirmrecreate-noreason": "[[User:$1|$1]] ([[User talk:$1|دانیشیق]]) آدلی ایستیفاده‌چی، سیز ديَیشیکلیک ائتمه‌يه باشلادیقدان سونرا بو صحیفه‌‌نی سیلدی. خاهیش ائدیریک بو صحیفه‌‌نی حقیقتن يئنیدن ياراتماق ایسته‌دیگینیزی تسدیق ائدین.",
     	"recreate": "يئنیله‌مک",
     	"confirm_purge_button": "اولدو",
    -	"confirm-purge-top": "بو صحیفه‌‌ کئشدن (cache) سیلینسین؟",
    -	"confirm-purge-bottom": "بیر صحیفه‌‌نی لغو ائتمک کئشی تمیزله‌ير و ان آکتوال دیستریبوتیوین گؤرونمه‌سینه مجبور ائدر.",
    +	"confirm-purge-top": "بۇ صفحه‌‌ کشدن (cache) سیلینسین‌می؟",
    +	"confirm-purge-bottom": "بیر صفحه‌‌نی یئنی‌له‌مک کشی تمیزله‌ير و سوْن نوسخه‌نین گؤرولمه‌سینه مجبور ائدیر.",
     	"confirm-watch-button": "اولدو",
     	"confirm-watch-top": "بو صفحه‌نی ایزله‌دیکلرینیزه آرتیریلدی",
     	"confirm-unwatch-button": "اولدو",
     	"confirm-unwatch-top": "بو صفحه‌نی ایزله‌دیگینیز صفحه‌لردن قالدیریلدی",
     	"quotation-marks": "«$1»",
    -	"imgmultipageprev": "&larr; اولکی صحیفه‌‌",
    -	"imgmultipagenext": "سونراکی صحیفه‌‌ &rarr;",
    +	"imgmultipageprev": "&rarr; قاباقکی صفحه‌‌",
    +	"imgmultipagenext": "سونراکی صفحه‌‌ &larr;",
     	"imgmultigo": "گئت!",
     	"imgmultigoto": "$1 صحیفه‌‌يه گئت",
     	"img-lang-default": "(وارساییلان دیل)",
    @@ -2796,11 +2827,11 @@
     	"ascending_abbrev": "آرتما سیراسینا گؤره",
     	"descending_abbrev": "آزالما سیراسینا گؤره",
     	"table_pager_next": "سوْنراکی صفحه",
    -	"table_pager_prev": "قاباغکی صحیفه",
    -	"table_pager_first": "ایلک صحیفه‌‌",
    -	"table_pager_last": "سون صحیفه‌‌",
    +	"table_pager_prev": "قاباقکی صفحه",
    +	"table_pager_first": "بیرینجی صفحه‌‌",
    +	"table_pager_last": "سون صفحه‌‌",
     	"table_pager_limit": "صحیفه‌‌ده $1 مؤوقئ سرگیله",
    -	"table_pager_limit_label": "هر صحیفه‌ده اولان موردلر سایی‌سی",
    +	"table_pager_limit_label": "هر صفحه‌ده اولان موردلر سایی‌سی",
     	"table_pager_limit_submit": "گئت",
     	"table_pager_empty": "نتیجه سیز",
     	"autosumm-blank": "صفحه‌‌نی بوْشالتدی",
    @@ -2826,7 +2857,7 @@
     	"watchlistedit-clear-legend": "ایزلدیکلریمین لیستین سیل",
     	"watchlistedit-clear-titles": "باشلیق‌لار:",
     	"watchlisttools-clear": "ایزلدیکلریمین لیستین سیل",
    -	"watchlisttools-view": "ایلگیلی دَییشیکلیکلره باخین",
    +	"watchlisttools-view": "باغلی دَییشیکلیکلره باخین",
     	"watchlisttools-edit": "ایزله‌دیکلره باخ و اونلاری دَییشدیر",
     	"watchlisttools-raw": "چیی ایزله‌دیکلری دَییشدیر",
     	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|دانیشیق]])",
    @@ -2893,7 +2924,7 @@
     	"fileduplicatesearch-noresults": "\"$1\" آدیندا فایل تاپیلمادی.",
     	"specialpages": "اؤزل صفحه‌لر",
     	"specialpages-note": "* نورمال اؤزل صفحه‌لر.\n* <span class=\"mw-specialpagerestricted\">محدودلاشدیریلمیش اؤزل صفحه‌لر.</span>",
    -	"specialpages-group-maintenance": "ساخلانیش راپورتلاری",
    +	"specialpages-group-maintenance": "ساخلانیش گوزاریشلری",
     	"specialpages-group-other": "آیری اؤزل صفحه‌لر",
     	"specialpages-group-login": "گیریش / حساب یارات",
     	"specialpages-group-changes": "سون دییشیک‌لیک‌لر و قئیدلر",
    @@ -2902,7 +2933,7 @@
     	"specialpages-group-highuse": "ان چوْخ ایشلدیلمیش صفحه‌لر",
     	"specialpages-group-pages": "صفحه‌لرین لیست‌لری",
     	"specialpages-group-pagetools": "صفحه آلتلری",
    -	"specialpages-group-wiki": "بیلگیلر و آلتلر",
    +	"specialpages-group-wiki": "دئیتا و آلتلر",
     	"specialpages-group-redirects": "مخصوص یوْللاندیرما صفحه‌لری",
     	"specialpages-group-spam": "هرزه یازماق آلت‌لری",
     	"blankpage": "بوش صفحه",
    @@ -2912,14 +2943,14 @@
     	"tag-filter": "[[Special:Tags|اِتیکِت]] سۆزگُجی:",
     	"tag-filter-submit": "سۆزگَج",
     	"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|اِتیکِت|اِتیکِتلر}}]]: $2)",
    -	"tags-title": "یاپیشقان",
    -	"tags-intro": "بو صحیفه، یازیلیم دَییشدیرمه‌لری نیشانلایان اِتیکِتلری و اونلارین آنلاملارینی گؤستریر.",
    -	"tags-tag": "یاپیشقان آدی",
    -	"tags-display-header": "ديَیشیکلیک لیستئلئریندئکی گؤرونوش",
    -	"tags-description-header": "آنلامینین تام آچیقلاماسی",
    +	"tags-title": "اِتیکتلر",
    +	"tags-intro": "بو صفحه، نرم افزار دَییشدیرمه‌لری علامتله‌ین اِتیکِتلری و اونلارین معنالارینی گؤستریر.",
    +	"tags-tag": "اِتیکت آدی",
    +	"tags-display-header": "ديَیشیکلیک لیستلرینده گؤرونوشو",
    +	"tags-description-header": "معنانین بوتون توضیحی",
     	"tags-source-header": "قایناق",
    -	"tags-active-header": "چالیشقلان؟",
    -	"tags-hitcount-header": "یاپیشقانلی دییشیک‌لیک‌لر",
    +	"tags-active-header": "چالیشقان؟",
    +	"tags-hitcount-header": "اِتیکتلی دَییشیک‌لیک‌لر",
     	"tags-actions-header": "چالیشمالار",
     	"tags-active-yes": "بلی",
     	"tags-active-no": "یوْخ",
    @@ -3007,10 +3038,11 @@
     	"revdelete-restricted": "ایداره‌چیلره محدودیت قویدو",
     	"revdelete-unrestricted": "ایداره‌چیلرین محدودیتلرینی گؤتوردو",
     	"logentry-block-block": "$1 {{GENDER:$4|$3}}-نی {{GENDER:$2|باغلادی}}. قۇرتارماق تاریخی: $5 $6",
    -	"logentry-block-unblock": "$1 {{GENDER:$4|$3}}-نین {{GENDER:$2|بلوکلاماغینی قالدیردی}}",
    +	"logentry-block-unblock": "$1 {{GENDER:$4|$3}}-نین {{GENDER:$2|باغلانماغینی گؤتوردو}}",
     	"logentry-import-upload": "$1 $3-نی فایل یوکله‌مه یولو ایله {{GENDER:$2|ایچری گتیردی}}",
     	"logentry-import-upload-details": "$1 $3-نی فایل یوکله‌مه یولو ایله {{GENDER:$2|ایچری گتیردی}} ($4 {{PLURAL:$4|نوسخه}})",
     	"logentry-import-interwiki-details": "$1 $3-نی $5-دن {{GENDER:$2|ایچری گتیردی}} ($4 {{PLURAL:$4|نوسخه}})",
    +	"logentry-merge-merge": "$1  $3  ایله  $4-نی {{GENDER:$2| بیرلشدیردی}} ($5-جن نوسخه)",
     	"logentry-move-move": "$1، $3 صفحه‌سینی $4-ه {{GENDER:$2|آپاردی}}",
     	"logentry-move-move-noredirect": "$1، $3 صفحه‌سینی، یوْل‌لاندیرما قوْیماماق‌لا، $4-ه {{GENDER:$2|آپاردی}}",
     	"logentry-move-move_redir": "$1، $3 صفحه‌سینی، $4-ده یوْل‌لاندیرما اۆستونه {{GENDER:$2|آپاردی}}",
    @@ -3027,6 +3059,8 @@
     	"logentry-rights-rights-legacy": "$1، $3-ین قروپ عوضولوگونو {{GENDER:$2|دَییشدیردی}}",
     	"logentry-rights-autopromote": "$1-ین مقامی اوتوماتیک $4-دن $5-ه {{GENDER:$2|آرتیریلدی}}",
     	"logentry-upload-upload": "$1 $3 را {{GENDER:$2|یوکلندیردی}}",
    +	"log-name-managetags": "اِتیکت ایداره گئچمیشی",
    +	"log-name-tag": "اِتیکت ژورنالی",
     	"rightsnone": "(هئچ)",
     	"revdelete-summary": "دَییشدیرمه قیساسی",
     	"feedback-adding": "صحیفه‌یه گئری-بیلدیریم آرتیریلیر...",
    @@ -3095,6 +3129,7 @@
     	"duration-centuries": "{{PLURAL:$1|بیر|$1}} یوز-ایل",
     	"duration-millennia": "{{PLURAL:$1|بیر|$1}} مین‌ایل",
     	"rotate-comment": "عکس $1 {{PLURAL:$1|درجه}} ساعات عقربه‌لری ایستیقامتینده فیرلاندیریلب‌دیر",
    +	"expandtemplates": "شابلونلاری گئنیشلتمه",
     	"expand_templates_output": "سوْنوج",
     	"expand_templates_ok": "اوْلسون",
     	"expand_templates_remove_comments": "باخیش‌لاری سیل",
    @@ -3142,5 +3177,15 @@
     	"special-characters-title-minus": "منفی علامتی",
     	"mw-widgets-dateinput-no-date": "تاریخ سئچیلمه‌ییب",
     	"mw-widgets-titleinput-description-new-page": "صفحه هله‌لیک یوخدور",
    -	"mw-widgets-titleinput-description-redirect": "$1-ه داشی"
    +	"mw-widgets-titleinput-description-redirect": "$1-ه داشی",
    +	"log-action-filter-block": "باغلانما نوعو:",
    +	"log-action-filter-managetags": "ایداره نوعو:",
    +	"log-action-filter-move": "حرکت نوعو:",
    +	"log-action-filter-upload": "یۆکله‌مه نوعو",
    +	"log-action-filter-managetags-create": "اِتیکت یاراتما",
    +	"log-action-filter-managetags-delete": "اِتیکت سیلمه",
    +	"log-action-filter-managetags-activate": "اِتیکت چالیشدیرما",
    +	"log-action-filter-managetags-deactivate": "اِتیکت دَییشدیرمه",
    +	"log-action-filter-upload-upload": "یئنی یۆکله‌مه",
    +	"log-action-filter-upload-overwrite": "یئنیدن یۆکله‌مه"
     }
    diff --git a/languages/i18n/ba.json b/languages/i18n/ba.json
    index 69a82c5312..7d76b81508 100644
    --- a/languages/i18n/ba.json
    +++ b/languages/i18n/ba.json
    @@ -472,6 +472,7 @@
     	"nocookiesnew": "Иҫәп яҙыуы яһалды, ләкин һеҙ танылмағанһығыҙ. {{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уларға рөхсәт бирегеҙ, шунан яңынан ҡатнашыусы исеме һәм серһүҙ менән танылығыҙ.",
     	"nocookieslogin": "{{SITENAME}} ҡатнашыусыны таныу өсөн «cookies» ҡуллана. Һеҙҙә «cookies» тыйылған. Зинһар, уға рөхсәт бирегеҙ һәм яңынан керегеҙ.",
     	"nocookiesfornew": "Иҫәп яҙмаһы булдырылманы, сөнки уның сығанағын тикшереү мөмкин түгел.\n\"Сookies\" эшләй икәнлеген тикшерегеҙ, битте яңыртығыҙ  һәм яңынан ҡабатлап ҡарағыҙ.",
    +	"createacct-loginerror": "Иҫәп яҙмаһы уңышлы төҙөлдө, әммә һеҙ автоматик рәүештә системаға инә алманығыҙ. [[Special:UserLogin|Ҡулдан авторлаштырыуҙы үтегеҙ]].",
     	"noname": "Ғәмәлдә булған ҡатнашыусы исемен керетмәнегеҙ.",
     	"loginsuccesstitle": "Танышыу уңышлы үтте",
     	"loginsuccess": "Хәҙер һеҙ $1 исеме менән эшләйһегеҙ.",
    @@ -593,6 +594,7 @@
     	"passwordreset-emailsentusername": "Әгәр был ҡатнашыусының исеменә бәйле  электрон почтаһының адресы булһа, ул саҡта  серһүҙҙе тергеҙеү өсөн  хат ебәреләсәк.",
     	"passwordreset-emailsent-capture": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон хат ебәрелде, уның тексы түбәндә бирелә:",
     	"passwordreset-emailerror-capture": "Серһүҙҙе ташлау тураһында хәбәр итеүсе электрон хат булдырылғайны, ләкин уны  {{GENDER:$2|kullanıcıya}} түбәндәге сәбәп арҡаһында ебәреп булманы: $1",
    +	"passwordreset-invalideamil": "Электрон почта адресы ҡабул ителмәй",
     	"changeemail": "Электрон почта адресын үҙгәртергә",
     	"changeemail-header": "Электрон почта адресын үҙгәртеү",
     	"changeemail-passwordrequired": "Әлеге үҙгәрештәрҙе раҫлау өсөн, Һеҙгә ҡулланыусының серһүҙен яҙырға кәрәк",
    @@ -1186,7 +1188,7 @@
     	"right-override-export-depth": "5-се тәрәнлеккә тиклем бәйле биттәре менән бергә биттәрҙе сығарыу",
     	"right-sendemail": "Башҡа ҡатнашыусыларға электрон почта аша хат ебәреү",
     	"right-passwordreset": "Серһүҙҙе яңыртыу осраҡтарын ҡарау",
    -	"right-managechangetags": "[[Special:Tags|билдәләр]] мәғлүмәттәр базаһында төҙөү һәм юйыу",
    +	"right-managechangetags": "[[Special:Tags|Билдәләрҙе]] төҙөү һәм (де)активация",
     	"right-applychangetags": " [[Special:Tags|тамғаһын]] үҙегеҙҙең төҙөтеү менән ҡулланырға",
     	"right-changetags": "Айырым үҙгәртеүҙәрҙә һәм журнал яҙмаланыда[[Special:Tags|тамғаһын]] өҫтәү һәм юйыу",
     	"right-deletechangetags": "[[Special:Tags|билдәләр]] мәғлүмәттәр базаһында төҙөү һәм юйыу",
    @@ -1267,9 +1269,10 @@
     	"action-viewmyprivateinfo": "һеҙҙең шәхси мәғлүмәтте байҡау",
     	"action-editmyprivateinfo": "һеҙҙең шәхси мәғлүмәтте мөхәррирләү",
     	"action-editcontentmodel": "Биттең контент моделен мөхәррирләү",
    -	"action-managechangetags": "Мәғлүмәт базаһында тамға булдырыу һәм юйыу",
    +	"action-managechangetags": "билдәләрҙе төҙөү һәм (де)активация",
     	"action-applychangetags": "Һеҙҙең үҙгәрештәр ТЕГын булдырырға",
     	"action-changetags": "Айырым үҙгәртеүҙәрҙә һәм журнал яҙмаланыда тег өҫтәү һәм юйыу",
    +	"action-deletechangetags": "билдәләрҙе мәғлүмәт базаһынан юйыу",
     	"nchanges": "$1 {{PLURAL:$1|үҙгәртәү|үҙгәртеүҙәр}}",
     	"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|һеҙҙең һуңғы визит}}",
     	"enhancedrc-history": "тарих",
    @@ -3581,6 +3584,7 @@
     	"log-action-filter-block-block": "Бикләргә",
     	"log-action-filter-block-reblock": "Бикте үҙгәртеү",
     	"log-action-filter-block-unblock": "Бикте алырға",
    +	"log-action-filter-contentmodel-change": "Эстәлек моделен үҙгәртергә",
     	"log-action-filter-delete-delete": "Битте юйыуҙар",
     	"log-action-filter-delete-restore": "Битте тергеҙеү",
     	"log-action-filter-delete-event": "Журналды юйыу",
    @@ -3602,6 +3606,7 @@
     	"authmanager-create-disabled": "Иҫәп яҙмаһын булдырыу бикләнгән.",
     	"authmanager-authplugin-setpass-failed-title": "Серһүҙҙе үҙгәртеү хатаһы",
     	"authmanager-userdoesnotexist": "\"$1\" иҫәп яҙмаһы теркәлмәгән.",
    +	"authmanager-domain-help": "Тышҡы аутентификация домены (өҫтәмә).",
     	"authmanager-email-label": "Электрон почта адресы",
     	"authmanager-email-help": "Электрон почта адресы",
     	"authmanager-realname-label": "Ысын исемегеҙ",
    @@ -3611,5 +3616,5 @@
     	"changecredentials-submit": "Иҫәп мәғлүмәттәрен үҙгәртеү",
     	"removecredentials": "Иҫәп мәғлүмәттәрен юйырға",
     	"removecredentials-submit": "Иҫәп мәғлүмәттәрен юйырға",
    -	"credentialsform-account": "Иҫәп хужаһы"
    +	"credentialsform-account": "Иҫәп яҙмаһы исеме:"
     }
    diff --git a/languages/i18n/be-tarask.json b/languages/i18n/be-tarask.json
    index a0c09a2202..9ae7f37a05 100644
    --- a/languages/i18n/be-tarask.json
    +++ b/languages/i18n/be-tarask.json
    @@ -509,8 +509,8 @@
     	"pt-login-continue-button": "Працягваць уваход",
     	"pt-createaccount": "Стварыць рахунак",
     	"pt-userlogout": "Выйсьці",
    -	"php-mail-error-unknown": "Узьнікла невядомая памылка ў функцыі PHP mail()",
    -	"user-mail-no-addy": "Спроба даслаць электронны ліст без адрасу дастаўкі",
    +	"php-mail-error-unknown": "Невядомая памылка ў PHP-функцыі mail().",
    +	"user-mail-no-addy": "Спроба даслаць электронны ліст бяз адрасу дастаўкі.",
     	"user-mail-no-body": "Спроба даслаць ліст з пустым або надзвычай кароткім зьместам.",
     	"changepassword": "Зьмяніць пароль",
     	"resetpass_announce": "Для завяршэньня ўваходу ў сыстэму Вы мусіце ўвесьці новы пароль.",
    @@ -584,6 +584,12 @@
     	"passwordreset-emailsent-capture": "Ліст пра скіданьне паролю быў дасланы, што паказана ніжэй.",
     	"passwordreset-emailerror-capture": "Ліст пра скіданьне паролю быў створаны і паказаны ніжэй, але не ўдалося адправіць яго {{GENDER:$2|ўдзельніку|ўдзельніцы}}: $1",
     	"passwordreset-emailsent-capture2": "{{PLURAL:$1|Электронны ліст|Электронныя лісты}} скіданьня паролю {{PLURAL:$1|быў дасланы|былі дасланыя}}. {{PLURAL:$1|Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя ніжэй.",
    +	"passwordreset-emailerror-capture2": "Не атрымалася даслаць {{GENDER:$2|удзельніку|удзельніцы}} ліст электроннай поштай: $1 {{PLURAL:$3|Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя ніжэй.",
    +	"passwordreset-nocaller": "Мусіць быць пададзены той, хто робіць выклік",
    +	"passwordreset-nosuchcaller": "Аўтар выкліку не існуе: $1",
    +	"passwordreset-ignored": "Скіданьне паролю не адбылося. Магчыма, ня быў наладжаны пастаўшчык?",
    +	"passwordreset-invalideamil": "Няслушны адрас электроннай пошты",
    +	"passwordreset-nodata": "Не былі пададзеныя ні імя ўдзельніка, ні адрас электроннай пошты",
     	"changeemail": "Зьмяніць або выдаліць адрас электроннай пошты",
     	"changeemail-header": "Запоўніце гэтую форму, каб зьмяніць ваш адрас электроннай пошты. Калі вы жадаеце выдаліць адрас электроннай пошты, далучаны да вашага рахунку, пакіньце поле новага адрасу электроннай пошты пустым пры запаўненьні формы.",
     	"changeemail-passwordrequired": "Вам трэба будзе ўвесьці ваш пароль, каб пацьвердзіць гэтую зьмену.",
    @@ -627,7 +633,9 @@
     	"minoredit": "Гэта дробная праўка",
     	"watchthis": "Назіраць за гэтай старонкай",
     	"savearticle": "Захаваць старонку",
    +	"savechanges": "Захаваць зьмены",
     	"publishpage": "Апублікаваць старонку",
    +	"publishchanges": "Апублікаваць зьмены",
     	"preview": "Папярэдні прагляд",
     	"showpreview": "Праглядзець",
     	"showdiff": "Паказаць зьмены",
    @@ -1219,8 +1227,8 @@
     	"rightslogtext": "Гэта журнал зьменаў правоў удзельнікаў.",
     	"action-read": "чытаньне гэтай старонкі",
     	"action-edit": "рэдагаваньне гэтай старонкі",
    -	"action-createpage": "стварэньне старонак",
    -	"action-createtalk": "стварэньне старонак абмеркаваньняў",
    +	"action-createpage": "стварэньне гэтай старонкі",
    +	"action-createtalk": "стварэньне гэтай старонкі абмеркаваньня",
     	"action-createaccount": "стварэньне гэтага рахунку ўдзельніка",
     	"action-autocreateaccount": "аўтаматычнае стварэньне гэтага рахунку вонкавага ўдзельніка",
     	"action-history": "прагляд гісторыі гэтай старонкі",
    @@ -1263,6 +1271,7 @@
     	"action-managechangetags": "стварэньне і (дэ)актывацыю метак",
     	"action-applychangetags": "дадаваньне метак пры рэдагаваньні",
     	"action-changetags": "дадаваньне і выдаленьне адвольных метак да асобных вэрсіяў і запісаў у журнале падзеяў",
    +	"action-deletechangetags": "выдаленьне метак з базы зьвестак",
     	"nchanges": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
     	"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|з апошняга візыту}}",
     	"enhancedrc-history": "гісторыя",
    @@ -1435,6 +1444,8 @@
     	"upload-http-error": "Узьнікла памылка HTTP: $1",
     	"upload-copy-upload-invalid-domain": "Капіяваньне загрузак не дазволенае ў гэтым дамэне.",
     	"upload-foreign-cant-upload": "Гэтая вікі не наладжаная для загрузкі файлаў у запытанае вонкавае сховішча файлаў.",
    +	"upload-foreign-cant-load-config": "Не атрымалася загрузіць канфігурацыю для загрузкі файлаў у вонкавае сховішча.",
    +	"upload-dialog-disabled": "Загрузка файлаў з дапамогай гэтага дыялёгу адключаная ў гэтай вікі.",
     	"upload-dialog-title": "Загрузка файла",
     	"upload-dialog-button-cancel": "Адмяніць",
     	"upload-dialog-button-done": "Зроблена",
    @@ -1873,6 +1884,8 @@
     	"trackingcategories-msg": "Катэгорыя, якая патрабуе ўвагі",
     	"trackingcategories-name": "Назва паведамленьня",
     	"trackingcategories-desc": "Крытэр уключэньня ў катэгорыю",
    +	"restricted-displaytitle-ignored": "Старонкі, дзе ігнаруюцца назвы для адлюстраваньня",
    +	"restricted-displaytitle-ignored-desc": "Старонка ігнаруе <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, бо ён не супадае зь цяперашняй назвай старонкі.",
     	"noindex-category-desc": "Гэтая старонка не індэксуецца пошукавымі робатамі, таму што на ёй маецца магічнае слова <code><nowiki>__NOINDEX__</nowiki></code>, а старонка знаходзіцца ў прасторы назваў, дзе дазволны гэты сьцяг.",
     	"index-category-desc": "На старонцы знаходзіцца магічнае слова <code><nowiki>__INDEX__</nowiki></code> (пры гэтым старонка знаходзіцца ў прасторы назваў, дзе дазволены гэты сьцяг), таму яна індэксуецца пошукавымі робатамі ў тых выпадках, калі звычайна гэтага не адбываецца.",
     	"post-expand-template-inclusion-category-desc": "Памер старонкі перавысіў <code>$wgMaxArticleSize</code> пасьля разгортваньня ўсіх шаблёнаў, таму некаторыя шаблёны не былі паказаныя цалкам.",
    @@ -1997,6 +2010,7 @@
     	"rollbacklinkcount": "адкаціць $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}",
     	"rollbacklinkcount-morethan": "адкаціць больш за $1 {{PLURAL:$1|рэдагаваньне|рэдагаваньні|рэдагаваньняў}}",
     	"rollbackfailed": "Памылка адкату",
    +	"rollback-missingparam": "У запыце адсутнічаюць абавязковыя парамэтры.",
     	"cantrollback": "Немагчыма адкаціць зьмену; апошні рэдактар — адзіны аўтар гэтай старонкі.",
     	"alreadyrolled": "Немагчыма адкаціць апошнюю зьмену [[:$1]], якую {{GENDER:$2|зрабіў|зрабіла}} [[User:$2|$2]] ([[User talk:$2|гутаркі]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); нехта іншы ўжо зьмяніў старонку альбо адкаціў зьмены.\n\nАпошнія зьмены зробленыя [[User:$3|$3]] ([[User talk:$3|гутаркі]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     	"editcomment": "Кароткае апісаньне зьменаў было: <em>$1</em>.",
    @@ -2015,6 +2029,7 @@
     	"changecontentmodel-success-text": "Тып зьместу [[:$1]] быў зьменены.",
     	"changecontentmodel-cannot-convert": "Зьмест [[:$1]] ня можа быць ператвораны ў тып $2.",
     	"changecontentmodel-nodirectediting": "Мадэль зьместу $1 не падтрымлівае наўпроставае рэдагаваньне",
    +	"changecontentmodel-emptymodels-title": "Няма даступных мадэляў зьместу",
     	"log-name-contentmodel": "Журнал зьменаў мадэляў зьместу",
     	"log-description-contentmodel": "Падзеі, зьвязаныя з мадэлямі зьместу старонак",
     	"logentry-contentmodel-change": "$1 {{GENDER:$2|зьмяніў|зьмяніла}} мадэль зьместу старонкі $3 з «$4» на «$5»",
    @@ -3568,6 +3583,6 @@
     	"mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
     	"mw-widgets-titleinput-description-new-page": "старонка яшчэ не існуе",
     	"mw-widgets-titleinput-description-redirect": "перанакіраваньне на $1",
    -	"api-error-blacklisted": "Калі ласка, выбярыце іншую, апісальную назву.",
    -	"randomrootpage": "Выпадковая карэнная старонка"
    +	"randomrootpage": "Выпадковая карэнная старонка",
    +	"changecredentials": "Зьмена ўліковых зьвестак"
     }
    diff --git a/languages/i18n/be.json b/languages/i18n/be.json
    index 96f712b579..fcf7f32764 100644
    --- a/languages/i18n/be.json
    +++ b/languages/i18n/be.json
    @@ -2134,8 +2134,8 @@
     	"whatlinkshere-prev": "{{PLURAL:$1|папярэдняя|папярэднія $1}}",
     	"whatlinkshere-next": "{{PLURAL:$1|наступная|наступныя $1}}",
     	"whatlinkshere-links": "← спасылкі",
    -	"whatlinkshere-hideredirs": "$1 перанакіраваньні",
    -	"whatlinkshere-hidetrans": "$1 уключэньні",
    +	"whatlinkshere-hideredirs": "$1 перасылкі",
    +	"whatlinkshere-hidetrans": "$1 уключэнні",
     	"whatlinkshere-hidelinks": "$1 спасылкі",
     	"whatlinkshere-hideimages": "$1 спасылкі на выявы",
     	"whatlinkshere-filters": "Фільтры",
    diff --git a/languages/i18n/bg.json b/languages/i18n/bg.json
    index 40c60bf5fc..dc49adff26 100644
    --- a/languages/i18n/bg.json
    +++ b/languages/i18n/bg.json
    @@ -522,6 +522,8 @@
     	"resetpass_submit": "Избиране на парола и влизане",
     	"changepassword-success": "Паролата ви беше променена успешно!",
     	"changepassword-throttled": "Направили сте твърде много опити да въведете паролата за тази сметка.\nНеобходимо е да изчакате $1 преди да опитате отново.",
    +	"botpasswords-createnew": "Създаване на нова бот парола",
    +	"botpasswords-editexisting": "Редактиране на съществуваща бот парола",
     	"botpasswords-label-appid": "Име на бота:",
     	"botpasswords-label-create": "Създаване",
     	"botpasswords-label-update": "Обновяване",
    @@ -558,6 +560,7 @@
     	"passwordreset-emailsentusername": "Ако това потребителско име е свързано с електронна поща, е изпратено писмо за възстановяване на паролата.",
     	"passwordreset-emailsent-capture": "По-долу е показано електронното писмо за възстановяване на паролата, което беше изпратено.",
     	"passwordreset-emailerror-capture": "По-долу е показано създадено електронно писмо за възстановяване на паролата, което не беше изпратено на {{GENDER:$2|потребителя}}: $1",
    +	"passwordreset-invalideamil": "Неправилен email адрес",
     	"changeemail": "Промяна или премахване на адреса за е-поща",
     	"changeemail-header": "Промяна на адреса за е-поща на сметката",
     	"changeemail-passwordrequired": "Трябва да въведете паролата си, за да потвърдите тази промяна.",
    @@ -1770,7 +1773,7 @@
     	"deletecomment": "Причина:",
     	"deleteotherreason": "Друга/допълнителна причина:",
     	"deletereasonotherlist": "Друга причина",
    -	"deletereason-dropdown": "*Стандартни причини за изтриване\n** Спам\n** По молба на автора\n** Нарушение на авторски права\n** Вандализъм\n** По желание на автора\n** Грешно пренасочване",
    +	"deletereason-dropdown": "*Стандартни причини за изтриване\n** Спам\n** Вандализъм\n** Нарушение на авторски права\n** По молба на автора\n** Грешно пренасочване",
     	"delete-edit-reasonlist": "Редактиране на причините за изтриване",
     	"delete-toobig": "Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Изтриването на такива страници е ограничено, за да се предотвратят евентуални поражения на {{SITENAME}}.",
     	"delete-warning-toobig": "Тази страница има голяма редакционна история с над $1 {{PLURAL:$1|версия|версии}}. Възможно е изтриването да наруши някои операции в базата данни на {{SITENAME}}; необходимо е особено внимание при продължаване на действието.",
    @@ -2752,6 +2755,7 @@
     	"confirm-watch-top": "Добавяне на страницата в списъка ви за наблюдение?",
     	"confirm-unwatch-button": "Потвърждаване",
     	"confirm-unwatch-top": "Премахване на страницата от списъка ви за наблюдение?",
    +	"confirm-rollback-button": "OK",
     	"quotation-marks": "„$1“",
     	"imgmultipageprev": "← предишна страница",
     	"imgmultipagenext": "следваща страница →",
    @@ -3140,5 +3144,12 @@
     	"log-action-filter-block-reblock": "Промяна на блокирането",
     	"log-action-filter-block-unblock": "Отблокиране",
     	"log-action-filter-upload-upload": "Ново качване",
    -	"log-action-filter-upload-overwrite": "Повторно качване"
    +	"log-action-filter-upload-overwrite": "Повторно качване",
    +	"authmanager-authplugin-setpass-bad-domain": "Невалиден домейн.",
    +	"authmanager-email-label": "Е-поща",
    +	"authmanager-email-help": "Електронна поща",
    +	"authmanager-realname-label": "Истинско име",
    +	"authprovider-resetpass-skip-label": "Пропусни",
    +	"specialpage-securitylevel-not-allowed-title": "Не е позволено",
    +	"cannotauth-not-allowed-title": "Достъпът е отказан"
     }
    diff --git a/languages/i18n/bn.json b/languages/i18n/bn.json
    index 5eaea029f7..9934a3771f 100644
    --- a/languages/i18n/bn.json
    +++ b/languages/i18n/bn.json
    @@ -453,8 +453,11 @@
     	"createaccountreason": "কারণ:",
     	"createacct-reason": "কারণ",
     	"createacct-reason-ph": "কেন আপনি আরেকটি অ্যাকাউন্ট তৈরি করছেন",
    +	"createacct-reason-help": "অ্যাকাউন্ট তৈরির লগে দেখানো বার্তা",
     	"createacct-submit": "আপনার অ্যাকাউন্ট তৈরি করুন",
     	"createacct-another-submit": "অ্যাকাউন্ট তৈরি করুন",
    +	"createacct-continue-submit": "অ্যাকাউন্ট তৈরি চালিয়ে যান",
    +	"createacct-another-continue-submit": "অ্যাকাউন্ট তৈরি চালিয়ে যান",
     	"createacct-benefit-heading": "{{SITENAME}} আপনার মত লোকের দ্বারাই তৈরি।",
     	"createacct-benefit-body1": "{{PLURAL:$1|টি সম্পাদনা}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|টি পাতা}}",
    @@ -512,6 +515,7 @@
     	"createacct-another-realname-tip": "আসল নাম ঐচ্ছিক।\nআপনি যদি তা দিতে চান, তাহলে তা ব্যবহারকারীকে তাদের কাজের জন্য স্বীকৃতিদানে ব্যবহার করা হবে।",
     	"pt-login": "প্রবেশ",
     	"pt-login-button": "প্রবেশ",
    +	"pt-login-continue-button": "প্রবেশ অব্যাহত রাখুন",
     	"pt-createaccount": "অ্যাকাউন্ট তৈরি করুন",
     	"pt-userlogout": "প্রস্থান",
     	"php-mail-error-unknown": "পিএইচপির mail() কার্যে অজ্ঞাত ত্রুটি।",
    @@ -562,7 +566,7 @@
     	"resetpass-abort-generic": "পাসওয়ার্ড পরিবর্তন একটি এক্সটেনশনের কারণে স্থগিত করা হয়েছে।",
     	"resetpass-expired": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে। অনুগ্রহ করে নতুন পাসওয়ার্ড নির্ধারণ করুন।",
     	"resetpass-expired-soft": "আপনার পাসওয়ার্ডের মেয়াদ উত্তীর্ণ হয়েছে এবং আপনাকে একটি নতুন পাসওয়ার্ড নির্ধারণ করতে হবে। অনুগ্রহ করে এখনই একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে পরিবর্তন করতে চাইলে \"{{int:authprovider-resetpass-skip-label}}\" বাটনে ক্লিক করুন।",
    -	"resetpass-validity-soft": "দয়া করে একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে করার জন্য \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
    +	"resetpass-validity-soft": "আপনার পাসওয়ার্ড বৈধ নয়: $1\n\nদয়া করে একটি নতুন পাসওয়ার্ড নির্ধারণ করুন অথবা পরে করার জন্য \"{{int:authprovider-resetpass-skip-label}}\" ক্লিক করুন।",
     	"passwordreset": "পাসওয়ার্ড রিসেট",
     	"passwordreset-text-one": "আপনার পাসওয়ার্ড পুনরায় সেট করতে এই ফর্মটি পূরণ করুন।",
     	"passwordreset-text-many": "{{PLURAL:$1|ইমেইলের মাধ্যমে একটি অস্থায়ী পাসওয়ার্ড পেতে ঘরগুলির একটি পূরণ করুন।}}",
    @@ -581,6 +585,8 @@
     	"passwordreset-emailsentusername": "যদি এই ব্যবহারকারী নামের সাথে ই-মেইল ঠিকানা সংযুক্ত করা থাকে, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
     	"passwordreset-emailsent-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল করা হয়েছে, যা নিচে দেখানো হচ্ছে।",
     	"passwordreset-emailerror-capture": "স্মরণ করিয়ে দেয়ার জন্য একটি ইমেইল তৈরী করা হয়েছিল, যা নিচে দেখানো হচ্ছে, তবে $1 {{GENDER:$2|ব্যবহারকারীকে}} এটি পাঠানো যায়নি!",
    +	"passwordreset-nocaller": "একটি আহ্বানকারী প্রদান করা আবশ্যক",
    +	"passwordreset-nosuchcaller": "আহ্বানকারীর অস্তিত্ব নেই: $1",
     	"passwordreset-invalideamil": "ভুল ইমেইল ঠিকানা",
     	"changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
     	"changeemail-header": "আপনার ইমেল ঠিকানা পরিবর্তন করতে এই ফরমটি পূরণ করুন। আপনি যদি আপনার একাউন্ট থেকে যে কোন ইমেল ঠিকানার এসোসিয়েশন অপসারণ করতে চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
    @@ -623,7 +629,9 @@
     	"minoredit": "এটি একটি অনুল্লেখ্য সম্পাদনা",
     	"watchthis": "এই পাতাটি নজরে রাখুন",
     	"savearticle": "সংরক্ষণ",
    +	"savechanges": "পরিবর্তন সংরক্ষণ",
     	"publishpage": "পাতা প্রকাশ করুন",
    +	"publishchanges": "পরিবর্তন প্রকাশ করুন",
     	"preview": "প্রাকদর্শন",
     	"showpreview": "প্রাকদর্শন",
     	"showdiff": "পরিবর্তনসমূহ",
    @@ -710,7 +718,7 @@
     	"sectioneditnotsupported-text": "এই সম্পাদনা পাতায় অনুচ্ছেদ সম্পাদনা সমর্থন করে না",
     	"permissionserrors": "অনুমতি ত্রুটিসমূহ",
     	"permissionserrorstext": "আপনার এটা করার অনুমতি নেই, নিচের {{PLURAL:$1|টি কারণের|টি কারণের}} জন্য:",
    -	"permissionserrorstext-withaction": "আপনার $2 করার অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}}:",
    +	"permissionserrorstext-withaction": "আপনার $2 করার অনুমতি নেই, যার {{PLURAL:$1|কারণ|কারণসমূহ}} হল:",
     	"recreate-moveddeleted-warn": "'''সতর্কীকরণ: আপনি এমন একটি পাতা পুনরায় তৈরি করছেন যা পূর্বে অপসারণ করা হয়েছিল।'''\n\nআপনি পাতাটি সম্পাদনা চালিয়ে যাওয়া ঠিক হবে কিনা, তা বিবেচনা করুন।\nআপনার সুবিধার্থে পাতাটির অপলুপ্তি লগ এখানে দেয়া হলো:",
     	"moveddeleted-notice": "এই পাতাটি অপসারণ করা হয়েছে।\nসূত্র হিসেবে নিচে এ পাতার অবলুপ্তি লগ দেওয়া হলো।",
     	"moveddeleted-notice-recent": "দুঃখিত, এই পাতাটি সাম্প্রতি অপসারিত হয়েছে (সর্বশেষ ২৪ ঘণ্টায়)।\nসূত্র হিসেবে নিচে এই পাতা অপসারণ ও স্থানান্তর লগ দেয়া হয়েছে।",
    @@ -841,7 +849,7 @@
     	"revdelete-submit": "নির্বাচিত {{PLURAL:$1|সংশোধনে|সংশোধসমূহে}} প্রয়োগ করো",
     	"revdelete-success": "সংশোধনের দৃশ্যমানতা হালনাগাদ করা হয়েছে।",
     	"revdelete-failure": "সংশোধনের দৃশ্যমানতা হালনাগাদ করা যায়নি:\n$1",
    -	"logdelete-success": "'''ঘটনা দৃশ্যমানতা সফলভাবে স্থাপন করা হয়েছে।'''",
    +	"logdelete-success": "দৃশ্যমানতা নির্ধারনের লগ।",
     	"logdelete-failure": "'''লগ-এর দৃশ্যমানতা নির্ধারণ সম্ভব হচ্ছে না:'''\n$1",
     	"revdel-restore": "দৃশ্যমানতা পরিবর্তন করো",
     	"pagehist": "পাতার ইতিহাস",
    @@ -1173,7 +1181,7 @@
     	"right-override-export-depth": "৫ম স্তর পর্যন্ত সংযুক্তিসহ একটি পাতা রপ্তানী করুন",
     	"right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
     	"right-passwordreset": "পাসওয়ার্ড পুনঃস্থাপনের ইমেইল দেখুন",
    -	"right-managechangetags": "ডাটাবেস থেকে [[Special:Tags|ট্যাগ]] তৈরি ও অপসারণ করুন",
    +	"right-managechangetags": "[[Special:Tags|ট্যাগ]] তৈরি ও সক্রিয়/নিষ্ক্রিয় করুন",
     	"right-applychangetags": "সম্পাদনার সাথে [[Special:Tags|ট্যাগ]] যুক্ত করুন",
     	"right-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে [[Special:Tags|ট্যাগ]] সংযোজন ও অপসারণ করুন",
     	"grant-group-email": "ইমেইল পাঠান",
    @@ -1194,8 +1202,8 @@
     	"rightslogtext": "এটি ব্যবহারকারী অধিকারে আনা পরিবর্তনগুলির একটি লগ।",
     	"action-read": "এই পাতাটি পড়ুন",
     	"action-edit": "এই পাতাটি সম্পাদনা",
    -	"action-createpage": "পাতা তৈরি করো",
    -	"action-createtalk": "আলাপের পাতা তৈরি করো",
    +	"action-createpage": "এই পাতাটি তৈরি",
    +	"action-createtalk": "এই আলাপের পাতাটি তৈরি",
     	"action-createaccount": "এই ব্যবহারকারী একাউন্টটি তৈরি করো",
     	"action-history": "এই পাতার ইতিহাস দেখাও",
     	"action-minoredit": "এই সম্পাদনাটি অনুল্লেখ্য হিসেবে চিহ্নিত করো",
    @@ -1234,7 +1242,7 @@
     	"action-viewmyprivateinfo": "আপনার ব্যক্তিগত তথ্য দেখুন",
     	"action-editmyprivateinfo": "আপনার ব্যক্তিগত তথ্য সম্পাদনা করুন",
     	"action-editcontentmodel": "পাতার কন্টেন্ট মডেল সম্পাদনা করুন",
    -	"action-managechangetags": "ডাটাবেস থেকে ট্যাগ তৈরি ও অপসারণ করুন",
    +	"action-managechangetags": "ট্যাগ তৈরি ও সক্রিয়/নিষ্ক্রিয়",
     	"action-applychangetags": "আপনার পরিবর্তনগুলোর সাথে ট্যাগ সংযোজন করুন",
     	"action-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে ট্যাগ সংযোজন ও অপসারণ করুন",
     	"nchanges": "$1টি {{PLURAL:$1|পরিবর্তন}}",
    @@ -2075,6 +2083,7 @@
     	"sp-contributions-username": "আইপি (IP) ঠিকানা অথবা ব্যবহারকারীর নাম:",
     	"sp-contributions-toponly": "শুধুমাত্র সেই সম্পাদনাগুলি দেখাও যেগুলো সাম্প্রতিক সংস্করণের অন্তর্ভুক্ত",
     	"sp-contributions-newonly": "শুধুমাত্র পাতা সৃষ্টি করা সম্পাদনাগুলি দেখাও",
    +	"sp-contributions-hideminor": "অনুল্লেখ্য পরিবর্তন আড়াল করুন",
     	"sp-contributions-submit": "অনুসন্ধান",
     	"whatlinkshere": "সংযোগকারী পাতাসমূহ",
     	"whatlinkshere-title": "যে পাতাগুলি থেকে \"$1\"-এর প্রতি সংযোগ আছে",
    @@ -2352,7 +2361,7 @@
     	"import-nonewrevisions": "কোনো সংস্করণ আমদানী করা হয়নি।",
     	"xml-error-string": "$1 যে লাইনে $2, কলামে $3 (বাইট $4): $5",
     	"import-upload": "XML ডাটা আপলোড",
    -	"import-token-mismatch": "সেশন ডাটা হারিয়ে গিয়েছে।\nঅনুগ্রহ করে পুনরায় চেষ্টা করুন।",
    +	"import-token-mismatch": "সেশন ডাটা হারিয়ে গেছে।\n\nআপনি সম্ভবত সংযোগ হারিয়েছেন। <strong>দয়া করে যাচাই করুন যে আপনি এখনও প্রবেশরত রয়েছেন এবং আবার চেষ্টা করুন</strong>। যদি এটি এখনও কাজ না করে, তাহলে দয়া করে [[Special:UserLogout|অ্যাকাউন্ট থেকে প্রস্থান করুন]] এবং আবার অ্যাকাউন্টে প্রবেশ করে চেষ্টা করুন এবং এবং পরীক্ষা করুন যে আপনার ব্রাউজার এই সাইটে কুকি ব্যবহারের অনুমতি দেয়।",
     	"import-invalid-interwiki": "নির্ধারিত উইকি থেকে আমদানী করা যাবে না।",
     	"import-error-edit": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ আপনার এটি সম্পাদনা করার অনুমতি নেই।",
     	"import-error-create": "\"$1\" পাতাটি আমদানি করা যায়নি কারণ আপনার এটি তৈরী করার অনুমতি নেই।",
    @@ -3479,7 +3488,6 @@
     	"mw-widgets-dateinput-placeholder-month": "বববব-মম",
     	"mw-widgets-titleinput-description-new-page": "পাতা এখনো বিদ্যমান নয়",
     	"mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত",
    -	"api-error-blacklisted": "অনুগ্রহ করে অপর কোনো বর্ণনামূলক নাম ব্যবহার করুন।",
     	"sessionmanager-tie": "একাধিক অনুরোধের প্রমাণীকরণের ধরন একত্রিত করা যাবে না: $1।",
     	"sessionprovider-generic": "$1টি সেশন",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "কুকি-ভিত্তিক সেশন",
    @@ -3507,12 +3515,29 @@
     	"log-action-filter-rights-autopromote": "স্বয়ংক্রিয় পরিবর্তন",
     	"log-action-filter-upload-upload": "নতুন আপলোড",
     	"log-action-filter-upload-overwrite": "পুনঃআপলোড",
    +	"authmanager-authplugin-setpass-bad-domain": "অবৈধ ডোমেইন।",
    +	"authmanager-autocreate-noperm": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি মঞ্জুরিপ্রাপ্ত নয়।",
     	"authmanager-userdoesnotexist": "ব্যবহারকারী অ্যাকাউন্ট \"$1\" অনিবন্ধিত।",
    +	"authmanager-email-label": "ইমেইল",
     	"authmanager-email-help": "ইমেইল ঠিকানা",
    +	"authmanager-realname-label": "প্রকৃত নাম",
    +	"authmanager-realname-help": "ব্যবহারকারীর প্রকৃত নাম",
    +	"authmanager-provider-temporarypassword": "অস্থায়ী পাসওয়ার্ড",
     	"authprovider-resetpass-skip-label": "উপেক্ষা করো",
     	"authprovider-resetpass-skip-help": "পাসওয়ার্ড পুনঃস্থাপন করা উপেক্ষা করুন।",
     	"authform-wrongtoken": "ভুল টোকেন",
    +	"specialpage-securitylevel-not-allowed-title": "অনুমতি নেই",
    +	"cannotauth-not-allowed-title": "অনুমতি অস্বীকৃত",
    +	"cannotauth-not-allowed": "আপনি এই পাতাটি ব্যবহার করতে অনুমতিপ্রাপ্ত নন।",
    +	"changecredentials": "পরিচয়পত্র পরিবর্তন করুন",
    +	"changecredentials-submit": "পরিচয়পত্র পরিবর্তন করুন",
    +	"changecredentials-invalidsubpage": "$1 বৈধ পরিচয়পত্রের ধরন নয়।",
    +	"changecredentials-success": "আপনার পরিচয়পত্র পরিবর্তিত হয়েছে।",
    +	"removecredentials": "পরিচয়পত্র সরান",
     	"removecredentials-submit": "পরিচয়পত্র সরান",
    +	"removecredentials-invalidsubpage": "$1 বৈধ পরিচয়পত্রের ধরন নয়।",
    +	"removecredentials-success": "আপনার পরিচয়পত্র সরানো হয়েছে।",
    +	"credentialsform-provider": "পরিচয়পত্রের ধরন:",
     	"credentialsform-account": "অ্যাকাউন্টের নাম:",
     	"linkaccounts": "অ্যাকাউন্ট সংযোগ করুন"
     }
    diff --git a/languages/i18n/bs.json b/languages/i18n/bs.json
    index fe4fbfe2a5..480e294cd6 100644
    --- a/languages/i18n/bs.json
    +++ b/languages/i18n/bs.json
    @@ -751,7 +751,7 @@
     	"history-feed-item-nocomment": "$1 u $2",
     	"history-feed-empty": "Tražena stranica ne postoji.\nMoguće da je izbrisana sa wikija, ili preimenovana.\nPokušajte [[Special:Search|pretražiti wiki]] za slične stranice.",
     	"history-edit-tags": "Uredi oznake izabranih verzija",
    -	"rev-deleted-comment": "(uklonjen sažetak izmjene)",
    +	"rev-deleted-comment": "(sažetak izmjene uklonjen)",
     	"rev-deleted-user": "(korisničko ime uklonjeno)",
     	"rev-deleted-event": "(stavka zapisa obrisana)",
     	"rev-deleted-user-contribs": "[korisničko ime ili IP adresa uklonjeni - izmjena sakrivena u spisku doprinosa]",
    @@ -761,7 +761,7 @@
     	"rev-suppressed-text-unhide": "Ova revizija stranice je '''uklonjena'''.\nMožete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisu uklanjanja].\nVi je i dalje možete [$1 vidjeti ovu reviziju] ako želite.",
     	"rev-deleted-text-view": "Revizija ove stranice je '''obrisana'''.\nVi je možete vidjeti; detalji o tome se mogu vidjeti u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisu brisanja].",
     	"rev-suppressed-text-view": "Ova revizija stranice je '''uklonjena'''.\nVi je možete vidjeti; možete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisu uklanjanja].",
    -	"rev-deleted-no-diff": "Ne možete vidjeti ove razlike jer je jedna od revizija '''obrisana'''.\nMožete pregledati detalje u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisima brisanja].",
    +	"rev-deleted-no-diff": "Ne možete vidjeti ovu razliku jer je jedna od izmjena '''obrisana'''.\nDetalji se nalaze u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].",
     	"rev-suppressed-no-diff": "Ne možete vidjeti ove razlike jer je jedna od revizija '''obrisana'''.",
     	"rev-deleted-unhide-diff": "Jedna od revizija u ovom pregledu razlika je '''obrisana'''.\nMožete pregledati detalje u [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} zapisniku brisanja].\nVi još uvijek možete [$1 vidjeti ove razlike] ako želite da nastavite.",
     	"rev-suppressed-unhide-diff": "edna od revizija ove razlike je '''uklonjena'''.\nMožete pogledati detalje u [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} zapisniku uklanjanja].\nVi i dalje možete [$1 vidjeti ove razlike] ako želite da nastavite.",
    @@ -1725,7 +1725,7 @@
     	"listusersfrom": "Prikaži korisnike koji počinju sa:",
     	"listusers-submit": "Prikaži",
     	"listusers-noresult": "Nije pronađen korisnik.",
    -	"listusers-blocked": "(blokiran)",
    +	"listusers-blocked": "({{GENDER:$1|blokiran|blokirana|blokiran}})",
     	"activeusers": "Spisak aktivnih korisnika",
     	"activeusers-intro": "Ovo je spisak korisnika koji su imali neku aktivnost u {{PLURAL:$1|posljednji $1 dan|posljednja $1 dana|posljednjih $1 dana}}.",
     	"activeusers-count": "$1 {{PLURAL:$1|izmjena|izmjene|izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
    @@ -2030,6 +2030,7 @@
     	"sp-contributions-username": "IP adresa ili korisničko ime:",
     	"sp-contributions-toponly": "Prikaži samo najnovije izmjene",
     	"sp-contributions-newonly": "Prikaži samo izmjene kojima su napravljene nove stranice",
    +	"sp-contributions-hideminor": "Sakrij manje izmjene",
     	"sp-contributions-submit": "Traži",
     	"whatlinkshere": "Å ta vodi ovamo",
     	"whatlinkshere-title": "Stranice koje vode na \"$1\"",
    @@ -3251,7 +3252,7 @@
     	"logentry-suppress-revision-legacy": "$1 je tajno {{GENDER:$2|promijenio|promijenila}} vidljivost izmjena na stranici $3",
     	"revdelete-content-hid": "sadržaj je sakriven",
     	"revdelete-summary-hid": "sažetak izmjene je sakriven",
    -	"revdelete-uname-hid": "sažetak izmjene je sakriven",
    +	"revdelete-uname-hid": "korisničko ime je sakriveno",
     	"revdelete-content-unhid": "sadržaj je otkriven",
     	"revdelete-summary-unhid": "sažetak izmjene je otkriven",
     	"revdelete-uname-unhid": "korisničko ime je otkriveno",
    @@ -3480,7 +3481,6 @@
     	"mw-widgets-dateinput-no-date": "Nikakav datum nije izabran",
     	"mw-widgets-titleinput-description-new-page": "stranica još ne postoji",
     	"mw-widgets-titleinput-description-redirect": "preusmjerava na $1",
    -	"api-error-blacklisted": "Molimo izaberite drugačiji, deskriptivniji naziv.",
     	"randomrootpage": "Slučajna root stranica",
     	"log-action-filter-block": "Vrsta blokiranja:",
     	"log-action-filter-delete": "Vrsta brisanja:",
    diff --git a/languages/i18n/ca.json b/languages/i18n/ca.json
    index a332a75903..9bbdba3934 100644
    --- a/languages/i18n/ca.json
    +++ b/languages/i18n/ca.json
    @@ -456,6 +456,7 @@
     	"password-change-forbidden": "No podeu canviar les contrasenyes en aquest wiki.",
     	"externaldberror": "Hi ha hagut un error en la base de dades d'autenticació o bé no teniu permís per a actualitzar el vostre compte extern.",
     	"login": "Inici de sessió",
    +	"login-security": "Verificació de la identitat",
     	"nav-login-createaccount": "Inicia una sessió / crea un compte",
     	"userlogin": "Inicia una sessió / crea un compte",
     	"userloginnocreate": "Inici de sessió",
    @@ -484,8 +485,11 @@
     	"createaccountreason": "Motiu:",
     	"createacct-reason": "Motiu",
     	"createacct-reason-ph": "Per què creeu un altre compte",
    +	"createacct-reason-help": "Missatge mostrat en el registre de creació de comptes",
     	"createacct-submit": "Crea el meu compte",
     	"createacct-another-submit": "Crea un compte",
    +	"createacct-continue-submit": "Continua amb la creació del compte",
    +	"createacct-another-continue-submit": "Continua amb la creació del compte",
     	"createacct-benefit-heading": "{{SITENAME}} és feta per gent com tu.",
     	"createacct-benefit-body1": "{{PLURAL:$1|edició|edicions}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|pàgina|pàgines}}",
    @@ -656,7 +660,9 @@
     	"minoredit": "Aquesta és una modificació menor",
     	"watchthis": "Vigila aquesta pàgina",
     	"savearticle": "Desa la pàgina",
    +	"savechanges": "Desa els canvis",
     	"publishpage": "Publica la pàgina",
    +	"publishchanges": "Publica els canvis",
     	"preview": "Previsualització",
     	"showpreview": "Mostra una previsualització",
     	"showdiff": "Mostra els canvis",
    @@ -3080,6 +3086,8 @@
     	"confirm-watch-top": "Voleu afegir aquesta pàgina a la llista de seguiment?",
     	"confirm-unwatch-button": "D'acord",
     	"confirm-unwatch-top": "Voleu treure aquesta pàgina de la llista de seguiment?",
    +	"confirm-rollback-button": "D'acord",
    +	"confirm-rollback-top": "Voleu revertir les modificacions a la pàgina?",
     	"quotation-marks": "«$1»",
     	"imgmultipageprev": "← pàgina anterior",
     	"imgmultipagenext": "pàgina següent →",
    @@ -3577,7 +3585,6 @@
     	"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
     	"mw-widgets-titleinput-description-new-page": "la pàgina no existeix encara",
     	"mw-widgets-titleinput-description-redirect": "redirigeix a $1",
    -	"api-error-blacklisted": "Trieu un títol diferent, més descriptiu.",
     	"sessionmanager-tie": "No es poden combinar diferents tipus de sol·licituds d'autenticació: $1.",
     	"sessionprovider-generic": "$1 sessions",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basades en galetes",
    @@ -3585,8 +3592,14 @@
     	"randomrootpage": "Pàgina arrel aleatòria",
     	"log-action-filter-block": "Tipus de blocatge:",
     	"log-action-filter-delete": "Tipus de supressió:",
    +	"log-action-filter-import": "Tipus d'importació:",
    +	"log-action-filter-managetags": "Tipus d'acció de gestió d'etiquetes:",
    +	"log-action-filter-move": "Tipus de reanomenament:",
    +	"log-action-filter-newusers": "Tipus de creació de compte:",
     	"log-action-filter-patrol": "Tipus de patrullatge:",
     	"log-action-filter-protect": "Tipus de protecció:",
    +	"log-action-filter-rights": "Tipus de canvi de permisos:",
    +	"log-action-filter-suppress": "Tipus de supressió:",
     	"log-action-filter-upload": "Tipus de càrrega:",
     	"log-action-filter-all": "Tota",
     	"log-action-filter-block-block": "Bloca",
    @@ -3603,6 +3616,21 @@
     	"log-action-filter-protect-unprotect": "Desprotecció",
     	"log-action-filter-upload-upload": "Nova càrrega",
     	"log-action-filter-upload-overwrite": "Torna a carregar",
    +	"authmanager-authn-not-in-progress": "L'autenticació no està en curs o les dades de sessió s'han perdut. Comenceu de nou des del principi.",
    +	"authmanager-authn-no-primary": "Les dades credencials no s'han pogut autenticar.",
    +	"authmanager-authn-autocreate-failed": "Ha fallat la creació automàtica d'un compte local: $1",
     	"authmanager-realname-label": "Nom real",
    -	"authmanager-realname-help": "Nom real de l'usuari"
    +	"authmanager-realname-help": "Nom real de l'usuari",
    +	"authmanager-provider-temporarypassword": "Contrasenya temporal",
    +	"authprovider-resetpass-skip-label": "Omet",
    +	"authpage-cannot-login-continue": "No es pot continuar amb l'inicio de sessió. Probablement la vostra sessió ha expirat.",
    +	"authpage-cannot-create-continue": "No es pot prosseguir la creació del compte. Probablement la vostra sessió ha expirat.",
    +	"changecredentials": "Canvi de dades credencials",
    +	"changecredentials-submit": "Canvia les dades credencials",
    +	"credentialsform-provider": "Tipus de dades credencials:",
    +	"credentialsform-account": "Nom del compte:",
    +	"linkaccounts-submit": "Enllaça els comptes",
    +	"unlinkaccounts": "Desenllaça els comptes",
    +	"unlinkaccounts-success": "El compte s'ha desenllaçat.",
    +	"authenticationdatachange-ignored": "No s'ha gestionat el canvi de dades d'autenticació. Potser no s'ha configurat cap proveïdor?"
     }
    diff --git a/languages/i18n/cdo.json b/languages/i18n/cdo.json
    index cde060e50d..2a856d9cee 100644
    --- a/languages/i18n/cdo.json
    +++ b/languages/i18n/cdo.json
    @@ -156,7 +156,7 @@
     	"qbedit": "修改",
     	"qbpageoptions": "茲蜀頁",
     	"qbmyoptions": "我其頁面",
    -	"faq": "經稠碰著其問題",
    +	"faq": "真稠碰著其問題",
     	"faqpage": "Project:稠問其問題",
     	"actions": "動作",
     	"namespaces": "命名空間",
    @@ -717,6 +717,7 @@
     	"linkstoimage": "下底{{PLURAL:$1|$1頁鏈接}}遘茲文件:",
     	"nolinkstoimage": "無鏈接遘茲蜀萆文件其頁面。",
     	"uploadnewversion-linktext": "上傳蜀萆新版本其茲萆文件。",
    +	"shared-repo-name-wikimediacommons": "Wikimedia Commons",
     	"download": "下載",
     	"unwatchedpages": "無監視其頁面",
     	"listredirects": "重定向其單單",
    diff --git a/languages/i18n/ce.json b/languages/i18n/ce.json
    index daef26f275..065581916e 100644
    --- a/languages/i18n/ce.json
    +++ b/languages/i18n/ce.json
    @@ -15,7 +15,7 @@
     		]
     	},
     	"tog-underline": "КӀел сиз хьакха хьажорган:",
    -	"tog-hideminor": "Къайладаха кигийра нисдарш оц могӀама керла хийцамехь",
    +	"tog-hideminor": "Къайладаха жима нисдарш керла могӀам юкъара",
     	"tog-hidepatrolled": "Къайладаха гӀаролладина нисдарш оц могӀама керла нисдаршкахь",
     	"tog-newpageshidepatrolled": "Къайлаяха гӀароллайина агӀонаш оьцу могӀама керла агӀонашкахь",
     	"tog-hidecategorization": "Къайлаяха агӀонийн категореш",
    @@ -1844,6 +1844,7 @@
     	"sp-contributions-username": "IP-адрес я декъашхочун цӀе:",
     	"sp-contributions-toponly": "Гайта тӀаьххьарлера хийцамаш",
     	"sp-contributions-newonly": "АгӀонаш кхоллар бен ма гайта",
    +	"sp-contributions-hideminor": "Къайладаха жима нисдарш",
     	"sp-contributions-submit": "Лахар",
     	"whatlinkshere": "Кхуза хьажоргаш",
     	"whatlinkshere-title": "«$1» тӀе хьажоргаш йолу агӀонаш",
    @@ -2119,7 +2120,7 @@
     	"tooltip-t-specialpages": "Белхан агӀонанийн могӀам",
     	"tooltip-t-print": "ХӀокху агӀонна зорба туху башхо",
     	"tooltip-t-permalink": "Даима йолу хьажорг хӀокху башха агӀонна",
    -	"tooltip-ca-nstab-main": "Яззамна чулацам",
    +	"tooltip-ca-nstab-main": "Коьрта яззаман чулацам",
     	"tooltip-ca-nstab-user": "ХӀора декъашхочун долахь йолу агӀо ю",
     	"tooltip-ca-nstab-media": "Медиа-файл",
     	"tooltip-ca-nstab-special": "ХӀара белхан агӀо ю, хӀара таялуш яц",
    diff --git a/languages/i18n/cs.json b/languages/i18n/cs.json
    index ad7f51d982..3c1e3ddac4 100644
    --- a/languages/i18n/cs.json
    +++ b/languages/i18n/cs.json
    @@ -30,7 +30,8 @@
     			"Macofe",
     			"Urbanecm",
     			"LordMsz",
    -			"Matma Rex"
    +			"Matma Rex",
    +			"Dvorapa"
     		]
     	},
     	"tog-underline": "Podtrhávat odkazy:",
    @@ -237,7 +238,7 @@
     	"categorypage": "Prohlédnout si stránku kategorie",
     	"viewtalkpage": "Prohlédnout si diskusi",
     	"otherlanguages": "V jiných jazycích",
    -	"redirectedfrom": "(Přesměrováno z $1)",
    +	"redirectedfrom": "(přesměrováno z $1)",
     	"redirectpagesub": "Přesměrování",
     	"redirectto": "Přesměrování na:",
     	"lastmodifiedat": "Stránka byla naposledy editována $1 v $2.",
    @@ -649,12 +650,14 @@
     	"minoredit": "Tato změna je malá editace.",
     	"watchthis": "Sledovat tuto stránku",
     	"savearticle": "Uložit změny",
    +	"savechanges": "Uložit změny",
     	"publishpage": "Zveřejnit stránku",
    +	"publishchanges": "Zveřejnit změny",
     	"preview": "Náhled",
     	"showpreview": "Ukázat náhled",
     	"showdiff": "Ukázat změny",
     	"blankarticle": "<strong>Upozornění:</strong> Stránka, kterou se chystáte založit, je prázdná. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude založena zcela bez obsahu.",
    -	"anoneditwarning": "<strong>Varování:</strong> Nejste přihlášen(a). Pokud uložíte jakoukoli editaci, bude vaše IP adresa zveřejněna v historii této stránky. Pokud se <strong>[$1 přihlásíte]</strong> nebo si <strong>[$2 vytvoříte účet]</strong>, budou vaše editace připsány vašemu uživatelskému jménu a získáte i další výhody.",
    +	"anoneditwarning": "<strong>Varování:</strong> Nejste přihlášen(a). Pokud uložíte jakoukoli editaci, vaše IP adresa bude zveřejněna v historii této stránky. Pokud se <strong>[$1 přihlásíte]</strong> nebo si <strong>[$2 vytvoříte účet]</strong>, vaše editace budou připsány vašemu uživatelskému jménu a získáte i další výhody.",
     	"anonpreviewwarning": "<em>Nejste přihlášen(a). Uložením zveřejníte svou IP adresu v historii této stránky.</em>",
     	"missingsummary": "<strong>Připomenutí:</strong> Nezadali jste shrnutí editace. Pokud ještě jednou kliknete na „{{int:savearticle}}“, bude vaše editace zapsána bez shrnutí.",
     	"selfredirect": "<strong>Upozornění:</strong> Pokoušíte se tuto stránku přesměrovat na sebe samu.\nMožná jste zadali chybný cíl přesměrování, nebo editujete špatnou stránku.\nPokud ještě jednou kliknete na „{{int:savearticle}}“, bude i přesto přesměrování vytvořeno.",
    @@ -1114,20 +1117,20 @@
     	"group": "Skupina:",
     	"group-user": "Uživatelé",
     	"group-autoconfirmed": "Automaticky schválení uživatelé",
    -	"group-bot": "Boti",
    +	"group-bot": "Roboti",
     	"group-sysop": "Správci",
     	"group-bureaucrat": "Byrokraté",
     	"group-suppress": "Utajovatelé",
     	"group-all": "(všichni)",
     	"group-user-member": "{{GENDER:$1|uživatel|uživatelka|uživatel}}",
     	"group-autoconfirmed-member": "automaticky {{GENDER:$1|schválený uživatel|schválená uživatelka|schválený uživatel}}",
    -	"group-bot-member": "{{GENDER:$1|bot|botka|bot}}",
    +	"group-bot-member": "{{GENDER:$1|robot|robotka}}",
     	"group-sysop-member": "{{GENDER:$1|správce|správkyně|správce}}",
     	"group-bureaucrat-member": "{{GENDER:$1|byrokrat|byrokratka|byrokrat}}",
     	"group-suppress-member": "{{GENDER:$1|utajovatel|utajovatelka|utajovatel}}",
     	"grouppage-user": "{{ns:project}}:Uživatelé",
     	"grouppage-autoconfirmed": "{{ns:project}}:Automaticky schválení uživatelé",
    -	"grouppage-bot": "{{ns:project}}:Boti",
    +	"grouppage-bot": "{{ns:project}}:Roboti",
     	"grouppage-sysop": "{{ns:project}}:Správci",
     	"grouppage-bureaucrat": "{{ns:project}}:Byrokraté",
     	"grouppage-suppress": "{{ns:project}}:Utajovatelé",
    @@ -1242,8 +1245,8 @@
     	"rightslogtext": "Toto je záznam změn uživatelských práv.",
     	"action-read": "přečíst tuto stránku",
     	"action-edit": "upravit tuto stránku",
    -	"action-createpage": "vytvářet stránky",
    -	"action-createtalk": "vytvářet diskusní stránky",
    +	"action-createpage": "vytvořit tuto stránku",
    +	"action-createtalk": "vytvořit tuto diskusní stránku",
     	"action-createaccount": "vytvořit tento uživatelský účet",
     	"action-autocreateaccount": "automaticky založit tento externí uživatelský účet",
     	"action-history": "prohlížet si historii této stránky",
    @@ -1297,7 +1300,7 @@
     	"recentchanges-feed-description": "Na tomto kanále sledujte poslední změny na {{grammar:6sg|{{SITENAME}}}}.",
     	"recentchanges-label-newpage": "Touto editací byla založena nová stránka",
     	"recentchanges-label-minor": "Toto je malá editace",
    -	"recentchanges-label-bot": "Tuto editaci provedl bot",
    +	"recentchanges-label-bot": "Tuto editaci provedl robot",
     	"recentchanges-label-unpatrolled": "Tato změna dosud nebyla prověřena",
     	"recentchanges-label-plusminus": "Velikost stránky se změnila o tolik bajtů",
     	"recentchanges-legend-heading": "<strong>Legenda:</strong>",
    @@ -1461,6 +1464,8 @@
     	"upload-http-error": "Došlo k chybě HTTP: $1",
     	"upload-copy-upload-invalid-domain": "Načítání kopírováním není dostupné z této domény.",
     	"upload-foreign-cant-upload": "Tato wiki není nakonfigurována, aby načítala soubory na požadované vzdálené úložiště souborů.",
    +	"upload-foreign-cant-load-config": "Nepodařilo se nahrát konfiguraci načítání souborů na vzdálené úložiště souborů.",
    +	"upload-dialog-disabled": "Načítání souborů pomocí tohoto dialogu je na této wiki vypnuto.",
     	"upload-dialog-title": "Načtení souboru",
     	"upload-dialog-button-cancel": "Storno",
     	"upload-dialog-button-done": "Hotovo",
    @@ -2155,7 +2160,7 @@
     	"tooltip-namespace_association": "Zaškrtnutím tohoto políčka zahrnete i diskusní či obsahový jmenný prostor příslušný k vybranému jmennému prostoru",
     	"blanknamespace": "(Hlavní)",
     	"contributions": "Příspěvky {{GENDER:$1|uživatele|uživatelky}}",
    -	"contributions-title": "Příspěvky uživatele $1",
    +	"contributions-title": "Příspěvky {{GENDER:$1|uživatele|uživatelky}} $1",
     	"mycontris": "Příspěvky",
     	"anoncontribs": "Příspěvky",
     	"contribsub2": "{{GENDER:$3|uživatele|uživatelky}} $1 ($2)",
    @@ -2180,6 +2185,7 @@
     	"sp-contributions-username": "IP adresa nebo uživatelské jméno:",
     	"sp-contributions-toponly": "Zobrazit pouze editace na aktuální revizi",
     	"sp-contributions-newonly": "Zobrazit pouze editace zakládající stránku",
    +	"sp-contributions-hideminor": "Skrýt malé editace",
     	"sp-contributions-submit": "Zobrazit",
     	"whatlinkshere": "Odkazuje sem",
     	"whatlinkshere-title": "Stránky odkazující na „$1“",
    @@ -2526,7 +2532,7 @@
     	"tooltip-ca-nstab-user": "Zobrazit uživatelskou stránku",
     	"tooltip-ca-nstab-media": "Zobrazit stránku souboru",
     	"tooltip-ca-nstab-special": "Toto je speciální stránka, kterou nelze editovat.",
    -	"tooltip-ca-nstab-project": "Zobrazit stránku o wiki",
    +	"tooltip-ca-nstab-project": "Zobrazit stránku projektu",
     	"tooltip-ca-nstab-image": "Zobrazit stránku souboru",
     	"tooltip-ca-nstab-mediawiki": "Zobrazit systémovou zprávu",
     	"tooltip-ca-nstab-template": "Zobrazit Å¡ablonu",
    @@ -2553,13 +2559,13 @@
     	"noscript.css": "/* Zde uvedené CSS bude ovlivňovat uživatele s vypnutým JavaScriptem */",
     	"group-autoconfirmed.css": "/* Zde uvedené CSS bude ovlivňovat pouze automaticky schválené uživatele */",
     	"group-user.css": "/* Zde uvedené CSS bude ovlivňovat pouze registrované uživatele */",
    -	"group-bot.css": "/* Zde uvedené CSS bude ovlivňovat pouze boty */",
    +	"group-bot.css": "/* Zde uvedené CSS bude ovlivňovat pouze roboty */",
     	"group-sysop.css": "/* Zde uvedené CSS bude ovlivňovat pouze správce */",
     	"group-bureaucrat.css": "/* Zde uvedené CSS bude ovlivňovat pouze byrokraty */",
     	"common.js": "/* Zde uvedený JavaScript bude použit pro všechny uživatele při načtení každé stránky. */",
     	"group-autoconfirmed.js": "/* Zde uvedený JavaScript bude použit pouze pro automaticky schválené uživatele */",
     	"group-user.js": "/* Zde uvedený JavaScript bude použit pouze pro registrované uživatele */",
    -	"group-bot.js": "/* Zde uvedený JavaScript bude použit pouze pro boty */",
    +	"group-bot.js": "/* Zde uvedený JavaScript bude použit pouze pro roboty */",
     	"group-sysop.js": "/* Zde uvedený JavaScript bude použit pouze pro správce */",
     	"group-bureaucrat.js": "/* Zde uvedený JavaScript bude použit pouze pro byrokraty */",
     	"anonymous": "{{PLURAL:$1|anonymního uživatele|anonymních uživatelů}} {{GRAMMAR:2sg|{{SITENAME}}}}",
    @@ -3675,7 +3681,6 @@
     	"mw-widgets-dateinput-placeholder-month": "RRRR-MM",
     	"mw-widgets-titleinput-description-new-page": "stránka zatím neexistuje",
     	"mw-widgets-titleinput-description-redirect": "přesměrování na $1",
    -	"api-error-blacklisted": "Zvolte prosím jiný, popisný název.",
     	"sessionmanager-tie": "Nelze kombinovat několik typů autentizace požadavků: $1.",
     	"sessionprovider-generic": "relace pomocí $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "relace pomocí cookies",
    @@ -3800,5 +3805,6 @@
     	"linkaccounts-success-text": "Účet byl propojen.",
     	"linkaccounts-submit": "Propojit účty",
     	"unlinkaccounts": "Zrušení propojení účtů",
    -	"unlinkaccounts-success": "Propojení účtu bylo zrušeno."
    +	"unlinkaccounts-success": "Propojení účtu bylo zrušeno.",
    +	"authenticationdatachange-ignored": "Změna autentizačních údajů nebyla zpracována. Možná není nakonfigurován žádný poskytovatel?"
     }
    diff --git a/languages/i18n/de.json b/languages/i18n/de.json
    index f994ffdf40..2089e40084 100644
    --- a/languages/i18n/de.json
    +++ b/languages/i18n/de.json
    @@ -96,7 +96,7 @@
     	"tog-hidepatrolled": "Kontrollierte Änderungen in den „Letzten Änderungen“ ausblenden",
     	"tog-newpageshidepatrolled": "Kontrollierte Seiten bei den „Neuen Seiten“ ausblenden",
     	"tog-hidecategorization": "Kategorisierungen von Seiten ausblenden",
    -	"tog-extendwatchlist": "In der Beobachtungsliste alle und nicht nur die aktuellsten Änderungen anzeigen",
    +	"tog-extendwatchlist": "Alle und nicht nur die aktuellsten Änderungen in der Beobachtungsliste anzeigen",
     	"tog-usenewrc": "Änderungen auf „Letzte Änderungen“ und der Beobachtungsliste nach Seite gruppieren",
     	"tog-numberheadings": "Überschriften automatisch nummerieren",
     	"tog-showtoolbar": "Bearbeiten-Werkzeugleiste anzeigen",
    @@ -106,7 +106,7 @@
     	"tog-watchdefault": "Selbst geänderte Seiten und Dateien automatisch beobachten",
     	"tog-watchmoves": "Selbst verschobene Seiten und Dateien automatisch beobachten",
     	"tog-watchdeletion": "Selbst gelöschte Seiten und Dateien automatisch beobachten",
    -	"tog-watchuploads": "Neue hochgeladene Dateien zu meiner Beobachtungsliste hinzufügen",
    +	"tog-watchuploads": "Selbst hochgeladene Dateien automatisch beobachten",
     	"tog-watchrollback": "Seiten, bei denen ich eine Zurücksetzung durchgeführt habe, automatisch beobachten",
     	"tog-minordefault": "Eigene Änderungen standardmäßig als geringfügig markieren",
     	"tog-previewontop": "Vorschau oberhalb des Bearbeitungsfensters anzeigen",
    @@ -124,10 +124,10 @@
     	"tog-watchlisthidebots": "Bearbeitungen durch Bots in der Beobachtungsliste ausblenden",
     	"tog-watchlisthideminor": "Kleine Bearbeitungen in der Beobachtungsliste ausblenden",
     	"tog-watchlisthideliu": "Bearbeitungen angemeldeter Benutzer in der Beobachtungsliste ausblenden",
    -	"tog-watchlistreloadautomatically": "Die Beobachtungsliste automatisch neu laden, wenn ein Filter geändert wurde (erfordert JavaScript)",
    +	"tog-watchlistreloadautomatically": "Sofern ein Filter geändert wurde, die Beobachtungsliste automatisch neu laden (erfordert JavaScript)",
     	"tog-watchlisthideanons": "Bearbeitungen anonymer Benutzer (IP-Adressen) in der Beobachtungsliste ausblenden",
     	"tog-watchlisthidepatrolled": "Kontrollierte Änderungen in der Beobachtungsliste ausblenden",
    -	"tog-watchlisthidecategorization": "Kategorisierungen von Seiten ausblenden",
    +	"tog-watchlisthidecategorization": "Kategorisierungen von Seiten in der Beobachtungsliste ausblenden",
     	"tog-ccmeonemails": "Schicke mir Kopien der E-Mails, die ich anderen Benutzern sende",
     	"tog-diffonly": "Beim Versionsvergleich nur die Unterschiede und nicht die vollständige Seite anzeigen",
     	"tog-showhiddencats": "Versteckte Kategorien anzeigen",
    @@ -391,7 +391,7 @@
     	"databaseerror-query": "Abfrage: $1",
     	"databaseerror-function": "Funktion: $1",
     	"databaseerror-error": "Fehler: $1",
    -	"transaction-duration-limit-exceeded": "Um eine große Verzögerung in der Datenreplikation zu vermeiden, wurde diese Transaktion abgebrochen. Die Schreibdauer ($1) hat die Grenze von {{PLURAL:$2|einer Sekunde|$2 Sekunden}} überschritten. Falls du viele Objekte auf einmal änderst, versuche stattdessen, die Änderungen auf mehrere Operationen aufzuteilen.",
    +	"transaction-duration-limit-exceeded": "Um eine große Verzögerung in der Datenreplikation zu vermeiden, wurde diese Transaktion abgebrochen. Die Schreibdauer ($1) hat die Grenze von $2 Sekunden überschritten. Falls du viele Objekte auf einmal änderst, versuche stattdessen, die Änderungen auf mehrere Operationen aufzuteilen.",
     	"laggedslavemode": "<strong>Achtung:</strong> Die angezeigte Seite könnte unter Umständen nicht die letzten Bearbeitungen enthalten.",
     	"readonly": "Datenbank gesperrt",
     	"enterlockreason": "Bitte gib einen Grund ein, warum die Datenbank gesperrt werden soll und eine Abschätzung über die Dauer der Sperrung",
    @@ -707,7 +707,9 @@
     	"minoredit": "Nur Kleinigkeiten wurden verändert",
     	"watchthis": "Diese Seite beobachten",
     	"savearticle": "Seite speichern",
    +	"savechanges": "Änderungen speichern",
     	"publishpage": "Seite veröffentlichen",
    +	"publishchanges": "Änderungen veröffentlichen",
     	"preview": "Vorschau",
     	"showpreview": "Vorschau zeigen",
     	"showdiff": "Änderungen zeigen",
    @@ -1052,7 +1054,7 @@
     	"prefs-rc": "Letzte Änderungen",
     	"prefs-watchlist": "Beobachtungsliste",
     	"prefs-editwatchlist": "Beobachtungsliste bearbeiten",
    -	"prefs-editwatchlist-label": "Einträge auf der Beobachtungsliste bearbeiten:",
    +	"prefs-editwatchlist-label": "Einträge auf der Beobachtungsliste:",
     	"prefs-editwatchlist-edit": "ansehen und selektiv entfernen",
     	"prefs-editwatchlist-raw": "unformatiert bearbeiten",
     	"prefs-editwatchlist-clear": "vollständig entfernen",
    @@ -1303,8 +1305,8 @@
     	"rightslogtext": "Dies ist das Logbuch der Änderungen der Benutzerrechte.",
     	"action-read": "die Seite zu lesen",
     	"action-edit": "die Seite zu bearbeiten",
    -	"action-createpage": "Seiten zu erstellen",
    -	"action-createtalk": "Diskussionsseiten zu erstellen",
    +	"action-createpage": "diese Seite zu erstellen",
    +	"action-createtalk": "diese Diskussionsseite zu erstellen",
     	"action-createaccount": "ein Benutzerkonto zu erstellen",
     	"action-autocreateaccount": "automatisch dieses externe Benutzerkonto zu erstellen",
     	"action-history": "die Versionsgeschichte dieser Seite anzusehen",
    @@ -1523,7 +1525,8 @@
     	"upload-http-error": "Ein HTTP-Fehler ist aufgetreten: $1",
     	"upload-copy-upload-invalid-domain": "Als Kopie hochladbare Dateien sind über diese Domain nicht verfügbar.",
     	"upload-foreign-cant-upload": "Dieses Wiki ist nicht konfiguriert, um Dateien auf das gewünschte fremde Dateirepositorium hochzuladen.",
    -	"upload-foreign-cant-load-config": "Das Laden der Dateiuploadkonfiguration für das fremde Dateirepositorium ist fehlgeschlagen.",
    +	"upload-foreign-cant-load-config": "Die Konfiguration für Dateiuploads in das fremde Dateirepositorium konnte nicht geladen werden.",
    +	"upload-dialog-disabled": "Dateiuploads mit diesem Dialog sind auf diesem Wiki deaktiviert.",
     	"upload-dialog-title": "Datei hochladen",
     	"upload-dialog-button-cancel": "Abbrechen",
     	"upload-dialog-button-done": "Schließen",
    @@ -1793,7 +1796,7 @@
     	"prefixindex": "Alle Seiten (mit Präfix)",
     	"prefixindex-namespace": "Alle Seiten mit Präfix (Namensraum $1)",
     	"prefixindex-submit": "Anzeigen",
    -	"prefixindex-strip": "Präfix in der Liste abschneiden",
    +	"prefixindex-strip": "Suchpräfix ausblenden",
     	"shortpages": "Kurze Seiten",
     	"longpages": "Lange Seiten",
     	"deadendpages": "Nicht verlinkende Seiten",
    @@ -1844,7 +1847,7 @@
     	"apisandbox": "API-Spielwiese",
     	"apisandbox-jsonly": "Zur Nutzung der API-Spielwiese ist JavaScript erforderlich.",
     	"apisandbox-api-disabled": "Die API wurde auf diesem Wiki deaktiviert.",
    -	"apisandbox-intro": "Diese Seite kannst du für Versuche mit der <strong>MediaWiki-API</strong> verwenden.\nDie [[mw:API:Main page|Dokumentation zur API]] enthält weitere Hinweise zu ihrer Nutzung. Beispiel: [https://www.mediawiki.org/wiki/API:Main_page/de#Ein_einfaches_Beispiel Den Inhalt der Hauptseite abrufen]. Für weitere Beispiele eine der verfügbaren Aktionen auswählen.\n\nObwohl dies eine Spielwiese ist, bedenke, dass Aktionen, die du auf dieser Seite durchführst, das Wiki verändern.",
    +	"apisandbox-intro": "Diese Seite kannst du für Versuche mit der <strong>MediaWiki-API</strong> verwenden.\nDie [[mw:API:Main page|Dokumentation zur API]] enthält weitere Hinweise zu ihrer Nutzung. Beispiel: [https://www.mediawiki.org/wiki/API:Main_page/de#Ein_einfaches_Beispiel Den Inhalt der Hauptseite abrufen]. Wähle für weitere Beispiele eine der verfügbaren Aktionen.\n\nObwohl dies eine Spielwiese ist, bedenke, dass Aktionen, die du auf dieser Seite durchführst, das Wiki verändern.",
     	"apisandbox-fullscreen": "Panel expandieren",
     	"apisandbox-fullscreen-tooltip": "Expandiert das Spielwiesen-Panel, um das Browserfenster auszufüllen.",
     	"apisandbox-unfullscreen": "Seite anzeigen",
    @@ -2244,6 +2247,7 @@
     	"sp-contributions-username": "IP-Adresse oder Benutzername:",
     	"sp-contributions-toponly": "Nur aktuelle Versionen zeigen",
     	"sp-contributions-newonly": "Nur Seitenerstellungen anzeigen",
    +	"sp-contributions-hideminor": "Kleine Bearbeitungen ausblenden",
     	"sp-contributions-submit": "Suchen",
     	"whatlinkshere": "Links auf diese Seite",
     	"whatlinkshere-title": "Seiten, die auf „$1“ verlinken",
    @@ -2463,7 +2467,7 @@
     	"allmessagesname": "Name",
     	"allmessagesdefault": "Standardtext",
     	"allmessagescurrent": "Aktueller Text",
    -	"allmessagestext": "Dies ist eine Liste der MediaWiki-Systemtexte.\nBitte besuche die Seiten [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-Lokalisierung] und [https://translatewiki.net translatewiki.net], sofern du dich an der Lokalisierung von MediaWiki beteiligen möchtest.",
    +	"allmessagestext": "Dies ist eine Liste der MediaWiki-Systemtexte.\nGehe auf [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki-Lokalisierung] und [https://translatewiki.net translatewiki.net], wenn du dich an der Übersetzung von MediaWiki beteiligen möchtest.",
     	"allmessagesnotsupportedDB": "Diese Spezialseite steht nicht zur Verfügung, da sie über den Parameter <tt>$wgUseDatabaseMessages</tt> deaktiviert wurde.",
     	"allmessages-filter-legend": "Filter",
     	"allmessages-filter": "Filter für angepassten Zustand:",
    @@ -3713,7 +3717,6 @@
     	"mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
     	"mw-widgets-titleinput-description-new-page": "Seite ist noch nicht vorhanden",
     	"mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1",
    -	"api-error-blacklisted": "Bitte einen anderen, aussagekräftigen Titel wählen.",
     	"sessionmanager-tie": "Mehrere Anfrageauthentifikationstypen konnten nicht kombiniert werden: $1.",
     	"sessionprovider-generic": "$1-Sitzungen",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebasierten Sitzungen",
    @@ -3728,8 +3731,8 @@
     	"log-action-filter-newusers": "Typ der Benutzerkontenerstellung:",
     	"log-action-filter-patrol": "Kontrolltyp:",
     	"log-action-filter-protect": "Schutztyp:",
    -	"log-action-filter-rights": "Typ der Rechteänderung",
    -	"log-action-filter-suppress": "Unterdrückungstyp",
    +	"log-action-filter-rights": "Typ der Rechteänderung:",
    +	"log-action-filter-suppress": "Unterdrückungstyp:",
     	"log-action-filter-upload": "Hochladetyp:",
     	"log-action-filter-all": "Alle",
     	"log-action-filter-block-block": "Sperren",
    diff --git a/languages/i18n/diq.json b/languages/i18n/diq.json
    index a9930da937..40ce273476 100644
    --- a/languages/i18n/diq.json
    +++ b/languages/i18n/diq.json
    @@ -63,7 +63,7 @@
     	"tog-watchlisthidecategorization": "Pera kategorizasyoni bınımne",
     	"tog-ccmeonemails": "E-posteyanê ke ez karberanê binan rê rışenan, mı rê kopya inan bırışe",
     	"tog-diffonly": "Qıyasê versiyonan de tek ferqan bımocne, pela butıne nê",
    -	"tog-showhiddencats": "Kategoriyanê dızdiye bımocne",
    +	"tog-showhiddencats": "Kategoriyanê nımneya bıasne",
     	"tog-norollbackdiff": "Peyser ardışi ra dıme ferqi measne",
     	"tog-useeditwarning": "Wexto ke mı yew pela nizami be vurnayışanê nêqeydbiyayeyan caverdê, hay be mı ser de",
     	"tog-prefershttps": "Ronışten akerden de  greyo itimadın bıkarne",
    @@ -106,7 +106,7 @@
     	"march-gen": "Adar",
     	"april-gen": "Nisane",
     	"may-gen": "Gulane",
    -	"june-gen": "Hezirane",
    +	"june-gen": "Heziran",
     	"july-gen": "Temuze",
     	"august-gen": "Tebaxe",
     	"september-gen": "Keşkelun",
    @@ -130,7 +130,7 @@
     	"march-date": "Adar $1",
     	"april-date": "Nisane $1",
     	"may-date": "Gulane $1",
    -	"june-date": "Hezirane $1",
    +	"june-date": "{{PLURAL:$1|1=1ᵉ|$1}} Heziran",
     	"july-date": "Temuze $1",
     	"august-date": "Tebaxe $1",
     	"september-date": "Keşkelun $1",
    @@ -147,10 +147,10 @@
     	"hidden-categories": "{{PLURAL:$1|Kategoriya nımıtiye|Kategoriyê nımıtey}}",
     	"hidden-category-category": "Kategoriyê nımıtey",
     	"category-subcat-count": "{{PLURAL:$2|Na kategoriya de $1 bınkategoriyay estê.|$2 kategoriyan ra $1 bınkategoriyay asenê.}}",
    -	"category-subcat-count-limited": "Na kategoriye de {{PLURAL:$1|ena kategoriya bınêne esta|enê $1 kategoriyê bınêni estê}}.",
    +	"category-subcat-count-limited": "Na kategoriya de {{PLURAL:$1|ena kategoriya bınên est a|enê $1 kategoriyay bınêni est ê}}.",
     	"category-article-count": "{{PLURAL:$2|Na kategoriye de teyna ena pele esta.|Ebe $2 ra pêro piya {{PLURAL:$1|ena pela na kategoriye dera|$1 enê peli na kategoriye derê.}}}}",
     	"category-article-count-limited": "{{PLURAL:$1|Pela cêrêne|$1 Pelê cêrêni}} na kategoriye derê.",
    -	"category-file-count": "<noinclude>{{PLURAL:$2|Na kategoriye tenya dosyayanê cêrênan muhtewa kena.}}</noinclude>\n*Na kategoriye de $2 dosyayan ra {{PLURAL:$1|yew dosya tenêka esta| $1 dosyey asenê}}.",
    +	"category-file-count": "<noinclude>{{PLURAL:$2|Na kategoriya tenya dosyanê cêrênan muhtewa kena.}}</noinclude>\n*Na kategoriya de $2 dosyan ra {{PLURAL:$1|yew dosya tenêka esta| $1 dosyay asenê}}.",
     	"category-file-count-limited": "{{PLURAL:$1|Dosya cêrêne|$1 Dosyê cêrêni}} na kategoriye derê.",
     	"listingcontinuesabbrev": "dewam...",
     	"index-category": "Pelê endeksıni",
    @@ -160,7 +160,7 @@
     	"about": "Heqa cı de",
     	"article": "Pela zerreki",
     	"newwindow": "(pençereyê newey de beno a)",
    -	"cancel": "Bıtexelne",
    +	"cancel": "Peyd ke",
     	"moredotdotdot": "Vêşi...",
     	"morenotlisted": "Vêşi lista nêbi...",
     	"mypage": "Pele",
    @@ -222,14 +222,14 @@
     	"toolbox": "Haceti",
     	"userpage": "Pela karberi bıvêne",
     	"projectpage": "Pela proceyi bıvêne",
    -	"imagepage": "Pela dosya bımocne",
    -	"mediawikipage": "Pela mesaci bımocne",
    -	"templatepage": "Pela şabloni bımocne",
    +	"imagepage": "Pera dosya bıasne",
    +	"mediawikipage": "Pera mesaci bıasne",
    +	"templatepage": "Pera şabloni bıasne",
     	"viewhelppage": "Pela peşti bıvêne",
    -	"categorypage": "Pela kategoriye bıvêne",
    +	"categorypage": "Pela kategoriya bıasne",
     	"viewtalkpage": "Werênayışi bıvêne",
     	"otherlanguages": "Zıwananê binan de",
    -	"redirectedfrom": "(Pele da $1 ra heteneyê)",
    +	"redirectedfrom": "($1 ra kırışı yê)",
     	"redirectpagesub": "Pela berdışi",
     	"redirectto": "Beno hetê:",
     	"lastmodifiedat": "Ena pele tewr peyên roca $2, $1 de biya rocaniye.",
    @@ -383,6 +383,7 @@
     	"virus-scanfailed": "cıgerayiş tamam nêbı (kod $1)",
     	"virus-unknownscanner": "antiviruso ke nêzanyeno:",
     	"logouttext": "'''Şıma hesabra newke vicyay.'''\n\nWexta ke verhafızayê cıgerayoxê şıma pak beno no benate de taye peli de hesabe şıma akerde aseno.",
    +	"cannotlogoutnow-title": "Enewke ronıştışo nêracneyêno",
     	"welcomeuser": "Ğeyr amey, $1!",
     	"welcomecreation-msg": "Hesabê şıma abiyo.\n[[Special:Preferences|{{SITENAME}} vurnayişê tercihanê xo]], xo vir ra mekere.",
     	"yourname": "Nameyê karberi:",
    @@ -432,11 +433,14 @@
     	"createacct-reason-ph": "Şımaye çı xo re zewbi hesab vırazeni?",
     	"createacct-submit": "Hesabê xo vıraze",
     	"createacct-another-submit": "Hesab vıraze",
    +	"createacct-continue-submit": "Hesab vıraştışi rê devam ke",
    +	"createacct-another-continue-submit": "Hesab vıraştışi rê dewam ke",
     	"createacct-benefit-heading": "{{SITENAME}} meş de merduman şi",
     	"createacct-benefit-body1": "{{PLURAL:$1|vurnayış|vurnayışi}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|wesiqe|wesiqey}}",
     	"createacct-benefit-body3": "{{PLURAL:$1|iştıraqkerdoğo nıkayên|iştıraqkerdoğê nıkayêni}}",
     	"badretype": "Parolayê ke şıma nuşti yewbini nêtepışneni.",
    +	"usernameinprogress": "Qandê nê karberi hesab vıraştışondewamnkeno.  Tay bıpawê",
     	"userexists": "Jewna karber enê nami karneno.\nMara reca xorê jewna name bınusnê.",
     	"loginerror": "Xetayê hesab ekerdışi",
     	"createacct-error": "Xetaya vıraştışê hesabi",
    @@ -523,8 +527,10 @@
     	"resetpass-submit-cancel": "Bıtexelne",
     	"resetpass-wrong-oldpass": "parolayo parola maqbul niyo.\nşıma ya parolaye xo vurnayo ya zi parolayo muwaqqat waşto.",
     	"resetpass-recycled": "Parolaya şımaya newiye wa paroloya şımaya verêne ra ferqıne bo.",
    +	"resetpass-temp-emailed": "E postaya rışyayê yubkoda şıma ronıştış akerdo.  Ronıştışi xo temammkerdışi rê yu parolaya newi lazım a",
     	"resetpass-temp-password": "parolayo muweqet:",
     	"resetpass-abort-generic": "Vurnayışê parola terefê yew niçıki ra texeliya.",
    +	"resetpass-expired": "Dema parolay da şıma qedya ya. Qandê cıkewtışi u patolaya newi vıraz",
     	"resetpass-expired-soft": "Wahdey patolanda şıma qedya yo u vurnayış icab keno. Xorê yu parola weçinê yana bahdo weçinayışi rê butona \"{{int:authprovider-resetpass-skip-label}}\" 'i bıploğnê",
     	"resetpass-validity-soft": "Parolay şıma ravêrdi niya: $1\n\nXorê yu parola nışan bıkerê  uana bahdo sıfır kerdışi rê grey \"{{int:authprovider-resetpass-skip-label}}\" bıploğnê.",
     	"passwordreset": "Parola reset ke",
    @@ -534,7 +540,7 @@
     	"passwordreset-emaildisabled": "Na wikid hısusiyeté e-posta dewera vıcyayé",
     	"passwordreset-username": "Nameyê karberi:",
     	"passwordreset-domain": "Domain:",
    -	"passwordreset-capture": "neticey e-postay bımocne?",
    +	"passwordreset-capture": "neticey e-postay bıasne yo?",
     	"passwordreset-capture-help": "Şıma na dorek morkerê se, e-posta (idareten eposta ya) şıma rê yana karbera rê rışêno.",
     	"passwordreset-email": "Adresa e-postey:",
     	"passwordreset-emailtitle": "Hesab timarê {{SITENAME}}",
    @@ -544,6 +550,7 @@
     	"passwordreset-emailsentemail": "Eke na seba hesabê şıma yew adresa e-posteyê qeydına, yew e-posteyê parola nênkerdışi rışiyeno.",
     	"passwordreset-emailsent-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo.",
     	"passwordreset-emailerror-capture": "Yew e-posteyê esterıtışê parolayo ke rışiya, no cêr mocniyayo, ema {{GENDER:$2|karber}}i rê rıştış de mıwefeq nêbi: $1",
    +	"passwordreset-invalideamil": "Adresê eposta raşt niya",
     	"changeemail": "E-posta adresa xo wedarne",
     	"changeemail-header": "E-posya adresta hesabdê xo bıvurnê",
     	"changeemail-no-info": "Şıma gani bıkewê pele ke derdest bıresê na pele.",
    @@ -586,8 +593,8 @@
     	"savearticle": "Pele qeyd ke",
     	"publishpage": "Perer bıhesırne",
     	"preview": "Verqayt",
    -	"showpreview": "Verqayti bımocne",
    -	"showdiff": "Vurnayışan bımocne",
    +	"showpreview": "Verqayti bıasne",
    +	"showdiff": "Vurriyayışan bıasne",
     	"anoneditwarning": "<strong>İqaz:</strong> Şıma be hesabê xo nêkewtê cı. \nAdresê şımayê IP tarixê vırnayışê na pele de do qeyd bo. Eke şıma <strong>[$1 cıkewê]</strong> ya zi <strong>[$2 hesab vırazê]</strong>, vurnayışê şıma be zewbina kare ra nameyê şıma rê bar beno.",
     	"anonpreviewwarning": "\"Şıma be hesabê xo nêkewtê cı. Eke qeyd kerê, adresê şımaê IP tarixê vırnayışê na pele de do qeyd bo.\"",
     	"missingsummary": "'''DİQET:''' Şıma jû xulasa nênuşte.\nEke şıma \"{{int:savearticle}}\" reyna bıtıknê, vırnayışê şıma bê xulasa qeyd beno.",
    @@ -604,7 +611,7 @@
     	"confirmedittext": "Eka ti wazene binusi, adresê xo e-maili confirme bike.\nAdresê xo e-maili [[Special:Preferences|user preferences]] de confirme bike.",
     	"nosuchsectiontitle": "Eno qısım çıniyo",
     	"nosuchsectiontext": "To waşt ke yew qısım kewê, oyo ke çıniyo.\nHeta ke werte de qısım çıniyo, ca çıniyo ke tı raştkerdışê xo qeyd bıkerê.",
    -	"loginreqtitle": "Cıkewtış lazımo",
    +	"loginreqtitle": "Cı kewtış icab keno",
     	"loginreqlink": "cı kewe",
     	"loginreqpagetext": "Eka ti wazeno peleyanê bini bivini, ti gani $1.",
     	"accmailtitle": "Paralo şirawiyayo.",
    @@ -703,7 +710,8 @@
     	"parser-template-recursion-depth-warning": "limitê şablonê newekerdışi biyo de ($1)",
     	"language-converter-depth-warning": "xoritiya çarnekarê zıwanan viyarnê ra ($1)",
     	"node-count-exceeded-category": "Pela ra hetê kotya amardışê cı ravêrya",
    -	"node-count-exceeded-warning": "Amariya pela ravêrya.",
    +	"node-count-exceeded-category-desc": "Pela azami amora gozgıray ravêr  da.",
    +	"node-count-exceeded-warning": "Pela amora gozgıra ravêr da",
     	"expansion-depth-exceeded-category": "Pela dı hetê canaya zoriya herayin ravêrya",
     	"expansion-depth-exceeded-warning": "Ravêriya pela xori herayêna",
     	"parser-unstrip-loop-warning": "Unstrip lete vineya",
    @@ -719,7 +727,7 @@
     	"viewpagelogs": "Seba na pele rê qeydan bımocne",
     	"nohistory": "Verê vurnayışanê na pele çıniyo.",
     	"currentrev": "Çımraviyarnayışo rocane",
    -	"currentrev-asof": "Revizyonanê peniyan, tarixê $1",
    +	"currentrev-asof": "$1 ra tepya mewcud weziyeta pela",
     	"revisionasof": "Verziyonê roca $1ine",
     	"revision-info": "Vurnayışo ke $1 de terefê {{GENDER:$6|$2}}$7 ra biyo",
     	"previousrevision": "← Çımraviyarnayışo kıhanêr",
    @@ -741,6 +749,7 @@
     	"history-feed-description": "Wiki de tarixê çımraviyarnayışê na pele",
     	"history-feed-item-nocomment": "$1 miyanê $2i de",
     	"history-feed-empty": "Pela cıgeyrayiye çıniya.\nBeno ke ena esteriya, ya zi namê cı vuriyo.\nSeba pelanê muhimanê newan [[Special:Search|cıgeyrayışê wiki de]] bıcerebne.",
    +	"history-edit-tags": "Etiketa weçinaye rewizyoni timar ke",
     	"rev-deleted-comment": "(Timarkerdışe enay hewadeyayo)",
     	"rev-deleted-user": "(nameyê karberi esteriyo)",
     	"rev-deleted-event": "(fealiyetê cıkewtışi esteriyo)",
    @@ -757,7 +766,7 @@
     	"rev-suppressed-unhide-diff": "Nê Timarkerdışi ra yewi '''çap biyo'''.\n[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} rocaneyê vındertışi] de teferru'ati esti.\nEke şıma serkari u devam bıkeri [$1 no vurnayiş şıma eşkeni bıvini].",
     	"rev-deleted-diff-view": "Jew timarkerdışê ena versiyon '''wedariyayo''.\nÎdarekarî şenê ena versiyon bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} wedarnayişî] de teferruat esto.",
     	"rev-suppressed-diff-view": "Jew timarkerdışê ena versiyon '''Ploxneyış'' biyo.\nÎdarekarî eşkeno ena dif bivîne; belki tiya de [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} ploxnayış] de teferruat esto.",
    -	"rev-delundel": "bımocne/bınımne",
    +	"rev-delundel": "bıasne/bınımne",
     	"rev-showdeleted": "bıasene",
     	"revisiondelete": "Çımraviyarnayışan bestere/peyser biya",
     	"revdelete-nooldid-title": "Çımraviyarnayışo waşte nêvêreno",
    @@ -810,7 +819,7 @@
     	"mergehistory-into": "Pela destinasyonî",
     	"mergehistory-list": "tarixê vurnayîşî ke eşkeno yew bi.",
     	"mergehistory-merge": "[[:$1]] qey ney revizyonê cêrini [[:$2]] şıma ekeni piyawani. Benatê wexto muwaqqet de piyayanayişê rezizyonan de tuşa radyo bıxebitne.",
    -	"mergehistory-go": "Vernayîşê yewbiyayeni bimocne",
    +	"mergehistory-go": "Yew bıyaye vurriyayışa bıasne",
     	"mergehistory-submit": "revizyonî yew bike",
     	"mergehistory-empty": "Revizyonî yew nibenê.",
     	"mergehistory-done": "$1 ra $3 {{PLURAL:$3|revizyon|revizyoni}} [[:$2]] de {{PLURAL:$3|biyo|biyê}} têmiyan.",
    @@ -827,7 +836,7 @@
     	"mergelog": "Qeydé zew kerdışi",
     	"revertmerge": "Abırnê",
     	"mergelogpagetext": "Cêr de yew liste esta ke mocnena ra, raya tewr peyêne kamci pela tarixi be a bine ra şanawa pê.",
    -	"history-title": "Tarixê çımraviyarnayışê \"$1\"",
    +	"history-title": "Revizyona pela \"$1\"",
     	"difference-title": "Pela \"$1\" ferqê çım ra viyarnayışan",
     	"difference-title-multipage": "Ferkê pelan dê \"$1\" u \"$2\"",
     	"difference-multipage": "(Ferqê pelan)",
    @@ -870,7 +879,7 @@
     	"search-category": "(kategori $1)",
     	"search-file-match": "(zerreyê dosya yewbini gêno)",
     	"search-suggest": "To va: $1",
    -	"search-rewritten": "Neticey $ asenê.  Herunda ney wa neticey $2  bıasê",
    +	"search-rewritten": "Neticey $ ra asenê.  Herunda ney wa neticey $2 ra bıasê",
     	"search-interwiki-caption": "Proceyê bıray",
     	"search-interwiki-default": "$1 ra neticey:",
     	"search-interwiki-more": "(véşi)",
    @@ -887,6 +896,7 @@
     	"powersearch-togglelabel": "Kontrol ke:",
     	"powersearch-toggleall": "Pêro",
     	"powersearch-togglenone": "Çıniyo",
    +	"powersearch-remember": "Cıgeyrayışanê newe tepyayan de biya xo viri",
     	"search-external": "Cıgeyrayışê teberi",
     	"searchdisabled": "{{SITENAME}} no keyepel de cıgerayiş muweqqet bıryayo. no benatê de şıma pê Google eşkeni zerreyê {{SITENAME}} de cıgerayiş bıkeri.",
     	"search-error": "Cıgeyrayış de yew xeta emê meydan: $1",
    @@ -902,6 +912,11 @@
     	"prefs-personal": "Pela karberi",
     	"prefs-rc": "Vurriyayışê peyêni",
     	"prefs-watchlist": "Lista seyrkerdışi",
    +	"prefs-editwatchlist": "Lista seyrkerdışi bıvurne",
    +	"prefs-editwatchlist-label": "Listey serkerdışanê cıkewtışi timar kerê",
    +	"prefs-editwatchlist-edit": "Sernamanê listey serkerdışanê xo bıasne u timar kerê",
    +	"prefs-editwatchlist-raw": "Lista seyrkerdışia xame bıvurne",
    +	"prefs-editwatchlist-clear": "Lista serykerdışê xo pak kerê",
     	"prefs-watchlist-days": "Rocê ke lista seyrkerdışi de bêrê ramocnaene",
     	"prefs-watchlist-days-max": "tewr vêşi $1 {{PLURAL:$1|roci|roci}}",
     	"prefs-watchlist-edits": "tewr zêde amarê vurnayışi ke lista seyrkerdışia herakerdiye de bıasê:",
    @@ -909,7 +924,7 @@
     	"prefs-watchlist-token": "Lista seyrkerdışia nışani:",
     	"prefs-misc": "ê bini",
     	"prefs-resetpass": "Parola bıvurne",
    -	"prefs-changeemail": "E-postay bıvurne",
    +	"prefs-changeemail": "E-postay bıvurne yana wedarne",
     	"prefs-setemail": "E-posta adresiyê xo saz kerê",
     	"prefs-email": "Tercihê e-maili",
     	"prefs-rendering": "Asayış",
    @@ -919,7 +934,8 @@
     	"rows": "Xeti:",
     	"columns": "Estûni:",
     	"searchresultshead": "Cı geyre",
    -	"stub-threshold": "Qandé <a href=\"#\" class=\"stub\">Taslağ  formati</a> sinor (bayti):",
    +	"stub-threshold": "Qandé Taslağ  formati  sinor:$1",
    +	"stub-threshold-sample-link": "misal",
     	"stub-threshold-disabled": "Astengın",
     	"recentchangesdays": "Rocê ke vurnayışanê peyênan de bıasê:",
     	"recentchangesdays-max": "Tewr zaf $1 {{PLURAL:$1|roc|roci}}",
    @@ -989,7 +1005,7 @@
     	"prefs-advancedrendering": "Tercihê raverberdey",
     	"prefs-advancedsearchoptions": "Tercihê raverberdey",
     	"prefs-advancedwatchlist": "Tercihê raverberdey",
    -	"prefs-displayrc": "Tercihan bımocne",
    +	"prefs-displayrc": "Tercihê asenayışi",
     	"prefs-displaywatchlist": "Weçinayışê mocnayışi",
     	"prefs-tokenwatchlist": "Morge",
     	"prefs-diffs": "Ferqi",
    @@ -998,10 +1014,10 @@
     	"userrights": "İdarey heqanê karberan",
     	"userrights-lookup-user": "Grubanê karberi/karbere idare bıke",
     	"userrights-user-editname": "Yew nameyê karberi cı kewe:",
    -	"editusergroup": "Grupanê karberi/karbere bıvurne (bıbedelne)",
    -	"editinguser": "'''[[User:$1|$1]]''' keno weziyetê $2'i bıvurno",
    +	"editusergroup": "Grupanê {{GENDER:$1|karberi}} bıvurne",
    +	"editinguser": "{{GENDER:$1|karber}} [[User:$1|$1]] heqanê $2'i vurne no",
     	"userrights-editusergroup": "Grubanê karberi/karbere sero bıgureye (bıxebetiye)",
    -	"saveusergroups": "Grubanê karberi qeyd bıke",
    +	"saveusergroups": "Grubanê {{GENDER:$1|karberi}} qeyd bıke",
     	"userrights-groupsmember": "Ezayê:",
     	"userrights-groupsmember-auto": "Ezao daxıl/ezaa daxıle ê:",
     	"userrights-groups-help": "şıma şenê grubanê nê karberi/na karbere, oyo/aya ke tede, bıvurnê:\n* qutiya ke nışankerdiya, mocnena ke karber/e na grube dero/dera.\n* qutiya ke nışankerdiye niya, mocnena ke karber/ na grube de niyo/niya.\n* Yew estare * mocneno ke, gruba ke şıma kerda ra ser (daxıl kerda), şıma nêşenê wedarê/hewa dê ya ki dêmlaşta/tersê cı.",
    @@ -1040,6 +1056,7 @@
     	"right-createpage": "Pele vıraze (pelê ke ê werênayışi niyê)",
     	"right-createtalk": "Pela werênayışi vıraze",
     	"right-createaccount": "Hesabê karberi vıraze",
    +	"right-autocreateaccount": "Xarici yew name dê karberi ya ronıştış ake",
     	"right-minoredit": "Vurnayışan qıckek nışan bıde.",
     	"right-move": "Pele bere",
     	"right-move-subpages": "Pele be bınpelanê cı ra pia bere",
    @@ -1105,6 +1122,8 @@
     	"right-override-export-depth": "Peleyanê ke tede linkanê 5 ra zafyer estê ay export bike",
     	"right-sendemail": "Karberanê binî ra e-mail bişirav",
     	"right-passwordreset": "E-postayanê parola reset kerdışa vineno",
    +	"right-managechangetags": "[[Special:Tags|Etiketi]] vıraz u aktiv (me)ke",
    +	"right-applychangetags": "[[Special:Tags|Etiketa]]  vurnayışana piya dezge fi.",
     	"newuserlogpage": "Cıkewtışê hesabvıraştışi",
     	"newuserlogpagetext": "Ena log de viraştişê karberî esta.",
     	"rightslog": "Qeydê heqanê karberi",
    @@ -1164,26 +1183,26 @@
     	"recentchanges-legend-heading": "<strong>Kıtabek:</strong>",
     	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|Lista pelanê neweyan]] zi bıvêne)",
     	"recentchanges-legend-plusminus": "''(±123)''",
    -	"recentchanges-submit": "Bıasene",
    +	"recentchanges-submit": "Bıasne",
     	"rcnotefrom": "Cêr de <strong>$2</strong> ra nata vurnayışiyê asenê (tewr vêşi <strong>$1</strong> asenê).",
     	"rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
     	"rcshowhideminor": "vurnayışê werdiyi $1",
    -	"rcshowhideminor-show": "Bıasene",
    +	"rcshowhideminor-show": "Bıasne",
     	"rcshowhideminor-hide": "Bınımne",
     	"rcshowhidebots": "botan $1",
     	"rcshowhidebots-show": "Bıasene",
     	"rcshowhidebots-hide": "Bınımne",
     	"rcshowhideliu": "karberê qeydbiyayeyi $1",
    -	"rcshowhideliu-show": "Bıasene",
    +	"rcshowhideliu-show": "Bıasne",
     	"rcshowhideliu-hide": "Bınımne",
     	"rcshowhideanons": "karberê bênameyi $1",
     	"rcshowhideanons-show": "Bıasene",
     	"rcshowhideanons-hide": "Bınımne",
     	"rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
    -	"rcshowhidepatr-show": "Bıasene",
    +	"rcshowhidepatr-show": "Bıasne",
     	"rcshowhidepatr-hide": "Bınımne",
     	"rcshowhidemine": "vurnayışanê mı $1",
    -	"rcshowhidemine-show": "Bıasene",
    +	"rcshowhidemine-show": "Bıasne",
     	"rcshowhidemine-hide": "Bınımne",
     	"rcshowhidecategorization": "kategorizasyonê pele $1",
     	"rcshowhidecategorization-show": "Bıasne",
    @@ -1603,12 +1622,15 @@
     	"apihelp": "Peştiya APIyi",
     	"apihelp-no-such-module": "Modulê \"$1\" çıniyo.",
     	"apisandbox": "API qumdor",
    +	"apisandbox-fullscreen": "Panela hera kerdışi",
     	"apisandbox-submit": "Bıwazê",
     	"apisandbox-reset": "Bestere",
    +	"apisandbox-retry": "Fına",
     	"apisandbox-examples": "Misali",
     	"apisandbox-dynamic-parameters": "Parametreya debyayi",
     	"apisandbox-dynamic-parameters-add-label": "Parametre dek:",
     	"apisandbox-dynamic-parameters-add-placeholder": "Nmaey parametrey",
    +	"apisandbox-submit-invalid-fields-title": "Tay çiy ters şı",
     	"apisandbox-results": "Neticey",
     	"apisandbox-sending-request": "API waştış rışêno...",
     	"apisandbox-request-url-label": "URL waştış:",
    @@ -1632,10 +1654,11 @@
     	"checkbox-select": "Weçinaye: $1",
     	"checkbox-all": "Pêro",
     	"checkbox-none": "Temam",
    +	"checkbox-invert": "Doç kerdış",
     	"allpages": "Peli pêro",
     	"nextpage": "Pela badê cû ($1)",
     	"prevpage": "Pela verêne ($1)",
    -	"allpagesfrom": "Pelanê ke be ena herfe dest pêkenê bımocne",
    +	"allpagesfrom": "Pera liste kerdışi bıasne:",
     	"allpagesto": "Pelanê ke be ena herfe qediyenê bımocne:",
     	"allarticles": "Wesiqey pêro",
     	"allinnamespace": "Peli pênro ( $1 cayênameyî)",
    @@ -1692,6 +1715,9 @@
     	"listgrouprights-removegroup-self-all": "şıma hesabê xo ra eşkeni heme gruban bıveci",
     	"listgrouprights-namespaceprotection-header": "Kılm kerdena nameyan",
     	"listgrouprights-namespaceprotection-namespace": "Heruna nami",
    +	"listgrants": "Hibey",
    +	"listgrants-grant": "Hibe",
    +	"listgrants-rights": "Heqi",
     	"trackingcategories": "Kategoriyê teqibi",
     	"trackingcategories-msg": "Kategoriya teqibi",
     	"trackingcategories-name": "Namey mesaci",
    @@ -1750,7 +1776,7 @@
     	"wlshowlast": "Peyni de vurnayışan ra  $1 seata u $2 roca  bımocnê",
     	"watchlist-hide": "Bınımne",
     	"watchlist-submit": "Bıasene",
    -	"wlshowtime": "Peyênan bımocne:",
    +	"wlshowtime": "Periyoda zemani asenayışi:",
     	"wlshowhideminor": "vurnayışê werdiyi",
     	"wlshowhidebots": "boti",
     	"wlshowhideliu": "karberê qeydıni",
    @@ -1879,7 +1905,7 @@
     	"restriction-level-sysop": "tam pawiyayo",
     	"restriction-level-autoconfirmed": "nêm pawiyayo",
     	"restriction-level-all": "kamci be sewiya",
    -	"undelete": "Peleyê ke besterneyayê enê bımocnê",
    +	"undelete": "Peranê esteryayan bıasne",
     	"undeletepage": "bıewn revizyonê peli yê hewn a şiyayeyan u tepiya biyar",
     	"undeletepagetitle": "'''pelo [[:$1|$1]] cêrın, wayirê revizyonê hewn a şiyayeyan o'''.",
     	"viewdeletedpage": "Pelanê esteriyayeyan bımocne",
    @@ -1896,7 +1922,7 @@
     	"undeletebtn": "Timar bike",
     	"undeletelink": "bıvêne/peyser biya",
     	"undeleteviewlink": "bıvin",
    -	"undeleteinvert": "Weçinıtışi açarne",
    +	"undeleteinvert": "Weçinayışi dimlaşt ke",
     	"undeletecomment": "Sebeb:",
     	"undeletedrevisions": "pêro piya{{PLURAL:$1|1 qeyd|$1 qeyd}} tepiya anciya.",
     	"undeletedrevisions-files": "{{PLURAL:$1|1 revizyon|$1 revizyon}} u {{PLURAL:$2|1 dosya|$2 dosya}} ameyê halê xo yê verıni",
    @@ -1919,12 +1945,12 @@
     	"undelete-show-file-confirm": "\"<nowiki>$1</nowiki>\" şıma emin î dosyaya revizyonê no $2 $3 tarixi bıvini?",
     	"undelete-show-file-submit": "Eya",
     	"namespace": "Heruna nameyi:",
    -	"invert": "Weçinıtışi açarne",
    +	"invert": "Weçinayışi dimlaşt ke",
     	"tooltip-invert": "nameyo ke nışan biyo (u nameyo elekeyın zi nışanyyayo se) vurnayışan  zerrekan nımtışi re ena dore tesdiqi nışan kerê",
     	"namespace_association": "Heruna nameyanê elaqedaran",
     	"tooltip-namespace_association": "Herunda canemiya elekeyın nışan kerdışi sero qıse kerdışi yana zerre dekerdışi rê ena dora tesdiqi nışan kerê",
     	"blanknamespace": "(Ser)",
    -	"contributions": "Dekerdışê {{GENDER:$1|karber}}i",
    +	"contributions": "İştiraqê {{GENDER:$1|karber}}i",
     	"contributions-title": "Dekerdenê karber de $1",
     	"mycontris": "İştıraqi",
     	"anoncontribs": "İştıraqi",
    @@ -2367,8 +2393,8 @@
     	"pageinfo-category-pages": "Amarê pelan",
     	"pageinfo-category-subcats": "Amarê bınkategoriyan",
     	"pageinfo-category-files": "Amarê dosyeyan",
    -	"markaspatrolleddiff": "Nişan bıke ke dewriya biyo",
    -	"markaspatrolledtext": "Ena pele nişan bike ke devriye biyo",
    +	"markaspatrolleddiff": "Kontrol biyayi nışan ke",
    +	"markaspatrolledtext": "Ena pele kontrol biyayi nışan ke",
     	"markedaspatrolled": "Nişan biyo ke verni de devriye biyo",
     	"markedaspatrolledtext": "Versiyone weçinaye [[:$1]] nişan biyo ke devriye biyo",
     	"rcpatroldisabled": "Dewriyaya vurnayışê peyêni nêxebetiyena",
    @@ -2414,7 +2440,7 @@
     	"file-info-png-frames": "$1 {{PLURAL:$1|çerçeve|çerçeveyi}}",
     	"file-no-thumb-animation": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de animasyoni miyan dı nêbo.'''",
     	"file-no-thumb-animation-gif": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de  GIF imaci de animasyon do nêbo.'''",
    -	"newimages": "Galeriye Dosyan dê newan",
    +	"newimages": "Galeriya dosyanê neweyan",
     	"imagelisttext": "Cêr de yew listeyê '''$1''' esto {{PLURAL:$1|dosya|dosyayi}} veçiniya $2.",
     	"newimages-summary": "Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.",
     	"newimages-legend": "Avrêc",
    @@ -2485,7 +2511,7 @@
     	"variantname-shi": "shi",
     	"metadata": "Melumato serên",
     	"metadata-help": "Ena dosya dı zafyer informasyoni esto. Belki ena dosya yew kamareyo dijital ya zi skaner ra vıraziyo.\nEg ena dosya, kondisyonê orcinali ra bıvuriya, belki detayanê hemi nıeseno.",
    -	"metadata-expand": "Detayan bımocne",
    +	"metadata-expand": "Detayan bıasne",
     	"metadata-collapse": "melumati bınımne",
     	"metadata-fields": "Resımê meydanê metadataê ke na pele de benê lista, pela resımmocnaene de ke tabloê metadata gına waro, gureniyenê.\nÊ bini zey sayekerdoğan nımiyenê.\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-langitem": "'''$2:''' $1",
    @@ -2924,7 +2950,7 @@
     	"autosumm-replace": "Maqale pê '$1' vuriya",
     	"autoredircomment": "heteneya [[$1]]",
     	"autosumm-new": "Pela vıraziyê, '$1' bıvinê",
    -	"size-bytes": "$1 B",
    +	"size-bytes": "$1 {{PLURAL:$1|bayt|bayti}}",
     	"size-kilobytes": "$1 KB",
     	"size-megabytes": "$1 MB",
     	"size-gigabytes": "$1 GB",
    @@ -3123,6 +3149,7 @@
     	"tags-create-tag-name": "Nameyê etiketi:",
     	"tags-create-reason": "Sebeb:",
     	"tags-create-submit": "Vıraze",
    +	"tags-edit-reason": "Sebeb:",
     	"comparepages": "Pela miqeyese ke",
     	"compare-page1": "Pele 1",
     	"compare-page2": "Pele 2",
    @@ -3198,7 +3225,7 @@
     	"feedback-bugcheck": "Harika! Sadece [xırabina ke $1 ] çınyayışê cı kontrol keno.",
     	"feedback-bugnew": "Mı qontrol ke. Xetaya newi xeber ke",
     	"feedback-bugornote": "Jew mersela teferruato teknik esta şıma reca malumatê şıma hazıro se [ $1  jew xırab rapor] bıvinê.Zewbi zi, formê cerê xo rê şenê karfiyê. Vatışê xo pela da \"[ $3  $2 ]\", namey karber dê xoya piya u wasteriya karfiye.",
    -	"feedback-cancel": "Bıtexelne",
    +	"feedback-cancel": "Peyd ke",
     	"feedback-close": "Biya star",
     	"feedback-error1": "Xeta: API ra neticey ne vıcyay",
     	"feedback-error2": "Xeta: Timar kerdış nebı",
    @@ -3318,6 +3345,5 @@
     	"special-characters-title-minus": "işaretê kemiye",
     	"mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
     	"mw-widgets-dateinput-placeholder-month": "SSSS-AA",
    -	"mw-widgets-titleinput-description-redirect": "berd be $1",
    -	"api-error-blacklisted": "Reca keme zewbina weçine, name wa şınasnaye bo."
    +	"mw-widgets-titleinput-description-redirect": "berd be $1"
     }
    diff --git a/languages/i18n/dty.json b/languages/i18n/dty.json
    index 761f799884..dca9160fb0 100644
    --- a/languages/i18n/dty.json
    +++ b/languages/i18n/dty.json
    @@ -377,7 +377,9 @@
     	"createacct-yourpasswordagain": "पासवर्ड निश्चित गर",
     	"createacct-yourpasswordagain-ph": "आजी पासवर्ड लेख",
     	"userlogin-remembermypassword": "मुलाई अघाडी झान्या काम गराइराख्या",
    +	"userlogin-signwithsecure": "सुक्षित जडान प्रयोग गद्द्या",
     	"cannotloginnow-title": "अईल भितर झान नाइँ पाईनो",
    +	"cannotloginnow-text": "भितर जान असंभव छ जब प्रयोग $1|",
     	"yourdomainname": "तमरो ज्ञानक्षेत्र(डोमेन):",
     	"password-change-forbidden": "ये विकिमी पासवर्ड परिवर्तन गर्न सक्नुहुन्न।",
     	"login": "प्रवेश (लगईन)",
    @@ -409,7 +411,7 @@
     	"createacct-reason": "कारण",
     	"createacct-reason-ph": "क्याई तम नयाँ खाता खोल्ला छौ?",
     	"createacct-submit": "तमरो खाता सिर्जना गर",
    -	"createacct-another-submit": "दोसरो खाता सिर्जना गर",
    +	"createacct-another-submit": "खाता खोल",
     	"createacct-continue-submit": "खाता खोल्लु जारि राख",
     	"createacct-another-continue-submit": "खाता खोल्लु जारि राख",
     	"createacct-benefit-heading": "{{SITENAME}} तम जसाई मान्सुनले सिर्जना गरिया हो ।",
    @@ -808,11 +810,26 @@
     	"timezoneregion-asia": "एसिया",
     	"timezoneregion-atlantic": "एट्लान्टिक महासागर",
     	"timezoneregion-australia": "अष्ट्रेलिया",
    +	"timezoneregion-europe": "युरोप",
     	"timezoneregion-indian": "हिन्द महासागर",
    +	"timezoneregion-pacific": "प्राशान्त महासागर",
    +	"allowemail": "और प्रयोगकर्ताबठे पौन्या ईमेल सक्षम गर।",
    +	"prefs-searchoptions": "खोज",
    +	"prefs-namespaces": "नामठौर:",
    +	"default": "पूर्वनिर्धारित",
     	"prefs-files": "फाइलहरू",
    +	"prefs-custom-css": "अनुकुलित CSS",
    +	"prefs-custom-js": "अनुकुल जाभास्क्रिप्ट",
    +	"prefs-common-css-js": "साझा CSS/जाभा स्क्रिप्ट सबै कि लेखा:",
    +	"prefs-reset-intro": "तम ये पृष्ठलाई आफनो अभिरुचीहरू साइट पूर्वावस्थामी फर्काउनत फर्काउन प्रयोग गद्दु सकन्छौ । तै पाछा ये लाई रद्द गद्दु सकन्छौ ।",
    +	"prefs-emailconfirm-label": "इ-मेल एकिन प्रक्रिया:",
     	"youremail": "ईमेल",
    +	"username": "{{लिंग:$1|प्रयोगकर्ता नाम}}:",
    +	"prefs-memberingroups": "निम्न {{बहुबचन:$1|समूह | समूहहरू}}को {{लिंग:$2|सदस्य}} :",
    +	"prefs-registration": "दर्ता समय:",
     	"yourrealname": "वास्तविक नाम:",
     	"yourlanguage": "भाषा",
    +	"yourvariant": "लेखको भाषा संस्करण:",
     	"yournick": "नयाँ हस्ताक्षर:",
     	"prefs-help-signature": "कुरडी पानाका टिप्पणीहरू \"<nowiki>~~~~</nowiki>\" द्वारा दस्तखत गरिनुपडन्छ ,त्यो पछि तमरो दस्तखत र समयरेखामी रुपान्तरित हुनेछ ।",
     	"badsiglength": "तमरो दस्तखत मैथै लामो छ।\nयो $1 {{PLURAL:$1|अक्षर|अक्षरहरू}} भन्दा लामो हुनु हुँदैन ।",
    diff --git a/languages/i18n/el.json b/languages/i18n/el.json
    index aadacabce4..c1bba97691 100644
    --- a/languages/i18n/el.json
    +++ b/languages/i18n/el.json
    @@ -48,7 +48,8 @@
     			"Gts-tg",
     			"Nemo bis",
     			"Αντιγόνη",
    -			"Matma Rex"
    +			"Matma Rex",
    +			"Ανώνυμος Βικιπαιδιστής"
     		]
     	},
     	"tog-underline": "Υπογράμμιση συνδέσμων:",
    @@ -90,7 +91,7 @@
     	"tog-ccmeonemails": "Να μου αποστέλλονται αντίγραφα των μηνυμάτων ηλεκτρονικού ταχυδρομείου που στέλνω σε άλλους χρήστες",
     	"tog-diffonly": "Να μην εμφανίζεται περιεχόμενο σελίδων κάτω από τις διαφορές των εκδόσεων",
     	"tog-showhiddencats": "Εμφάνιση κρυμμένων κατηγοριών",
    -	"tog-norollbackdiff": "Παράλειψη διαφοράς μετά την εκτέλεση επαναφοράς",
    +	"tog-norollbackdiff": "Παράλειψη εμφάνισης διαφορών μετά την εκτέλεση επαναφοράς",
     	"tog-useeditwarning": "Προειδοποίηση όταν εγκαταλείπω μία σελίδα επεξεργασίας χωρίς να έχω πρώτα αποθηκεύσει τις αλλαγές",
     	"tog-prefershttps": "Να γίνεται πάντα χρήση ασφαλούς σύνδεσης όταν ο χρήστης είναι συνδεδεμένος",
     	"underline-always": "Πάντα",
    @@ -445,6 +446,7 @@
     	"password-change-forbidden": "Δεν μπορείτε να αλλάξετε τους κωδικούς πρόσβασης σε αυτό το βίκι.",
     	"externaldberror": "Είτε συνέβη κάποιο σφάλμα εξωτερικής πιστοποίησης της βάσης δεδομένων είτε δεν σας έχει επιτραπεί να ενημερώσετε τον εξωτερικό σας λογαριασμό.",
     	"login": "Είσοδος",
    +	"login-security": "Επαληθεύστε την ταυτότητά σας",
     	"nav-login-createaccount": "Είσοδος / δημιουργία λογαριασμού",
     	"userlogin": "Είσοδος / δημιουργία λογαριασμού",
     	"userloginnocreate": "Είσοδος",
    @@ -462,18 +464,23 @@
     	"userlogin-resetpassword-link": "Ξεχάσατε τον κωδικό πρόσβασης;",
     	"userlogin-helplink2": "Βοήθεια για τη σύνδεση",
     	"userlogin-loggedin": "Είστε ήδη {{GENDER:$1|συνδεδεμένος|συνδεδεμένη}} ως $1.\nΧρησιμοποιήστε την παρακάτω φόρμα για να συνδεθείτε ως άλλος χρήστης.",
    +	"userlogin-reauth": "Θα πρέπει να συνδεθείτε ξανά για να επιβεβαιώσετε ότι είστε ο/η {{GENDER:$1|$1}}.",
     	"userlogin-createanother": "Δημιουργήστε άλλο λογαριασμό",
     	"createacct-emailrequired": "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
     	"createacct-emailoptional": "Διεύθυνση ηλεκτρονικού ταχυδρομείου (προαιρετικό)",
     	"createacct-email-ph": "Εισαγάγετε τη διεύθυνση ηλεκτρονικού σας ταχυδρομείου",
     	"createacct-another-email-ph": "Εισαγάγετε τη διεύθυνση ηλεκτρονικού ταχυδρομείου",
     	"createaccountmail": "Χρήση τυχαίου προσωρινού κωδικού πρόσβασης και αποστολή του στην καθοριζόμενη διεύθυνση ηλεκτρονικού ταχυδρομείου",
    +	"createaccountmail-help": "Μπορεί να χρησιμοποιηθεί για την δημιουργία λογαριασμού τρίτων χωρίς την γνωστοποίηση των κωδικών πρόσβασής τους.",
     	"createacct-realname": "Πραγματικό όνομα (προαιρετικό)",
     	"createaccountreason": "Αιτία:",
     	"createacct-reason": "Λόγος",
     	"createacct-reason-ph": "Γιατί δημιουργείτε έναν άλλο λογαριασμό",
    +	"createacct-reason-help": "Εμφανιζόμενο μήνυμα στο μητρώο δημιουργίας λογαριασμών",
     	"createacct-submit": "Δημιουργία λογαριασμού χρήστη",
     	"createacct-another-submit": "Δημιουργία λογαριασμού",
    +	"createacct-continue-submit": "Συνεχίστε την δημιουργία λογαριασμού",
    +	"createacct-another-continue-submit": "Συνεχίστε την δημιουργία λογαριασμού",
     	"createacct-benefit-heading": "Το {{SITENAME}} έχει φτιαχτεί από ανθρώπους σαν κι εσένα.",
     	"createacct-benefit-body1": "{{PLURAL:$1|επεξεργασία|επεξεργασίες}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|σελίδα|σελίδες}}",
    @@ -487,10 +494,11 @@
     	"nocookiesnew": "Ο λογαριασμός χρήστη έχει δημιουργηθεί, αλλά δεν έχετε ακόμα συνδεθεί. Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και στη συνέχεια συνδεθείτε χρησιμοποιώντας το νέο όνομα χρήστη σας και τον κωδικό σας.",
     	"nocookieslogin": "Το {{SITENAME}} χρησιμοποιεί cookies κατά τη σύνδεση των χρηστών. Τα cookies είναι απενεργοποιημένα στον υπολογιστή σας. Παρακαλούμε ενεργοποιήστε τα και ξαναδοκιμάστε!",
     	"nocookiesfornew": "Ο λογαριασμός χρήστη δεν δημιουργήθηκε, καθώς δεν μπορούσε να επιβεβαιώσει την πηγή του. \n Βεβαιωθείτε ότι έχετε ενεργοποιήσει τα cookies, ξαναφορτώστε αυτή τη σελίδα και προσπαθήστε ξανά.",
    +	"createacct-loginerror": "Ο λογαριασμός δημιουργήθηκε με επιτυχία, αλλά δεν μπορέσατε να συνδεθείτε αυτόματα. Παρακαλώ [[Special:UserLogin|συνδεθείτε χειροκίνητα]].",
     	"noname": "Το όνομα χρήστη που έχετε καθορίσει δεν είναι έγκυρο.",
     	"loginsuccesstitle": "Επιτυχής σύνδεση",
     	"loginsuccess": "Είστε συνδεδεμένος(-η) στο {{SITENAME}} ως \"$1\".",
    -	"nosuchuser": "Δεν υπάρχει χρήστης με το όνομα \"$1\".\nΤα ονόματα χρηστών είναι ευαίσθητα σε κεφαλαιογράμματη και μικρογράμματη γραφή.\nΕλέγξτε την ορθογραφία ή [[Special:CreateAccount|δημιουργήστε ένα νέο λογαριασμό]].",
    +	"nosuchuser": "Δεν υπάρχει χρήστης με το όνομα \"$1\".\nΤα ονόματα χρηστών είναι ευαίσθητα στα κεφαλαία και στα μικρά.\nΕλέγξτε την ορθογραφία ή [[Special:CreateAccount|δημιουργήστε ένα νέο λογαριασμό]].",
     	"nosuchusershort": "Δεν υπάρχει χρήστης με το όνομα \"$1\". Παρακαλούμε ελέγξτε την ορθογραφία.",
     	"nouserspecified": "Πρέπει να ορίσετε ένα όνομα χρήστη.",
     	"login-userblocked": "Αυτός ο χρήστης έχει αποκλειστεί. Δεν επιτρέπεται σύνδεση.",
    @@ -507,7 +515,7 @@
     	"noemail": "Δεν έχει καθοριστεί ηλεκτρονική διεύθυνση για τον χρήστη \"$1\".",
     	"noemailcreate": "Είναι απαραίτητο να υποβάλλετε μια έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
     	"passwordsent": "Σας έχει σταλεί ένας νέος κωδικός στην ηλεκτρονική διέθυνση που δηλώσατε για \"$1\".\nΣας παρακαλούμε να ξανασυνδεθείτε μόλις τον λάβετε.",
    -	"blocked-mailpassword": "Η διεύθυνση IP σας είναι αποκλεισμένη από επεξεργασία, και έτσι\nδεν επιτρέπεται να χρησιμοποιήσει την λειτουργία ανάκτησης κωδικού πρόσβασης, για την αποφυγή κατάχρησης.",
    +	"blocked-mailpassword": "Η διεύθυνση IP σας δεν έχει δικαίωμα επεξεργασίας. Για την αποφυγή κατάχρησης, δεν επιτρέπεται να χρησιμοποιήσετε την λειτουργία ανάκτησης κωδικού πρόσβασης από αυτήν την IP.",
     	"eauthentsent": "Ένα μήνυμα επαλήθευσης έχει σταλεί στην ηλεκτρονική διεύθυνση που έχετε δηλώσει.\nΠριν αρχίσει η αποστολή μηνυμάτων στη συγκεκριμένη διεύθυνση, πρέπει να ακολουθήσετε τις οδηγίες που βρίσκονται στο μήνυμα που σας έχει σταλεί, για να επαληθεύσετε ότι η συγκεκριμένη ηλεκτρονική διεύθυνση ανήκει πραγματικά σε εσάς.",
     	"throttled-mailpassword": "Ένα email επαναφοράς κωδικού έχει ήδη αποσταλεί, μέσα {{PLURAL:$1|στην τελευταία ώρα|στις τελευταίες $1 ώρες}}.\nΓια την αποφυγή κατάχρησης, μόνο ένα email επαναφοράς κωδικού θα στέλνεται ανά {{PLURAL:$1|ώρα|$1 ώρες}}.",
     	"mailerror": "Σφάλμα στην αποστολή του μηνύματος: $1",
    @@ -524,13 +532,14 @@
     	"createaccount-title": "Δημιουργία λογαριασμού για {{SITENAME}}",
     	"createaccount-text": "Κάποιος δημιούργησε έναν λογαριασμό για τη διεύθυνση email σας στο {{SITENAME}} ($4) με το όνομα \"$2\", με κωδικό πρόσβασης \"$3\". Θα πρέπει να συνδεθείτε και να αλλάξετε τον κωδικό πρόσβασής σας τώρα.\n\nΜπορείτε να αγνοήσετε αυτό το μήνυμα, αν αυτός ο λογαριασμός δημιουργήθηκε εσφαλμένα.",
     	"login-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
    -	"login-abort-generic": "Η είσοδος δεν πέτυχε - Ματαιώθηκε",
    +	"login-abort-generic": "Η είσοδος σας απέτυχε - Ματαίωση",
     	"login-migrated-generic": "Ο λογαριασμός σας έχει μεταναστεύσει, και το όνομα χρήστη σας δεν υπάρχει πλέον σε αυτό το wiki.",
     	"loginlanguagelabel": "Γλώσσα: $1",
     	"suspicious-userlogout": "Το αίτημα αποσύνδεσής σας απερρίφθη επειδή φαίνεται ότι στάλθηκε από ένα λανθασμένο φυλλομετρητή (browser) ή διακομιστή προσωρινής αποθήκευσης.",
     	"createacct-another-realname-tip": "Το πραγματικό όνομα είναι προαιρετικό.\nΑν επιλέξετε να το δώσετε, αυτό θα μπορεί να χρησιμοποιηθεί για να αναγνωριστεί η δουλειά σας.",
     	"pt-login": "Σύνδεση",
     	"pt-login-button": "Σύνδεση",
    +	"pt-login-continue-button": "Συνεχίστε την σύνδεσή σας",
     	"pt-createaccount": "Δημιουργία λογαριασμού",
     	"pt-userlogout": "Αποσύνδεση",
     	"php-mail-error-unknown": "Άγνωστο σφάλμα στη συνάρτηση mail() της PHP.",
    @@ -544,9 +553,10 @@
     	"newpassword": "Νέος κωδικός πρόσβασης",
     	"retypenew": "Πληκτρολογήστε ξανά το νέο κωδικό.",
     	"resetpass_submit": "Δώστε κωδικό πρόσβασης και συνδεθείτε",
    -	"changepassword-success": "Ο κωδικός πρόσβασής σας άλλαξε επιτυχώς!",
    +	"changepassword-success": "Ο κωδικός πρόσβασής σας άλλαξε!",
     	"changepassword-throttled": "Κάνατε πάρα πολλές πρόσφατες απόπειρες σύνδεσης.\nΠαρακαλούμε περιμένετε $1 προτού ξαναδοκιμάσετε.",
     	"botpasswords": "Κωδικοί πρόσβασης για Μποτ",
    +	"botpasswords-summary": "<em>Οι κωδικοί των μποτ</em> δίνουν πρόσβαση σε λογαριασμό χρήστη μέσω του API χωρίς να χρησιμοποιούνται τα συνθηματικά της κύριας σύνδεσης του λογαριασμού. Τα δικαιώματα χρήστη όταν με σύνδεση μέσω κωδικού μποτ μπορεί να είναι περιορισμένα.\n\nΑν δεν ξέρετε γιατί θέλετε να το κάνετε αυτό, καλύτερα να μην το κάνετε. Κανένα δεν θα πρέπει να σας ζητήσει να δημιουργήσετε ένα τέτοιο κωδικό και να του τον γνωστοποιήσετε.",
     	"botpasswords-disabled": "Οι κωδικοί πρόσβασης των ρομπότ είναι απενεργοποιημένοι.",
     	"botpasswords-no-central-id": "Για να χρησιμοποιήσετε τους κωδικούς πρόσβασης των ρομπότ θα πρέπει να συνδεθείτε με έναν κεντρικό λογαριασμό.",
     	"botpasswords-existing": "Υπάρχοντες κωδικοί πρόσβασης ρομπότ",
    @@ -642,6 +652,8 @@
     	"minoredit": "Αυτή είναι μια μικροαλλαγή",
     	"watchthis": "Παρακολούθηση αυτής της σελίδας",
     	"savearticle": "Αποθήκευση σελίδας",
    +	"publishpage": "Δημοσίευση σελίδας",
    +	"publishchanges": "Δημοσίευση αλλαγών",
     	"preview": "Προεπισκόπηση",
     	"showpreview": "Εμφάνιση προεπισκόπησης",
     	"showdiff": "Εμφάνιση αλλαγών",
    @@ -2482,6 +2494,7 @@
     	"tooltip-ca-nstab-category": "Προβολή της σελίδας κατηγορίας",
     	"tooltip-minoredit": "Χαρακτηρισμός αυτής της επεξεργασίας ως μικροεπεξεργασία",
     	"tooltip-save": "Αποθήκευση των αλλαγών σας",
    +	"tooltip-publish": "Δημοσίευση των αλλαγών σας",
     	"tooltip-preview": "Προεπισκόπηση των αλλαγών σας. Παρακαλούμε χρησιμοποιήστε την πριν αποθηκεύσετε!",
     	"tooltip-diff": "Εμφάνιση των αλλαγών που κάνατε στο κείμενο",
     	"tooltip-compareselectedversions": "Προβολή των διαφορών ανάμεσα στις δύο επιλεγμένες αναθεωρήσεις αυτής της σελίδας",
    @@ -3520,9 +3533,9 @@
     	"mw-widgets-dateinput-placeholder-month": "ΕΕΕΕ-ΜΜ",
     	"mw-widgets-titleinput-description-new-page": "η σελίδα που δεν υπάρχει ακόμα",
     	"mw-widgets-titleinput-description-redirect": "ανακατεύθυνση στο $1",
    -	"api-error-blacklisted": "Παρακαλώ επιλέξτε ένα διαφορετικό, περιγραφικό τίτλο.",
     	"sessionprovider-generic": "$1 συνεδρίες",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "συνεδρίες με βάση τα cookies",
     	"sessionprovider-nocookies": "Τα Cookies μπορούν να απενεργοποιηθούν. Βεβαιωθείτε ότι έχετε ενεργοποιημένα τα cookies και ξεκινήστε πάλι.",
    -	"randomrootpage": "Τυχαία κύρια σελίδα"
    +	"randomrootpage": "Τυχαία κύρια σελίδα",
    +	"log-action-filter-rights": "Πληκτρολογήστε για αλλαγή δικαιωμάτων:"
     }
    diff --git a/languages/i18n/en.json b/languages/i18n/en.json
    index cc58b131b9..6d1e58d4c5 100644
    --- a/languages/i18n/en.json
    +++ b/languages/i18n/en.json
    @@ -319,7 +319,7 @@
     	"databaseerror-query": "Query: $1",
     	"databaseerror-function": "Function: $1",
     	"databaseerror-error": "Error: $1",
    -	"transaction-duration-limit-exceeded": "To avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 {{PLURAL:$2|second|seconds}} limit.\nIf you are changing many items at once, try doing multiple smaller operations instead.",
    +	"transaction-duration-limit-exceeded": "To avoid creating high replication lag, this transaction was aborted because the write duration ($1) exceeded the $2 second limit.\nIf you are changing many items at once, try doing multiple smaller operations instead.",
     	"laggedslavemode": "<strong>Warning:</strong> Page may not contain recent updates.",
     	"readonly": "Database locked",
     	"enterlockreason": "Enter a reason for the lock, including an estimate of when the lock will be released",
    @@ -658,7 +658,9 @@
     	"minoredit": "This is a minor edit",
     	"watchthis": "Watch this page",
     	"savearticle": "Save page",
    +	"savechanges": "Save changes",
     	"publishpage": "Publish page",
    +	"publishchanges": "Publish changes",
     	"preview": "Preview",
     	"showpreview": "Show preview",
     	"showdiff": "Show changes",
    @@ -782,6 +784,8 @@
     	"content-model-json": "JSON",
     	"content-json-empty-object": "Empty object",
     	"content-json-empty-array": "Empty array",
    +	"deprecated-self-close-category": "Pages using invalid self-closed HTML tags",
    +	"deprecated-self-close-category-desc": "The page contains invalid self-closed HTML tags, such as <code>&lt;b/></code> or <code>&lt;span/></code>.  The behavior of these will change soon to be consistent with the HTML5 specification, so their use in wikitext is deprecated.",
     	"duplicate-args-warning": "<strong>Warning:</strong> [[:$1]] is calling [[:$2]] with more than one value for the \"$3\" parameter. Only the last value provided will be used.",
     	"duplicate-args-category": "Pages using duplicate arguments in template calls",
     	"duplicate-args-category-desc": "The page contains template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
    @@ -1281,8 +1285,8 @@
     	"rightslogtext": "This is a log of changes to user rights.",
     	"action-read": "read this page",
     	"action-edit": "edit this page",
    -	"action-createpage": "create pages",
    -	"action-createtalk": "create discussion pages",
    +	"action-createpage": "create this page",
    +	"action-createtalk": "create this discussion page",
     	"action-createaccount": "create this user account",
     	"action-autocreateaccount": "automatically create this external user account",
     	"action-history": "view the history of this page",
    @@ -1513,7 +1517,8 @@
     	"upload-http-error": "An HTTP error occurred: $1",
     	"upload-copy-upload-invalid-domain": "Copy uploads are not available from this domain.",
     	"upload-foreign-cant-upload": "This wiki is not configured to upload files to the requested foreign file repository.",
    -	"upload-foreign-cant-load-config": "Loading file upload configuration for the foreign file repository failed.",
    +	"upload-foreign-cant-load-config": "Failed to load the configuration for file uploads to the foreign file repository.",
    +	"upload-dialog-disabled": "File uploads using this dialog are disabled on this wiki.",
     	"upload-dialog-title": "Upload file",
     	"upload-dialog-button-cancel": "Cancel",
     	"upload-dialog-button-done": "Done",
    @@ -4056,7 +4061,6 @@
     	"mw-widgets-dateinput-placeholder-month": "YYYY-MM",
     	"mw-widgets-titleinput-description-new-page": "page does not exist yet",
     	"mw-widgets-titleinput-description-redirect": "redirect to $1",
    -	"api-error-blacklisted": "Please choose a different, descriptive title.",
     	"sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
     	"sessionprovider-generic": "$1 sessions",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
    @@ -4071,8 +4075,8 @@
     	"log-action-filter-newusers": "Type of account creation:",
     	"log-action-filter-patrol": "Type of patrol:",
     	"log-action-filter-protect": "Type of protection:",
    -	"log-action-filter-rights": "Type of right change",
    -	"log-action-filter-suppress": "Type of suppression",
    +	"log-action-filter-rights": "Type of right change:",
    +	"log-action-filter-suppress": "Type of suppression:",
     	"log-action-filter-upload": "Type of upload:",
     	"log-action-filter-all": "All",
     	"log-action-filter-block-block": "Block",
    @@ -4107,7 +4111,7 @@
     	"log-action-filter-suppress-event": "Log suppression",
     	"log-action-filter-suppress-revision": "Revision suppression",
     	"log-action-filter-suppress-delete": "Page suppression",
    -	"log-action-filter-suppress-block": "User supppression by block",
    +	"log-action-filter-suppress-block": "User suppression by block",
     	"log-action-filter-suppress-reblock": "User suppression by reblock",
     	"log-action-filter-upload-upload": "New upload",
     	"log-action-filter-upload-overwrite": "Reupload",
    diff --git a/languages/i18n/eo.json b/languages/i18n/eo.json
    index 2725fb9b8f..76684b8554 100644
    --- a/languages/i18n/eo.json
    +++ b/languages/i18n/eo.json
    @@ -566,7 +566,7 @@
     	"botpasswords-label-delete": "Forigi",
     	"botpasswords-label-resetpassword": "Rekomencigi la pasvorton",
     	"botpasswords-label-grants": "Uzeblaj permesdonoj:",
    -	"botpasswords-help-grants": "Ĉiu permesdono provizas aliron al listitaj uzantaj permisoj, kiujn uzantkonto jam havas. Vidu la [[Special:ListGrants|tabelon de permisdonoj]] por pli da informo.",
    +	"botpasswords-help-grants": "Ĉiu permesdono provizas aliron al listitaj uzantaj permisoj, kiujn uzantkonto jam havas. Vidu la [[Special:ListGrants|tabelon de permesdonoj]] por pli da informo.",
     	"botpasswords-label-restrictions": "Limigoj de uzado:",
     	"botpasswords-label-grants-column": "Permeso donita",
     	"botpasswords-bad-appid": "La robota nomo \"$1\" estas malvalida.",
    @@ -693,14 +693,14 @@
     	"accmailtext": "Hazarde generita pasvorto por [[User talk:$1|$1]] estis sendita al $2.\n\nLa pasvorto por ĉi tiu nova konto povas esti ŝanĝita en la paĝo ''[[Special:ChangePassword|ŝanĝi pasvorton]]'' dum ensalutado.",
     	"newarticle": "(Nova)",
     	"newarticletext": "Vi sekvis ligilon al paĝo ankoraŭ ne ekzistanta. Se vi volas krei ĝin, ektajpu malsupre (vidu la [$1 helpopaĝon] por klarigoj.) Se vi malintence alvenis ĉi tien, simple alklaku la retrobutonon de via retumilo.",
    -	"anontalkpagetext": "---- ''Jen diskutopaĝo por anonima kontribuanto kiu ne jam kreis konton aŭ ne uzas ĝin.\nNi tial devas uzi la cifran IP-adreson por identigi lin/ŝin.\nĈi tia IP-adreso povas esti uzata de pluraj uzantoj.\nSe vi estas anonimulo kaj preferus eviti tiajn mistrafajn komentojn al vi, bonvolu [[Special:CreateAccount|krei konton]] aŭ [[Special:UserLogin|ensaluti]] por eviti estontan konfuzon pro aliaj anonimaj uzantoj.''",
    +	"anontalkpagetext": "<em>Jen diskutopaĝo por anonima kontribuanto kiu ne jam kreis konton aŭ ne uzas ĝin.</em>\nNi tial devas uzi la cifran IP-adreson por identigi lin/ŝin.\nĈi tia IP-adreso povas esti uzata de pluraj uzantoj.\nSe vi estas anonimulo kaj preferus eviti tiajn mistrafajn komentojn al vi, bonvolu [[Special:CreateAccount|krei konton]] aŭ [[Special:UserLogin|ensaluti]] por eviti estontan konfuzon pro aliaj anonimaj uzantoj.''",
     	"noarticletext": "Mankas teksto en ĉi tiu paĝo.\nVi povas [[Special:Search/{{PAGENAME}}|serĉi ĉi tiun paĝtitolon]] en aliaj paĝoj,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serĉi la rilatajn protokolojn],\naŭ [{{fullurl:{{FULLPAGENAME}}|action=edit}} krei ĉi tiun paĝon]</span>.",
     	"noarticletext-nopermission": "Estas neniom da teksto en ĉi tiu paĝo.\nVi povas [[Special:Search/{{PAGENAME}}|serĉi ĉi tiun paĝan titolon]] en aliaj paĝoj,\naŭ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serĉi la rilatajn protokolojn]</span>, sed vi ne rajtas krei ĉi tiun paĝon.",
     	"missing-revision": "La revizio n-ro $1 de la paĝo nomata \"{{FULLPAGENAME}}\" ne ekzistas.\n\nTio kutime estas kaŭzata per sekvado de malaktuala historio-ligilo al paĝo forigita.\nDetaloj troveblos en la [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} registro de forigoj].",
     	"userpage-userdoesnotexist": "Uzantokonto \"<nowiki>$1</nowiki>\" ne estas registrita. Bonvolu konfirmi se vi volas krei/redakti ĉi tiun paĝon.",
     	"userpage-userdoesnotexist-view": "Uzanto-konto \"$1\" ne estas registrita.",
     	"blocked-notice-logextract": "Ĉi tiu uzanto estas ĉi-momente forbarita.\nLa lasta protokolero estas jene montrata por via referenco:",
    -	"clearyourcache": "Notu:''' Post konservado, vi forviŝu la kaŝmemoron de via foliumilo por vidi la ŝanĝojn. \n* '''Firefox / Safari:''' Premu majuskligan klavon klakante ''Reŝarĝi'', aŭ premu aŭ ''Stir-F5'' aŭ ''Stir-R'' (''⌘-R'' kun Makintoŝo)\n* '''Google Chrome:''' Premu ''Stir-majuskligklavon-R'' (''⌘-Majuskligklavo-R'' kun Makintoŝo)\n* '''Interreta Esplorilo''': Premu ''Stir'' klakante ''Refreŝu'', aŭ premu ''Stir-F5'' \n* '''Opera:''' Nuligi la kaŝmemoro en ''Iloj → Preferoj''",
    +	"clearyourcache": "<strong>Notu:</strong>Post konservado, vi forviŝu la kaŝmemoron de via foliumilo por vidi la ŝanĝojn. \n* <strong>Firefox / Safari:</strong> Premu majuskligan klavon klakante <em>Reŝarĝi</em>, aŭ premu aŭ <em>Stir-F5</em> aŭ <em>Stir-R</em> (<em>⌘-R</em> kun Makintoŝo)\n* <strong>Google Chrome:</strong> Premu <em>Stir-majuskligklavon-R</em> (<em>⌘-Majuskligklavo-R</em> kun Makintoŝo)\n* <strong>Interreta Esplorilo</strong>: Premu <em>Stir</em> klakante <em>Refreŝu</em>, aŭ premu <em>Stir-F5</em> \n* <strong>Opera:</strong> Iru al <em>menuo →  parametroj</em> (<em>Opera →  Agordoj</em> per Makintoŝa) kaj tiam al <em>privateco kaj sekureco →  Nuligi retuman datenon → kaŝmemorataj bildoj kaj dosieroj</em>.",
     	"usercssyoucanpreview": "'''Konsileto:''' Uzu la butonon \"AntaÅ­rigardi\" por provi vian novan CSS-kodon antaÅ­ konservado.",
     	"userjsyoucanpreview": "'''Konsileto:''' Uzu la butonon \"{{int:showpreview}}\" por provi vian novan Ĝavaskriptan kodon antaŭ konservado.",
     	"usercsspreview": "'''Notu ke vi nur antaŭvidas vian uzanto-CSS.\nĜi ne jam estis konservita!'''",
    @@ -1217,7 +1217,7 @@
     	"right-override-export-depth": "Eksporti paĝojn inkluzivante ligitajn paĝojn ĝis profundeco de 5",
     	"right-sendemail": "Sendi retpoŝton al aliaj uzantoj",
     	"right-passwordreset": "Vidi retpoŝtojn de pasvorta restarado.",
    -	"right-managechangetags": "Kreado kaj forigado de [[Special:Tags|etikedoj]] de datumbazo",
    +	"right-managechangetags": "Kreado kaj (mal)aktivgo de [[Special:Tags|etikedoj]]",
     	"right-applychangetags": "Aldoni [[Special:Tags|etikedojn]] al propraj ŝanĝoj",
     	"right-changetags": "Aldoni kaj forigi arbitrajn [[Special:Tags|etikedojn]] ĉe unuopaj revizioj kaj protokoleroj",
     	"right-deletechangetags": "Forigi [[Special:Tags|etikedojn]] de la datenbazo",
    @@ -1257,8 +1257,8 @@
     	"rightslogtext": "Ĉi tio estas protokolo pri la ŝanĝoj de uzantorajtoj.",
     	"action-read": "legi ĉi tiun paĝon",
     	"action-edit": "redakti ĉi tiun paĝon",
    -	"action-createpage": "krei paĝojn",
    -	"action-createtalk": "krei diskuto-paĝojn",
    +	"action-createpage": "krei ĉi tiun paĝon",
    +	"action-createtalk": "krei ĉi tiun diskutpaĝon",
     	"action-createaccount": "krei ĉi tiun uzanto-konton",
     	"action-autocreateaccount": "AÅ­tomate krei tiun eksteruzantan konton",
     	"action-history": "vidi historion de tiu ĉi paĝo",
    @@ -1474,6 +1474,8 @@
     	"upload-http-error": "HTTP-eraro okazis: $1",
     	"upload-copy-upload-invalid-domain": "Kopio-alŝutoj ne disponiĝas el ĉi tiu domajno.",
     	"upload-foreign-cant-upload": "Tiu vikio ne estas agorita por alŝuti alŝutitan dosieron al la petita fora dosierdeponejo.",
    +	"upload-foreign-cant-load-config": "La ŝarĝado de agordo pri dosieran alŝuton malsukcesis por la fora dosiera deponejo.",
    +	"upload-dialog-disabled": "Alŝutoj de dosiero per ĉi tiun dialogon estas malfunkciigita sur ĉi tiu vikio.",
     	"upload-dialog-title": "Alŝuti dosieron",
     	"upload-dialog-button-cancel": "Nuligi",
     	"upload-dialog-button-done": "Farite",
    @@ -1903,6 +1905,7 @@
     	"listgrouprights-namespaceprotection-namespace": "Nomspaco",
     	"listgrouprights-namespaceprotection-restrictedto": "Rajtoj, kiuj permesas al uzanto redakti",
     	"listgrants": "Rajtoj donitaj",
    +	"listgrants-summary": "La sekvo estas listo de permesdonoj kun ilia rilata aliro al uzantaj rajtoj. Uzantoj povas sankcii aplikojn por uzi ilian konton, sed kun limaj permesoj laŭ la gratifikoj ke la uzanto donis al la aplikaĵo. Tamen aplikaĵo kiu agas en la nomo de uzanto ne povas efektive uzi rajtojn ke la uzanto ne havas.\nPovas esti [[{{MediaWiki:Listgrouprights-helppage}}|suplementa informo]] pri individuaj rajtoj.",
     	"listgrants-grant": "Aljuĝoj",
     	"listgrants-rights": "Rajtoj",
     	"trackingcategories": "Kategorioj por kontrolado",
    @@ -2191,6 +2194,7 @@
     	"sp-contributions-username": "IP-adreso aÅ­ uzantonomo:",
     	"sp-contributions-toponly": "Montru nur ŝanĝojn kiuj estas la plej lastaj revizioj",
     	"sp-contributions-newonly": "Montri nur redaktojn, kiuj kreis paĝon",
    +	"sp-contributions-hideminor": "Malvidigu redaktetojn",
     	"sp-contributions-submit": "Serĉi",
     	"whatlinkshere": "Ligiloj ĉi tien",
     	"whatlinkshere-title": "Paĝoj ligantaj al \"$1\"",
    @@ -2336,9 +2340,9 @@
     	"lockedbyandtime": "(de {{GENDER:$1|$1}} je $2, $3)",
     	"move-page": "Alinomi $1",
     	"move-page-legend": "Alinomi paĝon",
    -	"movepagetext": "Per la jena formulo vi povas ŝanĝi la nomon de iu paĝo, kunportante ĝian historion de redaktoj al la nova nomo.\nLa antaŭa titolo fariĝos alidirektilo al la nova titolo.\nVi povas ĝisdatigi alidirektilojn kiu indikas la originalan titolon aŭtomate.\nSe vi elektas ĝisdatigi permane, bonvolu kontroli [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|rompitajn alidirektilojn]].\nVi estas responsa por certigi ke ligilojn direktas fidinde.\n\nNotu, ke la paĝo '''ne''' estos movita se jam ekzistas paĝo ĉe la nova titolo, krom se tiu loko estas malplena aŭ alidirektilo al ĉi tiu paĝo, kaj sen antaŭa redaktohistorio.\nPro tio, vi ja povos removi la paĝon je la antaŭa titolo se vi mistajpus, kaj ne povas forviŝi ekzistantan paĝon per movo.\n\n'''AVERTO!'''\nTio povas esti drasta kaj neatendita ŝanĝo por populara paĝo;\nbonvolu certigi vin, ke vi komprenas ties konsekvencojn antaŭ ol vi antaŭeniru.",
    -	"movepagetext-noredirectfixer": "Per jena formularo vi povas alinomigi paĝon, kaj movi tutan ĝian redaktohistorion al la nova nomo. \nLa antaŭa titolo alidirektigos onin al la nova titolo.\nKontrolu pri [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|nefunkciantajn alidirektilojn]].\nVi respondecas pri tio ke ligoj restas montrantaj ĝustadirekten.\n\nKonsciu ke la paĝo '''ne'' estas movota se jam ekzistas paĝo havanta la novan titolon, krom se ĝi maplenas aŭ estas alidirektilo sen antaŭa redaktohistorio.\nTio ĉi signifas ke vi povas alinomigi paĝon reen al antaŭa nomo se vi eraras, kaj vi ke vi ne povas anstataŭigi ekzistantan paĝon.\n\n'''Averto!''\nEblas ke tio ĉi estas drasta kaj neatendita ŝanĝo de populara paĝo;\nAntaŭ daŭrigi, bonvolu certiĝi, ke vi komprenas la konsekvencojn de tiuj ĉi ŝanĝo.",
    -	"movepagetalktext": "La movo aŭtomate kunportos la diskuto-paĝon, se tia ekzistas, '''krom se:'''\n*Vi movas la paĝon tra nomspacoj (ekz de ''Nomo'' je ''User:Nomo''),\n*Ne malplena diskuto-paĝo jam ekzistas je la nova nomo, aŭ\n*Vi malelektas la suban ŝaltilon.\n\nTiujokaze, vi nepre permane kunigu la diskuto-paĝojn se vi tion deziras.",
    +	"movepagetext": "Per la jena formulo vi povas ŝanĝi la nomon de iu paĝo, kunportante ĝian historion de redaktoj al la nova nomo.\nLa antaŭa titolo fariĝos alidirektilo al la nova titolo.\nVi povas ĝisdatigi alidirektilojn kiu indikas la originalan titolon aŭtomate.\nSe vi elektas ĝisdatigi permane, bonvolu kontroli [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|rompitajn alidirektilojn]].\nVi estas responsa por certigi ke ligilojn direktas fidinde.\n\nNotu, ke la paĝo '''ne''' estos movita se jam ekzistas paĝo ĉe la nova titolo, krom se tiu loko estas malplena aŭ alidirektilo al ĉi tiu paĝo, kaj sen antaŭa redaktohistorio.\nPro tio, vi ja povos removi la paĝon je la antaŭa titolo se vi mistajpus, kaj ne povas forviŝi ekzistantan paĝon per movo.\n\n'''Note:'''\nTio povas esti drasta kaj neatendita ŝanĝo por populara paĝo;\nbonvolu certigi vin, ke vi komprenas ties konsekvencojn antaŭ ol vi antaŭeniru.",
    +	"movepagetext-noredirectfixer": "Per jena formularo vi povas alinomigi paĝon, kaj movi tutan ĝian redaktohistorion al la nova nomo. \nLa antaŭa titolo alidirektigos onin al la nova titolo.\nKontrolu pri [[Special:DoubleRedirects|duoblajn]] aŭ [[Special:BrokenRedirects|nefunkciantajn alidirektilojn]].\nVi respondecas pri tio ke ligoj restas montrantaj ĝustadirekten.\n\nKonsciu ke la paĝo '''ne'' estas movota se jam ekzistas paĝo havanta la novan titolon, krom se ĝi estas alidirektilo sen antaŭa redaktohistorio.\nTio ĉi signifas ke vi povas alinomigi paĝon reen al antaŭa nomo se vi eraras, kaj vi ke vi ne povas anstataŭigi ekzistantan paĝon.\n\n'''Rimarko:''\nEblas ke tio ĉi estas drasta kaj neatendita ŝanĝo de populara paĝo;\nAntaŭ daŭrigi, bonvolu certiĝi, ke vi komprenas la konsekvencojn de tiuj ĉi ŝanĝo.",
    +	"movepagetalktext": "Se vi validas tiun elektobutono, la asociata diskutpaĝo estos aŭtomate alinomita al nova titolo, krom se malplena diskutpaĝo jam ekzistas.\n\nTiujokaze, vi alinomigendos aŭ kunfandendos malaŭtomate la paĝon se vi tion deziras.",
     	"moveuserpage-warning": "<strong>Averto:</strong> Vi preskaŭ alinomas paĝon de uzanto. Bonvolu noti ke nur la paĝo estos alinomita kaj la uzanto mem <em>ne</em> estos alinomita.",
     	"movecategorypage-warning": "<strong>Averto:</strong> Vi baldaŭ movos kategorian paĝon. Bonvolu noti ke, nur la paĝo estos movita, kaj la paĝoj en la malnova kategorio <em>ne</em> transiros en la novan kategorion.",
     	"movenologintext": "Vi nepre estu registrita uzanto kaj [[Special:UserLogin|ensalutu]] por rajti movi paĝojn.",
    @@ -2371,7 +2375,7 @@
     	"movenosubpage": "Ĉi tiu paĝo havas neniujn subpaĝojn.",
     	"movereason": "Kialo:",
     	"revertmove": "restarigi",
    -	"delete_and_move_text": "==Forigo nepras==\n\nLa celartikolo \"[[:$1]]\" jam ekzistas. Ĉu vi volas forigi ĝin por krei spacon por la movo?",
    +	"delete_and_move_text": "La celpaĝo \"[[:$1]]\" jam ekzistas. Ĉu vi volas forigi ĝin por krei spacon por la alinomado?",
     	"delete_and_move_confirm": "Jes, forigu la paĝon",
     	"delete_and_move_reason": "Forigita por ebligi movadon de \"[[$1]]\"",
     	"selfmove": "Fonto- kaj celo-titoloj samas; ne povas movi paĝon sur ĝin mem.",
    @@ -2389,7 +2393,7 @@
     	"move-leave-redirect": "Forlasi alidirektilon",
     	"protectedpagemovewarning": "'''Averto:''' Ĉi tiu paĝo estis ŝlosita tiel nur uzantoj kun administranto-rajtoj povas movi ĝin.\nJen la lasta protokolero por via referenco:",
     	"semiprotectedpagemovewarning": "'''Averto:''' Ĉi tiu paĝo estis ŝlosita tiel ĝi estas nur movebla de registritaj uzantoj.\nJen la lasta protokolero por via referenco:",
    -	"move-over-sharedrepo": "== Dosiero ekzistas ==\n[[:$1]] ekzistas en komuna dosierujo. Movante la dosieron al ĉi tiu titolo anstataŭigos la komunan dosieron.",
    +	"move-over-sharedrepo": "[[:$1]] ekzistas en komuna dosierujo. Movado de dosiero al ĉi tiu titolo anstataŭigos la komunan dosieron.",
     	"file-exists-sharedrepo": "La elektita dosiernomo jam estas uzita en komun dosierujo.\nBonvolu elekti alian nomon.",
     	"export": "Eksporti paĝojn",
     	"exporttext": "Vi povas eksporti la tekston kaj la redaktohistorion de aparta paĝo aŭ de paĝaro kolektita en ia XML.\nĈi tio povas esti importita en alian programon funkciantan per MediaWiki-softvaro per la [[Special:Import|import-paĝo]].\n\nPor eksporti paĝojn, enigu la titolojn en la jena tekst-skatolo, po unu por linio, kaj elektu ĉu vi volas kaj la nunan version kaj ĉiujn antaŭajn versiojn, kun la paĝaj historiaj linioj, aŭ la nunan version kun la informo pri la lasta redakto.\n\nEn la lasta okazo, vi ankaŭ povas uzi ligilon, ekz-e [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] por la paĝo \"[[{{MediaWiki:Mainpage}}]]\".",
    @@ -2469,7 +2473,7 @@
     	"import-nonewrevisions": "Neniuj versioj estis antaŭe importitaj. Aŭ ili ĉiuj jam ekzistis aŭ estis ellasitaj pro eraroj.",
     	"xml-error-string": "$1 ĉe linio $2, kolumno $3 (bitiko $4): $5",
     	"import-upload": "Alŝuti XML-datenojn",
    -	"import-token-mismatch": "Seancaj datenoj perdiĝis. Bonvolu reprovi.",
    +	"import-token-mismatch": "Seancaj datenoj perdiĝis.\n\nVi eble estis elsalutita. <strong>Bonvolu kontroli ke vi ankaŭ estas ensalutita kaj pravu denove</strong>.\nSe tiu ankoraŭ ne funkcios, pravu [[Special:UserLogout|elsaluti]] \nkaj ensaluti denove, kaj kontrolu ke via retumilo permesas kuketon de tiu paĝaro.",
     	"import-invalid-interwiki": "Ne povas importi de la specifita vikio.",
     	"import-error-edit": "Paĝo \"$1\" ne estis importita ĉar vi ne rajtas radakti ĝin.",
     	"import-error-create": "Paĝo \"$1\" ne estis importita ĉar vi ne rajtas krei ĝin.",
    @@ -3256,7 +3260,7 @@
     	"version-libraries-description": "Priskribo",
     	"version-libraries-authors": "AÅ­toroj",
     	"redirect": "Alidirektilo laŭ dosiera, uzanta, paĝa, revizia aŭ protokola identigilo.",
    -	"redirect-summary": "Tiu ĉi paĝo alidirektas al dosiero (laŭ ĝia nomo), paĝo (laŭ ĝia revizio-numero aŭ paĝo-identigilo) aŭ al uzantopaĝo (laŭ numera uzanto-identigilo). Uzado: [[{{#Special:Redirect}}/file/Ekzemplo.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], aŭ [[{{#Special:Redirect}}/user/101]].",
    +	"redirect-summary": "Tiu ĉi paĝo alidirektas al dosiero (laŭ ĝia nomo), paĝo (laŭ ĝia revizio-numero aŭ paĝo-identigilo) aŭ al uzantopaĝo (laŭ numera uzanto-identigilo) aŭ enigo de protokolo (laŭ la protokol-identigilo). Uzado: [[{{#Special:Redirect}}/file/Ekzemplo.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], aŭ [[{{#Special:Redirect}}/user/101]], aŭ [[{{#Special:Redirect}}/logid/186]].",
     	"redirect-submit": "Ek",
     	"redirect-lookup": "Traserĉi:",
     	"redirect-value": "Valoro:",
    @@ -3448,7 +3452,9 @@
     	"logentry-suppress-block": "$1 {{GENDER:$2|forbaris}} la {{GENDER:$4|uzanton|uzantinon}} $3 por daÅ­ro de $5 $6",
     	"logentry-suppress-reblock": "$1 {{GENDER:$2|ŝanĝis}} agordojn de forbaro por la {{GENDER:$4|uzanto|uzantino}} $3 por daŭro de $5 $6",
     	"logentry-import-upload": "$1 {{GENDER:$2|importis}} $3 per dosiera alŝuto",
    +	"logentry-import-upload-details": "$1 {{GENDER:$2|importis}} $3 kiel dosiera alŝuto ($4 {{PLURAL:$4|revizio|revizioj}})",
     	"logentry-import-interwiki": "$1 {{GENDER:$2|importis}} $3 de alia vikio",
    +	"logentry-import-interwiki-details": "$1 {{GENDER:$2|importis}} $3 el $5 ($4 {{PLURAL:$4|revizio|revizioj}})",
     	"logentry-merge-merge": "$1 {{GENDER:$2|kunigis}} $3 en $4 (revizioj ĝis $5)",
     	"logentry-move-move": "$1 movis paĝon $3 al $4",
     	"logentry-move-move-noredirect": "$1 movis paĝon $3 al $4 ne lasante alidirektilon",
    @@ -3461,7 +3467,13 @@
     	"logentry-newusers-create2": "Konto de uzanto $3 estis kreita de $1",
     	"logentry-newusers-byemail": "Konto de uzanto $3 estis kreita de $1 kaj pasvorto estis sendita per retpoŝto",
     	"logentry-newusers-autocreate": "Uzantokonto $1 estis {{GENDER:$2|kreita}} aÅ­tomate",
    -	"logentry-rights-rights": "$1 ŝanĝis grupan membrecon por $3 de $4 al $5",
    +	"logentry-protect-move_prot": "$1 {{GENDER:$2|movis}} protektajn agordojn el $4 al $3",
    +	"logentry-protect-unprotect": "$1 {{GENDER:$2|forigis}} protekton el $3",
    +	"logentry-protect-protect": "$1 {{GENDER:$2|protektis}} $3 $4",
    +	"logentry-protect-protect-cascade": "$1 {{GENDER:$2|protektis}} $3 $4 [rikure]",
    +	"logentry-protect-modify": "$1 {{GENDER:$2|ŝanĝis}} la nivelon de protekto de $3 $4",
    +	"logentry-protect-modify-cascade": "$1 {{GENDER:$2|ŝanĝis}} la nivelon de protekto de $3 $4 [rikure]",
    +	"logentry-rights-rights": "$1 {{GENDER:$2|ŝanĝis}} grupan membrecon por {{GENDER:$6|$3}} el $4 al $5",
     	"logentry-rights-rights-legacy": "$1 ŝanĝis grupan membrecon por $3",
     	"logentry-rights-autopromote": "$1 estis aÅ­tomate {{GENDER:$2|altrangigita}} de $4 al $5",
     	"logentry-upload-upload": "$1 {{GENDER:$2|alŝutis}} $3",
    @@ -3594,7 +3606,7 @@
     	"expand_templates_generate_xml": "Montri XML-sintaksarbon",
     	"expand_templates_generate_rawhtml": "Montri krudan HTML-n",
     	"expand_templates_preview": "AntaÅ­rigardo",
    -	"expand_templates_preview_fail_html": "<em>Ĉar {{SITENAME}} ebligas enmeton de kruda HTML kaj sesiaj datumoj estis perditaj, antaŭvido estas kaŝita kiel protekto kontraŭ Ĝavoskriptaj atakoj.</em>\n\n<strong>Se tio estis legitima provo antaŭvidi, bonvolu reprovi.</strong>\nSe tio daŭre ne funkcias, provu [[Special:UserLogout|elsaluti]] kaj ree ensaluti.",
    +	"expand_templates_preview_fail_html": "<em>Ĉar {{SITENAME}} ebligas enmeton de kruda HTML kaj sesiaj datumoj estis perditaj, antaŭvido estas kaŝita kiel protekto kontraŭ Ĝavoskriptaj atakoj.</em>\n\n<strong>Se tio estis legitima provo antaŭvidi, bonvolu reprovi.</strong>\nSe tio daŭre ne funkcias, provu [[Special:UserLogout|elsaluti]] kaj ree ensaluti, kaj kontrolu ke via retumilo permesas kuketojn el tiu paĝaro.",
     	"expand_templates_preview_fail_html_anon": "<em>Ĉar {{SITENAME}} ebligas enmeton de kruda HTML kaj vi ne estas ensalutinta, antaŭvido estas kaŝita kiel protekto kontraŭ Ĝavoskriptaj atakoj.</em>\n\n<strong>Se tio estis legitima provo antaŭvidi, bonvolu [[Special:UserLogin|ensaluti]] kaj reprovi.</strong>",
     	"expand_templates_input_missing": "Vi nepras provizi almenaÅ­ iom da eniga teksto.",
     	"pagelanguage": "Ŝanĝi paĝan lingvon",
    @@ -3615,7 +3627,8 @@
     	"mediastatistics": "Statistikoj pri dosieroj",
     	"mediastatistics-summary": "Statistiko pri tipoj de alŝutitaj dosieroj. Tio ĉi inkludas nur aktualajn versiojn de dosiero. Malnovaj aŭ forigitaj versioj de dosieroj estas ekskluditaj.",
     	"mediastatistics-nbytes": "{{PLURAL:$1|$1 bitoko|$1 bitokoj}} ($2; $3%)",
    -	"mediastatistics-allbytes": "Totala dosiera grandeco por ĉiuj dosieroj: {{PLURALO:$1|$1 okumo|$1 okumoj}} ($2).",
    +	"mediastatistics-bytespertype": "Totala grandeco de dosiero por ĉi tiu sekcio: {{PLURAL:$1|$1 okopo|$1 okopoj}} ($2; $3%).",
    +	"mediastatistics-allbytes": "Totala grandeco de dosiero por ĉiuj dosieroj: {{PLURAL:$1|$1 okopo|$1 okopoj}} ($2).",
     	"mediastatistics-table-mimetype": "MIME-tipo",
     	"mediastatistics-table-extensions": "Eblaj dosier-sufiksoj",
     	"mediastatistics-table-count": "Nombro de dosieroj",
    @@ -3670,7 +3683,6 @@
     	"mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
     	"mw-widgets-titleinput-description-new-page": "paĝo ankoraŭ ne ekzistas",
     	"mw-widgets-titleinput-description-redirect": "alidirekti al $1",
    -	"api-error-blacklisted": "Bonvolu elekti alian, priskriban titolon.",
     	"sessionmanager-tie": "Kombini diversajn tipojn de ensaluta peto ne estas permisita: $1.",
     	"sessionprovider-generic": "$1 seancoj",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "kuketaj seancoj",
    @@ -3705,6 +3717,8 @@
     	"log-action-filter-managetags-activate": "Etikeda ekebligado",
     	"log-action-filter-managetags-deactivate": "Etikeda malekebligado",
     	"log-action-filter-move-move": "Alinomi sen anstataÅ­igi alidirektojn",
    +	"log-action-filter-move-move_redir": "Alinomi anstataÅ­ige alidirektojn",
    +	"log-action-filter-newusers-create": "Kreo far anonima uzanto",
     	"log-action-filter-newusers-create2": "Kreo de registrita uzanton",
     	"log-action-filter-newusers-autocreate": "AÅ­tomata kreo",
     	"log-action-filter-newusers-byemail": "Kreo kun pasvorto sendita per retpoŝto",
    @@ -3713,20 +3727,86 @@
     	"log-action-filter-protect-protect": "Protekto",
     	"log-action-filter-protect-modify": "Modifo de la protekto",
     	"log-action-filter-protect-unprotect": "Malprotektado",
    +	"log-action-filter-protect-move_prot": "Movis protekton",
     	"log-action-filter-rights-rights": "Malaŭtomata ŝanĝo",
     	"log-action-filter-rights-autopromote": "Aŭtomata ŝanĝo",
    +	"log-action-filter-suppress-event": "Forigo de protokolo",
    +	"log-action-filter-suppress-revision": "Forigo de revizio",
    +	"log-action-filter-suppress-delete": "Forigo de paĝo",
    +	"log-action-filter-suppress-block": "Forigo de uzanto per forbari",
    +	"log-action-filter-suppress-reblock": "Forigi uzanton per reforbari",
     	"log-action-filter-upload-upload": "Novalŝuta",
     	"log-action-filter-upload-overwrite": "Realŝuta",
    +	"authmanager-authn-not-in-progress": "AÅ­tentikigado ne estas progresanta aÅ­ seanca dateno estis perdita. Bonvolu pravi denove ekde la komenco.",
    +	"authmanager-authn-no-primary": "La provizita legitimaĵo ne povus esti aŭtentikigita.",
    +	"authmanager-authn-no-local-user": "La provizitaj legitimaĵoj ne estas asociitaj kun ajna uzanto de ĉi tiu vikio.",
    +	"authmanager-authn-no-local-user-link": "La provizitaj legitimaĵoj estas validaj sed ne estas asociita kun ajna uzanto de ĉi tiu vikio. Ensalutu per malsama metodo aŭ kreu novan uzanton kaj vi havos elekton por ligi vian antaŭan legitimaĵon kun tiu konto.",
    +	"authmanager-authn-autocreate-failed": "AÅ­tokreo de loka konto malsukcesis: $1",
    +	"authmanager-change-not-supported": "La provizitaj legitimaĵoj ne povas esti ŝanĝita, kiel nenio uzus ilin.",
    +	"authmanager-create-disabled": "kreado de kontoj estas malebligita",
    +	"authmanager-create-from-login": "Por krei vian konton, bonvolu plenigi la kampojn sube.",
    +	"authmanager-create-not-in-progress": "Konta kreo ne estas progresanta aÅ­ seanca dateno estis perdita. Bonvolu pravi denove ekde la komenco.",
    +	"authmanager-create-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta kreo.",
    +	"authmanager-link-no-primary": "La provizitaj legitimaĵoj ne povus esti uzita por konta ligado.",
    +	"authmanager-link-not-in-progress": "Ligo de konto ne estas progresanta aÅ­ dateno de seanco estis perdita. Bonvolu pravi denove ekde la komenco.",
    +	"authmanager-authplugin-setpass-failed-title": "Pasvorta ŝanĝo malsukcesis",
    +	"authmanager-authplugin-setpass-failed-message": "La aŭtentikigado kromprogramo neis la pasvortan ŝanĝon.",
    +	"authmanager-authplugin-create-fail": "La kromprogramo de aÅ­tentikigado neis la keon de konto.",
    +	"authmanager-authplugin-setpass-denied": "La kromprogramaro de aŭtentikigado ne permisas ŝanĝadon de pasvorto.",
     	"authmanager-authplugin-setpass-bad-domain": "Malvalida domajno.",
     	"authmanager-autocreate-noperm": "AÅ­tomata kreo de konto ne estas permesita.",
     	"authmanager-autocreate-exception": "AÅ­tomata kreo de konto estas provizore malfunkciigita pro antaÅ­aj eraroj.",
     	"authmanager-userdoesnotexist": "Uzanto-konto \"$1\" ne estas registrita.",
    +	"authmanager-userlogin-remembermypassword-help": "Ĉu la pasvorto devus esti memorita por pli longa ol la daŭro de la sesio.",
     	"authmanager-username-help": "Salutnomo por aÅ­tentikado.",
    +	"authmanager-password-help": "Pasvorto por aÅ­tentikigo.",
    +	"authmanager-domain-help": "Domajno por ekstera aÅ­tentikigo.",
    +	"authmanager-retype-help": "Pasvortu denove konfirmi.",
    +	"authmanager-email-label": "Retadreso",
     	"authmanager-email-help": "Retpoŝtadreso",
     	"authmanager-realname-label": "Vera nomo",
     	"authmanager-realname-help": "Vera nomo de la uzanto",
    -	"changecredentials-submit": "Ŝanĝi",
    -	"removecredentials-submit": "Forigi",
    +	"authmanager-provider-password": "Pasvorto-bazita aÅ­tentikigo",
    +	"authmanager-provider-password-domain": "AÅ­tentikigo per pasvorto kaj domajno",
    +	"authmanager-provider-temporarypassword": "Provizora pasvorto:",
    +	"authprovider-confirmlink-message": "LaÅ­ viaj lastatempaj provoj de ensalutado, la sekvantaj kontoj povas esti ligita al via vikia konto. Ligi ilin ebligas ensalutadon per tiuj kontoj. Bonvolu elekti tiun, kiun ligendus.",
    +	"authprovider-confirmlink-request-label": "Kontoj kiuj devus esti ligita",
    +	"authprovider-confirmlink-success-line": "$1: Ligita sukcese.",
    +	"authprovider-confirmlink-failed": "Ligado de konto ne plene sukcesis: $1",
    +	"authprovider-confirmlink-ok-help": "Kontinui post montrado de mesaĝoj pri malsukceso de ligado.",
    +	"authprovider-resetpass-skip-label": "Preterpasi",
    +	"authprovider-resetpass-skip-help": "Preterpasi  pasvortan reensignadon.",
    +	"authform-nosession-login": "La aÅ­tentikagdo sukcesis, sed via retumilo ne povas \"memori\" ensalutitadon.\n\n$1",
    +	"authform-nosession-signup": "La konto estis kreita, sed via retumilo ne povas \"memori\" ensalutitadon.\n\n$1",
    +	"authform-newtoken": "Mankanta ĵetono. $1",
    +	"authform-notoken": "Mankanta ĵetono",
    +	"authform-wrongtoken": "Malvalida ĵetono",
    +	"specialpage-securitylevel-not-allowed-title": "Ne permesita",
    +	"specialpage-securitylevel-not-allowed": "Pardonu, vi ne permesohavas je uzi ĉi tiun paĝon ĉar via identeco ne povus esti konfirmita.",
    +	"authpage-cannot-login": "Ne povas ekensaluti.",
    +	"authpage-cannot-login-continue": "Malpovas kontinui ensalutadon. Via sesio probablege tempoelĉerpis.",
    +	"authpage-cannot-create": "Malpovas kontan ekkron",
    +	"authpage-cannot-create-continue": "Malpovas konitinui kontan kreon. Via sesio probablege tempoelĉerpiĝis.",
    +	"authpage-cannot-link": "Malpovas kontan ekligadon.",
    +	"authpage-cannot-link-continue": "Malpovas kontinui ensalutan ligadon. Via sesio probablege tempoelĉerpis.",
    +	"cannotauth-not-allowed-title": "Permison neis",
    +	"cannotauth-not-allowed": "Estas malpermesite al vi uzi ĉi tiun paĝon",
    +	"changecredentials": "Ŝanĝi legitimaĵojn",
    +	"changecredentials-submit": "Ŝanĝi legitimaĵojn",
    +	"changecredentials-invalidsubpage": "\"$1\" ne estas valida legitimaĵa tipo.",
    +	"changecredentials-success": "Viaj legitimaĵoj estis ŝanĝitaj.",
    +	"removecredentials": "Forigi legitimaĵojn",
    +	"removecredentials-submit": "Forigi legitimaĵojn",
    +	"removecredentials-invalidsubpage": "\"$1\" ne estas valida legitimaĵa tipo.",
    +	"removecredentials-success": "Viaj legitimaĵoj estis forigitaj.",
    +	"credentialsform-provider": "Tipo de legitimaĵoj",
    +	"credentialsform-account": "Nomo de konto:",
    +	"cannotlink-no-provider-title": "Malekzistas linkeblajn kontojn",
    +	"cannotlink-no-provider": "Malekzistas ligeblajn kontojn.",
     	"linkaccounts": "Ligi kontojn",
    -	"linkaccounts-submit": "Ligi kontojn"
    +	"linkaccounts-success-text": "La konto estis ligita.",
    +	"linkaccounts-submit": "Ligi kontojn",
    +	"unlinkaccounts": "Malligi kontojn",
    +	"unlinkaccounts-success": "La konto estis malligita.",
    +	"authenticationdatachange-ignored": "La ŝanĝo de dateno pri aŭtentikigado ne estis traktita. Eble neniu provizanto estis agorda?"
     }
    diff --git a/languages/i18n/es.json b/languages/i18n/es.json
    index 4127838da7..245bfc7f17 100644
    --- a/languages/i18n/es.json
    +++ b/languages/i18n/es.json
    @@ -146,7 +146,8 @@
     			"Codynguyen1116",
     			"2axterix2",
     			"Matma Rex",
    -			"Dgstranz"
    +			"Dgstranz",
    +			"Copper12"
     		]
     	},
     	"tog-underline": "Subrayar los enlaces:",
    @@ -279,7 +280,7 @@
     	"category-file-count-limited": "{{PLURAL:$1|El siguiente archivo pertenece|Los siguientes $1 archivos pertenecen}} a esta categoría.",
     	"listingcontinuesabbrev": "cont.",
     	"index-category": "Páginas indizadas",
    -	"noindex-category": "Páginas no indizadas",
    +	"noindex-category": "Páginas no indexadas",
     	"broken-file-category": "Páginas con enlaces rotos a archivos",
     	"about": "Acerca de",
     	"article": "Página de contenido",
    @@ -717,6 +718,9 @@
     	"passwordreset-emailerror-capture": "Se ha generado un correo electrónico de restablecimiento de contraseña, que se muestra a continuación, pero ha fallado el envío {{GENDER:$2|al usuario|a la usuaria}}: $1",
     	"passwordreset-emailsent-capture2": "{{PLURAL:$1|El e-mail de restablecimiento de contraseña ha sido enviado|Los e-mails de restablecimiento de contraseña han sido enviados}}. {{PLURAL:$1|El nombre de usuario y la contraseña se muestra a continuación|La lista de nombres de usuarios y contraseñas se muestra a continuación}}.",
     	"passwordreset-emailerror-capture2": "No fue posible mandar un correo electrónico {{Gender:$2|al usuario|a la usuaria}}: $1 {{PLURAL:$3|El nombre de usuario y la contraseña|La lista de nombres de usuarios y contraseñas}} se muestra a continuación.",
    +	"passwordreset-nocaller": "Debe de proporcionarse un interlocutor",
    +	"passwordreset-nosuchcaller": "La persona que llama no existe: $1",
    +	"passwordreset-ignored": "No se logró el reestablecimiento de la contraseña. ¿Tal vez no se configuró un proveedor?",
     	"passwordreset-invalideamil": "Dirección de correo electrónico no válida.",
     	"passwordreset-nodata": "No se ha proporcionado ni un nombre de usuario ni una dirección de correo electrónico",
     	"changeemail": "Cambiar o eliminar la dirección de correo electrónico",
    @@ -762,7 +766,9 @@
     	"minoredit": "Esta es una edición menor",
     	"watchthis": "Vigilar esta página",
     	"savearticle": "Guardar la página",
    +	"savechanges": "Guardar cambios",
     	"publishpage": "Publicar la página",
    +	"publishchanges": "Publicar cambios",
     	"preview": "Previsualizar",
     	"showpreview": "Mostrar previsualización",
     	"showdiff": "Mostrar los cambios",
    @@ -1128,7 +1134,7 @@
     	"rows": "Filas:",
     	"columns": "Columnas:",
     	"searchresultshead": "Búsquedas",
    -	"stub-threshold": "Límite para cambiar a formato de enlace a esbozo ($1):",
    +	"stub-threshold": "Límite para enlazar con el estilo de esbozo ($1):",
     	"stub-threshold-sample-link": "muestra",
     	"stub-threshold-disabled": "Desactivado",
     	"recentchangesdays": "Días que mostrar en los cambios recientes:",
    @@ -1355,8 +1361,8 @@
     	"rightslogtext": "Este es un registro de cambios en los permisos de usuarios.",
     	"action-read": "leer esta página",
     	"action-edit": "modificar esta página",
    -	"action-createpage": "crear páginas",
    -	"action-createtalk": "crear páginas de discusión",
    +	"action-createpage": "crear esta página",
    +	"action-createtalk": "crear esta página de discusión",
     	"action-createaccount": "crear esta cuenta de usuario",
     	"action-autocreateaccount": "crear automáticamente esta cuenta de usuario externa",
     	"action-history": "ver el historial de esta página",
    @@ -1573,6 +1579,8 @@
     	"upload-http-error": "Ha ocurrido un error HTTP: $1",
     	"upload-copy-upload-invalid-domain": "No se pueden realizar subidas remotas desde este dominio.",
     	"upload-foreign-cant-upload": "Este wiki no está configurado para subir archivos al repositorio de archivos externo solicitado.",
    +	"upload-foreign-cant-load-config": "Falló la carga de la configuración para subir archivos al depósito de archivos externo.",
    +	"upload-dialog-disabled": "En este wiki están desactivadas las subidas de archivos mediante este cuadro de diálogo.",
     	"upload-dialog-title": "Subir archivo",
     	"upload-dialog-button-cancel": "Cancelar",
     	"upload-dialog-button-done": "Hecho",
    @@ -2137,6 +2145,7 @@
     	"rollbacklinkcount": "revertir $1 {{PLURAL:$1|edición|ediciones}}",
     	"rollbacklinkcount-morethan": "revertir más de $1 {{PLURAL:$1|edición|ediciones}}",
     	"rollbackfailed": "No se pudo revertir",
    +	"rollback-missingparam": "Faltan parámetros requeridos en la solicitud.",
     	"cantrollback": "No se puede revertir la edición;\nel último colaborador es el único autor de esta página.",
     	"alreadyrolled": "No se puede revertir la última edición de [[:$1]] hecha por [[User:$2|$2]] ([[User talk:$2|discusión]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nalguien más ya ha editado o revertido esa página.\n\nLa última edición fue hecha por [[User:$3|$3]] ([[User talk:$3|discusión]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     	"editcomment": "El resumen de la edición fue: <em>$1</em>.",
    @@ -2291,6 +2300,7 @@
     	"sp-contributions-username": "Dirección IP o nombre de usuario:",
     	"sp-contributions-toponly": "Solo mostrar últimas ediciones de página",
     	"sp-contributions-newonly": "Mostrar solo ediciones que son creaciones de páginas",
    +	"sp-contributions-hideminor": "Ocultar ediciones menores",
     	"sp-contributions-submit": "Buscar",
     	"whatlinkshere": "Lo que enlaza aquí",
     	"whatlinkshere-title": "Páginas que enlazan con «$1»",
    @@ -3583,6 +3593,7 @@
     	"api-error-autoblocked": "Tu dirección IP ha sido bloqueada automáticamente porque fue utilizada por un usuario bloqueado.",
     	"api-error-badaccess-groups": "No puedes cargar archivos en este wiki.",
     	"api-error-badtoken": "Error interno: Símbolo incorrecto.",
    +	"api-error-blocked": "Has sido bloqueado de editar.",
     	"api-error-copyuploaddisabled": "La subida por URL está desactivada en este servidor.",
     	"api-error-duplicate": "Ya {{PLURAL:$1|existe otro archivo|existen otros archivos}} en el sitio con el mismo contenido.",
     	"api-error-duplicate-archive": "Ya {{PLURAL:$1|existía otro archivo|existían otros archivos}} en el sitio con el mismo contenido, pero {{PLURAL:$1|fue eliminado|fueron eliminados}}.",
    @@ -3609,6 +3620,7 @@
     	"api-error-nomodule": "Error interno: No hay un módulo de carga configurado.",
     	"api-error-ok-but-empty": "Error interno: No hay respuesta del servidor.",
     	"api-error-overwrite": "No se permite sobrescribir un archivo existente.",
    +	"api-error-ratelimited": "Estás tratando de subir, en un corto periodo de tiempo, más archivos de los que este wiki permite.\nPor favor, inténtalo de nuevo dentro de algunos minutos.",
     	"api-error-stashfailed": "Error interno: El servidor no pudo almacenar el archivo temporal.",
     	"api-error-publishfailed": "Error interno: el servidor no pudo publicar el archivo temporal.",
     	"api-error-stasherror": "Ha ocurrido un error al subir el archivo al depósito.",
    @@ -3742,7 +3754,6 @@
     	"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
     	"mw-widgets-titleinput-description-new-page": "la página aún no existe",
     	"mw-widgets-titleinput-description-redirect": "redirigir a $1",
    -	"api-error-blacklisted": "Elige un título diferente, más descriptivo.",
     	"sessionmanager-tie": "No se pueden combinar múltiples tipos de autenticación de solicitudes: $1.",
     	"sessionprovider-generic": "sesiones $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basadas en cookies",
    @@ -3793,18 +3804,23 @@
     	"log-action-filter-suppress-event": "Supresión de registros",
     	"log-action-filter-suppress-revision": "Supresión de revisiones",
     	"log-action-filter-suppress-delete": "Supresión de páginas",
    -	"log-action-filter-suppress-block": "Usuario supppression por bloque",
    +	"log-action-filter-suppress-block": "Supresión de usuarios por bloque",
     	"log-action-filter-suppress-reblock": "Usuario supresión de rebloqueo",
     	"log-action-filter-upload-upload": "Subida nueva",
     	"log-action-filter-upload-overwrite": "Volver a subir",
    +	"authmanager-authn-not-in-progress": "La autenticación no está en curso o los datos de sesión se han perdido. Por favor, vuelve a empezar desde el principio.",
     	"authmanager-authn-no-primary": "Las credenciales proporcionadas no se han podido autentificar.",
     	"authmanager-authn-no-local-user": "Las credenciales suministradas no están asociadas con ningún usuario en este wiki.",
     	"authmanager-authn-no-local-user-link": "Las credenciales suministradas son válidas, pero no están asociadas con ningún usuario de este wiki. Inicia sesión con un usuario diferente, o crea un nuevo usuario, para poder vincular tus credenciales anteriores a esa cuenta.",
     	"authmanager-authn-autocreate-failed": "Falló la creación automática de una cuenta local: $1",
    +	"authmanager-change-not-supported": "Las credenciales proporcionadas no se pueden cambiar, ya que no hay nada que fuera a hacer uso de ellas.",
     	"authmanager-create-disabled": "Está desactivada la creación de cuentas.",
     	"authmanager-create-from-login": "Para crear tu cuenta, completa los campos a continuación.",
     	"authmanager-create-not-in-progress": "El proceso de creación de la cuenta no está en progreso o se perdieron los datos de la sesión. Empieza de nuevo desde el principio.",
     	"authmanager-create-no-primary": "Las credenciales suministradas no pueden usarse para la creación de la cuenta.",
    +	"authmanager-link-no-primary": "Las credenciales proporcionadas no se han podido utilizar para enlazar cuentas.",
    +	"authmanager-link-not-in-progress": "La vinculación de cuentas no está en curso o los datos de la sesión se han perdido. Por favor, vuelve a empezar desde el principio.",
    +	"authmanager-authplugin-setpass-failed-title": "Error de cambio de contraseña",
     	"authmanager-authplugin-setpass-failed-message": "El complemento de autenticación denegó el cambio de contraseña.",
     	"authmanager-authplugin-create-fail": "El complemento de autenticación denegó la creación de la cuenta.",
     	"authmanager-authplugin-setpass-denied": "El complemento de autenticación no permite el cambio de contraseñas.",
    @@ -3812,7 +3828,10 @@
     	"authmanager-autocreate-noperm": "La creación automática de cuentas no está permitida.",
     	"authmanager-autocreate-exception": "La creación automática de cuentas ha sido temporalmente desactivada debido a errores previos.",
     	"authmanager-userdoesnotexist": "El usuario «$1» no está registrado.",
    +	"authmanager-userlogin-remembermypassword-help": "Si debe recordarse la contraseña por más tiempo que la duración de la sesión.",
    +	"authmanager-username-help": "Nombre de usuario para la autenticación.",
     	"authmanager-password-help": "Contraseña para autenticación.",
    +	"authmanager-domain-help": "Dominio para la autenticación externa.",
     	"authmanager-retype-help": "La contraseña de nuevo para confirmar.",
     	"authmanager-email-label": "Correo electrónico",
     	"authmanager-email-help": "Dirección de correo electrónico",
    @@ -3821,28 +3840,44 @@
     	"authmanager-provider-password": "Autenticación basada en contraseña",
     	"authmanager-provider-password-domain": "Autenticación basada en contraseña y dominio",
     	"authmanager-provider-temporarypassword": "Contraseña temporal",
    +	"authprovider-confirmlink-message": "Basado en tus últimos intentos para iniciar sesión, las siguientes cuentas pueden vincularse a tu cuenta wiki. Vincularlas permite iniciar sesión a través de esas cuentas. Selecciona cuáles deben vincularse.",
    +	"authprovider-confirmlink-request-label": "Cuentas que deberían vincularse",
     	"authprovider-confirmlink-success-line": "$1: vinculado exitosamente.",
    +	"authprovider-confirmlink-failed": "La vinculación de cuentas no se ha realizado con éxito: $1",
    +	"authprovider-confirmlink-ok-help": "Continuar luego de mostrar los mensajes de error en la vinculación.",
     	"authprovider-resetpass-skip-label": "Omitir",
    +	"authprovider-resetpass-skip-help": "Saltar el reestablecimiento de la contraseña.",
     	"authform-nosession-login": "La autenticación fue exitosa, pero tu navegador no puede \"recordar\" haber iniciado sesión.\n\n$1",
     	"authform-nosession-signup": "La cuenta ha sido creada, pero tu navegador no \"recuerda\" haber iniciado sesión.\n\n$1",
    +	"authform-newtoken": "Falta token. $1",
    +	"authform-notoken": "Falta token",
    +	"authform-wrongtoken": "Token incorrecto",
     	"specialpage-securitylevel-not-allowed-title": "No está permitido",
     	"specialpage-securitylevel-not-allowed": "Lo siento, no tienes permitido usar esta página, porque tu identidad no pudo verificarse.",
    +	"authpage-cannot-login": "No se puede iniciar la sesión.",
     	"authpage-cannot-login-continue": "No se puede continuar con el inicio de sesión. Lo más probable es que tu sesión haya expirado.",
     	"authpage-cannot-create": "No se puede iniciar la creación de la cuenta.",
    +	"authpage-cannot-create-continue": "No se puede continuar con la creación de la cuenta. Lo más probable es que tu sesión haya expirado.",
    +	"authpage-cannot-link": "No se puede iniciar la vinculación de la cuenta.",
     	"authpage-cannot-link-continue": "No se puede continuar con la vinculación de la cuenta. Lo más probable es que tu sesión haya expirado.",
     	"cannotauth-not-allowed-title": "Permiso denegado",
     	"cannotauth-not-allowed": "No tienes permiso para usar esta página.",
     	"changecredentials": "Cambiar las credenciales",
     	"changecredentials-submit": "Cambiar credenciales",
    +	"changecredentials-invalidsubpage": "$1 no es un tipo de credencial válido.",
     	"changecredentials-success": "Tus credenciales han sido cambiadas.",
     	"removecredentials": "Eliminar credenciales",
     	"removecredentials-submit": "Eliminar credenciales",
    +	"removecredentials-invalidsubpage": "$1 no es un tipo de credencial válido.",
     	"removecredentials-success": "Tus credenciales han sido eliminadas.",
    +	"credentialsform-provider": "Tipo de credenciales:",
     	"credentialsform-account": "Nombre de la cuenta:",
    +	"cannotlink-no-provider-title": "No hay cuentas vinculables",
     	"cannotlink-no-provider": "No hay cuentas vinculables.",
     	"linkaccounts": "Vincular cuentas",
     	"linkaccounts-success-text": "La cuenta fue vinculada.",
     	"linkaccounts-submit": "Vincular cuentas",
     	"unlinkaccounts": "Desvincular cuentas",
    -	"unlinkaccounts-success": "Se ha desvinculado la cuenta."
    +	"unlinkaccounts-success": "Se ha desvinculado la cuenta.",
    +	"authenticationdatachange-ignored": "El cambio den los datos de autentificacion no fue realizado. ¿Tal vez, no se configuró un proveedor?"
     }
    diff --git a/languages/i18n/et.json b/languages/i18n/et.json
    index 97e943e69a..9e27c3a603 100644
    --- a/languages/i18n/et.json
    +++ b/languages/i18n/et.json
    @@ -142,6 +142,8 @@
     	"october-date": "$1. oktoober",
     	"november-date": "$1. november",
     	"december-date": "$1. detsember",
    +	"period-am": "e. l.",
    +	"period-pm": "p. l.",
     	"pagecategories": "{{PLURAL:$1|Kategooria|Kategooriad}}",
     	"category_header": "Leheküljed kategoorias \"$1\"",
     	"subcategories": "Alamkategooriad",
    @@ -461,7 +463,7 @@
     	"nocookieslogin": "{{SITENAME}} kasutab kasutajate tuvastamisel küpsiseid. Sinu brauseris on küpsised keelatud. Palun sea küpsised lubatuks ja proovi siis uuesti.",
     	"nocookiesfornew": "Kasutajakonto jäi loomata, kuna me ei saanud selle allikat kindlaks teha.\nVeendu, et sul on küpsised lubatud, taaslaadi see lehekülg ja proovi uuesti.",
     	"noname": "Sa ei sisestanud kasutajanime lubataval kujul.",
    -	"loginsuccesstitle": "Sisselogimine õnnestus",
    +	"loginsuccesstitle": "Sisse logitud",
     	"loginsuccess": "Oled sisse loginud. Sinu kasutajanimi on \"$1\".",
     	"nosuchuser": "Kasutajat \"$1\" pole.\nKasutajanimed on tõstutundlikud.\nKontrolli kirjapilti või [[Special:CreateAccount|loo uus konto]].",
     	"nosuchusershort": "Kasutajat nimega \"$1\" pole.\nKontrolli kirjapilti.",
    @@ -480,7 +482,7 @@
     	"noemail": "Kasutaja $1 e-posti aadressi meil kahjuks pole.",
     	"noemailcreate": "Pead sisestama korrektse e-posti aadressi",
     	"passwordsent": "Uus parool on saadetud kasutaja $1 registreeritud e-postiaadressil.\nPärast parooli saamist logige palun sisse.",
    -	"blocked-mailpassword": "Sinu IP-aadressi jaoks on toimetamine blokeeritud, seetõttu ei saa sa kasutada ka parooli meeldetuletamise funktsiooni.",
    +	"blocked-mailpassword": "Sinu IP-aadressi jaoks on toimetamine blokeeritud. Et väärtarvitust ennetada, ei saa sellelt IP-aadressilt kasutada parooli meeldetuletamise funktsiooni.",
     	"eauthentsent": "Määratud e-posti aadressile on saadetud kinnituse e-kiri.\nEnne kui su kontole ükskõik milline muu e-kiri saadetakse, pead e-kirjas olevat juhist järgides kinnitama, et konto on tõepoolest sinu.",
     	"throttled-mailpassword": "Parooli lähtestamise e-kiri saadetud viimase {{PLURAL:$1|tunni|$1 tunni}} jooksul.\nVäärtarvitamise vältimiseks saadetakse {{PLURAL:$1|tunni|$1 tunni}} jooksul ainult üks lähtestamise e-kiri.",
     	"mailerror": "Viga kirja saatmisel: $1",
    @@ -517,13 +519,13 @@
     	"newpassword": "Uus parool:",
     	"retypenew": "Sisesta uus parool uuesti:",
     	"resetpass_submit": "Sisesta parool ja logi sisse",
    -	"changepassword-success": "Sinu parool on edukalt muudetud!\nSind logitakse nüüd sisse...",
    +	"changepassword-success": "Sinu parool on muudetud!",
     	"changepassword-throttled": "Oled hiljuti proovinud liiga palju kordi sisse logida.\nPalun oota $1, enne kui uuesti proovid.",
     	"resetpass_forbidden": "Paroole ei saa muuta",
     	"resetpass-no-info": "Pead olema sisselogitud, et sellele lehele pääseda.",
     	"resetpass-submit-loggedin": "Muuda parool",
     	"resetpass-submit-cancel": "Loobu",
    -	"resetpass-wrong-oldpass": "Vigane ajutine või praegune salasõna.\nVõib-olla oled juba edukalt muudnud oma salasõna või taotlenud uut ajutist salasõna.",
    +	"resetpass-wrong-oldpass": "Vigane ajutine või praegune salasõna.\nVõib-olla oled juba muutnud oma salasõna või taotlenud uut ajutist salasõna.",
     	"resetpass-recycled": "Palun vali uus salasõna, mis erineb praegusest.",
     	"resetpass-temp-emailed": "Logisid sisse e-posti teel saadud ajutise koodiga.\nEt sisselogimine lõpule viia, pead määrama siin uue parooli:",
     	"resetpass-temp-password": "Ajutine parool:",
    @@ -627,7 +629,7 @@
     	"userpage-userdoesnotexist": "Kasutajakontot \"<nowiki>$1</nowiki>\" pole olemas.\nPalun mõtle järele, kas soovid seda lehte luua või muuta.",
     	"userpage-userdoesnotexist-view": "Kasutajakonto \"$1\" pole registreeritud.",
     	"blocked-notice-logextract": "See kasutaja on praegu blokeeritud.\nAllpool on toodud viimane blokeerimislogi sissekanne:",
    -	"clearyourcache": "'''Märkus:''' Võimalik, et pärast salvestamist tuleb muudatuste nägemiseks veebilehitseja puhver tühjendada.\n* '''Firefox / Safari:''' Hoia all ''Shift''-klahvi ja klõpsa ''Laadi uuesti'' või vajuta kas ''Ctrl-F5'' või ''Ctrl-R'' (Macis ''⌘-R'').\n* '''Google Chrome:''' Vajuta ''Ctrl-Shift-R'' (Macis ''⌘-Shift-R'').\n* '''Internet Explorer:''' Hoia all ''Ctrl''-klahvi ja klõpsa ''Värskenda'' või vajuta ''Ctrl-F5''.\n* '''Opera:''' Tühjenda puhver asukohas ''Seaded → Eelistused''.",
    +	"clearyourcache": "<strong>Märkus:</strong> Võimalik, et pärast salvestamist tuleb muudatuste nägemiseks veebilehitseja puhver tühjendada.\n* <strong>Firefox / Safari:</strong> Hoia all <em>Shift</em>-klahvi ja klõpsa <em>Laadi uuesti</em> või vajuta kas <em>Ctrl-F5</em> või <em>Ctrl-R</em> (Macis <em>⌘-R</em>).\n* <strong>Google Chrome:</strong> Vajuta <em>Ctrl-Shift-R</em> (Macis <em>⌘-Shift-R</em>).\n* <strong>Internet Explorer:</strong> Hoia all <em>Ctrl</em>-klahvi ja klõpsa <em>Värskenda</em> või vajuta <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Mine asukohta <em>Menüü → Seaded</em> (Macis <em>Opera → Eelistused</em>) ja seejärel <em>Privaatsus ja turvalisus → Tühjenda sirvimisandmed → Puhverdatud pildid ja failid</em>.",
     	"usercssyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue CSSi proovimiseks nuppu \"{{int:showpreview}}\".",
     	"userjsyoucanpreview": "'''Vihje:''' Enne salvestamist kasuta oma uue JavaScripti proovimiseks nuppu \"{{int:showpreview}}\".",
     	"usercsspreview": "'''Ära unusta, et seda versiooni sinu isiklikust stiililehest pole veel salvestatud!'''",
    @@ -640,8 +642,8 @@
     	"previewnote": "'''Ära unusta, et see on kõigest eelvaade!'''\nSinu muudatused pole veel salvestatud!",
     	"continue-editing": "Mine redigeerimiskasti juurde",
     	"previewconflict": "See eelvaade näitab, kuidas ülemises toimetuskastis olev tekst hakkab välja nägema, kui otsustate salvestada.",
    -	"session_fail_preview": "'''Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.'''\nPalun proovi uuesti.\nKui see ikka ei tööta, proovi [[Special:UserLogout|välja]] ja tagasi sisse logida.",
    -	"session_fail_preview_html": "'''Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.'''\n\n''Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud, on eelvaade JavaScripti-rünnakute vastase ettevaatusabinõuna peidetud.''\n\n'''Kui see on õigustatud redigeerimiskatse, proovi palun uuesti.'''\nKui see ikka ei tööta, proovi [[Special:UserLogout|välja]] ja tagasi sisse logida.",
    +	"session_fail_preview": "Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.\n\nVõimalik, et oled välja loginud. <strong>Palun veendu, et oled endiselt sisse logitud ja proovi uuesti</strong>.\nKui see ei toimi, siis proovi [[Special:UserLogout|logida välja]] ja seejärel tagasi sisse ning kontrolli, kas brauser lubab sellest võrgukohast küpsiseid.",
    +	"session_fail_preview_html": "Vabandust! Meil ei õnnestunud seansiandmete kaotuse tõttu sinu muudatust töödelda.\n\n<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud, on eelvaade JavaScripti-rünnakute vastase ettevaatusabinõuna peidetud.</em>\n\n<strong>Kui see on õigustatud redigeerimiskatse, proovi palun uuesti.</strong>\nKui see ikka ei tööta, proovi [[Special:UserLogout|välja]] ja tagasi sisse logida ning kontrolli, kas brauser lubab sellest võrgukohast küpsiseid.",
     	"token_suffix_mismatch": "'''Muudatus lükati tagasi, kuna sinu klienttarkvara ei suuda õigesti kirjavahemärke kasutada.'''\nMuudatus lükati tagasi, et vältida lehekülje segiminekut.\nSee juhtub mõnikord siis, kui kasutatakse vigast veebipõhist anonüümsusserverit.",
     	"edit_form_incomplete": "'''Redigeerimisvormi mõni osa ei jõudnud serverisse; kontrolli, kas sinu tehtud muudatused on alles, ja proovi uuesti.'''",
     	"editing": "Muutmisel on \"$1\"",
    @@ -807,9 +809,9 @@
     	"revdelete-unsuppress": "Eemalda taastatud redaktsioonidelt piirangud",
     	"revdelete-log": "Põhjus:",
     	"revdelete-submit": "Rakenda valitud {{PLURAL:$1|redaktsiooni|redaktsioonide}} suhtes",
    -	"revdelete-success": "Redaktsiooni nähtavus edukalt värskendatud.",
    +	"revdelete-success": "Redaktsiooni nähtavus värskendatud.",
     	"revdelete-failure": "'''Redaktsiooni nähtavust ei saanud värskendada:'''\n$1",
    -	"logdelete-success": "'''Logi nähtavus edukalt muudetud.'''",
    +	"logdelete-success": "Logi nähtavus muudetud.",
     	"logdelete-failure": "'''Logi nähtavust ei saanud paika:'''\n$1",
     	"revdel-restore": "muuda nähtavust",
     	"pagehist": "lehekülje ajalugu",
    @@ -1030,10 +1032,10 @@
     	"userrights": "Kasutajaõiguste haldus",
     	"userrights-lookup-user": "Kasutajarühma muutmine",
     	"userrights-user-editname": "Sisesta kasutajanimi:",
    -	"editusergroup": "Muuda kasutajarühmi",
    +	"editusergroup": "Muuda {{GENDER:$1|kasutajarühmi}}",
     	"editinguser": "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
     	"userrights-editusergroup": "Kasutajarühmade muutmine",
    -	"saveusergroups": "Salvesta kasutajarühmad",
    +	"saveusergroups": "Salvesta {{GENDER:$1|kasutajarühmad}}",
     	"userrights-groupsmember": "Kuulub rühmadesse:",
     	"userrights-groupsmember-auto": "Kuulub vaikimisi rühmadesse:",
     	"userrights-groups-help": "Sa võid muuta selle kasutaja kuuluvust eri kasutajarühmadesse.\n* Märgitud kast tähendab, et kasutaja kuulub sellesse rühma.\n* Märkimata kast tähendab, et kasutaja ei kuulu sellesse rühma.\n* Aga * kasutajarühma juures tähistab õigust, mida sa peale lisamist enam eemaldada ei saa, või siis ka vastupidi.",
    @@ -1045,7 +1047,7 @@
     	"userrights-changeable-col": "Rühmad, mida sa saad muuta",
     	"userrights-unchangeable-col": "Rühmad, mida sa ei saa muuta",
     	"userrights-conflict": "Kasutajaõiguste muutmise konflikt! Palun vaata oma muudatused üle ja kinnita need.",
    -	"userrights-removed-self": "Võtsid edukalt endalt õigused. Seetõttu sellele leheküljele sa enam ligi ei pääse.",
    +	"userrights-removed-self": "Võtsid endalt õigused. Seetõttu sellele leheküljele sa enam ligi ei pääse.",
     	"group": "Rühm:",
     	"group-user": "Kasutajad",
     	"group-autoconfirmed": "Automaatselt kinnitatud kasutajad",
    @@ -1136,7 +1138,7 @@
     	"right-override-export-depth": "Eksportida lehekülgi, kaasates viidatud leheküljed kuni viienda tasemeni",
     	"right-sendemail": "Saata teistele kasutajatele e-kirju",
     	"right-passwordreset": "Vaadata parooli lähtestamise e-kirju",
    -	"right-managechangetags": "Koostada [[Special:Tags|märgiseid]] ja kustutada neid andmebaasist",
    +	"right-managechangetags": "Koostada ja (in)aktiveerida [[Special:Tags|märgiseid]]",
     	"right-applychangetags": "Rakendada [[Special:Tags|märgiseid]] enda muudatuste suhtes",
     	"right-changetags": "Lisada ja eemaldada käsitsi rakendatavaid [[Special:Tags|märgiseid]] üksikute redaktsioonide ja logisissekannete juures",
     	"grant-group-page-interaction": "Interaktsioon lehekülgedega",
    @@ -1164,6 +1166,7 @@
     	"grant-sendemail": "Kasutajatele e-kirjade saatmine",
     	"grant-uploadeditmovefile": "Failide üleslaadimine, asendamine ja teisaldamine",
     	"grant-uploadfile": "Uute failide üleslaadimine",
    +	"grant-basic": "Põhiõigused",
     	"grant-viewdeleted": "Kustutatud failide ja lehekülgede vaatamine",
     	"grant-viewmywatchlist": "Oma jälgimisloendi vaatamine",
     	"newuserlogpage": "Konto loomise logi",
    @@ -1172,8 +1175,8 @@
     	"rightslogtext": "See on logi kasutajate õiguste muutuste kohta.",
     	"action-read": "seda lehekülge lugeda",
     	"action-edit": "seda lehekülge muuta",
    -	"action-createpage": "lehekülgi luua",
    -	"action-createtalk": "arutelulehekülgi luua",
    +	"action-createpage": "seda lehekülge luua",
    +	"action-createtalk": "seda arutelulehekülge luua",
     	"action-createaccount": "seda kasutajakontot luua",
     	"action-history": "vaadata selle lehekülje ajalugu",
     	"action-minoredit": "seda muudatust pisimuudatuseks märkida",
    @@ -1212,7 +1215,7 @@
     	"action-viewmyprivateinfo": "oma eraandmeid vaadata",
     	"action-editmyprivateinfo": "oma eraandmeid redigeerida",
     	"action-editcontentmodel": "lehekülje sisumudelit muuta",
    -	"action-managechangetags": "märgiseid koostada ege neid andmebaasist kustutada",
    +	"action-managechangetags": "märgiseid koostada ega (in)aktiveerida",
     	"action-applychangetags": "rakendada märgiseid oma muudatuste suhtes",
     	"action-changetags": "käsitsi rakendatavaid märgiseid üksikute redaktsioonide ega logisissekannete juures lisada ega eemaldada",
     	"nchanges": "$1 {{PLURAL:$1|muudatus|muudatust}}",
    @@ -1278,9 +1281,9 @@
     	"recentchangeslinked-page": "Lehekülje nimi:",
     	"recentchangeslinked-to": "Näita hoopis muudatusi lehekülgedel, mis sellele lehele lingivad",
     	"recentchanges-page-added-to-category": "kategooriasse lisatud \"[[:$1]]\"",
    -	"recentchanges-page-added-to-category-bundled": "kategooriasse lisatud \"[[:$1]]\" ja veel [[Special:WhatLinksHere/$1|{{PLURAL:$2|üks lehekülg|$2 lehekülge}}]]",
    +	"recentchanges-page-added-to-category-bundled": "kategooriasse lisatud \"[[:$1]]\", [[Special:WhatLinksHere/$1|seda lehekülge kasutatakse teisel leheküljel mallina]]",
     	"recentchanges-page-removed-from-category": "kategooriast eemaldatud \"[[:$1]]\"",
    -	"recentchanges-page-removed-from-category-bundled": "kategooriast eemaldatud \"[[:$1]]\" ja veel {{PLURAL:$2|üks lehekülg|$2 lehekülge}}",
    +	"recentchanges-page-removed-from-category-bundled": "kategooriast eemaldatud \"[[:$1]]\", [[Special:WhatLinksHere/$1|seda lehekülge kasutatakse teisel leheküljel mallina]]",
     	"autochange-username": "MediaWiki automaatne muudatus",
     	"upload": "Faili üleslaadimine",
     	"uploadbtn": "Laadi fail üles",
    @@ -1353,7 +1356,7 @@
     	"uploaded-script-svg": "Üleslaaditud SVG-failist leiti skriptitav element \"$1\".",
     	"uploaded-hostile-svg": "Üleslaaditud SVG-faili laadielemendist leiti ebaturvaline CSS.",
     	"uploaded-event-handler-on-svg": "Sündmuse halduse atribuutide <code>$1=\"$2\"</code> seadmine pole SVG-failis lubatud.",
    -	"uploaded-href-unsafe-target-svg": "Üleslaaditud SVG-failist leiti href, mille sihtkoht <code>&lt;$1 $2=\"$3\"&gt;</code> on ebaturvaline.",
    +	"uploaded-href-unsafe-target-svg": "Üleslaaditud SVG-failist leiti href, mis viitab ebaturvalistele andmetele: URI sihtkoht <code>&lt;$1 $2=\"$3\"&gt;</code>.",
     	"uploaded-animate-svg": "Üleslaaditud SVG-failist leiti silt \"animate\", mis võib href-i muuta, kasutades from-atribuuti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
     	"uploaded-setting-event-handler-svg": "Sündmuse halduse atribuutide seadmine on keelatud, üleslaaditud SVG-failist leiti <code>&lt;$1 $2=\"$3\"&gt;</code>.",
     	"uploaded-setting-href-svg": "Sildi \"set\" kasutamine, selleks et lisada emaelemendile href-atribuut, on keelatud.",
    @@ -1423,7 +1426,7 @@
     	"backend-fail-read": "Faili $1 ei saa lugeda.",
     	"backend-fail-create": "Faili $1 ei saa kirjutada.",
     	"backend-fail-maxsize": "Faili $1 ei saa kirjutada, sest see on {{PLURAL:$2|ühest baidist|$2 baidist}} suurem.",
    -	"backend-fail-readonly": "Tagamälu \"$1\" on praegu kirjutuskaitstud. Põhjus: \"<em>$2</em>\"",
    +	"backend-fail-readonly": "Tagamälu \"$1\" on praegu kirjutuskaitstud. Põhjus: <em>$2</em>",
     	"backend-fail-synced": "Faili \"$1\" olek sisemälus on ühtimatu.",
     	"backend-fail-connect": "Ühendus tagamäluga \"$1\" ebaõnnestus.",
     	"backend-fail-internal": "Tagamälus \"$1\" esines tundmatu tõrge.",
    @@ -1450,7 +1453,7 @@
     	"uploadstash-summary": "See lehekülg pakub juurdepääsu failidele, mis on üles laaditud (või mida parasjagu üles laaditakse), kuid mis pole veel vikis avaldatud. Need failid on nähtavad üksnes kasutajale, kes need üles laadis.",
     	"uploadstash-clear": "Kustuta failid algsest hoidlast",
     	"uploadstash-nofiles": "Sul pole algses hoidlas faile.",
    -	"uploadstash-badtoken": "Toiming ebaõnnestus; võib-olla redigeerimisloa aegumise tõttu. Proovi uuesti.",
    +	"uploadstash-badtoken": "Toiming ebaõnnestus, võib-olla redigeerimismandaadi aegumise tõttu. Palun proovi uuesti.",
     	"uploadstash-errclear": "Failide kustutamine ebaõnnestus.",
     	"uploadstash-refresh": "Värskenda faililoendit",
     	"invalid-chunk-offset": "Tüki vigane nihe",
    @@ -1601,7 +1604,7 @@
     	"pageswithprop-prophidden-long": "pika tekstiatribuudi väärtus peidetud ($1)",
     	"pageswithprop-prophidden-binary": "kahendatribuudi väärtus peidetud ($1)",
     	"doubleredirects": "Kahekordsed ümbersuunamised",
    -	"doubleredirectstext": "See lehekülg loetleb leheküljed, mis on ümber suunatud teistele ümbersuunamislehekülgedel.\nIgal real on toodud esimene ja teine ümbersuunamislehekülg ning samuti lehekülg, kuhu teine ümbersuunamislehekülg on suunatud ja kuhu tavaliselt ka esimene ümbersuunamislehekülg tegelikult peaks suunama.\n<del>Läbikriipsutatud</del> kirjed on kohendatud.",
    +	"doubleredirectstext": "See lehekülg loetleb leheküljed, mis on ümber suunatud teistele ümbersuunamislehekülgedele.\nIgal real on toodud esimene ja teine ümbersuunamislehekülg ning samuti lehekülg, kuhu teine ümbersuunamislehekülg on suunatud ja kuhu tavaliselt ka esimene ümbersuunamislehekülg tegelikult peaks suunama.\n<del>Läbikriipsutatud</del> kirjed on kohendatud.",
     	"double-redirect-fixed-move": "[[$1]] on teisaldatud.\nLehekülg uuendati automaatselt ja see suunab nüüd leheküljele [[$2]].",
     	"double-redirect-fixed-maintenance": "Hooldustöö käigus parandati automaatselt kahekordne suunamine leheküljelt [[$1]] leheküljele [[$2]].",
     	"double-redirect-fixer": "Ümbersuunamiste parandaja",
    @@ -1702,13 +1705,13 @@
     	"apihelp-no-such-module": "Moodulit \"$1\" ei leitud.",
     	"apisandbox": "API liivakast",
     	"apisandbox-api-disabled": "API on selles võrgukohas keelatud.",
    -	"apisandbox-intro": "Kasuta seda lehekülge '''MediaWiki API''' katsetamiseks.\nÜksikasjad API kasutamise kohta leiad [https://www.mediawiki.org/wiki/API:Main_page API dokumentatsioonist]. Näide: [https://www.mediawiki.org/wiki/API#A_simple_example esilehe sisu hankimine]. Vali toiming, et näha veel näiteid.\n\nPane tähele, et kuigi siin on liivakast, võivad siin leheküljel tehtud toimingud vikit muuta.",
    +	"apisandbox-intro": "Kasuta seda lehekülge <strong>MediaWiki API</strong> katsetamiseks.\nÜksikasjad API kasutamise kohta leiad [[mw:API:Main page|API dokumentatsioonist]]. Näide: [https://www.mediawiki.org/wiki/API#A_simple_example esilehe sisu hankimine]. Vali toiming, et näha veel näiteid.\n\nPane tähele, et kuigi siin on liivakast, võivad siin leheküljel tehtud toimingud vikit muuta.",
     	"apisandbox-submit": "Tee päring",
     	"apisandbox-reset": "Puhasta",
    -	"apisandbox-examples": "Näide",
    -	"apisandbox-results": "Tulemus",
    +	"apisandbox-examples": "Näited",
    +	"apisandbox-results": "Tulemused",
     	"apisandbox-request-url-label": "Päringu URL:",
    -	"apisandbox-request-time": "Päringuaeg: $1",
    +	"apisandbox-request-time": "Päringuaeg: {{PLURAL:$1|$1 ms}}",
     	"booksources": "Raamatuotsimine",
     	"booksources-search-legend": "Raamatuotsimine",
     	"booksources-search": "Otsi",
    @@ -1783,8 +1786,10 @@
     	"listgrouprights-namespaceprotection-header": "Nimeruumipiirangud",
     	"listgrouprights-namespaceprotection-namespace": "Nimeruum",
     	"listgrouprights-namespaceprotection-restrictedto": "Redigeerimiseks vajalikud õigused",
    -	"listgrants-summary": "See on OAuthi-volituste ja neile vastavate kasutajaõiguste loend. Kasutaja saab volitada rakenduse tarvituse enda nimel, aga vaid kasutaja valitud volituste piires. Rakenduse abil ei saa kasutaja nimel siiski kasutada õigusi, mida kasutajal pole.\nÜksikute õiguste kohta võib leiduda [[{{MediaWiki:Listgrouprights-helppage}}|lisateavet]].",
    -	"listgrants-rights": "Volitus",
    +	"listgrants": "Volitused",
    +	"listgrants-summary": "See on volituste ja neile vastavate kasutajaõiguste loend. Kasutaja saab volitada rakenduse tarvituse enda nimel, aga vaid kasutaja valitud volituste piires. Rakenduse abil ei saa kasutaja nimel siiski kasutada õigusi, mida kasutajal pole.\nÜksikute õiguste kohta võib leiduda [[{{MediaWiki:Listgrouprights-helppage}}|lisateavet]].",
    +	"listgrants-grant": "Volitus",
    +	"listgrants-rights": "Õigused",
     	"trackingcategories": "Süsteemikategooriad",
     	"trackingcategories-summary": "Siin leheküljel on loetletud süsteemikategooriad, millesse MediaWiki tarkvara ise lehekülgi arvab. Nende kategooriate nimesid saab muuta, kui vahetada {{ns:8}}-nimeruumis vastavaid süsteemisõnumeid.",
     	"trackingcategories-msg": "Süsteemikategooria",
    @@ -1908,7 +1913,7 @@
     	"delete-toobig": "See lehekülg on pika redigeerimisajalooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.\nSelle kustutamine on keelatud, et ära hoida ekslikku {{GRAMMAR:genitive|{{SITENAME}}}} töö häirimist.",
     	"delete-warning-toobig": "See lehekülg on pika redigeerimislooga – üle {{PLURAL:$1|ühe muudatuse|$1 muudatuse}}.\nEttevaatust, selle kustutamine võib esile kutsuda häireid {{GRAMMAR:genitive|{{SITENAME}}}} andmebaasi töös.",
     	"deleteprotected": "Seda lehekülge ei saa kustutada, sest see on kaitstud.",
    -	"deleting-backlinks-warning": "'''Hoiatus:''' [[Special:WhatLinksHere/{{FULLPAGENAME}}|Teised leheküljed]] viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
    +	"deleting-backlinks-warning": "<strong>Hoiatus:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Teised leheküljed]] viitavad leheküljele, mida oled kustutamas, või see lehekülg on kasutuses mallina.",
     	"rollback": "Tühista muudatused",
     	"rollbacklink": "tühista",
     	"rollbacklinkcount": "tühista {{PLURAL:$1|üks muudatus|$1 muudatust}}",
    @@ -1967,7 +1972,7 @@
     	"protect-summary-cascade": "kaskaad",
     	"protect-expiring": "aegumistähtaeg $1 (UTC)",
     	"protect-expiring-local": "aegumistähtaeg $1",
    -	"protect-expiry-indefinite": "määramatu",
    +	"protect-expiry-indefinite": "tähtajatu",
     	"protect-cascade": "Kaitse lehekülgi, mis on lülitatud käesoleva lehekülje koosseisu (kaskaadkaitse)",
     	"protect-cantedit": "Sa ei saa lehekülje kaitsetaset muuta, sest sul puudub lehekülje redigeerimise õigus.",
     	"protect-othertime": "Muu aeg:",
    @@ -2087,7 +2092,7 @@
     	"unblock": "Kasutaja blokeeringu eemaldamine",
     	"blockip": "Blokeeri {{GENDER:$1|kasutaja}}",
     	"blockip-legend": "Kasutaja blokeerimine",
    -	"blockiptext": "See vorm on kindla IP-aadressi või kasutajanime kirjutamisõiguste blokeerimiseks.\nSeda tohib teha ainult vandalismi vältimiseks ja kooskõlas [[{{MediaWiki:Policy-url}}|{{GRAMMAR:genitive|{{SITENAME}}}} sisekorraga]].\nTäida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.",
    +	"blockiptext": "See vorm on kindla IP-aadressi või kasutajanime kirjutamisõiguste blokeerimiseks.\nSeda tohib teha ainult vandalismi vältimiseks ja kooskõlas [[{{MediaWiki:Policy-url}}|{{GRAMMAR:genitive|{{SITENAME}}}} sisekorraga]].\nTäida ka põhjuse väli, näiteks viidates lehekülgedele, mis rikuti.\nIP-aadresside vahemikke saad blokeerida [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]-süntaksi abil; suurim lubatud vahemik on IPv4 jaoks /$1 ja IPv6 jaoks /$2.",
     	"ipaddressorusername": "IP-aadress või kasutajanimi:",
     	"ipbexpiry": "Kehtivus:",
     	"ipbreason": "Põhjus:",
    @@ -2205,8 +2210,8 @@
     	"lockedbyandtime": "(lukustas $1; $2, kell $3)",
     	"move-page": "Lehekülje \"$1\" teisaldamine",
     	"move-page-legend": "Lehekülje teisaldamine",
    -	"movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
    -	"movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge '''ei teisaldata''' juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n'''Hoiatus!'''\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
    +	"movepagetext": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nSaad senisele pealkirjale viitavad ümbersuunamised automaatselt parandada.\nKui sa seda ei tee, kontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui viimane on redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Märkus:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
    +	"movepagetext-noredirectfixer": "Allolevat vormi kasutades saad lehekülje ümber nimetada. Lehekülje ajalugu tõstetakse uue pealkirja alla automaatselt.\nPraeguse pealkirjaga leheküljest saab ümbersuunamislehekülg uuele leheküljele.\nKontrolli, et teisaldamise tõttu ei jää maha [[Special:DoubleRedirects|kahekordseid]] ega [[Special:BrokenRedirects|katkiseid ümbersuunamisi]].\nSinu kohus on hoolitseda selle eest, et kõik jääks toimima, nagu ette nähtud.\n\nPane tähele, et lehekülge <strong>ei teisaldata</strong> juhul, kui uue pealkirjaga lehekülg on juba olemas. Erandiks on juhud, kui olemasolev lehekülg on tühi või redigeerimisajaloota ümbersuunamislehekülg.\nSee tähendab, et kogemata ei saa üle kirjutada juba olemasolevat lehekülge, kuid saab ebaõnnestunud ümbernimetamise tagasi pöörata.\n\n<strong>Note:</strong>\nTegu võib olla väga loetava lehekülje jaoks tõsise ja ootamatu muudatusega;\nenne jätkamist teadvusta palun tagajärgi.",
     	"movepagetalktext": "Kui märgid selle ruudu, teisaldatakse arutelulehekülg automaatselt uue pealkirja alla. Seda välja arvatud juhul, kui uue pealkirja all on juba arutelulehekülg, mis pole tühi.\n\nSel juhul saad lehekülje soovi korral käsitsi teisaldada või liita.",
     	"moveuserpage-warning": "'''Hoiatus:''' Oled teisaldamas kasutajalehekülge. Pane tähele, et teisaldatakse ainult lehekülg ja kasutajat '''ei''' nimetata ümber.",
     	"movecategorypage-warning": "<strong>Hoiatus:</strong> Oled teisaldamas kategoorialehekülge. Pane palun tähele, et teisaldatakse vaid see lehekülg ja ühtegi vanas kategoorias sisalduvat lehekülge <em>ei</em> kategoriseerita ümber uude kategooriasse.",
    @@ -2240,7 +2245,7 @@
     	"movenosubpage": "Sellel leheküljel pole alamlehekülgi.",
     	"movereason": "Põhjus:",
     	"revertmove": "taasta",
    -	"delete_and_move_text": "== Vajalik kustutamine ==\nSihtlehekülg \"[[:$1]]\" on juba olemas.\nKas kustutad selle, et luua võimalus teisaldamiseks?",
    +	"delete_and_move_text": "Sihtlehekülg \"[[:$1]]\" on juba olemas.\nKas kustutad selle, et luua võimalus teisaldamiseks?",
     	"delete_and_move_confirm": "Jah, kustuta lehekülg",
     	"delete_and_move_reason": "Kustutatud, et tõsta asemele lehekülg \"[[$1]]\"",
     	"selfmove": "Algne nimi ja uus nimi on samad.",
    @@ -2258,7 +2263,7 @@
     	"move-leave-redirect": "Jäta maha ümbersuunamisleht",
     	"protectedpagemovewarning": "'''Hoiatus:''' See lehekülg on nii lukustatud, et ainult administraatori õigustega kasutajad saavad seda teisaldada.\nAllpool on toodud uusim logisissekanne:",
     	"semiprotectedpagemovewarning": "'''Pane tähele:''' See lehekülg on lukustatud, nii et ainult registreeritud kasutajad saavad seda teisaldada.\nAllpool on toodud uusim logisissekanne:",
    -	"move-over-sharedrepo": "== Fail on olemas ==\n[[:$1]] on olemas jagatud failivaramus. Faili teisaldamisel selle nime alla varjatakse jagatud failivarmus olev samanimeline fail.",
    +	"move-over-sharedrepo": "[[:$1]] on olemas jagatud failivaramus. Faili teisaldamisel selle nime alla varjatakse jagatud failivarmus olev samanimeline fail.",
     	"file-exists-sharedrepo": "Valitud failinimi on juba kasutusel jagatud failivaramus.\nPalun kasuta mõnda teist nime.",
     	"export": "Lehekülgede eksport",
     	"exporttext": "Saad eksportida kindla leheküljel või lehekülgede kogumi teksti ja redigeerimisloo XML-kujule viiduna.\nSeda saab teise vikisse importida, kasutades selleks MediaWiki [[Special:Import|impordi lehekülge]].\n\nEt eksportida lehekülgi, sisesta nende pealkirjad allolevasse tekstikasti, iga pealkiri ise reale ja vali, kas soovid viimast redaktsiooni ja kõiki vanemaid redaktsioone ühes redigeerimislooga või viimast redaktsiooni ühes andmetega viimase redigeerimise kohta.\n\nViimasel juhul saab kasutada ka linki, näiteks lehekülje \"[[{{MediaWiki:Mainpage}}]]\" jaoks [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]].",
    @@ -2337,7 +2342,7 @@
     	"import-nonewrevisions": "Ühtegi redaktsiooni ei imporditud (kõik on juba olemas või tõrgete tõttu vahele jäetud).",
     	"xml-error-string": "$1 real $2, tulbas $3 (bait $4): $5",
     	"import-upload": "Laadi üles XML-andmed",
    -	"import-token-mismatch": "Seansiandmed läksid kaduma.\nPalun ürita uuesti.",
    +	"import-token-mismatch": "Seansiandmed läksid kaduma.\n\nVõimalik, et oled välja loginud. <strong>Palun veendu, et oled endiselt sisse logitud ja proovi uuesti</strong>.\nKui see ei toimi, siis proovi [[Special:UserLogout|logida välja]] ja tagasi sisse ning kontrolli, kas brauser lubab sellest võrgukohast küpsiseid.",
     	"import-invalid-interwiki": "Määratud vikist ei saa importida.",
     	"import-error-edit": "Lehekülge \"$1\" ei imporditud, sest sul pole õigust seda muuta.",
     	"import-error-create": "Lehekülge \"$1\" ei imporditud, sest sul pole õigust seda luua.",
    @@ -2394,8 +2399,8 @@
     	"tooltip-t-recentchangeslinked": "Viimased muudatused lehekülgedel, millele on siit viidatud",
     	"tooltip-feed-rss": "Selle lehekülje RSS-voog",
     	"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-contributions": "Kuva {{GENDER:$1|selle kasutaja}} kaastöö",
    +	"tooltip-t-emailuser": "Saada {{GENDER:$1|sellele kasutajale}} e-kiri",
     	"tooltip-t-info": "Lisateave selle lehekülje kohta",
     	"tooltip-t-upload": "Laadi faile üles",
     	"tooltip-t-specialpages": "Erilehekülgede loend",
    @@ -2534,7 +2539,7 @@
     	"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|lehekülg|lehekülge}}",
     	"file-info": "faili suurus: $1, MIME tüüp: $2",
     	"file-info-size": "$1 × $2 pikslit, faili suurus: $3, MIME tüüp: $4",
    -	"file-info-size-pages": "$1 × $2 pikslit, faili suurus: $3 , MIME tüüp: $4, $5 {{PLURAL:$5|lehekülg|lehekülge}}",
    +	"file-info-size-pages": "$1 × $2 pikslit, faili suurus: $3, MIME tüüp: $4, $5 {{PLURAL:$5|lehekülg|lehekülge}}",
     	"file-nohires": "Sellest suuremat pilti pole.",
     	"svg-long-desc": "SVG-fail, algsuurus $1 × $2 pikslit, faili suurus: $3",
     	"svg-long-desc-animated": "Animeeritud SVG-fail,  algsuurus $1 × $2 pikslit, faili suurus: $3",
    @@ -3018,7 +3023,7 @@
     	"watchlistedit-raw-done": "Sinu jälgimisloend on uuendatud.",
     	"watchlistedit-raw-added": "{{PLURAL:$1|1 lehekülg|$1 lehekülge}} lisatud:",
     	"watchlistedit-raw-removed": "{{PLURAL:$1|1 pealkiri|$1 pealkirja}} eemaldati:",
    -	"watchlistedit-clear-title": "Tühjendatud jälgimisloend",
    +	"watchlistedit-clear-title": "Jälgimisloendi tühjendamine",
     	"watchlistedit-clear-legend": "Jälgimisloendi tühjendamine",
     	"watchlistedit-clear-explain": "Sinu jälgimisloendist eemaldatakse kõik pealkirjad.",
     	"watchlistedit-clear-titles": "Pealkirjad:",
    @@ -3081,8 +3086,8 @@
     	"version-libraries-license": "Litsents",
     	"version-libraries-description": "Kirjeldus",
     	"version-libraries-authors": "Autorid",
    -	"redirect": "Ümbersuunamine faili, kasutaja, lehekülje või redaktsiooni identifikaatori järgi",
    -	"redirect-summary": "See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni või lehekülje identifikaator) või kasutajalehekülje (toodud numbriline kasutaja identfikaator) juurde. Kasutamine: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] või [[{{#Special:Redirect}}/user/101]].",
    +	"redirect": "Ümbersuunamine faili, kasutaja, lehekülje, redaktsiooni või logiidentifikaatori järgi",
    +	"redirect-summary": "See erilehekülg suunab ümber faili (toodud failinimi), lehekülje (toodud redaktsiooni või lehekülje identifikaator), kasutajalehekülje (toodud numbriline kasutaja identfikaator) või logisissekande (toodud logiidentifikaator) juurde. Kasutamine: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] või [[{{#Special:Redirect}}/logid/186]].",
     	"redirect-submit": "Mine",
     	"redirect-lookup": "Leia:",
     	"redirect-value": "Väärtus:",
    @@ -3164,7 +3169,7 @@
     	"tags-delete-not-allowed": "Tarkvaralisas määratletud märgiseid ei saa kustutada, kui märgis on tarkvaralisas eraldi lubatud.",
     	"tags-delete-not-found": "Märgist \"$1\" pole.",
     	"tags-delete-too-many-uses": "Märgist \"$1\" on rakendatud rohkem kui {{PLURAL:$2|ühe|$2}} redaktsiooni juures, mistõttu ei saa seda kustutada.",
    -	"tags-delete-warnings-after-delete": "Märgis \"$1\" on edukalt kustutatud, kuid väljastati {{PLURAL:$2|järgmine hoiatus|järgmised hoiatused}}:",
    +	"tags-delete-warnings-after-delete": "Märgis \"$1\" on kustutatud, kuid väljastati {{PLURAL:$2|järgmine hoiatus|järgmised hoiatused}}:",
     	"tags-activate-title": "Märgise lubamine",
     	"tags-activate-question": "Siinkohal lubad märgise \"$1\".",
     	"tags-activate-reason": "Põhjus:",
    @@ -3193,7 +3198,7 @@
     	"tags-edit-revision-legend": "Märgiste lisamine või eemaldamine {{PLURAL:$1|selle|kõigi $1}} redaktsiooni juures",
     	"tags-edit-logentry-legend": "Märgiste lisamine või eemaldamine {{PLURAL:$1|selle|kõigi $1}} logisissekande juures",
     	"tags-edit-existing-tags": "Senised märgised:",
    -	"tags-edit-existing-tags-none": "''puuduvad''",
    +	"tags-edit-existing-tags-none": "<em>puuduvad</em>",
     	"tags-edit-new-tags": "Uued märgised:",
     	"tags-edit-add": "Lisa need märgised:",
     	"tags-edit-remove": "Eemalda need märgised:",
    @@ -3203,7 +3208,7 @@
     	"tags-edit-reason": "Põhjus:",
     	"tags-edit-revision-submit": "Rakenda {{PLURAL:$1|selle|$1}} redaktsiooni suhtes",
     	"tags-edit-logentry-submit": "Rakenda {{PLURAL:$1|selle|$1}} logisissekande suhtes",
    -	"tags-edit-success": "Muudatused on edukalt rakendatud.",
    +	"tags-edit-success": "Muudatused on rakendatud.",
     	"tags-edit-failure": "Muudatusi ei õnnestunud rakendada:\n$1",
     	"tags-edit-nooldid-title": "Vigane sihtredaktsioon",
     	"tags-edit-nooldid-text": "Selle toimingu jaoks pole määratud ühtegi sihtredaktsiooni või määratud redaktsiooni pole olemas.",
    @@ -3293,7 +3298,7 @@
     	"logentry-protect-protect-cascade": "$1 {{GENDER:$2|kaitses}} lehekülje $3 $4 [kaskaadkaitse]",
     	"logentry-protect-modify": "$1 {{GENDER:$2|muutis}} lehekülje $3 kaitsetaset $4",
     	"logentry-protect-modify-cascade": "$1 {{GENDER:$2|muutis}} lehekülje $3 kaitsetaset $4 [kaskaadkaitse]",
    -	"logentry-rights-rights": "$1 {{GENDER:$2|muutis}} kasutaja $3 rühmaliikmesust; enne oli $4, nüüd on $5",
    +	"logentry-rights-rights": "$1 {{GENDER:$2|muutis}} kasutaja {{GENDER:$6|$3}} rühmaliikmesust; enne oli $4, nüüd on $5",
     	"logentry-rights-rights-legacy": "$1 {{GENDER:$2|muutis}} kasutaja $3 rühmaliikmesust",
     	"logentry-rights-autopromote": "$1 {{GENDER:$2|viidi}} automaatselt üle teise rühma; enne oli $4, nüüd on $5",
     	"logentry-upload-upload": "$1 {{GENDER:$2|laadis üles}} faili $3",
    @@ -3422,7 +3427,7 @@
     	"expand_templates_generate_xml": "Näita XML-liigenduspuud",
     	"expand_templates_generate_rawhtml": "Näita toor-HTMLi",
     	"expand_templates_preview": "Eelvaade",
    -	"expand_templates_preview_fail_html": "<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud ja osa seansiandmeid läks kaotsi, siis on JavaScripti põhiste rünnakute vastase abinõuna eelvaade peidetud.</em>\n\n<strong>Kui see eelvaatekatse on õigustatud, proovi palun uuesti.</strong>\nKui see ikka ei tööta, proovi [[Special:UserLogout|logida välja]] ja tagasi sisse.",
    +	"expand_templates_preview_fail_html": "<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud ja osa seansiandmeid läks kaotsi, siis on JavaScripti põhiste rünnakute vastase abinõuna eelvaade peidetud.</em>\n\n<strong>Kui see eelvaatekatse on õigustatud, proovi palun uuesti.</strong>\nKui see ikka ei tööta, proovi [[Special:UserLogout|logida välja]] ja tagasi sisse ning kontrolli, kas brauser lubab sellest võrgukohast küpsiseid.",
     	"expand_templates_preview_fail_html_anon": "<em>Kuna {{GRAMMAR:inessive|{{SITENAME}}}} on toor-HTML lubatud ja sa pole sisse logitud, siis on JavaScripti põhiste rünnakute vastase abinõuna eelvaade peidetud.</em>\n\n<strong>Kui see eelvaatekatse on õigustatud, [[Special:UserLogin|logi]] palun sisse ja proovi uuesti.</strong>",
     	"pagelanguage": "Lehekülje keele valik",
     	"pagelang-name": "Lehekülg",
    @@ -3441,8 +3446,8 @@
     	"mediastatistics": "Meediafailide arvandmestik",
     	"mediastatistics-summary": "Arvandmed üles laaditud failitüüpide kohta. See käib ainult failide viimaste versioonide kohta. Vanu ja kustutatud versioone pole arvesse võetud.",
     	"mediastatistics-nbytes": "{{PLURAL:$1|$1 bait|$1 baiti}} ($2; $3%)",
    -	"mediastatistics-bytespertype": "Failide kogusuurus selles alaosas: $1 baiti.",
    -	"mediastatistics-allbytes": "Kõigi failide kogusuurus: $1 baiti.",
    +	"mediastatistics-bytespertype": "Failide kogusuurus selles alaosas: $1 {{PLURAL:$1|bait|baiti}} ($2; $3%).",
    +	"mediastatistics-allbytes": "Kõigi failide kogusuurus: $1 {{PLURAL:$1|bait|baiti}} ($2).",
     	"mediastatistics-table-mimetype": "MIME tüüp",
     	"mediastatistics-table-extensions": "Võimalikud laiendid",
     	"mediastatistics-table-count": "Failide arv",
    @@ -3495,6 +3500,5 @@
     	"mw-widgets-dateinput-placeholder-month": "AAAA-KK",
     	"mw-widgets-titleinput-description-new-page": "lehekülge pole veel",
     	"mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
    -	"api-error-blacklisted": "Palun vali muu pealkiri, mis on kirjeldav.",
     	"randomrootpage": "Juhuslik juurlehekülg"
     }
    diff --git a/languages/i18n/fa.json b/languages/i18n/fa.json
    index 05107198a2..ddd603e7c6 100644
    --- a/languages/i18n/fa.json
    +++ b/languages/i18n/fa.json
    @@ -53,7 +53,10 @@
     			"Ms96",
     			"Freshman404",
     			"Hamisun",
    -			"Matma Rex"
    +			"Matma Rex",
    +			"4nn1l2",
    +			"Namo",
    +			"Alifakoor"
     		]
     	},
     	"tog-underline": "خط کشیدن زیر پیوندها:",
    @@ -80,7 +83,7 @@
     	"tog-enotifusertalkpages": "هنگامی که در صفحهٔ بحث کاربری‌ام تغییری صورت می‌گیرد به من ایمیلی فرستاده شود",
     	"tog-enotifminoredits": "برای تغییرات جزئی در صفحه‌ها و پرونده‌ها هم به من ایمیلی فرستاده شود",
     	"tog-enotifrevealaddr": "نشانی پست الکترونیکی من در ایمیل‌های اطلاع‌رسانی هویدا گردد",
    -	"tog-shownumberswatching": "شمار کاربران پی‌گیرندهٔ نمایش یابد",
    +	"tog-shownumberswatching": "نمایشِ شمار کاربران پی‌گیری کننده",
     	"tog-oldsig": "امضای کنونی:",
     	"tog-fancysig": "امضا به صورت ویکی‌متن در نظر گرفته شود (بدون درج خودکار پیوند)",
     	"tog-uselivepreview": "استفاده از پیش‌نمایش زنده",
    @@ -98,7 +101,7 @@
     	"tog-showhiddencats": "نمایش رده‌های پنهان",
     	"tog-norollbackdiff": "بعد از واگردانی، تفاوت نشان داده نشود",
     	"tog-useeditwarning": "زمان خروج از صفحهٔ ویرایش در صورت داشتن ویرایش‌های‌ ذخیره‌نشده به من هشدار داده شود",
    -	"tog-prefershttps": "در حالت ورود به سامانه همواره از اتصال امن استفاده شود",
    +	"tog-prefershttps": "هنگامی که به سامانه وارد شده‌ام، همواره از اتصال امن استفاده شود",
     	"underline-always": "همیشه",
     	"underline-never": "هرگز",
     	"underline-default": "پیش‌فرض پوسته یا مرورگر",
    @@ -453,6 +456,7 @@
     	"password-change-forbidden": "شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید.",
     	"externaldberror": "خطایی در ارتباط با پایگاه داده رخ داده است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
     	"login": "ورود به سامانه",
    +	"login-security": "هویتتان را تائید کنید",
     	"nav-login-createaccount": "ورود به سامانه / ایجاد حساب کاربری",
     	"userlogin": "ورود به سامانه / ایجاد حساب کاربری",
     	"userloginnocreate": "ورود به سامانه",
    @@ -470,18 +474,23 @@
     	"userlogin-resetpassword-link": "گذرواژه‌تان را فراموش کردید؟",
     	"userlogin-helplink2": "کمک با ورود",
     	"userlogin-loggedin": "شما در حال حاضر به عنوان {{GENDER:$1|$1}} وارد شده‌اید.\nاز فرم پایین برای ورود به عنوان یک کاربر دیگر استفاده کنید.",
    +	"userlogin-reauth": "برای تأييد اینکه شما خود $1 هستيد، نیاز است دوباره وارد شويد.",
     	"userlogin-createanother": "ایجاد یک حساب کاربری دیگر",
     	"createacct-emailrequired": "نشانی ایمیل",
     	"createacct-emailoptional": "نشانی ایمیل (اختیاری)",
     	"createacct-email-ph": "نشانی ایمیل خود را وارد کنید",
     	"createacct-another-email-ph": "آدرس ایمیل را وارد کنید",
     	"createaccountmail": "استفاده از رمز عبور موقت تصادفی و ارسال آن به آدرس ایمیل مشخص شده",
    +	"createaccountmail-help": "جهت ايجاد حساب برای شخص ديگری بدون دانستن گذرواژهٔ آن کاربرد دارد.",
     	"createacct-realname": "نام واقعی (اختیاری)",
     	"createaccountreason": "دلیل:",
     	"createacct-reason": "دلیل",
     	"createacct-reason-ph": "چرا شما حساب دیگری می‌سازید؟",
    +	"createacct-reason-help": "پیامی که در سياههٔ ایجاد حساب نمایش داده می‌شود",
     	"createacct-submit": "حسابتان را بسازید",
     	"createacct-another-submit": "ایجاد حساب کاربری",
    +	"createacct-continue-submit": "ادامهٔ ايجاد حساب",
    +	"createacct-another-continue-submit": "ادامهٔ ايجاد حساب",
     	"createacct-benefit-heading": "{{SITENAME}} توسط افرادی مانند شما ساخته شده است",
     	"createacct-benefit-body1": "{{PLURAL:$1|ویرایش}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|صفحه}}",
    @@ -495,6 +504,7 @@
     	"nocookiesnew": "حساب کاربری ایجاد شد، اما شما وارد سامانه نشدید.\n{{SITENAME}} برای ورود کاربران به سامانه از کوکی استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید، و سپس با نام کاربری و گذرواژهٔ جدیدتان به سامانه وارد شوید.",
     	"nocookieslogin": "{{SITENAME}} برای ورود کاربران به سامانه از کوکی‌ها استفاده می‌کند.\nشما کوکی‌ها را از کار انداخته‌اید.\nلطفاً کوکی‌ها را به کار بیندازید و دوباره امتحان کنید.",
     	"nocookiesfornew": "حساب کاربری ساخته نشد، زیرا نتوانستیم منبع آن را تأیید کنیم.\nمطمئن شوید که کوکی‌ها فعال هستند، آن‌گاه صفحه را از نو بارگیری کنید و دوباره امتحان کنید.",
    +	"createacct-loginerror": "حساب با موفقيت ايجاد شد، ليکن امکان ورود خودکار شما وجود ندارد. لطفاً با [[Special:UserLogin|manual login]] ادامه دهيد.",
     	"noname": "شما نام کاربری معتبری مشخص نکرده‌اید.",
     	"loginsuccesstitle": "ورود به سامانه",
     	"loginsuccess": "'''شما اکنون با نام «$1» به {{SITENAME}} وارد شده‌اید.'''",
    @@ -539,6 +549,7 @@
     	"createacct-another-realname-tip": "نام واقعی اختیاری است.\nاگر آن را وارد کنید هنگام ارجاع به آثارتان و انتساب آن‌ها به شما از نام واقعی‌تان استفاده خواهد شد.",
     	"pt-login": "ورود",
     	"pt-login-button": "ورود به سامانه",
    +	"pt-login-continue-button": "ادامه دادن ورود به سامانه",
     	"pt-createaccount": "ایجاد حساب کاربری",
     	"pt-userlogout": "خروج",
     	"php-mail-error-unknown": "خطای ناشناخته در تابع  mail()‎ پی‌اچ‌پی",
    @@ -586,6 +597,7 @@
     	"botpasswords-invalid-name": "نام کاربری مشخص شده دارای جداکنندهٔ گذرواژهٔ رباتی نیست (\"$1\").",
     	"botpasswords-not-exist": "کاربر «$1» گذرواژهٔ رباتی نام‌دهی شدهٔ «$2» ندارد.",
     	"resetpass_forbidden": "نمی‌توان گذرواژه‌ها را تغییر داد",
    +	"resetpass_forbidden-reason": "نمی‌توانید گذرواژه‌ها را تغییر داد: $1",
     	"resetpass-no-info": "برای دسترسی مستقیم به این صفحه شما باید به سامانه وارد شده باشید.",
     	"resetpass-submit-loggedin": "تغییر گذرواژه",
     	"resetpass-submit-cancel": "لغو",
    @@ -615,6 +627,13 @@
     	"passwordreset-emailsentusername": "اگر نشانی پست الکترونیکی مرتبطی موجود باشد، یک نامه برای بازنشانی گذرواژه به آن ارسال خواهد شد.",
     	"passwordreset-emailsent-capture": "یک ایمیل بازنشانی که در پایین نمایش داده شده، فرستاده شده است.",
     	"passwordreset-emailerror-capture": "ایمیل بازنشانی، که در زیر نمایش داده شده، ایجاد شد، ولی ارسال آن به {{GENDER:$2|کاربر}} موفقیت‌آمیز نبود: $1",
    +	"passwordreset-emailsent-capture2": "{{PLURAL:$1|نامهٔ|نامهٔ}} بازنشانی گذرواژه ارسال شد. در زير $1 نام کاربری و گذرواژه در حال نمایش است.",
    +	"passwordreset-emailerror-capture2": "ارسال ناموفق نامه به $2: $1\nدر زير $3 نام کاربری و گذرواژه در حال نمایش است",
    +	"passwordreset-nocaller": "فراخواننده می‌بايست مشخص شده باشد",
    +	"passwordreset-nosuchcaller": "اين فراخواننده وجود ندارد:$1",
    +	"passwordreset-ignored": "به بازنشانی گذرواژه پرداخته نشد. آیا ممکن است که هيچ مهياکننده‌ای برای این کار تنظيم نشده باشد؟",
    +	"passwordreset-invalideamil": "آدرس ایمیل نامعتبر",
    +	"passwordreset-nodata": "یک نام کاربری و یا یک آدرس ايميل، هيچکدام ارائه نشده",
     	"changeemail": "تغییر یا حذف نشانی ایمیل",
     	"changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
     	"changeemail-passwordrequired": "برای تائید این تغییر باید گذرواژه‌تان را وارد کنید.",
    @@ -658,7 +677,9 @@
     	"minoredit": "این ویرایش، جزئی است",
     	"watchthis": "پی‌گیری این صفحه",
     	"savearticle": "صفحه ذخیره شود",
    +	"savechanges": "ذخیرهٔ تغییرات",
     	"publishpage": "انتشار صفحه",
    +	"publishchanges": "انتشار تغییرات",
     	"preview": "پیش‌نمایش",
     	"showpreview": "پیش‌نمایش",
     	"showdiff": "نمایش تغییرات",
    @@ -687,14 +708,14 @@
     	"accmailtext": "یک گذرواژهٔ تصادفی برای [[User talk:$1|$1]] به $2 فرستاده شد. می‌توان آن را از صفحهٔ ''[[Special:ChangePassword|تغییر گذرواژه]]'' که هنگام ثبت ورود نمایش می‌یابد تغییر داد.",
     	"newarticle": "(تازه)",
     	"newarticletext": "شما پیوندی را دنبال کرده‌اید و به صفحه‌ای رسیده‌اید که هنوز وجود ندارد.\nبرای ایجاد صفحه، در مستطیل زیر شروع به نوشتن کنید (برای اطلاعات بیشتر به [$1 صفحهٔ راهنما] مراجعه کنید).\nاگر به اشتباه اینجا آمده‌اید، دکمهٔ «بازگشت» مرورگرتان را بزنید.",
    -	"anontalkpagetext": "----''این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمی‌کند.\nبنا بر این برای شناسایی‌اش مجبوریم از نشانی آی‌پی عددی استفاده کنیم.\nچنین نشانی‌های آی‌پی ممکن است توسط چندین کاربر به شکل مشترک استفاده شود.\nاگر شما کاربر گمنامی هستید و تصور می‌کنید اظهار نظرات نامربوط به شما صورت گرفته است، لطفاً برای پیشگیری از اشتباه گرفته شدن با کاربران گمنام دیگر در آینده [[Special:CreateAccount|حسابی ایجاد کنید]] یا [[Special:UserLogin|به سامانه وارد شوید]].''",
    +	"anontalkpagetext": "----<em>این صفحهٔ بحث برای کاربر گمنامی است که هنوز حسابی درست نکرده است یا از آن استفاده نمی‌کند.\nبنا بر این برای شناسایی‌اش مجبوریم از نشانی آی‌پی عددی استفاده کنیم.</em>\nچنین نشانی‌های آی‌پی ممکن است توسط چندین کاربر به شکل مشترک استفاده شود.\nاگر شما کاربر گمنامی هستید و تصور می‌کنید اظهار نظرات نامربوط به شما صورت گرفته است، لطفاً برای پیشگیری از اشتباه گرفته شدن با کاربران گمنام دیگر در آینده [[Special:CreateAccount|حسابی ایجاد کنید]] یا [[Special:UserLogin|به سامانه وارد شوید]].",
     	"noarticletext": "این صفحه هم‌اکنون دارای هیچ متنی نیست.\nشما می‌توانید در صفحه‌های دیگر [[Special:Search/{{PAGENAME}}|عنوان این صفحه را جستجو کنید]]،\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را جستجو کنید]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} این صفحه را ایجاد کنید]</span>.",
     	"noarticletext-nopermission": "این صفحه هم‌اکنون متنی ندارد.\nشما می‌توانید در دیگر صفحات [[Special:Search/{{PAGENAME}}|این عنوان را جستجو کنید]]،\nیا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} سیاهه‌های مرتبط را بگردید]</span> ولی شما اجازه ایجاد این صفحه را ندارید.",
     	"missing-revision": "ویرایش #$1 از صفحهٔ «{{FULLPAGENAME}}» موجود نیست.\n\nمعمولاً در اثر پیوند به تاریخچهٔ به‌روز نشدهٔ صفحهٔ حذف شده است.\nمی‌توانید جزئیات بیشتر را در [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} سیاههٔ حذف] بیابید.",
     	"userpage-userdoesnotexist": "حساب کاربر «<nowiki>$1</nowiki>» ثبت نشده‌است.\nلطفاً مطمئن شوید که می‌خواهید این صفحه را ایجاد یا ویرایش کنید.",
     	"userpage-userdoesnotexist-view": "حساب کاربری «$1» ثبت نشده‌است.",
     	"blocked-notice-logextract": "دسترسی این کاربر در حال حاضر بسته است.\nآخرین مورد سیاهه قطع دسترسی در زیر آمده‌است:",
    -	"clearyourcache": "<strong>نکته:</strong> پس از ذخیره کردن ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.\n*<strong>فایرفاکس / سافاری:</strong> کلید <em>Shift</em> را نگه دارید و روی دکمهٔ <em>Reload</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> یا <em>Ctrl-R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-R</em>)\n*<strong>گوگل کروم:</strong> کلیدهای <em>Ctrl+Shift+R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-Shift-R</em>)\n*<strong>اینترنت اکسپلورر:</strong> کلید <em>Ctrl</em> را نگه‌دارید و روی دکمهٔ <em>Refresh</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> را با هم فشار دهید\n*<strong>اپرا:</strong> حافظهٔ نهانی مرورگر را از طریق منوی <em>Tools &rarr; Preferences</em> پاک کنید",
    +	"clearyourcache": "<strong>نکته:</strong> پس از ذخیره کردن ممکن است برای دیدن تغییرات نیاز باشد که حافظهٔ نهانی مرورگر خود را پاک کنید.\n*<strong>فایرفاکس / سافاری:</strong> کلید <em>Shift</em> را نگه دارید و روی دکمهٔ <em>Reload</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> یا <em>Ctrl-R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-R</em>)\n*<strong>گوگل کروم:</strong> کلیدهای <em>Ctrl+Shift+R</em> را با هم فشار دهید (در رایانه‌های اپل مکینتاش کلید‌های <em>⌘-Shift-R</em>)\n*<strong>اینترنت اکسپلورر:</strong> کلید <em>Ctrl</em> را نگه‌دارید و روی دکمهٔ <em>Refresh</em> کلیک کنید، یا کلید‌های <em>Ctrl-F5</em> را با هم فشار دهید\n*<strong>اپرا:</strong> بروید به <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
     	"usercssyoucanpreview": "'''نکته:''' پیش از ذخیره کردن پرونده سی‌اس‌اس خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
     	"userjsyoucanpreview": "'''نکته:''' پیش از ذخیره کردن پروندهٔ جاوااسکریپت خود، با دکمهٔ '''{{int:showpreview}}''' آن را آزمایش کنید.",
     	"usercsspreview": "'''فراموش مکنید که شما فقط دارید پیش‌نمایش سی‌اس‌اس کاربری‌تان را می‌بینید.'''\n'''این سی‌اس‌اس هنوز ذخیره نشده‌است!'''",
    @@ -1211,7 +1232,7 @@
     	"right-override-export-depth": "برون‌بری صفحه‌ها شامل صفحه‌های پیوند شده تا عمق ۵",
     	"right-sendemail": "ارسال ایمیل به دیگر کاربران",
     	"right-passwordreset": "مشاهدهٔ نامه‌های تنظیم مجدد گذرواژه",
    -	"right-managechangetags": "ایجاد و حذف [[Special:Tags|برچسب‌ها]] از پایگاه داده",
    +	"right-managechangetags": "ایجاد و غیرفعال کردن [[Special:Tags|برچسب‌ها]]",
     	"right-applychangetags": "تائید [[Special:Tags|برچسب]] بر روی تغییرات یک نفر",
     	"right-changetags": "افزودن یا حذف [[Special:Tags|برچسب]] قراردادی بر روی نسخه یا سیاهه ورودی‌ها",
     	"right-deletechangetags": "حذف [[Special:Tags|برچسب‌ها]] از پایگاه داده",
    @@ -1251,8 +1272,8 @@
     	"rightslogtext": "این سیاههٔ تغییرات اختیارات کاربر است.",
     	"action-read": "خواندن این صفحه",
     	"action-edit": "ویرایش این صفحه",
    -	"action-createpage": "ایجاد صفحه",
    -	"action-createtalk": "ایجاد صفحه‌های بحث",
    +	"action-createpage": "ایجاد این صفحه",
    +	"action-createtalk": "ایجاد این صفحه بحث",
     	"action-createaccount": "ایجاد این حساب کاربری",
     	"action-autocreateaccount": "حساب کاربری خارجی به صورت خودکار ساخته شد",
     	"action-history": "مشاهده تاریخچه این صفحه",
    @@ -1362,7 +1383,7 @@
     	"recentchanges-page-added-to-category": "[[:$1]] به رده اضافه شد",
     	"recentchanges-page-added-to-category-bundled": "[[:$1]] به رده افزوده شد، [[Special:WhatLinksHere/$1|این صفحه در صفحه‌های دیگر قرار گرفته است.]]",
     	"recentchanges-page-removed-from-category": "[[:$1]] از رده حذف شد",
    -	"recentchanges-page-removed-from-category-bundled": "[[:$1]] و [[Special:WhatLinksHere/$1|{{PLURAL:$2|یک صفحه|$2 صفحه}}]] دیگر از رده حذف شدند",
    +	"recentchanges-page-removed-from-category-bundled": "[[:$1]] از رده حذف شد، [[Special:WhatLinksHere/$1|این صفحه در صفحه‌های دیگر قرار گرفته است.]]",
     	"autochange-username": "تغییرات خودکار مدیاویکی",
     	"upload": "بارگذاری پرونده",
     	"uploadbtn": "بارگذاری پرونده",
    @@ -1469,6 +1490,8 @@
     	"upload-http-error": "یک خطای اچ‌تی‌تی‌پی رخ داد: $1",
     	"upload-copy-upload-invalid-domain": "بارگذاری کپی پرونده‌ها از این دامنه امکان‌پذیر نیست.",
     	"upload-foreign-cant-upload": "این ویکی برای بارگذاری پرونده ها در مخزن پرونده های خارجی درخواست شده پیکربندی نشده است.",
    +	"upload-foreign-cant-load-config": "خواندن تنظيمات مربوط به بارگذاری پرونده در مخزن خارجی با شکست مواجه شد",
    +	"upload-dialog-disabled": "در اين ويکی، بارگذاری پرونده‌هااز طريق اين رابط کاربری غير فعال است",
     	"upload-dialog-title": "بارگذاری پرونده",
     	"upload-dialog-button-cancel": "لغو",
     	"upload-dialog-button-done": "انجام شد",
    @@ -1908,6 +1931,8 @@
     	"trackingcategories-msg": "ردهٔ ردیابی",
     	"trackingcategories-name": "نام پیام",
     	"trackingcategories-desc": "معیارهای گنجایش رده",
    +	"restricted-displaytitle-ignored": "صفحه‌ها باعنوان نمایشی نادیده‌گرفته‌شده",
    +	"restricted-displaytitle-ignored-desc": "دراين صفحه <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> بی‌اهميت تلقی گرديده‌است، چراکه با عنوان اصلی صفحه یکي نيست.",
     	"noindex-category-desc": "این صفحه توسط ربات‌ها فهرست‌نشده‌است به این دلیل که واژه جادویی <code><nowiki>__NOINDEX__</nowiki></code> در آن یا در فضای که پرچم مجاز است دارد.",
     	"index-category-desc": "این صفحه <code><nowiki>__INDEX__</nowiki></code> درونش دارد (و در فضای نامی است که پرچم مجاز است)، و به این دلیل توسط ربات مجاز است که به‌صورت عادی نباید می‌شد.",
     	"post-expand-template-inclusion-category-desc": "پس از گسترش همهٔ الگوها، حجم صفحه بزرگتر از <code>$wgMaxArticleSize</code> است بنابراین بعضی از الگو گسترش نیافته‌اند.",
    @@ -2032,6 +2057,7 @@
     	"rollbacklinkcount": "واگردانی $1 ویرایش",
     	"rollbacklinkcount-morethan": "واگردانی بیش از $1 ویرایش",
     	"rollbackfailed": "واگردانی نشد",
    +	"rollback-missingparam": "فقدان پارامترهای ضروری در درخواست",
     	"cantrollback": "نمی‌توان ویرایش را واگرداند؛\nآخرین مشارکت‌کننده تنها مؤلف این مقاله است.",
     	"alreadyrolled": "واگردانی آخرین ویرایش [[:$1]] توسط [[User:$2|$2]] ([[User talk:$2|بحث]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ممکن نیست؛\nپیش از این شخص دیگری مقاله را ویرایش یا واگردانی کرده‌است.\n\nآخرین ویرایش توسط [[User:$3|$3]] ([[User talk:$3|بحث]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) انجام شده‌است.",
     	"editcomment": "خلاصهٔ ویرایش این بود:  <em>«$1»</em>.",
    @@ -2051,6 +2077,8 @@
     	"changecontentmodel-success-text": "نوع محتوی [[:$1]]  تغییر یافت",
     	"changecontentmodel-cannot-convert": "محتوی در [[:$1]] نمی‌تواند به گونه‌ای از $2 تبدیل شود.",
     	"changecontentmodel-nodirectediting": "نمونه محتوی $1 امکان ویرایش مستقیم را پشتیبانی نمی‌کند",
    +	"changecontentmodel-emptymodels-title": "هيچ مدل محتوایی در دسترس نيست",
    +	"changecontentmodel-emptymodels-text": "محتوای موجود در [[:$1]] به هيچ نوعی نمی‌تواند تبديل شود.",
     	"log-name-contentmodel": "سیاهه تغییر نمونه محتوی",
     	"log-description-contentmodel": "رویدادهای مرتبط با نمونه محتوی‌های یک صفحه",
     	"logentry-contentmodel-new": "صفحهٔ $3 با استفاده از مدل‌های محتوایی غیر پیش‌فرض «$5» توسط $1 {{GENDER:$2|ساخته شد}}",
    @@ -2184,6 +2212,7 @@
     	"sp-contributions-username": "نشانی آی‌پی یا نام کاربری:",
     	"sp-contributions-toponly": "فقط ویرایش‌هایی که آخرین نسخه‌اند نمایش داده شود",
     	"sp-contributions-newonly": "فقط نمایش ویرایش‌هایی که ایجاد صفحه هستند",
    +	"sp-contributions-hideminor": "پنهان کردن ویرایش‌های جزئی",
     	"sp-contributions-submit": "جستجو",
     	"whatlinkshere": "پیوندها به این صفحه",
     	"whatlinkshere-title": "صفحه‌هایی که به «$1» پیوند دارند",
    @@ -2197,10 +2226,10 @@
     	"whatlinkshere-prev": "{{PLURAL:$1|قبلی|$1 مورد قبلی}}",
     	"whatlinkshere-next": "{{PLURAL:$1|بعدی|$1 مورد بعدی}}",
     	"whatlinkshere-links": "→ پیوندها",
    -	"whatlinkshere-hideredirs": "$1 تغییرمسیر",
    -	"whatlinkshere-hidetrans": "$1 تراگنجانش‌ها",
    +	"whatlinkshere-hideredirs": "$1 تغییر مسیر",
    +	"whatlinkshere-hidetrans": "$1 تراگنجانش",
     	"whatlinkshere-hidelinks": "$1 پیوند",
    -	"whatlinkshere-hideimages": "$1 پیوندهای پرونده",
    +	"whatlinkshere-hideimages": "$1 پیوند پرونده",
     	"whatlinkshere-filters": "پالایه‌ها",
     	"whatlinkshere-submit": "برو",
     	"autoblockid": "شناسه قطع دسترسی خودکار #$1",
    @@ -3073,6 +3102,8 @@
     	"invalidateemail": "لغو تأیید نشانی ایمیل",
     	"notificationemail_subject_changed": "نشانی ایمیل ثبت شدهٔ {{SITENAME}} تغییر یافته است",
     	"notificationemail_subject_removed": "نشانی ایمیل ثبت شدهٔ {{SITENAME}} حذف شده است",
    +	"notificationemail_body_changed": "کسی، شايد خود شما، از آدرس اينترنتی $1، آدرس ايميل حساب $2 در {{SITENAME}} را به $3 تغيير داده است.\n\nاگر آن شخص شما نبوده‌ايد، فوراً با یک مدير سایت تماس بگيريد.",
    +	"notificationemail_body_removed": "کسی، شايد خود شما، از آدرس اينترنتی $1، آدرس ايميل حساب $2 در {{SITENAME}} را حذف کرده است.\n\nاگر آن شخص شما نبوده‌ايد، فوراً با یک مدير سایت تماس بگيريد.",
     	"scarytranscludedisabled": "[تراگنجانش بین‌ویکیانه فعال نیست]",
     	"scarytranscludefailed": "[فراخوانی الگو برای $1 میسر نشد]",
     	"scarytranscludefailed-httpstatus": "[فراخوانی الگو برای $1 میسر نشد: خطای اچ‌تی‌تی‌پی $2]",
    @@ -3203,6 +3234,7 @@
     	"timezone-local": "محلی",
     	"duplicate-defaultsort": "هشدار: ترتیب پیش‌فرض «$2» ترتیب پیش‌فرض قبلی «$1» را باطل می‌کند.",
     	"duplicate-displaytitle": "<strong>هشدار:</strong> نمایش عنوان \" $2 \"باعث ابطال پیش نمایش عنوان\" $1 \" می‌شود.",
    +	"restricted-displaytitle": "<strong>هشدار:</strong> از آنجايي که عنوان نمایشی «$1» با عنوان اصلی صفحه یکی نبود، مورد اغماز قرار گرفت.",
     	"invalid-indicator-name": "<strong>خطا:</strong>ویژگی های شاخص‌های وضعیت صفحهٔ <code>name</code> نباید خالی باشند.",
     	"version": "نسخه",
     	"version-extensions": "افزونه‌های نصب‌شده",
    @@ -3542,6 +3574,7 @@
     	"api-error-nomodule": "خطای داخلی: پودمان بارگذاری تنظیم نشده‌است.",
     	"api-error-ok-but-empty": "خطای داخلی : پاسخی از سرور دریافت نشد.",
     	"api-error-overwrite": "جای نوشتن یک پرونده موجود مجاز نیست.",
    +	"api-error-ratelimited": "شما سعی داريد، در بازه زمانی کوتاهی، بيشتر از تعدادی که اين ويکی اجازه داده‌است پرونده بارگذاری کنيد.\nلطفاً چند دقيقه بعد مجدداً تلاش نماييد.",
     	"api-error-stashfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
     	"api-error-publishfailed": "خطای داخلی: کارساز نمی‌تواند پرونده موقت را ذخیره کند.",
     	"api-error-stasherror": "هنگام انتقال پوشه برای ذخیره خطایی بود.",
    @@ -3560,6 +3593,7 @@
     	"api-error-unknownerror": "خطای ناشناخته: «$1».",
     	"api-error-uploaddisabled": "بارگذاری در این ویکی غیرفعال است.",
     	"api-error-verification-error": "ممکن است پرونده آسیب دیده باشد، یا دارای پسوند نادرست باشد.",
    +	"api-error-was-deleted": "پرونده‌ای با همين نام قبلاً بارگذاری و متعاقباً حذف شده است.",
     	"duration-seconds": "$1 ثانیه",
     	"duration-minutes": "$1 دقیقه",
     	"duration-hours": "$1 ساعت",
    @@ -3671,7 +3705,6 @@
     	"mw-widgets-dateinput-no-date": "هیچ داده‌ای انتخاب نشده",
     	"mw-widgets-titleinput-description-new-page": "این صفحه هنوز وجود ندارد",
     	"mw-widgets-titleinput-description-redirect": "تغییر مسیر به $1",
    -	"api-error-blacklisted": "لطفاً یک عنوان توصیفی متفاوت انتخاب کنید.",
     	"sessionmanager-tie": "نمی‌توان چندین نوع درخواست هویت‌سنجی را ترکیب کرد: $1.",
     	"sessionprovider-generic": "$1 فصل",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "فصل‌های کوکی‌محور",
    @@ -3700,6 +3733,7 @@
     	"log-action-filter-delete-event": "حذف سیاهه",
     	"log-action-filter-delete-revision": "حذف ویرایش",
     	"log-action-filter-import-interwiki": "ورودی ترانسویکی",
    +	"log-action-filter-import-upload": "درون‌ریزی به کمک بارگذاری XML",
     	"log-action-filter-managetags-create": "ایجاد تگ",
     	"log-action-filter-managetags-delete": "حذف کردن تگ",
     	"log-action-filter-managetags-activate": "فعالسازی تگ",
    @@ -3724,5 +3758,77 @@
     	"log-action-filter-suppress-block": "مخفی‌سازی کاربر با بستن",
     	"log-action-filter-suppress-reblock": "مخفی‌سازی کاربر با بستن مجدد",
     	"log-action-filter-upload-upload": "بارگذاری جدید",
    -	"log-action-filter-upload-overwrite": "بارگذاری دوباره"
    +	"log-action-filter-upload-overwrite": "بارگذاری دوباره",
    +	"authmanager-authn-not-in-progress": "ارزیابی ورود در جريان نيست یا اطلاعات جلسه کاری از بين رفته است. لطفاً دوباره از ابتدا شروع کنيد.",
    +	"authmanager-authn-no-primary": "اعتبارسنجی اطلاعات ارائه شده جهت ورود ميسر نيست",
    +	"authmanager-authn-no-local-user": "اطلاعات ورود ارائه شده با هيچ کاربری در اين ويکی مرتبط نيست",
    +	"authmanager-authn-no-local-user-link": "اطلاعات اعتبارسنجی ارائه شده معتبرند، ليکن با هيچ کاربری در اين ويکی مرتبط نشده‌اند. از طريق ديگری وارد شويد و یا یک حساب جديد بسازيد. شما امکان اتصال اطلاعات اعتبار‌سنجی قبلی را با آن حساب خواهيد داشت.",
    +	"authmanager-authn-autocreate-failed": "ايجاد خودکار یک حساب بومی با شکست مواجه شد:$1",
    +	"authmanager-change-not-supported": "تغییر پشتیبانی از اعتبارنامه امکان‌پذیر نیست، در صورتی که هیچ چیز از آنها استفاده نمی‌کند.",
    +	"authmanager-create-disabled": "قابلیت ایجاد حساب غیرفعال است",
    +	"authmanager-create-from-login": "برای ايجاد حساب، قسمت‌های زير را تکميل کنيد.",
    +	"authmanager-create-not-in-progress": "ايجاد حساب در جريان نيست یا اطلاعات جلسه کاری از بين رفته است. لطفاً دوباره از ابتدا شروع کنيد.",
    +	"authmanager-create-no-primary": "اطلاعات اعتبارسنجی ارائه شده نمی‌تواند جهت ايجاد حساب بکار رود.",
    +	"authmanager-link-no-primary": "اطلاعات اعتبارسنجی ارائه شده نمی‌تواند جهت مرتبط کردن حساب بکار رود.",
    +	"authmanager-link-not-in-progress": "مرتبط کردن حساب در جريان نيست یا اطلاعات جلسه کاری از بين رفته است. لطفاً دوباره از ابتدا شروع کنيد.",
    +	"authmanager-authplugin-setpass-failed-title": "تغییر گذرواژه ناموفق بود",
    +	"authmanager-authplugin-setpass-failed-message": "افزونهٔ اعتبارسنجی، تغيير گذزواژه را مردود دانست",
    +	"authmanager-authplugin-create-fail": "افزونهٔ اعتبارسنجی، ايجاد حساب را مردود دانست",
    +	"authmanager-authplugin-setpass-denied": "افزونهٔ اعتبارسنجی اجازهٔ تغيير گذرواژه را نمی‌دهد",
    +	"authmanager-authplugin-setpass-bad-domain": "دامنه نامعتبر است.",
    +	"authmanager-autocreate-noperm": "ایجاد حساب خودکار مجاز نیست.",
    +	"authmanager-autocreate-exception": "ایجاد حساب کاربری به خاطر خطاهای قبلی به طور موقت غیرفعال است.",
    +	"authmanager-userdoesnotexist": "حساب کاربری «$1» ثبت نشده‌است.",
    +	"authmanager-userlogin-remembermypassword-help": "اينکه گذرواژه می‌بایست به مدتی بيش از طول جلسه به خاطر سپرده شود",
    +	"authmanager-username-help": "نام کاربری جهت ورود",
    +	"authmanager-password-help": "گذرواژه جهت ورود",
    +	"authmanager-domain-help": "دامنه برای احراز هویت خارجی.",
    +	"authmanager-retype-help": "تکراد مجدد گذرواژه جهت تأييد",
    +	"authmanager-email-label": "ایمیل",
    +	"authmanager-email-help": "آدرس ایمیل",
    +	"authmanager-realname-label": "نام واقعی",
    +	"authmanager-realname-help": "نام واقعی کاربر",
    +	"authmanager-provider-password": "احراز هويت بر پايهٔ گذرواژه",
    +	"authmanager-provider-password-domain": "احراز هويت بر پايهٔ دامنه و گذرواژه",
    +	"authmanager-provider-temporarypassword": "گذرواژهٔ موقت",
    +	"authprovider-confirmlink-message": "طبق تلاش‌های اخير شما جهت ورود، حسابهای زير می‌توتنند با حساب ويکی شما پيوند بخورند. پيوند آنها شما را قادر می‌سازد تا از طریق آنها به سامانه وارد شويد. لطفاً انتخاب کنيد که کداميک از آنها می‌بايست پيوند داده شوند.",
    +	"authprovider-confirmlink-request-label": "حساب‌هایي که می‌بایست پيوند داده شوند",
    +	"authprovider-confirmlink-success-line": "$1 با موفقيت پيوند خورد.",
    +	"authprovider-confirmlink-failed": "پيوند حسابها به طور کامل انجام نشد:$1",
    +	"authprovider-confirmlink-ok-help": "پس از نمايش پيامهای عدم موفقيت پيوند زدن همچنان ادامه بده.",
    +	"authprovider-resetpass-skip-label": "رها کردن",
    +	"authprovider-resetpass-skip-help": "از خير تغيير گذرواژه بگذر",
    +	"authform-nosession-login": "احراز هويت موفقيت‌آميز بود، ليکن مرورگرشما نمی‌تواند وارد شدن شما را «به خاطر بسپارد».\n\n$1",
    +	"authform-nosession-signup": "حساب کاربری ساخته شد، ليکن مرورگرشما نمی‌تواند وارد شدن شما را «به خاطر بسپارد».\n\n$1",
    +	"authform-newtoken": "فقدان توکن.$1",
    +	"authform-notoken": "فقدان توکن.",
    +	"authform-wrongtoken": "توکن اشتباه",
    +	"specialpage-securitylevel-not-allowed-title": "مجاز نیست",
    +	"specialpage-securitylevel-not-allowed": "با عرض پوزش، شما مجاز به استفاده از اين صفحه نمی‌باشيد، چراکه هويت شما را نمی‌توان تأييد کرد.",
    +	"authpage-cannot-login": "نمی‌توان ورود را آغاز نمود",
    +	"authpage-cannot-login-continue": "نمی‌توان به ورود ادامه داد. زمان جلسه کاری شما احتمالاً به سر آمده است.",
    +	"authpage-cannot-create": "نمی‌توان ايجاد حساب را آغاز نمود.",
    +	"authpage-cannot-create-continue": "نمی‌توان به ايجاد حساب ادامه داد. زمان جلسه کاری شما احتمالاً به سر آمده است.",
    +	"authpage-cannot-link": "نمی‌توان پيوند دادن حساب را آغاز نمود.",
    +	"authpage-cannot-link-continue": "نمی‌توان به پيوند دادن حساب ادامه داد. زمان جلسه کاری شما احتمالاً به سر آمده‌است.",
    +	"cannotauth-not-allowed-title": "اجازه داده نشد",
    +	"cannotauth-not-allowed": "شما برای دسترسی به این صفحه مجاز نیستید",
    +	"changecredentials": "تغییر اعتبارنامه‌ها",
    +	"changecredentials-submit": "تغییر اعتبارنامه‌ها",
    +	"changecredentials-invalidsubpage": "$1 به دلیل نوع اعتبارنامه نادرست قابل پذیرش نیست.",
    +	"changecredentials-success": "اعتبارنامه شما تغییر یافت.",
    +	"removecredentials": "حذف اعتبارنامه‌ها",
    +	"removecredentials-submit": "حذف اعتبارنامه‌ها",
    +	"removecredentials-invalidsubpage": "$1 به دلیل نوع اعتبارنامه نادرست قابل پذیرش نیست.",
    +	"removecredentials-success": "اعتبارنامهٔ شما حذف شد.",
    +	"credentialsform-provider": "نوع اعتبارنامه:",
    +	"credentialsform-account": "نام حساب کاربری:",
    +	"cannotlink-no-provider-title": "حساب کاربری قابل پیوند وجود ندارد",
    +	"cannotlink-no-provider": "حساب کاربری قابل پیوند وجود ندارد.",
    +	"linkaccounts": "پیوند حساب کاربری",
    +	"linkaccounts-success-text": "حساب کاربری پیوند شده‌است.",
    +	"linkaccounts-submit": "پیوند حساب کاربری",
    +	"unlinkaccounts": "حذف پیوند حساب کاربری",
    +	"unlinkaccounts-success": "پیوند کاربری بدون پیوند شد.",
    +	"authenticationdatachange-ignored": "به تغيير اطلاعات احراز هويت پرداخته نشد. آیا ممکن است که هيچ مهيا کننده‌ای برای اين کار تنظيم نشده باشد؟"
     }
    diff --git a/languages/i18n/fi.json b/languages/i18n/fi.json
    index 5663cd26d3..07869da7d0 100644
    --- a/languages/i18n/fi.json
    +++ b/languages/i18n/fi.json
    @@ -448,6 +448,7 @@
     	"password-change-forbidden": "Et voi muuttaa salasanoja tässä wikissä.",
     	"externaldberror": "Tapahtui virhe ulkoisen autentikointitietokannan käytössä tai sinulla ei ole lupaa päivittää tunnustasi.",
     	"login": "Kirjaudu sisään",
    +	"login-security": "Varmista henkilöllisyytesi",
     	"nav-login-createaccount": "Kirjaudu sisään tai luo tunnus",
     	"userlogin": "Kirjaudu sisään tai luo tunnus",
     	"userloginnocreate": "Kirjaudu sisään",
    @@ -465,18 +466,23 @@
     	"userlogin-resetpassword-link": "Unohditko salasanasi?",
     	"userlogin-helplink2": "Apua sisäänkirjautumiseen",
     	"userlogin-loggedin": "Olet jo kirjautunut sisään tunnuksella {{GENDER:$1|$1}}.\nKäytä alla olevaa lomaketta kirjautuaksesi sisään toisena käyttäjänä.",
    +	"userlogin-reauth": "Sinun on kirjauduttava sisään uudelleen varmistaaksesi olevasi {{GENDER:$1|$1}}.",
     	"userlogin-createanother": "Luo toinen käyttäjätunnus",
     	"createacct-emailrequired": "Sähköpostiosoite",
     	"createacct-emailoptional": "Sähköpostiosoite (vapaaehtoinen)",
     	"createacct-email-ph": "Anna sähköpostiosoitteesi",
     	"createacct-another-email-ph": "Lisää sähköpostiosoite",
     	"createaccountmail": "Käytä satunnaista väliaikaissalasanaa ja lähetä se alla olevaan sähköpostiosoitteeseen",
    +	"createaccountmail-help": "Voidaan käyttää luomaan tunnus toiselle käyttäjälle ilman salasanan tietämistä.",
     	"createacct-realname": "Oikea nimi (vapaaehtoinen tieto)",
     	"createaccountreason": "Syy:",
     	"createacct-reason": "Syy",
     	"createacct-reason-ph": "Miksi olet luomassa toista käyttäjätunnusta",
    +	"createacct-reason-help": "Tunnustenluontilokissa näytetty viesti",
     	"createacct-submit": "Luo tunnus",
     	"createacct-another-submit": "Luo käyttäjätunnus",
    +	"createacct-continue-submit": "Jatka tunnuksen luomista",
    +	"createacct-another-continue-submit": "Jatka tunnuksen luomista",
     	"createacct-benefit-heading": "{{SITENAME}} on sinun kaltaistesi ihmisten tekemä.",
     	"createacct-benefit-body1": "{{PLURAL:$1|muokkaus|muokkausta}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|sivu|sivua}}",
    @@ -490,6 +496,7 @@
     	"nocookiesnew": "Käyttäjätunnus on luotu, mutta et ole kirjautunut sisään. \n{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. \nSelaimesi ei salli evästeitä. \nSalli evästeiden käyttö, ja sen jälkeen kirjaudu sisään juuri luomallasi käyttäjätunnuksella ja salasanalla.",
     	"nocookieslogin": "{{SITENAME}} käyttää evästeitä sisäänkirjautumisen yhteydessä. Selaimesi ei salli evästeitä. Ota ne käyttöön, ja yritä uudelleen.",
     	"nocookiesfornew": "Käyttäjätunnusta ei luotu, koska sen lähdettä ei kyetty varmistamaan. Varmista, että selaimessasi on käytössä evästeet, päivitä tämä sivu ja yritä uudelleen.",
    +	"createacct-loginerror": "Tunnus luotiin onnistuneesti, mutta automaattista sisäänkirjautumista ei voitu tehdä. Siirry [[Special:UserLogin|manuaaliseen kirjautumiseen]].",
     	"noname": "Et ole määritellyt kelvollista käyttäjänimeä.",
     	"loginsuccesstitle": "Olet kirjautunut sisään",
     	"loginsuccess": "'''Olet kirjautunut sivustolle {{SITENAME}} käyttäjänä $1.'''",
    @@ -581,6 +588,7 @@
     	"botpasswords-invalid-name": "Annetussa käyttäjätunnuksessa ei ole bottisalasanan erotinta (\"$1\").",
     	"botpasswords-not-exist": "Käyttäjällä \"$1\" ei ole bottisalasanaa nimellä \"$2\".",
     	"resetpass_forbidden": "Salasanoja ei voi vaihtaa.",
    +	"resetpass_forbidden-reason": "Salasanoja ei voi muuttaa: $1",
     	"resetpass-no-info": "Et voi nähdä tätä sivua kirjautumatta sisään.",
     	"resetpass-submit-loggedin": "Muuta salasana",
     	"resetpass-submit-cancel": "Peruuta",
    @@ -610,6 +618,10 @@
     	"passwordreset-emailsentusername": "Jos on olemassa vastaava rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
     	"passwordreset-emailsent-capture": "Salasanan uudistamisesta kertova sähköpostiviesti on lähetetty, ja se näkyy myös alla.",
     	"passwordreset-emailerror-capture": "Allaoleva sähköpostiviesti luotiin, mutta sen lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1",
    +	"passwordreset-emailsent-capture2": "Salasananpalautus{{PLURAL:$1|sähköposti|sähköpostit}} on lähetetty. {{PLURAL:$1|Käyttäjä ja salasana|Luettelo käyttäjistä ja salasanoista}} näytetään alapuolella.",
    +	"passwordreset-emailerror-capture2": "Sähköpostin lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1 {{PLURAL:$3|Käyttäjänimi ja salasana|Luettelo käyttäjänimistä ja salasanoista}} näytetään alla.",
    +	"passwordreset-invalideamil": "Virheellinen sähköpostiosoite",
    +	"passwordreset-nodata": "Käyttäjätunnusta ja salasanaa ei annettu",
     	"changeemail": "Muuta tai poista sähköpostiosoite",
     	"changeemail-header": "Täydennä tämä lomake, jolla voit muuttaa sähköpostiosoitettasi. Jos haluat poistaa sähköpostiosoitteesi kokonaan tunnuksesi yhteydestä, älä kirjoita uudeksi osoitteeksi mitään vaan jätä se tyhjäksi.",
     	"changeemail-passwordrequired": "Sinun on syötettävä salasanasi vahvistaaksesi tämän muutoksen.",
    @@ -653,7 +665,9 @@
     	"minoredit": "Tämä on pieni muutos",
     	"watchthis": "Tarkkaile tätä sivua",
     	"savearticle": "Tallenna sivu",
    +	"savechanges": "Tallenna muutokset",
     	"publishpage": "Julkaise sivu",
    +	"publishchanges": "Julkaise muutokset",
     	"preview": "Esikatselu",
     	"showpreview": "Esikatsele",
     	"showdiff": "Näytä muutokset",
    @@ -689,7 +703,7 @@
     	"userpage-userdoesnotexist": "Käyttäjätunnusta \"$1\" ei ole rekisteröity. \nVarmista, haluatko luoda tämän sivun tai muokata sitä.",
     	"userpage-userdoesnotexist-view": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
     	"blocked-notice-logextract": "Tämä käyttäjä on tällä hetkellä estetty.\nAlla on viimeisin estolokin tapahtuma:",
    -	"clearyourcache": "'''Huomautus:''' Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.\n* '''Firefox ja Safari:''' Napsauta ''Shift''-näppäin pohjassa ''Päivitä'' tai paina ''Ctrl-F5'' tai ''Ctrl-R'' (''⌘-R'' Macilla)\n* '''Google Chrome:''' Paina ''Ctrl-Shift-R'' (''⌘-Shift-R'' Macilla)\n* '''Internet Explorer:''' Napsauta ''Ctrl''-näppäin pohjassa ''Päivitä'' tai paina ''Ctrl-F5''\n* '''Opera:''' Tyhjennä välimuisti: ''Tools→Preferences''",
    +	"clearyourcache": "<strong>Huomautus:</strong> Selaimen välimuisti pitää tyhjentää asetusten tallentamisen jälkeen, jotta muutokset tulisivat voimaan.\n* <strong>Firefox ja Safari:</strong> Napsauta <em>Shift</em>-näppäin pohjassa <em>Päivitä</em>, tai paina <em>Ctrl-F5</em> tai <em>Ctrl-R</em> (<em>⌘-R</em> Macilla)\n* <strong>Google Chrome:</strong> Paina <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> Macilla)\n* <strong>Internet Explorer:</strong> Napsauta <em>Ctrl</em>-näppäin pohjassa <em>Päivitä</em> tai paina <em>Ctrl-F5</em>\n* <strong>Opera:</strong> <em>Menu → Settings</em> (<em>Opera → Preferences</em> Macilla) ja sitten <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
     	"usercssyoucanpreview": "Voit testata uutta CSS:ää ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.",
     	"userjsyoucanpreview": "Voit testata uutta JavaScriptiä ennen tallennusta käyttämällä painiketta ”{{int:showpreview}}”.",
     	"usercsspreview": "'''Tämä on CSS:n esikatselu. Muutoksia ei ole vielä tallennettu.'''",
    @@ -703,7 +717,7 @@
     	"continue-editing": "Siirry muokkauskenttään",
     	"previewconflict": "Tämä esikatselu näyttää miltä muokkausalueella oleva teksti näyttää tallennettuna.",
     	"session_fail_preview": "Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.\n\nSaatat olla kirjautunut ulos. '''Varmista, että olet edelleen kirjautunut sisään ja yritä uudelleen'''. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään, ja varmista, että selaimesi sallii evästeet tältä sivustolta.",
    -	"session_fail_preview_html": "'''Muokkaustasi ei voitu tallentaa, koska istuntosi tiedot ovat kadonneet.'''\n\nEsikatselu on piilotettu varokeinona JavaScript-hyökkäyksiä vastaan – tässä wikissä on HTML-tila päällä.\n\nYritä uudelleen. Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään.",
    +	"session_fail_preview_html": "Valitettavasti muokkaustasi ei voitu käsitellä istunnon tietojen katoamisen vuoksi.\n\n<em>Koska sivustolla {{SITENAME}} on käytössä suodattamaton HTML-koodi, esikatselu on piilotettu JavaScript-hyökkäyksien torjumiseksi</em>\n\n<strong>Jos tämä on oikea muokkausyritys, yritä uudelleen.</strong> Jos ongelma ei katoa, yritä [[Special:UserLogout|kirjautua ulos]] ja takaisin sisään. Tarkista myös, että selaimesi sallii evästeet tältä sivustolta.",
     	"token_suffix_mismatch": "'''Muokkauksesi on hylätty, koska asiakasohjelmasi ei osaa käsitellä välimerkkejä muokkaustarkisteessa. Syynä voi olla viallinen välityspalvelin.'''",
     	"edit_form_incomplete": "'''Osa muokkauslomakkeesta ei saavuttanut palvelinta. Tarkista, että muokkauksesi ovat vahingoittumattomia ja yritä uudelleen.'''",
     	"editing": "Muokataan sivua $1",
    @@ -1098,7 +1112,7 @@
     	"prefs-tabs-navigation-hint": "Vihje: Voit käyttää vasenta ja oikeata nuolinäppäintä liikkumiseen välilehtien välillä.",
     	"userrights": "Käyttöoikeuksien hallinta",
     	"userrights-lookup-user": "Hallinnoi käyttäjän ryhmiä",
    -	"userrights-user-editname": "Käyttäjätunnus",
    +	"userrights-user-editname": "Käyttäjätunnus:",
     	"editusergroup": "Muokkaa {{GENDER:$1|käyttäjän}} ryhmiä",
     	"editinguser": "Muutetaan {{GENDER:$1|käyttäjän}} <strong>[[User:$1|$1]]</strong> $2 oikeuksia",
     	"userrights-editusergroup": "Muuta käyttäjän ryhmiä",
    @@ -1246,8 +1260,8 @@
     	"rightslogtext": "Tämä on loki käyttäjien käyttöoikeuksien muutoksista.",
     	"action-read": "lukea tätä sivua",
     	"action-edit": "muokata tätä sivua",
    -	"action-createpage": "luoda sivuja",
    -	"action-createtalk": "luoda keskustelusivuja",
    +	"action-createpage": "luoda tätä sivua",
    +	"action-createtalk": "luoda tätä keskustelusivua",
     	"action-createaccount": "luoda tätä käyttäjätunnusta",
     	"action-autocreateaccount": "luoda automaattisesti tätä ulkopuolista käyttäjätunnusta",
     	"action-history": "tarkastella tämän sivun historiaa",
    @@ -1901,6 +1915,8 @@
     	"trackingcategories-msg": "Tarkkailuluokka",
     	"trackingcategories-name": "Viestin nimi",
     	"trackingcategories-desc": "Kriteerit luokkaan joutumiselle",
    +	"restricted-displaytitle-ignored": "Sivut, joiden näytettäviä otsikoita ei huomioida",
    +	"restricted-displaytitle-ignored-desc": "Sivulla on <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, jota ei oteta huomioon, koska se ei vastaa sivun oikeaa nimeä.",
     	"noindex-category-desc": "Tätä sivua eivät hakurobotit indeksoi, koska sivulla on taikasana <code><nowiki>__NOINDEX__</nowiki></code> ja koska sivu on sellaisessa nimiavaruudessa, jossa taikasanan käyttö on sallittua.",
     	"index-category-desc": "Tällä sivulla on koodi <code><nowiki>__INDEX__</nowiki></code> ja sivu on sellaisessa nimiavaruudessa, jossa koodin käyttö on sallittua. Tämän vuoksi hakurobotit indeksoivat tämän sivun, vaikka ilman koodia sivua ei indeksoitaisi normaalisti.",
     	"post-expand-template-inclusion-category-desc": "Sivun koko on suurempi kuin <code>$wgMaxArticleSize</code>, kun kaikki mallineet on laajennettu. Tämän vuoksi joitakin mallineita ei laajennettu.",
    @@ -2025,12 +2041,14 @@
     	"rollbacklinkcount": "palauta $1 {{PLURAL:$1|muutos|muutosta}}",
     	"rollbacklinkcount-morethan": "palauta yli $1 {{PLURAL:$1|muutos|muutosta}}",
     	"rollbackfailed": "Palautus epäonnistui",
    +	"rollback-missingparam": "Tarvittavat parametrit puuttuvat pyynnöstä.",
     	"cantrollback": "Aiempaan versioon ei voi palauttaa, koska viimeisin kirjoittaja on sivun ainoa tekijä.",
     	"alreadyrolled": "Käyttäjän [[User:$2|$2]] ([[User talk:$2|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tekemiä muutoksia sivuun [[:$1]] ei voida kumota, koska joku toinen käyttäjä on joko muuttanut sivua tai palauttanut muokkauksen.\n\nViimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     	"editcomment": "Muokkauksen yhteenveto oli: <em>$1</em>.",
     	"revertpage": "Käyttäjän [[Special:Contributions/$2|$2]] ([[User talk:$2|keskustelu]]) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän [[User:$1|$1]] tekemään versioon.",
     	"revertpage-nouser": "Käyttäjän (käyttäjänimi poistettu) muokkaukset kumottiin ja sivu palautettiin viimeisimpään käyttäjän {{GENDER:$1|[[User:$1|$1]]}} tekemään versioon",
     	"rollback-success": "Käyttäjän $1 tekemät muokkaukset kumottiin ja sivu palautettiin käyttäjän $2 versioon.",
    +	"rollback-success-notify": "Kumottiin käyttäjän $1 muokkaukset; palautettiin viimeiseen käyttäjän $2 versioon. [$3 Näytä muutokset]",
     	"sessionfailure-title": "Istuntovirhe",
     	"sessionfailure": "Istuntosi kanssa on ongelma. Muutosta ei toteutettu varotoimena istuntokaappauksien takia. Käytä selaimen paluutoimintoa ja päivitä sivu, jolta tulit, ja yritä uudelleen.",
     	"changecontentmodel": "Muuta sivun sisältömallia",
    @@ -2178,6 +2196,7 @@
     	"sp-contributions-username": "IP-osoite tai käyttäjätunnus:",
     	"sp-contributions-toponly": "Näytä vain muokkaukset, jotka ovat viimeisimpiä versioita",
     	"sp-contributions-newonly": "Näytä vain muokkaukset, joilla on luotu sivu",
    +	"sp-contributions-hideminor": "Piilota pienet muutokset",
     	"sp-contributions-submit": "Hae",
     	"whatlinkshere": "Tänne viittaavat sivut",
     	"whatlinkshere-title": "Sivut, jotka viittaavat sivulle $1",
    @@ -3096,6 +3115,8 @@
     	"confirm-watch-top": "Lisätäänkö tämä sivu tarkkailulistallesi?",
     	"confirm-unwatch-button": "OK",
     	"confirm-unwatch-top": "Poistetaanko tämä sivu tarkkailulistaltasi?",
    +	"confirm-rollback-button": "OK",
    +	"confirm-rollback-top": "Palauta tämän sivun muokkaukset?",
     	"percent": "$1&#160;%",
     	"quotation-marks": "\"$1\"",
     	"imgmultipageprev": "← edellinen sivu",
    @@ -3170,6 +3191,7 @@
     	"timezone-local": "Paikallinen",
     	"duplicate-defaultsort": "'''Varoitus:''' Oletuslajitteluavain ”$2” korvaa aiemman oletuslajitteluavaimen ”$1”.",
     	"duplicate-displaytitle": "<strong>Varoitus:</strong> Näytettävä otsikko \"$2\" päällekirjoittaa edellisen otsikon \"$1\".",
    +	"restricted-displaytitle": "<strong>Varoitus:</strong> Näytettävää otsikkoa \"$1\" ei huomioitu, koska se ei vastaa sivun oikeaa nimeä.",
     	"invalid-indicator-name": "<strong>Virhe:</strong> Sivun tilan osoittimien attribuutti <code>name</code> ei saa olla tyhjä.",
     	"version": "Versio",
     	"version-extensions": "Asennetut laajennukset",
    @@ -3507,6 +3529,7 @@
     	"api-error-nomodule": "Sisäinen virhe: tallennusmoduulia ei ole asetettu.",
     	"api-error-ok-but-empty": "Sisäinen virhe: palvelimelta ei saatu vastausta.",
     	"api-error-overwrite": "Olemassa olevan tiedoston korvaaminen toisella ei ole sallittua.",
    +	"api-error-ratelimited": "Yrität tallentaa lyhyessä ajassa enemmän tiedostoja kuin tämä wiki sallii.\nYritä uudelleen muutaman minuutin kuluttua.",
     	"api-error-stashfailed": "Sisäinen virhe: Väliaikaisen tiedoston tallentaminen epäonnistui.",
     	"api-error-publishfailed": "Sisäinen virhe: Väliaikaisen tiedoston julkaiseminen epäonnistui.",
     	"api-error-stasherror": "Tiedostoa ladattaessa tapahtui virhe.",
    @@ -3639,7 +3662,6 @@
     	"mw-widgets-dateinput-placeholder-month": "VVVV-KK",
     	"mw-widgets-titleinput-description-new-page": "sivua ei ole olemassa vielä",
     	"mw-widgets-titleinput-description-redirect": "ohjaus kohteeseen $1",
    -	"api-error-blacklisted": "Valitse toinen, kuvaava nimi.",
     	"sessionmanager-tie": "!!FYZZ!!Cannot combine multiple request authentication types: $1.",
     	"sessionprovider-generic": "$1 istuntoa",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "istuntoja, joissa on evästeet käytössä",
    @@ -3694,6 +3716,70 @@
     	"log-action-filter-suppress-reblock": "Käyttäjätunnuksen häivyttäminen uudella estolla",
     	"log-action-filter-upload-upload": "Uusi tallennus",
     	"log-action-filter-upload-overwrite": "Päälletallennus",
    +	"authmanager-authn-not-in-progress": "Varmennus ei ole käynnissä tai istunnon tiedot ovat hävinneet. Ole hyvä ja aloita uudelleen alusta.",
    +	"authmanager-authn-no-primary": "Annettua kirjautumistietoja ei pystytty varmentamaan.",
    +	"authmanager-authn-no-local-user": "Annetut kirjautumistiedot eivät kuulu millekään tämän wikin käyttäjistä.",
    +	"authmanager-authn-no-local-user-link": "Annetut kirjautumisiedot ovat kelvolliset, mutta eivät liity mihinkään tämän wikin käyttäjään. Kirjaudu sisään toisella tavalla, tai luo uusi käyttäjä ja sinulla on mahdollisuus linkittää aiemmat kirjautumistietosi tälle käyttäjälle.",
    +	"authmanager-authn-autocreate-failed": "Paikallisen tunnuksen automaattinen luonti epäonnistui: $1",
    +	"authmanager-change-not-supported": "Annettuja kirjautumistietoja ei voida muuttaa, koska mikään ei käyttäisi niitä.",
    +	"authmanager-create-disabled": "Tunnusten luonti ei ole käytössä.",
    +	"authmanager-create-from-login": "Luodaksesi tunnuksen täytä alla olevat kentät.",
    +	"authmanager-create-not-in-progress": "Tunnuksen luonti ei ole käynnissä tai istunnon tiedot ovat hävinneet. Ole hyvä ja aloita uudelleen alusta.",
    +	"authmanager-create-no-primary": "Annettuja kirjautumistietoja ei voitu käyttää tunnuksen luontiin.",
    +	"authmanager-link-no-primary": "Annettuja kirjautumistietoja ei voitu käyttää tunnuksen linkittämiseen.",
    +	"authmanager-link-not-in-progress": "Tunnuksen linkitys ei ole käynnissä tai istunnon tiedot ovat hävinneet. Ole hyvä ja aloita uudelleen alusta.",
    +	"authmanager-authplugin-setpass-failed-title": "Salasanan muuttaminen epäonnistui",
    +	"authmanager-authplugin-setpass-failed-message": "Varmennuslisäosa esti salasanan muuttamisen.",
    +	"authmanager-authplugin-create-fail": "Varmennuslisäosa esti tunnuksen luonnin.",
    +	"authmanager-authplugin-setpass-denied": "Varmennuslisäosa ei salli salasanojen muuttamista.",
    +	"authmanager-authplugin-setpass-bad-domain": "Virheellinen domain.",
    +	"authmanager-autocreate-noperm": "Automaattinen tunnustenluonti ei ole sallittu.",
    +	"authmanager-autocreate-exception": "Automaattinen tunnuksenluonti on tilapäisesti poistettu käytöstä aikaisempien virheiden vuoksi.",
    +	"authmanager-userdoesnotexist": "Käyttäjätunnusta ”$1” ei ole rekisteröity.",
    +	"authmanager-userlogin-remembermypassword-help": "Tulisiko salasana muistaa istunnon kestoa pidempään.",
    +	"authmanager-username-help": "Käyttäjänimi varmentamiseen.",
    +	"authmanager-password-help": "Salasana varmentamiseen.",
    +	"authmanager-retype-help": "Salasana uudelleen vahvistaaksesi.",
    +	"authmanager-email-label": "Sähköposti",
    +	"authmanager-email-help": "Sähköpostiosoite",
    +	"authmanager-realname-label": "Oikea nimi",
    +	"authmanager-realname-help": "Käyttäjän oikea nimi",
    +	"authmanager-provider-password": "Salasanapohjainen varmennus",
     	"authmanager-provider-temporarypassword": "Väliaikainen salasana",
    -	"authprovider-resetpass-skip-label": "Ohita"
    +	"authprovider-confirmlink-message": "Viimeisimpien kirjautumisyritystesi perusteella seuraavat tunnukset voidaan linkittää wikitunnuksellesi. Tunnusten linkittäminen mahdollistaa sisäänkirjautumisen niitä käyttämällä. Valitse tunnukset, jotka tulisi linkittää.",
    +	"authprovider-confirmlink-request-label": "Tunnukset, jotka tulisi yhdistää",
    +	"authprovider-confirmlink-success-line": "$1: Linkitetty onnistuneesti.",
    +	"authprovider-confirmlink-failed": "Tunnuksen linkitys ei onnistunut täysin: $1",
    +	"authprovider-resetpass-skip-label": "Ohita",
    +	"authprovider-resetpass-skip-help": "Ohita salasanan palautus.",
    +	"authform-nosession-login": "Varmennus onnistui, mutta selaimesi ei pysty \"muistamaan\" sisäänkirjautumista.\n\n$1",
    +	"authform-nosession-signup": "Tunnus luotiin, mutta selaimesi ei pysty \"muistamaan\" sisäänkirjautumista.\n\n$1",
    +	"specialpage-securitylevel-not-allowed-title": "Ei sallittu",
    +	"specialpage-securitylevel-not-allowed": "Valitettavasti sinulla ei ole oikeutta muokata tätä sivua, koska henkilöllisyyttäsi ei voitu varmentaa.",
    +	"authpage-cannot-login": "Kirjautumista ei voitu aloittaa.",
    +	"authpage-cannot-login-continue": "Kirjautumista ei voitu jatkaa. Istuntosi todennäköisesti aikakatkaistiin.",
    +	"authpage-cannot-create": "Tunnuksen luontia ei voitu aloittaa.",
    +	"authpage-cannot-create-continue": "Tunnuksen luontia ei voitu jatkaa. Istuntosi todennäköisesti aikakatkaistiin.",
    +	"authpage-cannot-link": "Tunnuksen linkittämistä ei voitu aloittaa.",
    +	"authpage-cannot-link-continue": "Tunnuksen linkittämistä ei voitu jatkaa. Istuntosi todennäköisesti aikakatkaistiin.",
    +	"cannotauth-not-allowed-title": "Pääsy estetty",
    +	"cannotauth-not-allowed": "Sinulla ei ole oikeutta käyttää tätä sivua",
    +	"changecredentials": "Muuta kirjautumistietoja",
    +	"changecredentials-submit": "Muuta kirjautumistietoja",
    +	"changecredentials-invalidsubpage": "$1 ei ole kelvollinen kirjautumistietojen tyyppi",
    +	"changecredentials-success": "Kirjautumistietosi on muutettu.",
    +	"removecredentials": "Poista kirjautumistiedot",
    +	"removecredentials-submit": "Poista kirjautumistiedot",
    +	"removecredentials-invalidsubpage": "$1 ei ole kelvollinen kirjautumistietojen tyyppi.",
    +	"removecredentials-success": "Kirjautumistietosi on poistettu.",
    +	"credentialsform-provider": "Kirjautumistietojen tyyppi:",
    +	"credentialsform-account": "Tunnuksen nimi:",
    +	"cannotlink-no-provider-title": "Linkitettäviä tunnuksia ei ole",
    +	"cannotlink-no-provider": "Linkitettäviä tunnuksia ei ole.",
    +	"linkaccounts": "Linkitä tunnuksia",
    +	"linkaccounts-success-text": "Tunnus linkitettiin.",
    +	"linkaccounts-submit": "Linkitä tunnuksia",
    +	"unlinkaccounts": "Poista tunnusten linkityksiä",
    +	"unlinkaccounts-success": "Tunnuksen linkitys poistettiin.",
    +	"authenticationdatachange-ignored": "Varmennustietojen muutosta ei käsitelty. Ehkä palveluntarjoajaa ei määritelty?"
     }
    diff --git a/languages/i18n/fr.json b/languages/i18n/fr.json
    index d1c02a5a60..9f3ac4f7a7 100644
    --- a/languages/i18n/fr.json
    +++ b/languages/i18n/fr.json
    @@ -189,8 +189,8 @@
     	"tog-diffonly": "Ne pas afficher le contenu des pages sous les diffs",
     	"tog-showhiddencats": "Afficher les catégories cachées",
     	"tog-norollbackdiff": "Ne pas afficher le diff après avoir révoqué",
    -	"tog-useeditwarning": "M’avertir quand je quitte une page de modification sans publier les changements",
    -	"tog-prefershttps": "Conserver une connexion sécurisée une fois connecté(e)",
    +	"tog-useeditwarning": "M’avertir quand je quitte une page en cours de modification sans avoir sauvegardé",
    +	"tog-prefershttps": "Toujours utiliser une connexion sécurisée pour se connecter",
     	"underline-always": "Toujours",
     	"underline-never": "Jamais",
     	"underline-default": "Valeur par défaut du thème ou du navigateur",
    @@ -448,7 +448,7 @@
     	"databaseerror-query": "Requête : $1",
     	"databaseerror-function": "Fonction : $1",
     	"databaseerror-error": "Erreur : $1",
    -	"transaction-duration-limit-exceeded": "Pour éviter une trop forte augmentation du délai de réplication, cette transaction a été annulée car la durée d’écriture ($1) a dépassé la limite de $2 seconde{{PLURAL:$2||s}}. Si vous cherchez à modifier un grand nombre d’éléments simultanément, essayez plutôt d’effectuer l’opération en plusieurs étapes.",
    +	"transaction-duration-limit-exceeded": "Pour éviter une trop forte augmentation du délai de réplication, cette transaction a été annulée car la durée d’écriture ($1) a dépassé la limite de $2 seconde{{PLURAL:$2||s}}. Si vous cherchez à modifier un grand nombre d’éléments simultanément, essayez plutôt d’effectuer l’opération en plusieurs étapes plus petites.",
     	"laggedslavemode": "Attention, cette page peut ne pas contenir les toutes dernières modifications effectuées",
     	"readonly": "Base de données verrouillée",
     	"enterlockreason": "Indiquez la raison du verrouillage ainsi qu’une estimation de sa durée",
    @@ -591,11 +591,11 @@
     	"nocookiesnew": "Le compte utilisateur a été créé, mais vous n’êtes pas connecté{{GENDER:||e|(e)}}.\n{{SITENAME}} utilise des cookies pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
     	"nocookieslogin": "{{SITENAME}} utilise des cookies pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter.",
     	"nocookiesfornew": "Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.\nVérifiez que vous avez activé les cookies, rechargez la page et essayez à nouveau.",
    -	"createacct-loginerror": "Le compte a bien été créé mais vous ne pouvez pas vous connecter automatiquement? Veuillez vous [[Special:UserLogin|connecter manuellement]].",
    +	"createacct-loginerror": "Le compte a bien été créé mais vous ne pouvez pas vous connecter automatiquement. Veuillez vous [[Special:UserLogin|connecter manuellement]].",
     	"noname": "Vous n’avez pas saisi un nom d’utilisateur valide.",
     	"loginsuccesstitle": "Connecté",
     	"loginsuccess": "<strong>Vous êtes maintenant connecté{{GENDER:$1||e|(e)}} à {{SITENAME}} en tant que « $1 ».</strong>",
    -	"nosuchuser": "L’utilisateur « $1 » n’existe pas.\nLes noms d’utilisateurs sont sensibles à la casse.\nVérifiez l’orthographe, ou [[Special:CreateAccount|créez un nouveau compte]].",
    +	"nosuchuser": "L’utilisateur « $1 » n’existe pas.\nLes noms d’utilisateur sont sensibles à la casse.\nVérifiez l’orthographe, ou [[Special:CreateAccount|créez un nouveau compte]].",
     	"nosuchusershort": "Il n’y a pas de contributeur avec le nom « $1 ».\nVeuillez vérifier l’orthographe.",
     	"nouserspecified": "Vous devez saisir un nom d’utilisateur.",
     	"login-userblocked": "Cet utilisateur est bloqué. Connexion non autorisée.",
    @@ -714,7 +714,7 @@
     	"passwordreset-emailsentusername": "S’il y a une adresse de courriel associée à ce nom d’utilisateur, alors un courriel de réinitialisation de mot de passe sera envoyé.",
     	"passwordreset-emailsent-capture": "Un courriel de réinitialisation de mot de passe a été envoyé, qui est affiché ci-dessous.",
     	"passwordreset-emailerror-capture": "Un courriel de réinitialisation de mot de passe a été généré, qui est affiché ci-dessous, mais l'envoi à l'{{GENDER:$2|utilisateur|utilisatrice}} a échoué : $1",
    -	"passwordreset-emailsent-capture2": "The password reset {{PLURAL:$1|Le courriel de réinitialisation du mot de passe a été envoyé|Les courriels de réinitialisation du mot de passe ont été envoyés}}. {{PLURAL:$1|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et mots de passe est affichée}} ci-dessous.",
    +	"passwordreset-emailsent-capture2": "{{PLURAL:$1|Le courriel de réinitialisation du mot de passe a été envoyé|Les courriels de réinitialisation du mot de passe ont été envoyés}}. {{PLURAL:$1|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et mots de passe est affichée}} ci-dessous.",
     	"passwordreset-emailerror-capture2": "L’envoi de courriel à {{GENDER:$2|l’utilisateur|l’utilisatrice}} a échoué : $1 {{PLURAL:$3|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et des mots de passe est affichée}} ci-dessous.",
     	"passwordreset-nocaller": "Un appelant doit être fourni",
     	"passwordreset-nosuchcaller": "L’appelant n’existe pas : $1",
    @@ -764,7 +764,9 @@
     	"minoredit": "Modification mineure",
     	"watchthis": "Suivre cette page",
     	"savearticle": "Enregistrer",
    +	"savechanges": "Enregistrer les modifications",
     	"publishpage": "Publier la page",
    +	"publishchanges": "Publier les modifications",
     	"preview": "Prévisualisation",
     	"showpreview": "Prévisualiser",
     	"showdiff": "Voir les modifications",
    @@ -1359,8 +1361,8 @@
     	"rightslogtext": "Voici l’historique des modifications des droits des utilisateurs.",
     	"action-read": "lire cette page",
     	"action-edit": "modifier cette page",
    -	"action-createpage": "créer des pages",
    -	"action-createtalk": "créer des pages de discussion",
    +	"action-createpage": "créer cette page",
    +	"action-createtalk": "créer cette page de discussion",
     	"action-createaccount": "créer ce compte utilisateur",
     	"action-autocreateaccount": "créer automatiquement ce compte utilisateur externe",
     	"action-history": "afficher l’historique de cette page",
    @@ -1409,9 +1411,9 @@
     	"enhancedrc-history": "historique",
     	"recentchanges": "Modifications récentes",
     	"recentchanges-legend": "Options des modifications récentes",
    -	"recentchanges-summary": "Piste les changements les plus récents du wiki sur cette page.",
    +	"recentchanges-summary": "Suivez les changements les plus récents du wiki sur cette page.",
     	"recentchanges-noresult": "Aucune modification correspondant à ces critères sur la période indiquée.",
    -	"recentchanges-feed-description": "Suivre les dernières modifications de ce wiki dans un flux.",
    +	"recentchanges-feed-description": "Suivez les dernières modifications du wiki dans ce flux.",
     	"recentchanges-label-newpage": "Cette modification a créé une nouvelle page",
     	"recentchanges-label-minor": "Cette modification est mineure.",
     	"recentchanges-label-bot": "Cette modification a été effectuée par un robot.",
    @@ -1578,7 +1580,8 @@
     	"upload-http-error": "Une erreur HTTP est survenue : $1",
     	"upload-copy-upload-invalid-domain": "La copie des téléversements n’est pas disponible depuis ce domaine.",
     	"upload-foreign-cant-upload": "Ce wiki n’est pas configuré pour télécharger des fichiers vers le dépôt de fichiers externe demandé.",
    -	"upload-foreign-cant-load-config": "Le chargement de la configuration de téléversement de fichier pour le référentiel de fichiers étranger a échoué.",
    +	"upload-foreign-cant-load-config": "Échec au chargement de la configuration du téléversement des fichiers vers le référentiel de fichiers étrangers.",
    +	"upload-dialog-disabled": "Les téléversements de fichier utilisant cette boîte de dialogue sont désactivés sur ce wiki.",
     	"upload-dialog-title": "Téléverser un fichier",
     	"upload-dialog-button-cancel": "Annuler",
     	"upload-dialog-button-done": "Terminé",
    @@ -2300,6 +2303,7 @@
     	"sp-contributions-username": "Adresse IP ou nom d'utilisateur :",
     	"sp-contributions-toponly": "Ne montrer que les contributions qui sont les dernières des articles",
     	"sp-contributions-newonly": "Afficher uniquement les modifications qui sont des créations de page",
    +	"sp-contributions-hideminor": "Masquer les modifications mineures",
     	"sp-contributions-submit": "Rechercher",
     	"whatlinkshere": "Pages liées",
     	"whatlinkshere-title": "Pages qui pointent vers « $1 »",
    @@ -2445,7 +2449,7 @@
     	"lockedbyandtime": "(par $1 le $2 à $3)",
     	"move-page": "Renommer $1",
     	"move-page-legend": "Renommer une page",
    -	"movepagetext": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. L’ancien titre deviendra une page de redirection vers le nouveau titre. Vous pouvez mettre à jour automatiquement les redirections actuelles qui pointent vers le titre original. Si vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera <string>pas</strong> renommée s’il existe déjà une page avec le nouveau titre, sauf si cette dernière est une simple redirection avec un historique de modifications vierge. Ceci permet de renommer une page vers sa position d’origine si le déplacement s’avère erroné.\n\n<strong>Attention !</strong>\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d’en avoir compris les conséquences avant de continuer.",
    +	"movepagetext": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom. L’ancien titre deviendra une page de redirection vers le nouveau titre. Vous pouvez mettre à jour automatiquement les redirections actuelles qui pointent vers le titre original. Si vous choisissez de ne pas le faire, assurez-vous de vérifier toute [[Special:DoubleRedirects|double redirection]] ou [[Special:BrokenRedirects|redirection cassée]]. Vous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera <strong>pas</strong> renommée s’il existe déjà une page avec le nouveau titre, sauf si cette dernière est une simple redirection avec un historique de modifications vierge. Ceci permet de renommer une page vers sa position d’origine si le déplacement s’avère erroné.\n\n<strong>Attention !</strong>\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d’en avoir compris les conséquences avant de continuer.",
     	"movepagetext-noredirectfixer": "Utilisez le formulaire ci-dessous pour renommer une page, en déplaçant tout son historique vers le nouveau nom.\nL’ancien titre deviendra une page de redirection vers le nouveau titre.\nVérifiez bien les [[Special:DoubleRedirects|doubles redirections]] ou les [[Special:BrokenRedirects|redirections cassées]].\nVous avez la responsabilité de vous assurer que les liens continuent de pointer vers leur destination supposée.\n\nNotez que la page ne sera <strong>pas</strong> déplacée s’il existe déjà une page avec le nouveau titre, sauf si cette dernière a un historique de modifications vierge et est soit vide, soit une simple redirection. Ceci permet de renommer une page vers sa position d’origine si le déplacement s’avère erroné, et il est impossible d’écraser une page existante.\n\n<strong>Attention !</strong>\nCeci peut provoquer un changement radical et imprévu pour une page souvent consultée ; assurez-vous d’en avoir compris les conséquences avant de continuer.",
     	"movepagetalktext": "Si vous cochez cette case, la page de discussion associée sera automatiquement renommée, à moins qu’une page de discussion non vide existe déjà sous ce nouveau nom.\n\nDans ce cas, vous devrez renommer ou fusionner cette page de discussion manuellement si vous le désirez.",
     	"moveuserpage-warning": "'''Attention :''' Vous êtes sur le point de renommer une page d’utilisateur. Veuillez noter que seule la page sera renommée et que l’utilisateur '''ne''' sera '''pas''' renommé.",
    @@ -2519,7 +2523,7 @@
     	"allmessagesname": "Nom du message",
     	"allmessagesdefault": "Message par défaut",
     	"allmessagescurrent": "Message actuel",
    -	"allmessagestext": "Ceci est la liste des messages disponibles dans l’espace MediaWiki.\nVeuillez visiter la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Régionalisation de MediaWiki] et [https://translatewiki.net/ translatewiki.net] si vous désirez contribuer à la régionalisation générique de MediaWiki.",
    +	"allmessagestext": "Ceci est la liste des messages système disponibles dans l’espace de noms MediaWiki.\nVeuillez visiter la [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Régionalisation de MediaWiki] et [https://translatewiki.net/ translatewiki.net] si vous désirez contribuer à la régionalisation générique de MediaWiki.",
     	"allmessagesnotsupportedDB": "Cette page '''{{ns:special}}:Allmessages''' n'est pas utilisable car '''$wgUseDatabaseMessages''' a été désactivé.",
     	"allmessages-filter-legend": "Filtrer",
     	"allmessages-filter": "Filtrer par état de modification :",
    @@ -3215,8 +3219,8 @@
     	"invalidateemail": "Annuler la confirmation de l'adresse de courriel",
     	"notificationemail_subject_changed": "L’adresse courriel enregistrée sur {{SITENAME}} a été changée",
     	"notificationemail_subject_removed": "L’adresse courriel enregistrée sur {{SITENAME}} a été supprimée",
    -	"notificationemail_body_changed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1, a changé l’adresse courriel\nassociée au compte « $2 » sur {{SITENAME}} en « $3 ».\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
    -	"notificationemail_body_removed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1,\na suprrimé l’adresse courriel associée au compte « $2 » sur {{SITENAME}}.\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
    +	"notificationemail_body_changed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1, a changé l’adresse\ncourriel associée au compte « $2 » sur {{SITENAME}} en « $3 ».\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
    +	"notificationemail_body_removed": "Quelqu’un, probablement vous, connecté depuis l’adresse IP $1,\na supprimé l’adresse courriel associée au compte « $2 » sur {{SITENAME}}.\n\nSi ce n’était pas vous, contactez un administrateur du site immédiatement.",
     	"scarytranscludedisabled": "[La transclusion interwiki est désactivée]",
     	"scarytranscludefailed": "[La récupération de modèle a échoué pour $1]",
     	"scarytranscludefailed-httpstatus": "[Échec de la récupération du modèle pour  $1 : HTTP  $2 ]",
    @@ -3834,7 +3838,6 @@
     	"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
     	"mw-widgets-titleinput-description-new-page": "la page n’existe pas encore",
     	"mw-widgets-titleinput-description-redirect": "redirection vers $1",
    -	"api-error-blacklisted": "Merci de choisir un autre titre descriptif.",
     	"sessionmanager-tie": "Impossible de combiner les demandes multiples de types d’authentification : $1.",
     	"sessionprovider-generic": "sessions $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basées sur les cookies",
    @@ -3849,8 +3852,8 @@
     	"log-action-filter-newusers": "Type de création de compte :",
     	"log-action-filter-patrol": "Type de patrouille :",
     	"log-action-filter-protect": "Type de protection :",
    -	"log-action-filter-rights": "Type de changement de droit",
    -	"log-action-filter-suppress": "Type de suppression",
    +	"log-action-filter-rights": "Type de changement de droit :",
    +	"log-action-filter-suppress": "Type de suppression :",
     	"log-action-filter-upload": "Type de téléversement :",
     	"log-action-filter-all": "Tout",
     	"log-action-filter-block-block": "Blocage",
    diff --git a/languages/i18n/frp.json b/languages/i18n/frp.json
    index a7feed5389..d3828caadb 100644
    --- a/languages/i18n/frp.json
    +++ b/languages/i18n/frp.json
    @@ -1909,7 +1909,7 @@
     	"removewatch": "Enlevar de la lista de gouârda",
     	"removedwatchtext": "« [[:$1]] » et sa pâge de discussion sont étâyes enlevâyes de voutra [[Special:Watchlist|lista de gouârda]].",
     	"removedwatchtext-short": "La pâge « $1 » est étâye enlevâye de voutra lista de gouârda.",
    -	"watch": "Siuvre",
    +	"watch": "Gouardar",
     	"watchthispage": "Siuvre cela pâge",
     	"unwatch": "Pas més siuvre",
     	"unwatchthispage": "Pas més siuvre",
    @@ -3299,7 +3299,7 @@
     	"htmlform-selectorother-other": "Ôtro",
     	"sqlite-has-fts": "$1 avouéc rechèrche en tèxto complèt recognua",
     	"sqlite-no-fts": "$1 sen rechèrche en tèxto complèt recognua",
    -	"logentry-delete-delete": "$1 at suprimâ la pâge $3",
    +	"logentry-delete-delete": "$1 {{GENDER:$2|at suprimâ}} la pâge $3",
     	"logentry-delete-restore": "$1 at refêt la pâge $3",
     	"logentry-delete-event": "$1 at changiê la visibilitât {{PLURAL:$5|d’un èvènement|de $5 èvènements}} du jornal dessus $3 : $4",
     	"logentry-delete-revision": "$1 at changiê la visibilitât {{PLURAL:$5|d’una vèrsion|de $5 vèrsions}} sur la pâge $3 : $4",
    @@ -3318,7 +3318,7 @@
     	"revdelete-uname-unhid": "nom d’usanciér pas més cachiê",
     	"revdelete-restricted": "at aplicâ les rèstriccions ux administrators",
     	"revdelete-unrestricted": "rèstriccions enlevâs por los administrators",
    -	"logentry-move-move": "$1 at dèplaciê la pâge $3 vers $4",
    +	"logentry-move-move": "$1 {{GENDER:$2|at dèplaciê}} la pâge $3 vers $4",
     	"logentry-move-move-noredirect": "$1 at dèplaciê la pâge $3 vers $4 sen lèssiér una redirèccion",
     	"logentry-move-move_redir": "$1 at dèplaciê la pâge $3 vers $4 en ècrasent sa redirèccion",
     	"logentry-move-move_redir-noredirect": "$1 at dèplaciê la pâge $3 vers $4 en ècrasent sa redirèccion sen lèssiér una redirèccion",
    @@ -3331,6 +3331,7 @@
     	"logentry-rights-rights": "$1 at changiê l’apartegnence a la tropa por « $3 » de $4 a $5",
     	"logentry-rights-rights-legacy": "$1 at changiê l’apartegnence a la tropa por « $3 »",
     	"logentry-rights-autopromote": "$1 est étâ nomâ ôtomaticament de $4 a $5",
    +	"logentry-upload-upload": "$1 {{GENDER:$2|at tèlèchargiê}} $3",
     	"rightsnone": "(nion)",
     	"revdelete-summary": "rèsumâ du changement",
     	"feedback-adding": "Aponsa de voutros avis a la pâge...",
    @@ -3427,6 +3428,5 @@
     	"special-characters-title-minus": "segno muens",
     	"mw-widgets-dateinput-placeholder-day": "AAAA-MM-JJ",
     	"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
    -	"api-error-blacklisted": "Volyéd chouèsir un ôtro titro dèscriptif.",
     	"randomrootpage": "Pâge racena a l’hasârd"
     }
    diff --git a/languages/i18n/gd.json b/languages/i18n/gd.json
    index b9645d1eb2..ddc6770e22 100644
    --- a/languages/i18n/gd.json
    +++ b/languages/i18n/gd.json
    @@ -458,8 +458,8 @@
     	"mailerror": "Mearachd a' cur post: $1",
     	"acct_creation_throttle_hit": "Chruthaich na h-aoighean air an uicidh seo {{PLURAL:$1|$1 chunntas|$1 chunntas|$1 cunntasan|$1 cunntas}} fon IP agad an-dè agus sin an àireamh as motha a tha ceadaichte. Chan urrainn do dh'aoighean eile on IP seo barrachd chunntasan a chruthachadh air sgàth sin.",
     	"emailauthenticated": "Chaidh an seòladh puist-d agad a dhearbhadh $2 aig $3.",
    -	"emailnotauthenticated": "Cha deach am post-d agad a dhearbhadh fhathast.\nCha dèid post-d a chur airson gin dhe na feartan a leanas.",
    -	"noemailprefs": "Sònraich post-d sna roghainnean agad gus na feartan seo a chur an comas.",
    +	"emailnotauthenticated": "Cha deach am post-d agad a dhearbhadh fhathast.\nCha dèid post-d a chur airson gin dhe na gleusan a leanas.",
    +	"noemailprefs": "Sònraich post-d sna roghainnean agad gus na gleusan seo a chur an comas.",
     	"emailconfirmlink": "Dearbhaich an seòladh puist-dhealain agad",
     	"invalidemailaddress": "Chan urrainn dhuinn gabhail ris an t-seòladh seo a chionn 's gu bheil coltas cearr air.\nCuir a-steach seòladh san fhòrmat cheart no falamhaich an raon sin.",
     	"cannotchangeemail": "Cha ghabh na puist-d a tha co-cheangailte ri cunntas atharrachadh air an uicipeid seo.",
    @@ -478,7 +478,7 @@
     	"pt-login-button": "Log a-steach",
     	"pt-createaccount": "Cruthaich cunntas",
     	"pt-userlogout": "Log a-mach",
    -	"php-mail-error-unknown": "Mearachd neo-aithichte san fheart mail() aig PHP.",
    +	"php-mail-error-unknown": "Mearachd nach aithne dhuinn sa ghleus mail() aig PHP.",
     	"user-mail-no-addy": "Cha do ghabh am post-d a chur leis nach robh seòladh puist-d ann.",
     	"user-mail-no-body": "Bha bodhaig na teachdaireachd bàn no air leth goirid.",
     	"changepassword": "Atharraich facal-faire",
    @@ -573,8 +573,8 @@
     	"summary-preview": "Ro-shealladh a' ghearr-chunntais:",
     	"subject-preview": "Ro-shealladh a’ chuspair:",
     	"blockedtitle": "Tha an cleachdair air a bhacadh",
    -	"blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n'S e $1 a chur am bacadh seo ort.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: <em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
    -	"autoblockedtext": "Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: \n\n:<em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut am feart \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
    +	"blockedtext": "<strong>Chaidh an t-ainm-cleachdaiche no an seòladh IP agad a bhacadh.</strong>\n\n'S e $1 a chur am bacadh seo ort.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: <em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\nChan urrainn dhut an gleus \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
    +	"autoblockedtext": "Chaidh an seòladh IP agad a bhacadh gu fèin-obrachail a chionn 's gun deach a chleachdadh le cuideigin eile a chaidh a bhacadh le $1.\n{{GENDER:$1|Thug e|Thug i|Thugadh}} an cèill gun do {{GENDER:$1|rinn e|rinn i|rinneadh}} sin air sgàth an adhbhair seo: \n\n:<em>$2</em>.\n\n* Toiseach a' bhacaidh: $8\n* Deireadh a' bhacaidh: $6\n* An neach air a bheil am bacadh: $7\n\n'S urrainn dhut fios a chur gu $1 no [[{{MediaWiki:Grouppage-sysop}}|rianair]] eile gus am bacadh seo a dheasbad.\n\nDh'fhaoidte nach urrainn dhut an gleus \"Cuir post-d dhan chleachdaiche seo\" a chleachdadh ach ma tha seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chunntais agad]] agus mura deach bacadh a chur air a chleachdadh.\n\n'S e $3 an seòladh IP làithreach agus agus 's e #$5 ID a' bhacaidh.\nThoir iomradh air a' mhion-fhiosrachadh gu h-àrd ma chuireas tu ceist sam bith mu dhèidhinn.",
     	"blockednoreason": "cha deach adhbhar a shònrachadh",
     	"whitelistedittext": "Feumaidh tu $1 mus urrainn dhut duilleagan a dheasachadh.",
     	"confirmedittext": "Feumaidh tu am post-d agad a dhearbhadh mus urrainn dhut duilleagan a dheasachadh.\nSuidhich is dearbhaich am post-d agad ann an [[Special:Preferences|roghainnean a' chleachdaiche]]",
    @@ -884,7 +884,7 @@
     	"prefs-skin": "Bian",
     	"skin-preview": "Ro-shealladh",
     	"datedefault": "Gun roghainnean",
    -	"prefs-labs": "Feartan nan deuchainn-lannan",
    +	"prefs-labs": "Gleusan nan deuchainn-lannan",
     	"prefs-user-pages": "Duilleagan a' chleachdaiche",
     	"prefs-personal": "Pròifil",
     	"prefs-rc": "Mùthaidhean ùra",
    @@ -1339,7 +1339,7 @@
     	"zip-file-open-error": "Thachair mearachd le fosgladh an fhaidhle airson dearbhadh ZIP.",
     	"zip-wrong-format": "Chan eil am faidhle sònraichte 'na fhaidhle ZIP.",
     	"zip-bad": "Tha am faidhle ZIP coirbte no cha ghabh a leughadh air adhbhar eile air choireigin.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
    -	"zip-unsupported": "Tha am faidhle ZIP seo a' chleachdadh feartan ZIP ris nach cuir MediaWiki taic.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
    +	"zip-unsupported": "Tha am faidhle ZIP seo a' chleachdadh gleusan ZIP ris nach cuir MediaWiki taic.\nChan urrainn dhuinn dearbhadh mar bu chòir a bheil e tèarainte gus nach eil.",
     	"uploadstash": "Tasgadan an luchdaidh suas",
     	"uploadstash-summary": "Bheir an duilleag seo inntrigeadh dhut a dh'fhaidhlichean a chaidh a luchdadh suas no a tha 'gan luchdadh suas ach nach deach fhoillseachadh air an uicidh fhathast. Chan fhaic duine na faidhlichean seo ach an cleachdaiche a rinn an luchdadh suas.",
     	"uploadstash-clear": "Glan na faidhlichean ann an tasgadan an luchdaidh suas",
    @@ -1699,7 +1699,7 @@
     	"emailccsubject": "Lethbhreac dhen teachdaireachd agad gu $1: $2",
     	"emailsent": "Post-d air a chur",
     	"emailsenttext": "Chaidh an teachdaireachd puist-d agad a chur.",
    -	"emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis an fheart \"{{int:emailuser}}\" air {{SITENAME}}.",
    +	"emailuserfooter": "Chaidh am post-d seo a chur o $1 gu $2 leis a' ghleus \"{{int:emailuser}}\" air {{SITENAME}}.",
     	"usermessage-summary": "A' fàgail teachdaireachd an t-siostaim.",
     	"usermessage-editor": "Teachdaire an t-siostaim",
     	"usermessage-template": "MediaWiki:UserMessage",
    @@ -1763,7 +1763,7 @@
     	"dellogpage": "Loga an sguabaidh às",
     	"dellogpagetext": "Seo liosta dhe na chaidh a sguabadh às o chionn goirid.",
     	"deletionlog": "loga an sguabaidh às",
    -	"reverted": "Air aiseag gu mùthadh nas sine",
    +	"reverted": "Air tilleadh gu mùthadh roimhe",
     	"deletecomment": "Adhbhar:",
     	"deleteotherreason": "Adhbhar eile/a bharrachd:",
     	"deletereasonotherlist": "Adhbhar eile",
    @@ -1784,8 +1784,11 @@
     	"revertpage": "Deasachaidhean a chaidh a thilleadh leis [[Special:Contributions/$2|$2]] ([[User talk:$2|an deasbaireachd]]) dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
     	"revertpage-nouser": "Deasachaidhean a chaidh a thilleadh le cleachdaiche falaichte dhan mhùthadh mu dheireadh le [[User:$1|$1]]",
     	"rollback-success": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2.",
    +	"rollback-success-notify": "Na deasachaidhean a chaidh a thilleadh le $1;\nchaidh an tilleadh gun mhùthadh mu dheireadh le $2. [$3 Seall na h-atharraichean]",
     	"sessionfailure-title": "Trioblaid leis an t-seisean",
     	"sessionfailure": "Tha duilgheadas ann leis an seisean logaidh a-steach agad a-rèir coltais;\nchaidh sgur dhen ghnìomh seo a chum dìon o session hijacking.\nTill dhan duilleag roimhpe, ath-luchdaich an duilleag ud 's feuch ris a-rithist an uairsin.",
    +	"logentry-contentmodel-change-revertlink": "till",
    +	"logentry-contentmodel-change-revert": "till",
     	"protectlogpage": "Loga an dìon",
     	"protectlogtext": "Tha liosta na chaidh a dhìon gu h-ìosal.\nCuir sùil air [[Special:ProtectedPages|liosta nan duilleagan fo dhìon]] airson liosta na fheadhainn a tha fo dhìon an-dràsta fhèin.",
     	"protectedarticle": "\"[[$1]]\" air a dhìon",
    @@ -2351,8 +2354,8 @@
     	"markaspatrolledtext": "Cuir comharra freiceadain ris an duilleag seo",
     	"markedaspatrolled": "Comharra freiceadain ris",
     	"markedaspatrolledtext": "Chaidh comharra freiceadain a chur ris a' mhùthadh de [[:$1]] a thagh thu.",
    -	"rcpatroldisabled": "Chaidh feart nam freiceadan airson atharraichean o chionn goirid a chur à comas",
    -	"rcpatroldisabledtext": "Tha feart nam freiceadan airson atharraichean o chionn goirid à comas an-dràsta.",
    +	"rcpatroldisabled": "Chaidh gleus nam freiceadan airson atharraichean o chionn goirid a chur à comas",
    +	"rcpatroldisabledtext": "Tha gleus nam freiceadan airson atharraichean o chionn goirid à comas an-dràsta.",
     	"markedaspatrollederror": "Cha ghabh comharra freiceadain a chur ris",
     	"markedaspatrollederrortext": "Feumaidh tu mùthadh a shònrachadh gus comharra freiceadain a chur ris.",
     	"markedaspatrollederror-noautopatrol": "Chan fhaod thu comharra freiceadain a chur ris na h-atharraichean agad fhèin.",
    @@ -2794,20 +2797,20 @@
     	"monthsall": "na h-uile",
     	"confirmemail": "Dearbhaich an seòladh puist-dhealain",
     	"confirmemail_noemail": "Cha dug thu seachad seòladh puist-d dligheach ann an [[Special:Preferences|roghainnean a' chleachdaiche]] agad.",
    -	"confirmemail_text": "Iarraidh {{SITENAME}} ort gun dearbhaich thu an seòladh puist-d agad mus cleachd thu feartan puist-d.\nCleachd am putan gu h-ìosal gus post-d dearbhaidh a chur dhan t-seòladh agad.\nBidh ceangal le còd sa phost-d ud;\nluchdaich an ceangal sa bhrabhsair agad airson dearbhadh gu bheil an seòladh puist-d agad dligheach.",
    +	"confirmemail_text": "Iarraidh {{SITENAME}} ort gun dearbhaich thu an seòladh puist-d agad mus cleachd thu gleusan puist-d.\nCleachd am putan gu h-ìosal gus post-d dearbhaidh a chur dhan t-seòladh agad.\nBidh ceangal le còd sa phost-d ud;\nluchdaich an ceangal sa bhrabhsair agad airson dearbhadh gu bheil an seòladh puist-d agad dligheach.",
     	"confirmemail_pending": "Chaidh còd dearbhaidh a chur thugad air a' phost-d mar-thà;\nma tha thu air a' chunntas agad a chruthachadh o chionn goirid, 's math dh'fhaoidte gum b' feairrde thu feitheamh mionaid no dhà ach an ruig e thu mus iarr thu còd ùr.",
     	"confirmemail_send": "Cuir còd dearbhaidh thugam",
     	"confirmemail_sent": "Chaidh post-d dearbhaidh a chur.",
    -	"confirmemail_oncreate": "Chaidh còd dearbhaidh a chur dhan t-seòladh puist-d agad.\nChan eil thu feumach air a' chòd seo airson logadh a-steach, ach feumaidh tu a thoirt seachad mus cleachd thu feart sam bith san uicidh a chleachdas post-d.",
    +	"confirmemail_oncreate": "Chaidh còd dearbhaidh a chur dhan t-seòladh puist-d agad.\nChan eil thu feumach air a' chòd seo airson logadh a-steach, ach feumaidh tu a thoirt seachad mus cleachd thu gleus sam bith san uicidh a chleachdas post-d.",
     	"confirmemail_sendfailed": "Cha deach le {{SITENAME}} post-d dearbhaidh a chur thugad.\nDearbhaich nach eil caractar mì-dhligheach san t-seòladh puist-d agad.\n\nSeo na thill an t-inneal puist-d: $1",
     	"confirmemail_invalid": "Tha an còd dearbhaidh mì-dhligheach.\n'S dòcha gun do dh'fhalbh an ùine air.",
     	"confirmemail_needlogin": "$1 gus an seòladh puist-d agad a dhearbhadh.",
     	"confirmemail_success": "Chaidh an seòladh puist-d agad a dhearbhadh.\nFaodaidh tu [[Special:UserLogin|logadh a-steach]] a-nis 's tlachd a ghabhail às an uicidh.",
     	"confirmemail_loggedin": "Tha an seòladh puist-d agad air a dhearbhadh a-nis.",
     	"confirmemail_subject": "Dearbhadh an t-seòlaidh puist-d air {{SITENAME}}",
    -	"confirmemail_body": "Chlàraich chuideigin - 's sinne an dùil gur e tusa a bh' ann - cunntas \"$2\"\nair {{SITENAME}} leis an t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na feartan puist-d\na ghnìomhachadh air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
    -	"confirmemail_body_changed": "Dh'atharraich chuideigin - 's sinne an dùil gur e tusa a bh' ann - an seòladh puist-d\naig a' chunntas \"$2\" air {{SITENAME}} dhan t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na feartan puist-d\na ghnìomhachadh às ùr air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
    -	"confirmemail_body_set": "Shuidhich chuideigin - 's sinne an dùil gur e tusa a bh' ann - an seòladh puist-d\naig a' chunntas \"$2\" air {{SITENAME}} dhan t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na feartan puist-d\na ghnìomhachadh air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
    +	"confirmemail_body": "Chlàraich chuideigin - 's sinne an dùil gur e tusa a bh' ann - cunntas \"$2\"\nair {{SITENAME}} leis an t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na gleusan puist-d\na ghnìomhachadh air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
    +	"confirmemail_body_changed": "Dh'atharraich chuideigin - 's sinne an dùil gur e tusa a bh' ann - an seòladh puist-d\naig a' chunntas \"$2\" air {{SITENAME}} dhan t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na gleusan puist-d\na ghnìomhachadh às ùr air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
    +	"confirmemail_body_set": "Shuidhich chuideigin - 's sinne an dùil gur e tusa a bh' ann - an seòladh puist-d\naig a' chunntas \"$2\" air {{SITENAME}} dhan t-seòladh puist-d seo on t-seòladh IP $1.\n\nGus dearbhadh gur an agad fhèin a tha an cunntas seo agus gus na gleusan puist-d\na ghnìomhachadh air {{SITENAME}}, fosgail an ceangal seo sa bhrabhsair agad:\n\n$3\n\nMur e *tusa* a bh' ann a chlàraich an cunntas seo, lean air a' cheangal seo\ngus sgur dhen dearbhadh leis a' phost-d:\n\n$5\n\nFalbhaidh an ùine air a' chòd dearbhaidh seo $4.",
     	"confirmemail_invalidated": "Chaidh sgur de dhearbhadh an t-seòlaidh puist-d",
     	"invalidateemail": "Sguir de dhearbhadh an t-seòlaidh puist-d",
     	"scarytranscludedisabled": "[Tha gabhail a-steach 'na iomradh eadar-uicidh à comas]",
    @@ -2826,6 +2829,7 @@
     	"confirm-watch-top": "A bheil thu airson an duilleag seo a chur ris a' chlàr-fhaire agad?",
     	"confirm-unwatch-button": "Ceart ma-thà",
     	"confirm-unwatch-top": "A bheil thu airson an duilleag seo a thoirt air falbh on chlàr-fhaire agad?",
    +	"confirm-rollback-top": "A bheil thu airson na mùthaidhean air an duilleag seo a thilleadh?",
     	"semicolon-separator": ";&#32;",
     	"comma-separator": ",&#32;",
     	"colon-separator": ":&#32;",
    diff --git a/languages/i18n/gl.json b/languages/i18n/gl.json
    index fe9b585b1d..6dcf7eaae2 100644
    --- a/languages/i18n/gl.json
    +++ b/languages/i18n/gl.json
    @@ -640,7 +640,9 @@
     	"minoredit": "Esta é unha edición pequena",
     	"watchthis": "Vixiar esta páxina",
     	"savearticle": "Gardar a páxina",
    +	"savechanges": "Gardar os cambios",
     	"publishpage": "Publicar a páxina",
    +	"publishchanges": "Publicar cambios",
     	"preview": "Vista previa",
     	"showpreview": "Mostrar a vista previa",
     	"showdiff": "Mostrar os cambios",
    @@ -1006,7 +1008,7 @@
     	"rows": "Filas:",
     	"columns": "Columnas:",
     	"searchresultshead": "Procurar",
    -	"stub-threshold": "Límite superior para o formato de ligazóns de bosquexo($1):",
    +	"stub-threshold": "Límite superior de tamaño para o formato das ligazóns cara bosquexos ($1):",
     	"stub-threshold-sample-link": "exemplo",
     	"stub-threshold-disabled": "Desactivado",
     	"recentchangesdays": "Número de días a mostrar nos cambios recentes:",
    @@ -1233,8 +1235,8 @@
     	"rightslogtext": "Este é un rexistro dos cambios nos permisos de usuario.",
     	"action-read": "ler esta páxina",
     	"action-edit": "editar esta páxina",
    -	"action-createpage": "crear páxinas",
    -	"action-createtalk": "crear páxinas de conversa",
    +	"action-createpage": "crear esta páxina",
    +	"action-createtalk": "crear esta páxina de conversa",
     	"action-createaccount": "crear esta conta de usuario",
     	"action-autocreateaccount": "crear automaticamente esta conta de usuario externa",
     	"action-history": "ver o historial desta páxina",
    @@ -1452,7 +1454,8 @@
     	"upload-http-error": "Produciuse un erro HTTP: $1",
     	"upload-copy-upload-invalid-domain": "A copia de cargas non está dispoñible neste dominio.",
     	"upload-foreign-cant-upload": "Este wiki non está configurado para subir ficheiros ao repositorio de ficheiros externo solicitado.",
    -	"upload-foreign-cant-load-config": "A carga da configuración de carga de ficheiros para o repositorio de ficheiros externo fallou.",
    +	"upload-foreign-cant-load-config": "Erro ó cargar a configuración das subas de ficheiros para o repositorio de ficheiros externo.",
    +	"upload-dialog-disabled": "As cargas de ficheiros usando esta pantalla están desactivadas neste wiki.",
     	"upload-dialog-title": "Subir un ficheiro",
     	"upload-dialog-button-cancel": "Cancelar",
     	"upload-dialog-button-done": "Feito",
    @@ -2172,6 +2175,7 @@
     	"sp-contributions-username": "Enderezo IP ou nome de usuario:",
     	"sp-contributions-toponly": "Mostrar só as últimas revisións",
     	"sp-contributions-newonly": "Mostrar só as edicións que crearon páxinas",
    +	"sp-contributions-hideminor": "Ocultar edicións menores",
     	"sp-contributions-submit": "Procurar",
     	"whatlinkshere": "Páxinas que ligan con esta",
     	"whatlinkshere-title": "Páxinas que ligan con \"$1\"",
    @@ -3613,7 +3617,6 @@
     	"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
     	"mw-widgets-titleinput-description-new-page": "a páxina aínda non existe",
     	"mw-widgets-titleinput-description-redirect": "redirección cara a $1",
    -	"api-error-blacklisted": "Escolla un título diferente e descritivo.",
     	"sessionmanager-tie": "Non pode combinar peticións múltiples de tipos de autenticación: $1.",
     	"sessionprovider-generic": "sesións $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sesións baseadas nas cookies",
    diff --git a/languages/i18n/gom-deva.json b/languages/i18n/gom-deva.json
    index 44c0b6603c..d4040cb68a 100644
    --- a/languages/i18n/gom-deva.json
    +++ b/languages/i18n/gom-deva.json
    @@ -773,6 +773,25 @@
     	"logentry-newusers-create": "उपयोगकत्याचें $1 {{GENDER:$2|तयार केलें}}",
     	"logentry-upload-upload": "$1 {{GENDER:$2|अपलोड केला}} $3",
     	"searchsuggest-search": "सोद",
    +	"special-characters-group-latin": "रोमी",
    +	"special-characters-group-latinextended": "रोमी (आनिंक-उइ)",
    +	"special-characters-group-ipa": "IPA",
    +	"special-characters-group-greek": "ग्रीक",
    +	"special-characters-group-greekextended": "ग्रीक (आनिंक-उइ)",
    +	"special-characters-group-cyrillic": "रश्यन",
    +	"special-characters-group-arabic": "अरबी",
    +	"special-characters-group-arabicextended": "अरबी (आनिंक-उइ)",
    +	"special-characters-group-persian": "पार्सी",
    +	"special-characters-group-hebrew": "हेब्रेव",
    +	"special-characters-group-bangla": "बंगाली",
    +	"special-characters-group-tamil": "तमिळ",
    +	"special-characters-group-telugu": "तेलुगु",
    +	"special-characters-group-sinhala": "सिंगालेज़",
    +	"special-characters-group-gujarati": "गुजराती",
    +	"special-characters-group-devanagari": "नगरी",
    +	"special-characters-group-thai": "थाई",
    +	"special-characters-group-lao": "लाओ",
    +	"special-characters-group-khmer": "ख्मेर",
     	"mw-widgets-dateinput-no-date": "तारीख निवडूंक ना",
     	"mw-widgets-dateinput-placeholder-day": "वर्स-म्हयनो-दीस",
     	"mw-widgets-dateinput-placeholder-month": "वर्स-म्हयनो"
    diff --git a/languages/i18n/gom-latn.json b/languages/i18n/gom-latn.json
    index 65dfc1a76b..975cb88a88 100644
    --- a/languages/i18n/gom-latn.json
    +++ b/languages/i18n/gom-latn.json
    @@ -802,6 +802,25 @@
     	"logentry-newusers-create": "Vapurpeacho kont $1 {{GENDER:$2|rochlam}}",
     	"logentry-upload-upload": "$1-an $3 {{GENDER:$2|upload kela}}",
     	"searchsuggest-search": "Sod",
    +	"special-characters-group-latin": "Romi",
    +	"special-characters-group-latinextended": "Romi (anink-ui)",
    +	"special-characters-group-ipa": "IPA",
    +	"special-characters-group-greek": "Grik",
    +	"special-characters-group-greekextended": "Grik (anink-ui)",
    +	"special-characters-group-cyrillic": "Russian",
    +	"special-characters-group-arabic": "Arbi",
    +	"special-characters-group-arabicextended": "Arbi (anink-ui)",
    +	"special-characters-group-persian": "Parsi",
    +	"special-characters-group-hebrew": "Hebrev",
    +	"special-characters-group-bangla": "Bongali",
    +	"special-characters-group-tamil": "Tamil",
    +	"special-characters-group-telugu": "Telugu",
    +	"special-characters-group-sinhala": "Singales",
    +	"special-characters-group-gujarati": "Gujrati",
    +	"special-characters-group-devanagari": "Nagari",
    +	"special-characters-group-thai": "Thai",
    +	"special-characters-group-lao": "Lao",
    +	"special-characters-group-khmer": "Khmer",
     	"mw-widgets-dateinput-no-date": "Tarikh nivddunk na",
     	"mw-widgets-dateinput-placeholder-day": "VVVV-MM-DD",
     	"mw-widgets-dateinput-placeholder-month": "VVVV-MM"
    diff --git a/languages/i18n/got.json b/languages/i18n/got.json
    index cc62704735..fbba50932d 100644
    --- a/languages/i18n/got.json
    +++ b/languages/i18n/got.json
    @@ -6,18 +6,20 @@
     			"Michawiki",
     			"Node ue",
     			"Sajasazi (on got.wikipedia.org)",
    -			"Zylbath"
    +			"Zylbath",
    +			"Espreon",
    +			"Gothicspeaker"
     		]
     	},
     	"underline-always": "Sinteino",
     	"underline-never": "Niu",
    -	"sunday": "Sunnonsdags",
    -	"monday": "Meninsdags",
    -	"tuesday": "Tiwisdags",
    +	"sunday": "𐌰𐍆𐌰𐍂𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
    +	"monday": "𐌼𐌴𐌽𐌹𐌽𐍃 𐌳𐌰𐌲𐍃",
    +	"tuesday": "𐍄𐌴𐌹𐍅𐌹𐍃 𐌳𐌰𐌲𐍃",
     	"wednesday": "Midiwiko",
    -	"thursday": "Þeiƕonsdags",
    -	"friday": "Fraujonsdags",
    -	"saturday": "𐌸𐍅𐌰𐌷𐌻𐌹𐍃𐌳𐌰𐌲𐍃",
    +	"thursday": "𐍀𐌰𐌹𐌽𐍄𐌴𐌳𐌰𐌲𐍃",
    +	"friday": "𐍀𐌰𐍂𐌴𐌹𐌽𐍃𐌳𐌰𐌲𐍃",
    +	"saturday": "𐍃𐌰𐌱𐌱𐌰𐍄𐍉",
     	"sun": "𐍃𐌿𐌽",
     	"mon": "𐌼𐌴𐌽",
     	"tue": "𐌰𐍂𐌴",
    @@ -25,20 +27,20 @@
     	"thu": "𐍀𐌰𐌹",
     	"fri": "𐍆𐍂𐌹",
     	"sat": "𐍃𐌰𐌼",
    -	"january": "𐌰𐍆𐍄𐌿𐌼𐌰 𐌾𐌹𐌿𐌻𐌴𐌹𐍃",
    -	"february": "𐍆𐌰𐌽𐌹𐌼𐌴𐌽𐍉𐌸𐍃",
    -	"march": "𐌺𐌰𐌻𐌳𐌼𐌴𐌽𐍉𐌸𐍃",
    -	"april": "𐌲𐍂𐌰𐍃𐌼𐌴𐌽𐍉𐌸𐍃",
    -	"may_long": "𐌱𐌻𐍉𐌼𐌰𐌼𐌴𐌽𐍉𐌸𐍃",
    -	"june": "𐍅𐌰𐍂𐌼𐌼𐌴𐌽𐍉𐌸𐍃",
    -	"july": "𐌷𐌰𐍅𐌹𐌼𐌴𐌽𐍉𐌸𐍃",
    -	"august": "𐌰𐍃𐌰𐌽𐌼𐌴𐌽𐍉𐌸𐍃",
    -	"september": "𐌰𐌺𐍂𐌰𐌽𐌼𐌴𐌽𐍉𐌸𐍃",
    -	"october": "𐍅𐌴𐌹𐌽𐌼𐌴𐌽𐍉𐌸𐍃",
    -	"november": "𐍆𐍂𐌿𐌼𐌰 𐌾𐌹𐌿𐌻𐌴𐌹𐍃",
    +	"january": "𐌾𐌰𐌽𐌿𐌰𐍂𐌴𐌹𐍃",
    +	"february": "𐍆𐌰𐌹𐌱𐍂𐌿𐌰𐍂𐌴𐌹𐍃",
    +	"march": "𐌼𐌰𐍂𐍄𐌹𐌿𐍃",
    +	"april": "𐌰𐍀𐍂𐌴𐌹𐌻𐌹𐍃",
    +	"may_long": "𐌼𐌰𐌾𐌿𐍃",
    +	"june": "𐌾𐌿𐌽𐌹𐌿𐍃",
    +	"july": "𐌾𐌿𐌻𐌹𐌿𐍃",
    +	"august": "𐌰𐌲𐌿𐍃𐍄𐌿𐍃",
    +	"september": "𐍃𐌰𐌹𐍀𐍄𐌰𐌹𐌼𐌱𐌰𐌹𐍂",
    +	"october": "𐌰𐌿𐌺𐍄𐍉𐌱𐌰𐌹𐍂",
    +	"november": "𐌽𐌰𐌿𐌱𐌰𐌹𐌼𐌱𐌰𐌹𐍂",
     	"december": "𐌾𐌹𐌿𐌻𐌴𐌹𐍃",
     	"january-gen": "𐌰𐍆𐍄𐌿𐌼𐌹𐌽𐍃 𐌾𐌹𐌿𐌻𐌴𐌹𐍃",
    -	"february-gen": "𐍆𐌰𐌽𐌹𐌼𐌴𐌽𐍉𐌸𐌹𐍃",
    +	"february-gen": "𐍆𐌰𐌹𐌱𐍂𐌿𐌰𐍂𐌴𐌹𐍃",
     	"march-gen": "𐌺𐌰𐌻𐌳𐌼𐌴𐌽𐍉𐌸𐌹𐍃",
     	"april-gen": "𐌲𐍂𐌰𐍃𐌼𐌴𐌽𐍉𐌸𐌹𐍃",
     	"may-gen": "𐌱𐌻𐍉𐌼𐌰𐌼𐌴𐌽𐍉𐌸𐌹𐍃",
    @@ -49,127 +51,166 @@
     	"october-gen": "𐍅𐌴𐌹𐌽𐌼𐌴𐌽𐍉𐌸𐌹𐍃",
     	"november-gen": "𐍆𐍂𐌿𐌼𐌹𐌽𐍃 𐌾𐌹𐌿𐌻𐌴𐌹𐍃",
     	"december-gen": "𐌾𐌹𐌿𐌻𐌴𐌹𐍃",
    -	"jan": "𐌰𐍆𐍄",
    +	"jan": "𐌾𐌰𐌽",
     	"feb": "𐍆𐌰𐌽",
    -	"mar": "𐌺𐌰𐌻",
    -	"apr": "𐌲𐍂𐌰",
    -	"may": "𐌱𐌻𐍉",
    -	"jun": "𐍅𐌰𐍂",
    -	"jul": "𐌷𐌰𐍅",
    -	"aug": "𐌰𐍃𐌰",
    -	"sep": "𐌰𐌺𐍂",
    -	"oct": "𐍅𐌴𐌹",
    -	"nov": "𐍆𐍂𐌿",
    -	"dec": "𐌾𐌹𐌿",
    -	"pagecategories": "{{PLURAL:$1|𐌷𐌰𐌽𐍃𐌰|𐌷𐌰𐌽𐍃𐍉𐍃}}",
    -	"category_header": "𐍃𐌴𐌹𐌳𐍉𐍃 𐌹𐌽𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
    -	"subcategories": "Dalaþkunjos",
    +	"mar": "𐌼𐌰𐍂",
    +	"apr": "𐌰𐍀𐍂",
    +	"may": "𐌼𐌰𐌾",
    +	"jun": "𐌾𐌿𐌽",
    +	"jul": "𐌾𐌿𐌻",
    +	"aug": "𐌰𐍀𐍂",
    +	"sep": "𐍃𐌰𐌹𐍀",
    +	"oct": "𐌰𐌿𐌺",
    +	"nov": "𐌽𐌰𐌿𐌱",
    +	"dec": "𐌳𐌰𐌹𐌺",
    +	"september-date": "𐍃𐌰𐌹𐍀𐍄𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
    +	"november-date": "𐌽𐌰𐌿𐌱𐌰𐌹𐌼𐌱𐌰𐌹𐍂 $1",
    +	"pagecategories": "{{PLURAL:$1|𐌺𐌿𐌽𐌹|𐌺𐌿𐌽𐌾𐌰}}",
    +	"category_header": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌹𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
    +	"subcategories": "𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰",
     	"category-media-header": "𐌼𐌴𐌳𐌾𐌰 𐌹𐌽𐌽 𐌺𐌿𐌽𐌾𐌰 \"$1\"",
    -	"hidden-categories": "{{PLURAL:$1|𐍆𐌿𐌻𐌲𐌹𐌽𐍃 𐌺𐌰𐍄𐌴𐌲𐍉𐍂𐌹|𐍆𐌿𐌻𐌲𐌹𐌽𐌰𐌹 𐌺𐌰𐍄𐌴𐌲𐍉𐍂𐌾𐍉𐍃}}",
    -	"about": "𐌿𐍆𐌰𐍂",
    -	"article": "𐍃𐌰𐌸𐍃𐍃𐌴𐌹𐌳𐍉",
    -	"newwindow": "(𐌰𐌽𐌳𐌷𐌿𐌻𐌾𐌹𐌸 𐌹𐌽𐌽 𐌽𐌹𐌿𐌾𐌰 𐌰𐌿𐌲𐌰𐌳𐌰𐌿𐍂𐍉)",
    -	"cancel": "𐌷𐌰𐌻𐍄𐍃",
    +	"hidden-categories": "{{PLURAL:$1|𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽 𐌺𐌿𐌽𐌹|𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}",
    +	"category-subcat-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌴𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 {{PLURAL:$1|𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽 𐌺𐌿𐌽𐌹|𐌹𐍆𐍄𐌿𐌼𐌰 $1 𐌼𐌹𐌽𐌽𐌹𐌶𐍉𐌽𐌰 𐌺𐌿𐌽𐌾𐌰}}, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌺𐌿𐌽𐌾𐌴.}}",
    +	"category-article-count": "{{PLURAL:$2|𐌸𐌰𐍄𐌰 𐌺𐌿𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐌸 𐌸𐌰𐍄𐌰𐌹𐌽𐌴𐌹 𐌹𐍆𐍄𐌿𐌼𐌰𐌽 𐌻𐌰𐌿𐍆.|𐌹𐍆𐍄𐌿𐌼𐌰(𐌽𐍃) {{PLURAL:$1|𐌻𐌰𐌿𐍆𐍃 𐌹𐍃𐍄|$1 𐌻𐌰𐌿𐌱𐍉𐍃 𐍃𐌹𐌽𐌳}} 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌺𐌿𐌽𐌾𐌰, 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 $2 𐌻𐌰𐌿𐌱𐌴.}}",
    +	"about": "𐌱𐌹",
    +	"article": "𐌷𐌰𐌱𐌰𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
    +	"newwindow": "(𐌿𐍃𐌻𐌿𐌺𐌹𐌸 𐌹𐌽 𐌽𐌹𐌿𐌾𐌰𐌼𐌼𐌰 𐌰𐌿𐌲𐌰𐌳𐌰𐌿𐍂𐌹𐌽)",
    +	"cancel": "𐍃𐍅𐌴𐌹𐌱",
     	"moredotdotdot": "𐌼𐌰𐌹𐍃...",
    -	"mypage": "𐌼𐌴𐌹𐌽 𐍃𐌴𐌹𐌳𐍉",
    -	"mytalk": "𐌼𐌴𐌹𐌽𐌰 𐌼𐌰𐌸𐌻𐌴𐌹",
    -	"navigation": "𐍅𐌹𐌲𐌰𐍄𐌰𐌿𐌷𐍄𐍃",
    +	"mypage": "𐌻𐌰𐌿𐍆𐍃",
    +	"mytalk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
    +	"navigation": "𐌻𐌰𐌿𐌱𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
     	"and": "𐌾𐌰𐌷",
    -	"qbfind": "𐍃𐍉𐌺𐌴𐌹𐌸",
    -	"qbedit": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
    -	"qbmyoptions": "𐌼𐌴𐌹𐌽𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
    -	"actions": "𐍅𐌰𐌿𐍂𐍃𐍄𐍅𐌴𐌹𐌽𐍃",
    -	"namespaces": "𐍃𐌴𐌹𐌳𐍉𐍃𐍄𐌰𐌸𐌴𐌹𐍃",
    -	"variants": "𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌽𐍃",
    -	"errorpagetitle": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰 𐌳𐍅𐌰𐌻𐌹𐍃",
    -	"returnto": "𐌲𐌰𐍅𐌰𐌽𐌳𐌾𐌰𐌽 𐌰𐍄 $1.",
    +	"qbfind": "𐌱𐌹𐌲𐌹𐍄",
    +	"qbedit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
    +	"qbpageoptions": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃",
    +	"qbmyoptions": "𐌼𐌴𐌹𐌽𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
    +	"actions": "𐍄𐍉𐌾𐌰",
    +	"namespaces": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼𐌰",
    +	"variants": "𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺",
    +	"errorpagetitle": "𐌰𐌹𐍂𐌶𐌴𐌹",
    +	"returnto": "𐌲𐌰𐍅𐌰𐌽𐌳𐌴𐌹 𐌳𐌿 $1.",
     	"tagline": "𐍆𐍂𐌰𐌼 {{SITENAME}}",
     	"help": "𐌷𐌹𐌻𐍀𐌰",
    -	"search": "𐍃𐍉𐌺𐌾𐌰𐌽",
    -	"searchbutton": "𐍃𐍉𐌺𐌾𐌰𐌽",
    -	"go": "𐌲𐌰𐌲𐌲𐌰",
    -	"searcharticle": "𐌰𐍆𐌲𐌰𐌲𐌲𐌰𐌽",
    -	"history": "𐌰𐌹𐍂𐌹𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌰𐌽𐌰 𐍃𐌴𐌹𐌳𐍉",
    -	"history_short": "𐌰𐌹𐍂𐌹𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
    -	"printableversion": "𐍅𐍂𐌴𐌹𐍄𐌼𐌰𐌷𐍄𐌴𐌹𐌲 𐍃𐌴𐌹𐌳𐍉",
    -	"permalink": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉 𐍃𐍄𐌰𐌽𐌳𐌰𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐌰",
    -	"view": "Saíhvan",
    -	"edit": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
    -	"create": "𐍃𐌺𐌰𐍀𐌾𐌰𐌽",
    -	"editthispage": "𐌼𐌰𐌹𐌳𐌾𐌰 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉",
    -	"create-this-page": "Skapja þo seido",
    -	"delete": "𐍄𐌰𐌹𐍂𐌰𐌽",
    -	"deletethispage": "𐍄𐌰𐌹𐍂𐌰 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉",
    +	"search": "𐍃𐍉𐌺𐌴𐌹",
    +	"searchbutton": "𐍃𐍉𐌺𐌴𐌹",
    +	"go": "𐌲𐌰𐌲𐌲",
    +	"searcharticle": "𐌲𐌰𐌲𐌲",
    +	"history": "𐌻𐌰𐌿𐌱𐌰𐍃𐍀𐌹𐌻𐌻",
    +	"history_short": "𐍃𐍀𐌹𐌻𐌻",
    +	"printableversion": "𐌿𐍃𐌼𐌴𐍂𐌴𐌹𐌽𐍃 𐌳𐌿 𐌿𐍃𐌼𐌴𐌻𐌾𐌰𐌽",
    +	"permalink": "𐌰𐌹𐍅𐌴𐌹𐌽𐌰 𐌲𐌰𐍅𐌹𐍃𐍃",
    +	"view": "𐍃𐌰𐌹𐍈",
    +	"view-foreign": "𐍃𐌰𐌹𐍈 𐌰𐌽𐌰 $1",
    +	"edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
    +	"create": "𐍃𐌺𐌰𐍀𐌴𐌹",
    +	"editthispage": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
    +	"create-this-page": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
    +	"delete": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹",
    +	"deletethispage": "𐍆𐍂𐌰𐌵𐌹𐍃𐍄𐌴𐌹 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
     	"protect": "𐌱𐌰𐌹𐍂𐌲𐌰𐌽",
    -	"protect_change": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
    -	"protectthispage": "Baírga þo siedo",
    +	"protect_change": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
    +	"protectthispage": "𐌱𐌰𐌹𐍂𐌲 𐌸𐍉 𐍃𐌴𐌹𐌳𐌰",
     	"unprotect": "𐌽𐌹𐌱𐌰𐌹𐍂𐌲𐌰",
     	"unprotectthispage": "Nibaírga þo siedo",
    -	"newpage": "𐌽𐌹𐌿𐌾𐌰 𐍃𐌴𐌹𐌳𐍉",
    -	"talkpage": "𐌼𐌰𐌸𐌻𐌴𐌹𐍃𐌴𐌹𐌳𐍉",
    +	"newpage": "𐌽𐌹𐌿𐌾𐌹𐍃 𐌻𐌰𐌿𐍆𐍃",
    +	"talkpage": "𐌼𐌰𐌸𐌻𐌰𐍃𐌴𐌹𐌳𐌰",
     	"talkpagelinktext": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
    -	"specialpage": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃𐌴𐌹𐌳𐍉𐍃",
    -	"personaltools": "𐍅𐌰𐌹𐍂𐌻𐌴𐌹𐌺𐍃 𐌱𐍂𐌿𐌺𐍅𐌰𐌹𐌷𐍄𐍃",
    +	"specialpage": "𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐍃𐌴𐌹𐌳𐍉𐍃",
    +	"personaltools": "𐍃𐍅𐌴𐍃𐌰𐌹 𐍃𐌰𐍂𐍅𐌰𐌽𐍃",
     	"talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰",
    -	"views": "𐌷𐌹𐍅𐌾𐍉𐍃",
    -	"toolbox": "𐍄𐌰𐌿𐌹 𐌰𐍂𐌺𐌰",
    -	"otherlanguages": "𐌰𐌽𐌸𐌰𐍂 𐍂𐌰𐌶𐌳𐍉𐍃",
    -	"redirectedfrom": "(𐌽𐌰𐌿𐌸𐌾𐌰𐌽 𐍆𐍂𐌰𐌼𐌹𐍃 $1)",
    +	"views": "𐍃𐌹𐌿𐌽𐌴𐌹𐍃",
    +	"toolbox": "𐍃𐌰𐍂𐍅𐌰𐌽𐍃",
    +	"otherlanguages": "𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐍂𐌰𐌶𐌳𐍉𐌼",
    +	"redirectedfrom": "(𐌹𐍃 𐍄𐌹𐌿𐌷𐌰𐌽𐍃/𐍄𐌹𐌿𐌷𐌰𐌽𐌰 𐌷𐌹𐌳𐍂𐌴 𐍆𐍂𐌰𐌼 $1)",
     	"redirectpagesub": "𐍄𐌰𐌹𐌺𐌾𐌰𐍃𐌴𐌹𐌳𐍉",
    -	"lastmodifiedat": "𐌸𐌰𐍄𐌰 𐍃𐌴𐌹𐌳𐍉 𐍃𐌹𐌽𐌳 𐌼𐌰𐌽𐌰𐌲𐌹𐍃𐍄𐍃 𐌽𐌹𐌿𐌾𐌰 𐌼𐌰𐌹𐌳𐌾𐌹𐌸𐍃 ($2) ($1)",
    -	"jumpto": "𐌲𐌰𐌲𐌲𐌰𐌽 𐌰𐍄:",
    -	"jumptonavigation": "𐍃𐌴𐌹𐌳𐍉𐌲𐌰𐍅𐌹𐍃𐍃",
    -	"jumptosearch": "𐍃𐍉𐌺𐌴𐌹𐌸",
    -	"aboutsite": "𐍆𐍂𐌰𐌼 {{SITENAME}}",
    -	"aboutpage": "Project:𐌿𐍆𐌰𐍂",
    +	"lastmodifiedat": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌸𐌰𐍄𐌰 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌸𐍃 𐍅𐌰𐍃 ($1) ($2).",
    +	"jumpto": "𐌲𐌰𐌲𐌲 𐌳𐌿:",
    +	"jumptonavigation": "𐌻𐌰𐌿𐌱𐌰𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
    +	"jumptosearch": "𐍃𐍉𐌺𐌴𐌹",
    +	"aboutsite": "𐌱𐌹 {{SITENAME}}",
    +	"aboutpage": "Project:𐌱𐌹",
     	"copyrightpage": "{{ns:project}}:𐌼𐌰𐌽𐌻𐌴𐌹𐌺𐌰𐍅𐌹𐍄𐍉𐌸𐌰",
     	"currentevents": "𐌽𐌹𐌿𐌾𐌰 𐍅𐌰𐌹𐌷𐍄𐍃",
     	"currentevents-url": "Project:𐌽𐌹𐌿𐌾𐌰 𐍅𐌰𐌹𐌷𐍄𐍃",
    -	"disclaimers": "𐍅𐌰𐌳𐌾𐍉𐌱𐌹𐌻𐌰𐌲𐌴𐌹𐌽𐍃",
    -	"disclaimerpage": "Project:𐍅𐌰𐌳𐌾𐌹𐍃 𐌱𐌹𐌻𐌰𐌲𐌴𐌹𐌽𐍃",
    +	"disclaimers": "𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐍂𐌰𐌹𐌷𐍄𐌰𐌹𐍃",
    +	"disclaimerpage": "Project:𐌲𐌰𐌼𐌰𐌹𐌽𐌰 𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐍂𐌰𐌹𐌷𐍄𐌰𐌹𐍃",
     	"edithelp": "𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌷𐌹𐌻𐍀𐌰",
    -	"mainpage": "𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
    -	"mainpage-description": "𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
    -	"portal": "𐌱𐌰𐌿𐍂𐌲𐌹𐍃 𐌲𐌰𐍅𐌹",
    -	"portal-url": "Project:𐌱𐌰𐌿𐍂𐌲𐌹𐍃 𐌲𐌰𐍅𐌹",
    -	"privacy": "𐍃𐌿𐌽𐌳𐍂𐌰𐍅𐌿𐍃 𐌱𐌹𐌻𐌰𐌲𐌴𐌹𐌽𐍃",
    -	"privacypage": "Project:𐍃𐌿𐌽𐌳𐍂𐌰𐍅𐌴𐌹𐌽𐍃 𐌱𐌹𐌻𐌰𐌲𐌴𐌹𐌽𐍃",
    -	"retrievedfrom": "𐌲𐌰𐌽𐌰𐌼 𐍆𐍂𐌰𐌼 \"$1\"",
    +	"mainpage": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
    +	"mainpage-description": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
    +	"portal": "𐌱𐌰𐌿𐍂𐌲𐍃 𐌲𐌰𐍅𐌹",
    +	"portal-url": "Project:𐌱𐌰𐌿𐍂𐌲𐍃 𐌲𐌰𐍅𐌹",
    +	"privacy": "𐌲𐌰𐍂𐌴𐌳𐌴𐌹𐌽𐍉𐍃 𐍃𐌿𐌽𐌳𐍂𐍉𐍅𐌹𐍃𐌰𐌽𐌰",
    +	"privacypage": "Project:𐌲𐌰𐍂𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐍃𐌿𐌽𐌳𐍂𐍉𐍅𐌹𐍃𐌰𐌽𐌰",
    +	"retrievedfrom": "𐌲𐌰𐌽𐌿𐌼𐌰𐌽 𐍆𐍂𐌰𐌼 \"$1\"",
     	"youhavenewmessages": "𐌸𐌿 𐌷𐌰𐌱𐌹𐍃 $1 ($2).",
    -	"editsection": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
    -	"editold": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
    -	"editlink": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽",
    -	"viewsourcelink": "𐍃𐌰𐌹𐍈𐌹𐍃 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
    -	"editsectionhint": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌳𐌰𐌹𐌻: $1",
    +	"editsection": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
    +	"editold": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
    +	"editlink": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹",
    +	"viewsourcelink": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
    +	"editsectionhint": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌳𐌰𐌹𐌻: $1",
     	"toc": "𐌹𐌽𐌽𐌰𐌽𐌰",
    -	"showtoc": "𐌰𐌿𐌲𐌾𐌰",
    -	"hidetoc": "𐍆𐌹𐌻𐌷𐌰𐌽",
    +	"showtoc": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
    +	"hidetoc": "𐌰𐍆𐍆𐌹𐌻𐌷",
    +	"confirmable-yes": "𐌾𐌰",
    +	"confirmable-no": "𐌽𐌴",
     	"site-rss-feed": "$1 RSS Miþnatifodjan",
    -	"site-atom-feed": "$1 𐌰𐍄𐍉𐌼 𐌼𐌹𐌸𐌽𐌰𐍄𐌹𐍆𐍉𐌳𐌾𐌰𐌽",
    +	"site-atom-feed": "$1 𐌰𐍄𐍉𐌼 𐍆𐍉𐌳𐌴𐌹𐌽𐍃",
     	"page-atom-feed": "\"$1\" 𐌰𐍄𐍉𐌼 𐍂𐌹𐌽𐌽𐍉",
    -	"red-link-title": "$1 (𐍃𐌴𐌹𐌳𐍉 𐍃𐌹𐌽𐌳 𐌽𐌹𐍃𐍄)",
    -	"nstab-main": "𐍃𐌴𐌹𐌳𐍉",
    -	"nstab-user": "𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃𐍃𐌴𐌹𐌳𐍉",
    -	"nstab-special": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃𐌴𐌹𐌳𐍉",
    -	"nstab-project": "𐍂𐌴𐌹𐌺𐌹𐍃𐌴𐌹𐌳𐍉",
    +	"red-link-title": "$1 (𐌻𐌰𐌿𐍆𐍃 𐌽𐌹𐍃𐍄)",
    +	"nstab-main": "𐌻𐌰𐌿𐍆𐍃",
    +	"nstab-user": "𐌱𐍂𐌿𐌺𐌾𐌰𐌻𐌰𐌿𐍆𐍃",
    +	"nstab-special": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃",
    +	"nstab-project": "𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆𐍃",
     	"nstab-image": "𐍆𐌴𐌹𐌻𐌰",
     	"nstab-template": "𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃",
     	"nstab-help": "𐌷𐌹𐌻𐍀𐌰",
    -	"nstab-category": "𐌷𐌰𐌽𐍃𐌰",
    +	"nstab-category": "𐌺𐌿𐌽𐌹",
    +	"mainpage-nstab": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐍆𐍃",
    +	"error": "𐌰𐌹𐍂𐌶𐌴𐌹",
    +	"databaseerror-error": "𐌰𐌹𐍂𐌶𐌴𐌹: $1",
     	"missing-article": "𐍃𐌰 𐌳𐌰𐍄𐌰𐌱𐌿𐍃 𐌽𐌹 𐌲𐌰𐌽𐌰𐌼 𐌸𐌰𐌽𐌰 𐌱𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳𐌰𐌽 𐌴𐌹 𐌹𐍄𐌰 𐍃𐌺𐌰𐌻 𐌱𐌹𐌲𐌹𐍄𐌰𐌽: \"$1\" $2\n\n(The data base did not find the text of a page that it should have found, named \"$1\" $2.\n\nThis is usually caused by following an outdated diff or history link to a page that has been deleted.\n\nIf this is not the case, you may have found a bug in the software.\nPlease report this to an [[Special:ListUsers/sysop|administrator]], making note of the URL.)",
    -	"viewsource": "𐍃𐌰𐌹𐍈𐌹𐍃 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
    -	"yourname": "𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃𐌽𐌰𐌼𐍉:",
    -	"yourpassword": "𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐍃 𐍅𐌰𐌿𐍂𐌳𐌰:",
    +	"badtitle": "𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐍄𐌰 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹",
    +	"badtitletext": "𐍆𐍂𐌰𐌹𐌷𐌰𐌽𐍃 𐌻𐌰𐌿𐍆𐍃 𐍅𐌰𐍃 𐌿𐌽𐌲𐌰𐌼𐌰𐌲𐌰𐌽𐌳𐍃, 𐌻𐌰𐌿𐍃, 𐌰𐌹𐌸𐌸𐌰𐌿 𐌿𐌽𐍂𐌰𐌹𐌷𐍄𐌰𐌱𐌰 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍃 𐌼𐌹𐌸𐍂𐌰𐌶𐌳𐌰 𐌸𐌰𐌿 𐌼𐌹𐌸-𐍅𐌹𐌺𐌹 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹. 𐌼𐌰𐌲𐌹 𐌷𐌰𐌱𐌰𐌽 𐌰𐌹𐌽𐌰 𐌸𐌰𐌿 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐍉𐍃 𐌱𐍉𐌺𐍉𐍃 𐌱𐍂𐌿𐌺𐌹𐌳𐍉𐍃 𐌹𐌽 𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌾𐌰𐌼.",
    +	"viewsource": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
    +	"yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉:",
    +	"userlogin-yourname": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉",
    +	"userlogin-yourname-ph": "𐌼𐌴𐌻𐌴𐌹 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉 𐌸𐌴𐌹𐌽",
    +	"createacct-another-username-ph": "𐌼𐌴𐌻𐌴𐌹 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌼𐍉",
    +	"yourpassword": "𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳:",
    +	"userlogin-yourpassword": "𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
    +	"userlogin-yourpassword-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳 𐌸𐌴𐌹𐌽",
    +	"createacct-yourpassword-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
    +	"createacct-yourpasswordagain": "𐌲𐌰𐍃𐌹𐌲𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
    +	"createacct-yourpasswordagain-ph": "𐌼𐌴𐌻𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳 𐌰𐍆𐍄𐍂𐌰",
    +	"userlogin-remembermypassword": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌼𐌹𐌺 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰𐌽𐌰/𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽𐌰",
     	"login": "Atgaggan",
     	"nav-login-createaccount": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽 / 𐌲𐌰𐌻𐌰𐌽𐌲𐌾𐌰𐌽 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃",
     	"userlogin": "Atgaggan / gaskapjan niutandis",
    +	"userloginnocreate": "𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽",
     	"logout": "𐌻𐌴𐌹𐌸𐌰𐌽",
     	"userlogout": "𐌻𐌴𐌹𐌸𐌰𐌽",
    +	"userlogin-noaccount": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽?",
    +	"userlogin-joinproject": "𐌲𐌰𐌼𐌰𐌹𐌽𐌴𐌹 {{SITENAME}}",
     	"nologinlink": "Gaskapjan þein niutandis",
     	"createaccount": "𐌲𐌰𐌻𐌰𐌲𐌾𐌰𐌽 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃",
     	"gotaccount": "Habiþ þu niutandis? '''$1'''",
     	"gotaccountlink": "Atgaggan",
    +	"userlogin-resetpassword-link": "𐌿𐍆𐌰𐍂𐌼𐌿𐌽𐌽𐍉𐌳𐌴𐍃 𐌸𐌴𐌹𐌽𐌰𐌼𐌼𐌰 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳𐌰?",
    +	"userlogin-helplink2": "𐌷𐌹𐌻𐍀𐌰 𐌼𐌹𐌸 𐌰𐍄𐌲𐌰𐌲𐌲𐌰",
    +	"createacct-emailoptional": "𐌴-𐌱𐍉𐌺𐍉𐍃 (𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍉𐍃)",
    +	"createacct-email-ph": "𐌼𐌴𐌻𐌴𐌹 𐌸𐌴𐌹𐌽𐍉𐍃 𐌴-𐌱𐍉𐌺𐍉𐍃",
    +	"createaccountreason": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰:",
    +	"createacct-reason": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰",
    +	"createacct-submit": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌸𐌴𐌹𐌽𐌰 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
    +	"createacct-benefit-heading": "{{SITENAME}} 𐍄𐌰𐍅𐌹𐌸 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 𐌼𐌰𐌽𐌽𐌰𐌼 𐍃𐍅𐌴 𐌸𐌿𐌺.",
    +	"createacct-benefit-body1": "{{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃}}",
    +	"createacct-benefit-body2": "{{PLURAL:$1|𐌻𐌰𐌿𐍆𐍃|𐌻𐌰𐌿𐌱𐍉𐍃}}",
     	"loginlanguagelabel": "Razda: $1",
    +	"pt-login": "𐌰𐍄𐌲𐌰𐌲𐌲",
    +	"pt-login-button": "𐌰𐍄𐌲𐌰𐌲𐌲",
    +	"pt-createaccount": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽",
    +	"passwordreset": "𐌰𐍆𐍄𐍂𐌰 𐍃𐌰𐍄𐌴𐌹 𐌲𐌰𐌼𐍉𐍄𐌰𐍅𐌰𐌿𐍂𐌳",
     	"bold_sample": "𐌰𐌱𐍂𐍃 𐌱𐍉𐌺𐌰",
     	"bold_tip": "𐌰𐌱𐍂 𐍅𐌰𐌿𐍂𐌳𐌰",
     	"italic_sample": "𐍅𐍂𐌰𐌹𐌵𐍃 𐍅𐌰𐌿𐍂𐌳𐌰",
    @@ -188,27 +229,36 @@
     	"hr_tip": "𐍂𐌰𐌹𐌷𐍄𐍃𐌱𐌰𐌿𐍂𐌳 (𐌱𐍂𐌿𐌺𐌾𐌰𐌽 𐌼𐌹𐌸 𐌽𐌹𐌿𐍆𐌰𐍂𐌿𐍃𐍃𐌿𐍃)",
     	"summary": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽𐍃𐍀𐌹𐌻𐌻𐍉𐌽:",
     	"subject": "𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌱𐍉𐌺𐌰:",
    -	"minoredit": "𐍃𐌰 𐌹𐍃𐍄 𐌻𐌴𐌹𐍄𐌹𐌻𐌰 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
    -	"watchthis": "𐍅𐌰𐍂𐌰𐌽 𐍃𐌴𐌹𐌳𐍉",
    -	"savearticle": "𐌼𐌴𐌻𐌾𐌰 𐍃𐌴𐌹𐌳𐍉",
    +	"minoredit": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
    +	"watchthis": "𐌰𐍄𐍅𐌹𐍄 𐌻𐌰𐌿𐌱𐌰",
    +	"savearticle": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌻𐌰𐌿𐍆",
     	"preview": "𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰 𐍃𐌴𐌹𐌳𐍉",
     	"showpreview": "𐍅𐌹𐍄𐌰𐌽 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰",
    -	"showdiff": "𐍅𐌹𐍄𐌰𐌽 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
    +	"showdiff": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃",
    +	"loginreqlink": "𐌰𐍄𐌲𐌰𐌲𐌲",
     	"newarticle": "(Niu)",
    +	"newarticletext": "𐌻𐌰𐌹𐍃𐍄𐌹𐌳𐌴𐍃 𐌲𐌰𐍅𐌹𐍃 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐍃𐌰𐌴𐌹 𐌽𐌹𐍃𐍄. 𐌳𐌿 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆, 𐌰𐌽 𐌰𐍃𐍄𐍉𐌳𐌴𐌹 𐌼𐌴𐌻𐌾𐌰𐌽 𐌹𐌽 𐌰𐍂𐌺𐌰𐌹 𐌿𐍆 (𐍃𐌰𐌹𐍈 [$1 𐌷𐌹𐌻𐍀𐌰𐌻𐌰𐌿𐍆] 𐌼𐌰𐌽𐌰𐌲𐌹𐌶𐌹𐌽 𐌺𐌿𐌽𐌸𐌾𐌰). 𐌾𐌰𐌱𐌰𐌹 𐌹𐍃 𐌷𐌴𐍂 𐌹𐌽 𐌰𐌹𐍂𐌶𐌴𐌹𐌽𐍃, 𐌲𐌰𐌲𐌲 𐌳𐌿 <𐍃𐍄𐍂𐍉𐌽𐌲>𐌹𐌱𐌿𐌺𐌰𐌷𐌰𐌿𐌱𐌹𐌳𐌹𐌻𐍉𐌽.",
    +	"noarticletext": "𐌽𐌿 𐌽𐌹 𐍃𐌹𐌽𐌳 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.\n𐌼𐌰𐌲𐍄 [[Special:Search/{{PAGENAME}}|𐍃𐍉𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐌻𐌰𐌿𐌱𐌰-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹]] 𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐌻𐌰𐌿𐌱𐌰𐌼,  <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 𐍃𐍉𐌺𐌾𐌰𐌽 𐌲𐌰𐌷𐌰𐌷𐌾𐍉 𐌲𐌰𐍆𐌰𐍃𐍄𐍉𐍃], 𐌰𐌹𐌸𐌸𐌰𐌿 [{{fullurl:{{FULLPAGENAME}}|action=edit}} 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆.]</ span>",
    +	"noarticletext-nopermission": "𐌽𐌿 𐌽𐌹 𐍃𐌹𐌽𐌳 𐌱𐍉𐌺𐍉𐍃 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.\n𐌼𐌰𐌲𐍄 [[Special:Search/{{PAGENAME}}|𐍃𐍉𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐌻𐌰𐌿𐌱𐌰-𐌿𐍆𐌰𐍂𐌼𐌴𐌻𐌹]] 𐌹𐌽 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐌻𐌰𐌿𐌱𐌰𐌼, 𐌸𐌰𐌿 <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 𐍃𐍉𐌺𐌾𐌰𐌽 𐌲𐌰𐌷𐌰𐌷𐌾𐍉 𐌲𐌰𐍆𐌰𐍃𐍄𐍉𐍃]</span>, 𐌹𐌸 𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆.",
     	"updated": "(Nuwisan)",
     	"previewnote": "'''𐍃𐌰𐌷 𐌹𐍃𐍄 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰. 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌲𐌰𐌼𐌴𐌻𐌾𐌹𐌸 𐌽𐌹 𐌰𐍆 𐌸𐌹𐌶𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐍃!'''",
     	"editing": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌰𐍆 $1",
    +	"creating": "𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐍃/𐍃𐌺𐌰𐍀𐌾𐌰𐌽𐌳𐌴𐌹 $1",
     	"editingsection": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌰𐍆 $1 (𐍆𐌴𐍂𐌰)",
     	"editingcomment": "𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐌰𐍆 $1 (𐍂𐍉𐌳𐌾𐌰𐍆𐌴𐍂𐌰)",
    -	"yourdiff": "Missalieks",
    -	"template-protected": "(𐌲𐌰𐌱𐌰𐌹𐍂𐌲𐌾𐌰𐌽)",
    +	"yourdiff": "𐌼𐌹𐍃𐍃𐌰𐌻𐌴𐌹𐌺𐍉𐍃",
    +	"template-protected": "(𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳)",
     	"template-semiprotected": "(halb-gabaírgjan)",
    +	"hiddencategories": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌹𐍃𐍄 𐌲𐌰𐌳𐌰𐌹𐌻𐌰 {{PLURAL:$1|1 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌹𐍃 𐌺𐌿𐌽𐌾𐌹𐍃|$1 𐌰𐌽𐌰𐌻𐌰𐌿𐌲𐌽𐌰𐌹𐌶𐌴 𐌺𐌿𐌽𐌾𐌴}}:‎",
    +	"permissionserrorstext-withaction": "𐌽𐌹 𐌷𐌰𐌱𐌰𐌹𐍃 𐌰𐌽𐌳𐌻𐌴𐍄 𐌳𐌿 $2, 𐌹𐌽 {{PLURAL:$1|𐌹𐍆𐍄𐌿𐌼𐌰𐌹𐌶𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃|𐌹𐍆𐍄𐌿𐌼𐌰𐌹𐌶𐍉 𐍅𐌰𐌹𐌷𐍄𐌴}}:",
    +	"moveddeleted-notice": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌿𐍃𐌽𐌿𐌼𐌰𐌽𐍃 𐌹𐍃𐍄. 𐌿𐍃𐌽𐌿𐌼𐍄𐍃 𐌾𐌰𐌷 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐍃 𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹𐌽𐌰𐌹𐍃 𐌿𐍆 𐍃𐌹𐌽𐌳 𐌿𐍃𐍄𐌰𐌹𐌺𐌽𐌴𐌹𐌽𐌰𐌹.",
     	"post-expand-template-inclusion-warning": "'''𐌷𐍅𐍉𐍄𐌾𐌰𐌽𐌳𐍃:''' 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐌳 𐌿𐍆𐌰𐍂𐌼𐌹𐌺𐌹𐌻𐍃. 𐍃𐌿𐌼𐍃 𐍆𐌰𐌿𐍂𐌴𐌼𐌴𐌻𐌴𐌹𐌽𐍉𐍃 𐌽𐌹 𐌼𐌰𐌲 𐍅𐌹𐍃𐌰𐌽 𐌸𐌰𐍂",
     	"post-expand-template-inclusion-category": "𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌸𐌰𐍂 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽𐍃 𐍃𐌹𐌽𐌳 𐌿𐍆𐌰𐍂𐌼𐌹𐌺𐌹𐌻𐍃",
    +	"viewpagelogs": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌲𐌰𐍆𐌰𐍃𐍄𐌰𐌹𐌽𐌹𐌽𐍃 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
     	"currentrev": "𐌽𐌿 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
    -	"currentrev-asof": "𐌰𐍆𐍄𐌿𐌼𐍃𐍄𐍃 𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $1",
    -	"revisionasof": "𐌲𐌰𐌼𐌰𐌳𐌾𐌴𐌹 𐍆𐍂𐌰𐌼 $1",
    -	"revision-info": "Máideins fram $1 bi $2",
    +	"currentrev-asof": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $1",
    +	"revisionasof": "𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $1",
    +	"revision-info": "𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃 𐌹𐌽 $1 𐍆𐍂𐌰𐌼 {{GENDER:$6|$2}}$7",
     	"previousrevision": "←𐌰𐌹𐍂𐌹𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
     	"nextrevision": "Iftuma máideins→",
     	"currentrevisionlink": "𐌽𐌿𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
    @@ -220,89 +270,116 @@
     	"histfirst": "𐍆𐌰𐌿𐍂𐌸𐌹𐍃",
     	"histlast": "𐍃𐍀𐌴𐌳𐌿𐌼𐌹𐍃𐍄𐍃",
     	"history-feed-item-nocomment": "$1 at $2",
    +	"rev-delundel": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌰𐌽𐌰𐍃𐌹𐌿𐌽",
     	"revdel-restore": "𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌹𐍃 𐌰𐌽𐌰𐍃𐌹𐌿𐌽𐌼𐌰𐌷𐍄𐌴𐌹𐌲𐍃",
     	"revertmerge": "𐌿𐌽𐌲𐌰𐍄𐌹𐌻𐍉𐍃",
    -	"history-title": "𐌰𐍂𐌹𐍃𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌰𐍆 \"$1\"",
    -	"lineno": "𐌱𐍉𐌺𐌰𐍂𐌹𐌲𐌹𐌻𐍉 $1:",
    -	"editundo": "𐌽𐌹𐌿𐍃𐌺𐌰𐍀𐌾𐌰𐌽",
    -	"searchresults": "𐍃𐍉𐌺𐌽𐌹𐍃 𐍄𐌰𐌿𐌾𐍉𐍃",
    -	"searchresults-title": "𐍃𐍉𐌺𐌽𐌹𐍃 𐍄𐌰𐌿𐌾𐍉𐍃 𐍆𐌰𐌿𐍂 \"$1\"",
    +	"history-title": "𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐌹𐍃𐍀𐌹𐌻𐌻 𐌻𐌰𐌿𐌱𐌹𐍃 \"$1\"",
    +	"difference-title": "𐌲𐌰𐍃𐌺𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌼𐌹𐌸 𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐍉𐌼 𐌻𐌰𐌿𐌱𐌹𐍃 \"$1\"",
    +	"lineno": "𐍃𐍄𐍂𐌹𐌺𐍃 $1:",
    +	"editundo": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌰𐍆𐍄𐍂𐌰",
    +	"diff-multi-sameuser": "({{PLURAL:$1|𐌰𐌹𐌽𐌰 𐌼𐌹𐌳𐌿𐌼𐌰𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍃|$1 𐌼𐌹𐌳𐌿𐌼𐌰 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍉𐍃}} 𐍆𐍂𐌰𐌼 𐍃𐌰𐌼𐌹𐌽 𐌱𐍂𐌿𐌺𐌾𐌹𐌽 𐌽𐌹 𐌰𐍄𐌰𐌿𐌲𐌹𐌳𐌰/𐌰𐍄𐌰𐌿𐌲𐌹𐌳𐍉𐍃)",
    +	"searchresults": "𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐍄𐍉𐌾𐌰",
    +	"searchresults-title": "𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐍄𐍉𐌾𐌰 𐍆𐌰𐌿𐍂 \"$1\"",
     	"prevn": "𐌰𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|$1}}",
     	"nextn": "𐌹𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|$1}}",
     	"prevn-title": "𐍆𐌰𐌹𐍂𐌽𐌰 $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐌰𐌿𐌾𐍉𐍃}}",
     	"nextn-title": "𐌰𐍆𐍄𐌿𐌼𐌰 $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐌰𐌿𐌾𐍉𐍃}}",
    -	"shown-title": "𐌰𐌿𐌾𐌰𐌽𐌳 $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐌰𐌿𐌾𐍉𐍃}} 𐌸𐌰𐌹𐍂𐌷 𐍃𐌴𐌹𐌳𐍉",
    +	"shown-title": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 $1 {{PLURAL:$1|𐍄𐌰𐌿𐌹|𐍄𐍉𐌾𐌰}} 𐍈𐌰𐍂𐌾𐌰𐌼𐌼𐌴𐌷 𐌻𐌰𐌿𐌱𐌰.",
     	"viewprevnext": "𐍃𐌹𐌿𐌽𐌴𐌹𐍃 ($1 {{int:pipe-separator}} $2) ($3)",
    -	"searchmenu-new": "'''𐍃𐌺𐌰𐍀𐌾𐌹𐍃 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉𐌽 \"[[:$1]]\" 𐌸𐌹𐌶𐍉𐍃 𐍅𐌹𐌺𐌾𐍉𐍃!'''",
    -	"searchprofile-articles": "𐌲𐌰𐌷𐌰𐌱𐌾𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃",
    -	"searchprofile-images": "𐌼𐌰𐌽𐌰𐌲𐍃𐌼𐌴𐌳𐌹𐌰",
    +	"searchmenu-new": "<strong>𐍃𐌺𐌰𐍀𐌴𐌹 𐌻𐌰𐌿𐍆 \"[[:$1]]\" 𐌰𐌽𐌰 𐌸𐌹𐌶𐌰𐌹 𐍅𐌹𐌺𐌹!</strong> {{{{PLURAL:$2|0=|𐍃𐌰𐌹 𐌾𐌰𐌷 𐌻𐌰𐌿𐍆 𐌱𐌹𐌲𐌹𐍄𐌰𐌽𐌰 𐌸𐌴𐌹𐌽𐌰𐌹 𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹.|𐍃𐌰𐌹 𐌾𐌰𐌷 𐍄𐍉𐌾𐌰 𐍃𐍉𐌺𐌴𐌹𐌽𐌰𐌹𐍃 𐌱𐌹𐌲𐌹𐍄𐌰𐌽𐌰.}}",
    +	"searchprofile-articles": "𐌷𐌰𐌱𐌰𐌽𐌳𐌰𐌽𐍃 𐌻𐌰𐌿𐌱𐍉𐍃",
    +	"searchprofile-images": "𐌼𐌰𐌽𐌰𐌲𐌼𐌴𐌳𐌾𐌰",
     	"searchprofile-everything": "𐌰𐌻𐌻",
     	"searchprofile-advanced": "𐍆𐌰𐌹𐍂𐍂𐌰𐍆𐍂𐌰𐌼𐌰",
    -	"searchprofile-articles-tooltip": "𐍃𐍉𐌺 𐌹𐌽𐌽𐌰 $1",
    +	"searchprofile-articles-tooltip": "𐍃𐍉𐌺𐌴𐌹 𐌹𐌽 $1",
     	"searchprofile-images-tooltip": "𐍃𐍉𐌺𐌾𐌹𐍃 𐍆𐌴𐌹𐌻𐌰𐌽𐍃",
    -	"searchprofile-everything-tooltip": "𐍃𐍉𐌺𐌾𐌹𐍃 𐌰𐌻𐌻 𐌲𐌰𐌷𐌰𐌱𐌾𐍉𐍃 (𐌸𐌹𐌶𐌴𐌴𐌹 𐌹𐍃𐍄 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃)",
    -	"searchprofile-advanced-tooltip": "𐍃𐌺𐍉𐌾𐌹𐍃 𐌹𐌽𐌽𐌰 𐍃𐌹𐌻𐌱𐌰𐍃𐌺𐌰𐍀𐌹𐌸𐍃 𐌽𐌰𐌼𐌰𐌽𐍃𐍄𐌰𐌸",
    +	"searchprofile-everything-tooltip": "𐍃𐍉𐌺𐌴𐌹 𐌰𐌻𐌻 𐌸𐌰𐍄𐌰 (𐌾𐌰𐌷 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰𐌻𐌰𐌿𐌱𐌰𐌽𐍃)",
    +	"searchprofile-advanced-tooltip": "𐍃𐍉𐌺𐌴𐌹 𐌹𐌽 𐌱𐌹𐌿𐌷𐍄𐌰𐌹𐌼 𐌽𐌰𐌼𐌰𐍂𐌿𐌼𐌰𐌼",
     	"search-result-size": "$1 ({{PLURAL:$2|•𐌰• 𐍅𐌰𐌿𐍂𐌳|•$2• 𐍅𐌰𐌿𐍂𐌳𐌰}})",
     	"search-redirect": "(𐌰𐍆𐍄𐍂𐌰𐍅𐌴𐌹𐍄𐍃 𐍆𐍂𐌰𐌼 𐌸𐌰𐌼𐌼𐌰 $1)",
     	"search-section": "(𐍆𐌴𐍂𐌰 $1)",
     	"search-suggest": "𐍄𐌰𐌹𐌺𐌽𐌹𐌳𐌰 𐌸𐌿: $1",
     	"searchall": "𐌰𐌻𐌻𐍃",
    +	"search-showingresults": "{{ZPLURAL:$4|𐍄𐌰𐌿𐌹 <strong>$1 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃 <strong>$3|𐍄𐍉𐌾𐌰 <strong>$1 - $2 𐍅𐌰𐌹𐌷𐍄𐌰𐌹𐍃 <strong>$3}}",
     	"search-nonefound": "𐌽𐌹 𐌰𐌹𐌽𐌷𐌿𐌽 𐌲𐌰𐌲𐌹𐌱𐌾𐍉 𐍆𐌿𐌻𐌻𐌾𐌹𐌸 𐍃𐍉𐌺𐌴𐌹𐌽",
     	"powersearch-legend": "𐍃𐍉𐌺𐌴𐌹𐌸",
     	"preferences": "𐌼𐌴𐌹𐌽𐍉𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃",
    -	"mypreferences": "𐌼𐌴𐌹𐌽𐍉𐍃 𐌱𐍂𐌿𐌺𐌾𐌰",
    +	"mypreferences": "𐌲𐌰𐌻𐌴𐌹𐌺𐌰𐌽𐌳𐌴𐌹𐌽𐍃 𐍅𐌰𐌹𐌷𐍄𐍃",
     	"prefs-skin": "Seidofill",
     	"skin-preview": "Faúrsaiƕa",
     	"saveprefs": "Melja",
     	"searchresultshead": "Sokeiþ",
     	"grouppage-sysop": "{{ns:project}}:𐍃𐌴𐌹𐌳𐍉𐍆𐌰𐌸𐍃",
    +	"right-writeapi": "𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐍃 API 𐌼𐌴𐌻𐌴𐌹𐌽𐌰𐌹𐍃",
     	"rightslog": "Niutandis stutjanlog",
     	"nchanges": "$1 {{PLURAL:$1|máidein|máideins}}",
    -	"recentchanges": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃",
    -	"rcshowhideminor": "$1 lietila máideins",
    -	"rcshowhidebots": "$1 bota",
    -	"rcshowhideliu": "$1 niutandis",
    -	"rcshowhideanons": "$1 gasteis",
    -	"rcshowhidemine": "$1 mein máideins",
    -	"diff": "𐌻𐌴𐌹𐌺𐍃",
    -	"hist": "𐍆𐍂𐌼𐌵",
    +	"enhancedrc-history": "𐍃𐍀𐌹𐌻𐌻",
    +	"recentchanges": "𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
    +	"recentchanges-summary": "𐌰𐍆𐌰𐍂𐌻𐌰𐌹𐍃𐍄𐌴𐌹 𐌸𐌰𐌹𐌼 𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌹𐍃𐍄𐍉𐌼 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐌼 𐌳𐌿 𐍅𐌹𐌺𐌾𐌰 𐌰𐌽𐌰 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
    +	"recentchanges-label-newpage": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐌲𐌰𐍃𐌺𐍉𐍀 𐌽𐌹𐌿𐌾𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
    +	"recentchanges-label-minor": "𐌸𐌰𐍄𐌰 𐌹𐍃𐍄 𐌻𐌴𐌹𐍄𐌹𐌻𐌰 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
    +	"recentchanges-label-bot": "𐍃𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 𐍄𐍉𐌾𐌰𐌳𐌰 𐍅𐌰𐍂𐌸 𐍆𐍂𐌰𐌼 𐌼𐌰𐌷𐍄𐌹𐍃𐌺𐌰𐌻𐌺𐌰 (𐌱𐌰𐌿𐍄)",
    +	"recentchanges-label-plusminus": "𐌻𐌰𐌿𐌱𐌰𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌳𐌰 𐌼𐌹𐌸 𐌸𐌹𐌶𐌰𐌹 𐍂𐌰𐌸𐌾𐍉𐌽 𐌱𐌹𐍄𐍉",
    +	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (𐍃𐌰𐌹𐍈 𐌾𐌰𐌷[[Special:NewPages|𐍅𐌹𐌺𐍉 𐌽𐌹𐌿𐌾𐌰𐌹𐌶𐌴 𐌻𐌰𐌿𐌱𐌴]])",
    +	"rclistfrom": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌽𐌹𐌿𐌾𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃 𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌾𐌰𐌽𐌳𐌴𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 $2, $3",
    +	"rcshowhideminor": "$1 𐌼𐌹𐌽𐌽𐌹𐌶𐌴𐌹𐌽𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
    +	"rcshowhideminor-show": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
    +	"rcshowhideminor-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
    +	"rcshowhidebots": "$1 𐌼𐌰𐌷𐍄𐌹𐍃𐌺𐌰𐌻𐌺𐍉𐍃",
    +	"rcshowhidebots-show": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
    +	"rcshowhidebots-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
    +	"rcshowhideliu": "$1 𐌰𐌽𐌰𐌼𐌴𐌻𐌹𐌳𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
    +	"rcshowhideliu-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
    +	"rcshowhideanons": "$1 𐌰𐍆𐍆𐌹𐌻𐌷𐌰𐌽𐌰𐌹 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
    +	"rcshowhideanons-show": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
    +	"rcshowhideanons-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
    +	"rcshowhidemine": "$1 𐌼𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
    +	"rcshowhidemine-show": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹",
    +	"rcshowhidemine-hide": "𐌰𐍆𐍆𐌹𐌻𐌷",
    +	"rclinks": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍉𐍃 $1 𐌹𐌽𐌼𐌰𐌹𐌳𐌹𐌽𐌹𐌽𐍃 𐌹𐌽 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐌰𐌹𐌼 $2 𐌳𐌰𐌲𐌰𐌼 <br />$3",
    +	"diff": "𐌼𐌹𐍃𐍃",
    +	"hist": "𐍃𐍀𐌹𐌻𐌻",
     	"hide": "𐍆𐌹𐌻𐌷𐌰𐌽",
     	"show": "𐌷𐌿𐌻𐌾𐌰𐌽",
     	"minoreditletter": "l",
     	"newpageletter": "N",
     	"boteditletter": "b",
    -	"recentchangeslinked": "𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌻𐌹𐌴𐌺𐍃",
    +	"recentchangeslinked": "𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
     	"recentchangeslinked-feed": "Máideinlieks",
    -	"recentchangeslinked-toolbox": "𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌻𐌹𐌴𐌺𐍃",
    +	"recentchangeslinked-toolbox": "𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃",
    +	"recentchangeslinked-title": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐍉𐍃 𐌼𐌹𐌸 \"$1\"",
     	"recentchangeslinked-summary": "𐍃𐍉 𐌹𐍃𐍄 𐌻𐌴𐌹𐍃𐍄𐌰 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴 𐌰𐍆𐍄𐌿𐌼𐌹𐍃𐍄𐍃 𐍃𐌺𐍉𐍀 𐌰𐌽𐌰 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐌳 𐌿𐍃 𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹 𐍃𐌴𐌹𐌳𐍉𐌽 (𐌰𐌹𐌸𐌸𐌰𐌿 𐌻𐌹𐌸𐌰𐌿𐍃 𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹𐌶𐍉𐍃 𐌷𐌰𐌽𐍃𐍉𐍃). 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 [[Special:Watchlist|𐍅𐌹𐍄𐌰𐌽𐌳𐌻𐌴𐌹𐍃𐍄𐍉𐍃 𐌸𐌴𐌹𐌽𐍉𐍃]] 𐍃𐌹𐌽𐌳 '''𐌳𐌹𐌲𐍂𐍃𐍄𐌰𐍆𐍃'''.",
    +	"recentchangeslinked-page": "𐌻𐌰𐌿𐌱𐌰𐌽𐌰𐌼𐍉:",
    +	"recentchangeslinked-to": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌻𐌰𐌿𐌱𐌴 𐌸𐌰𐌹𐌴𐌹 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐌰𐌹 𐌳𐌿 𐌲𐌹𐌱𐌰𐌽𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
     	"upload": "𐌿𐍃𐌷𐌻𐌰𐌸𐌰𐌽 𐍆𐌴𐌹𐌻𐌰𐌽𐍃",
     	"uploadbtn": "Ushlaþaiþ Feilans",
     	"uploadlogpage": "Log af Ushlaþan",
    +	"filedesc": "𐌼𐌰𐌿𐍂𐌲𐌿𐍃 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐍃",
     	"watchthisupload": "Witan so seido",
     	"imgfile": "Feilans",
     	"listfiles": "Feilans tala",
     	"file-anchor-link": "𐍆𐌴𐌹𐌻𐌰𐌽𐍃",
     	"filehist": "𐍆𐌴𐌹𐌻𐌰𐌽𐍃 𐌰𐌹𐍂𐌹𐍃",
    -	"filehist-help": "𐌺𐌻𐌹𐌺𐍉𐍃 𐌰𐌽𐌰 𐌳𐌰𐍄𐌰𐌹/𐍈𐌴𐌹𐌻𐌰𐌹 𐍃𐌰𐌹𐍈𐌰𐌽 𐍆𐌴𐌹𐌻𐌰𐌽 𐍃𐍅𐌴 𐌰𐍄𐌰𐌿𐌲𐌾𐌹𐌳𐌰 𐍃𐌹𐌺 𐌸𐌰𐌽.",
    +	"filehist-help": "𐌰𐍄𐍄𐌴𐌺 𐌳𐌰𐌲/𐌼𐌴𐌻 𐌳𐌿 𐌰𐍄𐌰𐌿𐌲𐌾𐌰𐌽 𐌳𐌰𐍄𐌰 𐍃𐍅𐌰𐍃𐍅𐌴 𐌲𐌰𐌱𐌰𐌹𐍂𐌷𐍄𐌹𐌳𐌰 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐌼𐌴𐌻𐌰.",
     	"filehist-current": "𐌽𐌿",
    -	"filehist-datetime": "𐍈𐌴𐌹𐌻𐌰",
    -	"filehist-thumb": "𐍆𐍉𐍂𐍃𐌾𐌰𐌿",
    -	"filehist-thumbtext": "𐍆𐍉𐍂𐍃𐌾𐌰𐌿 𐍆𐌰𐌿𐍂 𐌿𐍃𐌲𐌰𐌱𐌰 𐍆𐍂𐌰𐌼 $1",
    -	"filehist-user": "𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃",
    +	"filehist-datetime": "𐌼𐌴𐌻",
    +	"filehist-thumb": "𐌻𐌴𐌹𐍄𐌹𐌻𐌰 𐍆𐍂𐌹𐍃𐌰𐌷𐍄𐍃",
    +	"filehist-thumbtext": "𐌻𐌴𐌹𐍄𐌹𐌻𐌰𐍆𐍂𐌹𐍃𐌰𐌷𐍄𐍃 𐌿𐍃𐌼𐌴𐍂𐌾𐌰 𐌹𐌽 $1",
    +	"filehist-user": "𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃/𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹",
     	"filehist-dimensions": "𐍅𐌰𐌷𐍃𐍄𐌿𐍃",
     	"filehist-filesize": "Feilans wahstus",
    -	"filehist-comment": "𐌻𐌴𐌹𐍄𐌻𐌰𐍃𐍀𐌹𐌻𐌻𐍉𐌽",
    -	"imagelinks": "𐍆𐌴𐌹𐌻𐌹𐌽𐍃 𐌱𐍂𐌿𐌺𐌹𐍃",
    +	"filehist-comment": "𐍅𐌰𐌿𐍂𐌳",
    +	"imagelinks": "𐌱𐍂𐌿𐌺𐌴𐌹𐌽𐍃 𐍆𐌰𐌴𐌹𐌻𐌴",
     	"linkstoimage": "𐌰𐍆𐍄𐌿𐌼𐌰 {{PLURAL:$1|𐍃𐍉 𐍃𐌴𐌹𐌳𐍉 𐌻𐌴𐌹𐌽𐌺𐍉𐌸|𐌸𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐌳}} 𐌸𐌹𐌶𐍉𐌶𐌿𐌷 𐍆𐌴𐌹𐌻𐍉𐍃",
    -	"sharedupload-desc-here": "𐍃𐌰 𐍆𐌴𐌹𐌻𐌰 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 $1 𐌾𐌰𐌷 𐌼𐌰𐌲 𐍅𐌹𐍃𐌰𐌽 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐍃 𐍆𐍂𐌰𐌼 𐌰𐌻𐌾𐌰𐌹𐌼 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐍉𐌼.\n𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌾𐌰𐌽𐌳𐍃 𐌰𐌽𐌰 𐍃𐌴𐌹𐌳𐌰𐌹 𐍆𐌴𐌹𐌻𐌰𐌽𐍃𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌾𐌰𐌽𐌳𐌹𐍃 𐌸𐌰𐍂 𐌹𐍃𐍄 𐌳𐌰𐌻𐌰𐌸𐌰 𐌿𐍃𐌲𐌹𐌱𐌰𐌽𐍃.",
    +	"sharedupload-desc-here": "𐍃𐍉 𐌳𐌰𐍄𐌰 𐌹𐍃𐍄 𐍆𐍂𐌰𐌼 $1 𐌾𐌰𐌷 𐌼𐌰𐌲 𐌱𐍂𐌿𐌺𐌾𐌰𐌳𐌰 𐍆𐍂𐌰𐌼 𐌰𐌽𐌸𐌰𐍂𐌰𐌹𐌼 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐍉𐌼.\n𐌲𐌰𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐍃 𐌰𐌽𐌰 𐍃𐌴𐌹𐌽𐌰𐌼𐌼𐌰 [$2 𐌳𐌰𐍄𐌰 𐍃𐌺𐌴𐌹𐍂𐌴𐌹𐌽𐌹𐌻𐌰𐌿𐌱𐌰] 𐌾𐌰𐌹𐌽𐌰𐍂 𐌰𐍄𐌰𐌿𐌲𐌹𐌸𐍃 𐌹𐍃𐍄 𐌿𐍆.",
     	"filedelete-submit": "Taíran",
     	"mimesearch": "MIME sokeiþ",
     	"listredirects": "𐍄𐌰𐌻𐌰 𐌰𐍆 𐍄𐌰𐌹𐌺𐌾𐌰𐌽𐍃𐌴𐌹𐌳𐍉𐍃",
    -	"randompage": "𐍃𐌻𐌿𐌼𐍀𐌼𐌰𐍃𐍃𐌹𐌲 𐍃𐌴𐌹𐌳𐍉",
    +	"randompage": "𐌸𐌿𐍃 𐌿𐌽𐌺𐌿𐌽𐌸𐍃 𐌻𐌰𐌿𐍆𐍃",
     	"statistics": "𐍃𐌴𐌹𐌳𐍉𐍃𐍄𐌰𐍄𐌹𐍃𐍄𐌹𐌺",
     	"brokenredirects-edit": "(𐌼𐌰𐌹𐌳𐌾𐌰𐌽)",
     	"brokenredirects-delete": "(𐍄𐌰𐌹𐍂𐌰𐌽)",
    -	"nbytes": "$1 {{PLURAL:$1|𐌱𐌰𐌹𐍄|𐌱𐌰𐌹𐍄𐌰}}",
    +	"nbytes": "$1 {{PLURAL:$1|𐌱𐌹𐍄|𐌱𐌰𐍄𐌰}}",
     	"ncategories": "$1 {{PLURAL:$1|𐌺𐌿𐌽𐌾𐌰|𐌺𐌿𐌽𐌾𐍉𐍃}}",
     	"nlinks": "$1 {{PLURAL:$1|táikjanbandi|táikjanbandja}}",
     	"nmembers": "$1 {{PLURAL:$1|niutand|niutanda}}",
    @@ -310,9 +387,12 @@
     	"shortpages": "𐌻𐌴𐌹𐍄𐌹𐌻𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
     	"longpages": "𐌻𐌰𐌲𐌲𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
     	"listusers": "𐍂𐌴𐌲𐌹𐍃𐍄𐍂𐌴𐍂𐌰𐌳𐌴 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐍃",
    -	"newpages": "𐌽𐌹𐌿𐌾𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
    +	"newpages": "𐌽𐌹𐌿𐌾𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
     	"move": "𐌽𐌰𐌼𐌾𐌰𐌽 𐌰𐍆𐍄𐍂𐌰",
     	"movethispage": "𐍃𐌺𐌹𐌿𐌱𐌰𐌽 𐍃𐌰 𐍃𐌴𐌹𐌳𐍉",
    +	"booksources": "𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
    +	"booksources-search-legend": "𐍃𐍉𐌺𐌴𐌹 𐌱𐍉𐌺𐌰𐌱𐍂𐌿𐌽𐌽𐌰𐌽𐍃",
    +	"booksources-search": "𐍃𐍉𐌺𐌴𐌹",
     	"specialloguserlabel": "Niutand:",
     	"speciallogtitlelabel": "Namo:",
     	"log": "𐌻𐍉𐌲𐌱𐍉𐌺𐍉𐍃",
    @@ -320,13 +400,13 @@
     	"allpages": "𐌰𐌻𐌻𐌹𐍃 𐍃𐌴𐌹𐌳𐍉𐍃",
     	"nextpage": "𐌹𐍆𐍄𐌿𐌼𐌰 𐍃𐌴𐌹𐌳𐍉 ($1)",
     	"prevpage": "𐌰𐍆𐍄𐌿𐌼𐌰 𐍃𐌴𐌹𐌳𐍉 ($1)",
    -	"allarticles": "𐌰𐌻𐌾𐌰 𐍃𐌴𐌹𐌳𐍉𐍃",
    -	"allpagessubmit": "𐌰𐍆𐌲𐌰𐌲𐌲𐌰𐌽",
    -	"categories": "𐌺𐌿𐌽𐌾𐍉𐍃",
    +	"allarticles": "𐌰𐌻𐌻𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
    +	"allpagessubmit": "𐌲𐌰𐌲𐌲",
    +	"categories": "𐌺𐌿𐌽𐌾𐌰",
     	"linksearch-ns": "𐍃𐌴𐌹𐌳𐍉𐍆𐌴𐍂𐌰:",
     	"emailuser": "𐍃𐌰𐌽𐌳𐌾𐌰𐌽 𐌸𐍉 𐌽𐌹𐌿𐍄𐌰𐌽𐌳 𐌱𐍉𐌺𐍉𐌼",
     	"watchlist": "𐌼𐌴𐌹𐌽𐍉𐍃 𐍅𐌹𐍄𐌰𐌽𐌳𐍃𐌻𐌴𐌹𐍃𐍄𐌰",
    -	"mywatchlist": "𐌼𐌴𐌹𐌽𐍉𐍃 𐍅𐌹𐍄𐌰𐌽𐌳𐍃𐌻𐌴𐌹𐍃𐍄𐌰",
    +	"mywatchlist": "𐌻𐌰𐌹𐍃𐍄𐌰𐌻𐌴𐌹𐍃𐍄𐌰",
     	"watch": "𐍅𐌰𐍂𐌰𐌽",
     	"watchthispage": "𐍅𐌰𐍂𐌰𐌽 𐍃𐌴𐌹𐌳𐍉",
     	"unwatch": "𐌽𐌹𐍅𐌰𐍂𐌰𐌽",
    @@ -340,7 +420,8 @@
     	"dellogpage": "𐍄𐌰𐌹𐍂𐌰 𐌰𐌹𐍂𐍅𐌱𐍉𐌺𐌰",
     	"deleteotherreason": "𐌰𐌽𐌸𐌰𐍂/𐌼𐌰𐌹𐍃 𐌼𐌹𐍄𐍉𐌽𐍃:",
     	"deletereasonotherlist": "𐌰𐌽𐌸𐌰𐍂 𐌼𐌹𐍄𐍉𐌽𐍃",
    -	"rollbacklink": "𐌰𐍆𐍅𐌰𐌻𐍅𐌾𐌰𐌽",
    +	"rollbacklink": "𐌰𐍆𐍅𐌰𐌻𐍅𐌴𐌹",
    +	"rollbacklinkcount": "𐌰𐍆𐍅𐌰𐌻𐍅𐌴𐌹 $1 {{PLURAL:$1|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽|𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃}}",
     	"protectlogpage": "Log af Baírgjan",
     	"prot_1movedto2": "[[$1]] skiubiþ du [[$2]]",
     	"protect-level-sysop": "𐍃𐌴𐌹𐌳𐍉𐍆𐌰𐌸𐍃 𐌰𐌹𐌽𐌰𐌷𐌰",
    @@ -352,102 +433,142 @@
     	"undeletelink": "𐍃𐌰𐌹𐍈𐌰𐌽/𐌰𐍆𐍄𐍂𐌰𐌲𐌰𐍃𐌰𐍄𐌾𐌰𐌽",
     	"undeleteviewlink": "𐍃𐌰𐌹𐍈𐌹𐍃",
     	"undelete-search-submit": "Sokeiþ",
    -	"namespace": "𐍃𐌴𐌹𐌳𐍉𐍆𐌴𐍂𐌰:",
    +	"namespace": "𐌽𐌰𐌼𐌰𐍂𐌿𐌼:",
     	"invert": "Afwandjan kustus",
     	"blanknamespace": "(𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐍃)",
    -	"contributions": "𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃 𐌰𐌹𐍅𐌻𐌰𐌲𐌹𐍉𐍃",
    -	"mycontris": "𐌼𐌴𐌹𐌽𐍉𐍃 𐌰𐌹𐍅𐌻𐌰𐌲𐌹𐍉𐍃",
    +	"contributions": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃 {{{{GENDER:$1|User}}",
    +	"mycontris": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃",
     	"contribsub2": "𐍆𐌰𐌿𐍂 $1 ($2)",
    -	"uctop": "(háubiþ)",
    +	"uctop": "(𐌷𐌰𐌿𐌱𐌹𐌸)",
     	"month": "𐍆𐍂𐌰𐌼 𐌼𐌴𐌽𐍉𐌸𐍃 (𐌾𐌰𐌷 𐌰𐍆𐍄𐌿𐌼𐌰):",
     	"year": "𐍆𐍂𐌰𐌼 𐌾𐌴𐍂𐌰 (𐌾𐌰𐌷 𐌰𐍆𐍄𐌿𐌼𐌰):",
     	"sp-contributions-newbies-sub": "Faúr niujis niutandis",
     	"sp-contributions-blocklog": "Logboka af afdraúsjan",
     	"sp-contributions-talk": "Maþleiseido",
    -	"whatlinkshere": "𐍈𐌰𐍂𐌾𐌹𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌷𐌻𐌰𐌲𐌺𐌾𐌰𐌽𐌳 𐌷𐌹𐌳𐍂𐌴",
    -	"whatlinkshere-title": "Seidos hwarjis du $1 táiknjan",
    +	"whatlinkshere": "𐌰𐌻𐌻𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 𐌷𐌹𐌳𐍂𐌴",
    +	"whatlinkshere-title": "𐌻𐌰𐌿𐌱𐍉𐍃 𐌸𐌰𐌹𐌴𐌹 𐍄𐌰𐌹𐌺𐌽𐌾𐌰𐌽𐌳 𐌳𐌿 \"$1\"",
    +	"whatlinkshere-page": "𐌻𐌰𐌿𐍆𐍃:",
    +	"linkshere": "𐌹𐍆𐍄𐌿𐌼𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺  <strong>[[:$1]]</strong>:",
     	"isredirect": "𐍄𐌰𐌹𐌺𐌾𐌰𐍃𐌴𐌹𐌳𐍉",
     	"istemplate": "ináukan",
     	"whatlinkshere-prev": "{{PLURAL:$1|aftuma|aftumans $1}}",
     	"whatlinkshere-next": "{{PLURAL:$1|iftuma|iftumans $1}}",
     	"whatlinkshere-links": "← táikajanbandja",
    +	"whatlinkshere-hidelinks": "$1 𐌲𐌰𐍅𐌹𐍃𐍃𐌴𐌹𐍃",
     	"blockip": "𐌰𐍆𐌳𐍂𐌰𐌿𐍃𐌾𐌰𐌽 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃",
     	"ipbreason": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰:",
     	"ipboptions": "𐌱 𐌰𐍅𐍂𐌰:2 hours, 𐌰 𐌳𐌰𐌲𐍃:1 day, 𐌲 𐌳𐌰𐌲𐍉𐍃:3 days, 𐌰 𐍅𐌹𐌺𐍉:1 week, 𐌱 𐍅𐌹𐌺𐍉𐌽𐍃:2 weeks, 𐌰 𐌼𐌴𐌽𐍉𐌸𐍃:1 month, 𐌲 𐌼𐌴𐌽𐍉𐌸𐍉𐍃:3 months, 𐌵 𐌼𐌴𐌽𐍉𐌸𐍉𐍃:6 months, 𐌰 𐌾𐌴𐍂:1 year, 𐌹𐌽𐌿𐍄𐍂𐌹𐌲𐌲𐌴𐌽𐌳𐌴𐌹𐍃:infinite",
     	"ipblocklist-submit": "Sokeiþ",
     	"infiniteblock": "ajukduþs",
    -	"blocklink": "𐍅𐌰𐍂𐌲𐌾𐌰𐌽",
    +	"blocklink": "𐍆𐌰𐌿𐍂𐌳𐌰𐌼𐌼𐌴𐌹",
     	"unblocklink": "𐍅𐌰𐌽𐌳𐌾𐌰𐌽",
     	"change-blocklink": "𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌰𐌽 𐍅𐌰𐌿𐍂𐌾𐌰𐍅𐌰𐌳𐌳𐌾𐌿𐍃",
    -	"contribslink": "𐌲𐌹𐌱𐍉𐍃",
    +	"contribslink": "𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃",
     	"blocklogpage": "𐌻𐍉𐌲𐌱𐍉𐌺𐌰 𐌰𐍆 𐌰𐍆𐌳𐍂𐌰𐌿𐍃𐌾𐌰𐌽",
     	"blocklogentry": "𐌰𐍆𐌳𐍂𐌰𐌿𐍃𐌹𐌸 [[$1]] 𐍆𐌰𐌿𐍂 $2 $3",
    -	"movearticle": "𐍃𐌺𐌹𐌿𐌱𐌰 𐍃𐌴𐌹𐌳𐍉:",
     	"newtitle": "𐌳𐌿 𐌽𐌹𐌿𐌾𐌹𐍃 𐌽𐌰𐌼𐍉𐍃:",
     	"move-watch": "𐍅𐌹𐍄𐌰𐌽 𐍃𐍉 𐍃𐌴𐌹𐌳𐍉",
     	"movepagebtn": "𐍃𐌺𐌹𐌿𐌱𐌰 𐍃𐌴𐌹𐌳𐍉",
     	"movelogpage": "Log af skiubans",
     	"movereason": "𐍆𐌰𐌹𐍂𐌹𐌽𐌰:",
     	"revertmove": "𐍂𐌰𐌹𐌳𐌾𐌰𐌽",
    -	"export": "𐌿𐍄𐌼𐌹𐌸𐍃𐌰𐍄𐌾𐌹𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃",
    -	"thumbnail-more": "𐌱𐌹𐌰𐌿𐌺𐌰𐌽",
    -	"tooltip-pt-userpage": "𐌸𐌴𐌹𐌽𐌰 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-pt-mytalk": "𐌸𐌴𐌹𐌽𐌰 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-pt-preferences": "𐌼𐌴𐌹𐌽𐍉𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌴𐌹𐍃",
    -	"tooltip-pt-watchlist": "𐌻𐌴𐌹𐍃𐍄𐌰 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌴𐌹 𐌸𐌿 𐌰𐍄𐍅𐌹𐍄𐌰𐌹𐍃 𐍆𐌰𐌿𐍂 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃",
    -	"tooltip-pt-mycontris": "𐍄𐌰𐌻𐌰 𐌰𐍆 𐌸𐌴𐌹𐌽 𐌲𐌹𐌱𐍉𐌽𐍃",
    -	"tooltip-pt-login": "𐌸𐌿 𐌹𐍃 𐌲𐌰𐍈𐌰𐍄𐌾𐌰𐌽𐌳𐍃 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽; 𐌰𐌸𐌸𐌰𐌽, 𐌽𐌹𐍃𐍄 𐌸𐌰𐌿𐍂𐌱𐌰𐌽𐍃",
    +	"export": "𐌿𐍄𐌱𐌰𐌹𐍂 𐌻𐌰𐌿𐌱𐌰𐌽𐍃",
    +	"thumbnail-more": "\n𐌼𐌹𐌺𐌹𐌻𐌴𐌹",
    +	"tooltip-pt-userpage": "{{GENDER:|Your user}} 𐌻𐌰𐌿𐍆𐍃",
    +	"tooltip-pt-mytalk": "{{GENDER:|Your}} 𐌻𐌰𐌿𐍆𐍃 𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌹𐍃",
    +	"tooltip-pt-preferences": "{{GENDER:|Your}} 𐌲𐌰𐌻𐌴𐌹𐌺𐌰𐌽𐌳𐌴𐌹𐌽𐍃 𐍅𐌰𐌹𐌷𐍄𐍃",
    +	"tooltip-pt-watchlist": "𐍅𐌹𐌺𐍉 𐌻𐌰𐌿𐌱𐌴 𐌸𐌹𐌶𐌴𐌴𐌹 𐌰𐍄𐍅𐌰𐌹𐍃𐍄 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌼",
    +	"tooltip-pt-mycontris": "A list of {{GENDER:|your}} 𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴𐌹𐍃 𐌱𐍂𐌿𐌺𐌾𐌰𐌽𐌳𐌹𐍃",
    +	"tooltip-pt-login": "𐍄𐌹𐌼𐍂𐌾𐌰𐌶𐌰 𐌳𐌿 𐌰𐍄𐌲𐌰𐌲𐌲𐌰𐌽, 𐌹𐌸 𐌽𐌹𐍃𐍄 𐍃𐌺𐌿𐌻𐌳 𐌸𐌿𐍃",
     	"tooltip-pt-logout": "𐌻𐌴𐌹𐌸𐌰𐌽",
    -	"tooltip-ca-talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹 𐌱𐌹 𐌲𐌰𐌷𐌰𐌱𐌾𐌰 𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-ca-edit": "𐌸𐌿 𐌼𐌰𐌲𐍄 𐌼𐌰𐌹𐌳𐌾𐌹𐍃 𐌸𐌰𐍄𐌰 𐍃𐌴𐌹𐌳𐍉. 𐌾𐌰𐌱𐌰𐌹 𐍅𐌹𐌻𐌴𐌹𐍃, 𐌱𐍂𐌿𐌺𐌾𐌹𐍃 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰𐌹𐍃 𐍆𐍂𐌿𐌼𐌰.",
    -	"tooltip-ca-addsection": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌾𐌹𐍃 𐌽𐌹𐌿𐌾𐌰 𐌳𐌰𐌹𐌻",
    -	"tooltip-ca-viewsource": "𐍃𐍉 𐍃𐌴𐌹𐌳𐍉 𐌹𐍃𐍄 𐌷𐌻𐌴𐌹𐌱𐌾𐌰𐌽𐌳𐍃\n𐌸𐌿 𐌼𐌰𐌲𐍄 𐍃𐌰𐌹𐍈𐌹𐍃 𐌹𐌶𐍉𐍃 𐌱𐍂𐌿𐌽𐌽𐌰𐌽",
    -	"tooltip-ca-history": "𐍆𐌰𐌿𐍂𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐍃 𐌸𐌹𐌶𐌿𐌷 𐍃𐌴𐌹𐌳𐍉𐌽𐍃",
    +	"tooltip-pt-createaccount": "𐌱𐌰𐍄𐌹𐌶𐍉 𐌹𐍃𐍄 𐌸𐌿𐍃 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌺𐌰𐍅𐍄𐍃𐌾𐍉𐌽, 𐌹𐌸 𐍃𐌺𐌿𐌻𐌳 𐌽𐌹𐍃𐍄",
    +	"tooltip-ca-talk": "𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌹 𐌱𐌹 𐌷𐌰𐌱𐌰𐌽𐌳𐌰𐌽 𐌻𐌰𐌿𐍆",
    +	"tooltip-ca-edit": "𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
    +	"tooltip-ca-addsection": "𐌰𐌽𐌰𐍃𐍄𐍉𐌳𐌴𐌹 𐌽𐌹𐌿𐌾𐌰 𐌳𐌰𐌹𐌻",
    +	"tooltip-ca-viewsource": "𐍃𐌰 𐌻𐌰𐌿𐍆𐍃 𐌷𐌰𐌱𐌰𐌹𐌸 𐌼𐌿𐌽𐌳. 𐌼𐌰𐌲𐍄 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌼𐌿𐌽𐌳 𐍃𐌰𐌹𐍈𐌰𐌽.",
    +	"tooltip-ca-history": "𐌰𐍆𐍄𐌿𐌼𐍉𐍃 𐌲𐌰𐌱𐍉𐍄𐌴𐌹𐌽𐍉𐍃 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
     	"tooltip-ca-protect": "𐌱𐌰𐌹𐍂𐌲𐌰 𐌸𐍉 𐍃𐌴𐌹𐌳𐍉",
     	"tooltip-ca-delete": "𐍄𐌰𐌹𐍂𐌰𐌽 𐍃𐍉 𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-ca-move": "𐍃𐌺𐌹𐌿𐌱𐌰𐌽 𐍃𐍉 𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-ca-watch": "𐌰𐌽𐌰𐌰𐌿𐌺𐌹𐍃 𐌸𐌹𐌶𐌰𐌹 𐍃𐌴𐌹𐌳𐍉𐌽 𐌰𐌽𐌰 𐌸𐌴𐌹𐌽𐌰 𐍅𐌹𐍄𐌰𐌽𐌳𐌻𐌴𐌹𐍃𐍄𐌰",
    +	"tooltip-ca-move": "𐌼𐌹𐌸𐍃𐌰𐍄𐌴𐌹 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
    +	"tooltip-ca-watch": "𐌱𐌹𐌰𐌹𐌰𐌿𐌺 𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆 𐌳𐌿 𐌸𐌴𐌹𐌽𐌰𐌹 𐍅𐌹𐍄𐌰𐍅𐌹𐌺𐍉𐌽",
     	"tooltip-search": "𐍃𐍉𐌺𐌾𐌰𐌽 {{SITENAME}}",
    -	"tooltip-search-go": "𐍆𐌰𐍂𐌹𐍃 𐌳𐌿 𐍃𐌴𐌹𐌳𐍉𐌽 𐌼𐌹𐌸 𐌲𐌻𐌰𐌲𐌲𐌿𐌾𐌰𐌼𐌰 𐌽𐌰𐌼𐌹𐌽 𐌾𐌰𐌱𐌰𐌹 𐌹𐍃𐍄",
    -	"tooltip-search-fulltext": "𐍃𐍉𐌺𐌾𐌰𐌽 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐍆𐌰𐌿𐍂 𐌸𐌰𐌽𐌰 𐌱𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳𐌰𐌽",
    -	"tooltip-p-logo": "𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-n-mainpage": "𐍃𐌰𐌹𐍈𐌰𐌽 𐍃𐌰 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-n-mainpage-description": "𐍃𐌰𐌹𐍈𐌰𐌹𐍃 𐍃𐌰 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-n-portal": "𐌱𐌹 𐌸𐌹𐌶𐌰𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌹, 𐍈𐌰𐍃 𐌸𐌿 𐌼𐌰𐌲 𐍄𐌰𐌿𐌾𐌰, 𐍈𐌰𐍃 𐍃𐍄𐌰𐌸𐍃 𐌱𐌹𐌲𐌹𐍄𐌰𐌽 𐌹𐌽𐍃",
    -	"tooltip-n-currentevents": "𐌱𐌹𐌲𐌹𐌸𐌹𐍃 𐌱𐌰𐌺𐌲𐌰𐌷𐌰𐌱𐌹 𐌱𐌹 𐌽𐌹𐌿𐌾𐌰𐌽𐍃 𐍅𐌰𐌹𐌷𐍄𐌰𐌽𐍃",
    -	"tooltip-n-recentchanges": "𐌻𐌴𐌹𐍃𐍄𐌰 𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐌴 𐌽𐌿 𐌰𐌽𐌰 𐌸𐌰𐌼𐌼𐌰 𐍅𐌹𐌺𐌾𐌰",
    -	"tooltip-n-randompage": "𐌿𐍃𐌻𐌰𐌸𐌰𐌹𐌸 𐍃𐌻𐌿𐌼𐍀𐌼𐌰𐍃𐍃𐌹𐌾𐌹𐍃 𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-n-help": "𐍃𐌰 𐍃𐍄𐌰𐌸𐍃 𐍆𐌹𐌽𐌸𐌰𐌽",
    -	"tooltip-t-whatlinkshere": "𐌻𐌴𐌹𐍃𐍄𐌰 𐌰𐌻𐌻𐌹𐍃 𐍅𐌹𐌺𐌾𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍉 𐌴𐌹 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐌳 𐌷𐌹𐌳𐍂𐌴",
    -	"tooltip-t-recentchangeslinked": "𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐍃 𐌽𐌿 𐍅𐌹𐌸𐍂𐌰 𐍃𐌴𐌹𐌳𐍉𐌽𐍃 𐌸𐌰𐍄𐌴𐌹 𐍃𐌹𐌽𐌳 𐌻𐌴𐌹𐌽𐌺𐍉𐌽𐍃 𐌿𐍃 𐌸𐌰𐌼𐌼𐌰 𐍃𐌴𐌹𐌳𐍉𐌽",
    -	"tooltip-feed-atom": "𐌰𐍄𐍉𐌼 𐍂𐌹𐌽𐌽𐍉 𐌱𐌹 𐌸𐌹𐌶𐌰𐌹 𐍃𐌴𐌹𐌳𐍉𐌽",
    +	"tooltip-search-go": "𐌾𐌰𐌱𐌰𐌹 𐌹𐍃𐍄, 𐌲𐌰𐌲𐌲 𐌳𐌿 𐌻𐌰𐌿𐌱𐌰 𐌼𐌹𐌸 𐍃𐌰𐌼𐌹𐌽 𐌽𐌰𐌼𐌹𐌽.",
    +	"tooltip-search-fulltext": "𐍃𐍉𐌺𐌴𐌹 𐌻𐌰𐌿𐌱𐌰𐌽𐍃 𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼",
    +	"tooltip-p-logo": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
    +	"tooltip-n-mainpage": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
    +	"tooltip-n-mainpage-description": "𐌲𐌰𐍅𐌴𐌹𐍃 𐌷𐌰𐌿𐌱𐌹𐌳𐌰𐌻𐌰𐌿𐌱𐌹𐍃",
    +	"tooltip-n-portal": "𐌱𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰, 𐍈𐌰 𐌼𐌰𐌲𐍄 𐍄𐌰𐌿𐌾𐌰𐌽, 𐍈𐌰𐍂 𐌱𐌹𐌲𐌹𐍄𐌹𐍃 𐍅𐌰𐌹𐌷𐍄𐌹𐌽𐍃",
    +	"tooltip-n-currentevents": "𐌱𐌹𐌲𐌹𐍄 𐌼𐌰𐌹𐍃 𐌺𐌿𐌽𐌸𐌹 𐌱𐌹 𐌽𐌹𐌿𐌾𐍉𐍃 𐍅𐌰𐌿𐍂𐌸𐌰𐌽𐍉𐍃 𐍅𐌰𐌹𐌷𐍄𐌹𐌽𐍃",
    +	"tooltip-n-recentchanges": "𐍅𐌹𐌺𐍉 𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐌶𐍉 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉 𐌹𐌽 𐌸𐌰𐌼𐌼𐌰 𐍅𐌹𐌺𐌾𐌰",
    +	"tooltip-n-randompage": "𐌿𐍃𐌱𐍂𐌹𐌲𐌲 𐌸𐌿𐍃 𐌿𐌽𐌺𐌿𐌽𐌸𐌰𐌽𐌰 𐌻𐌰𐌿𐍆",
    +	"tooltip-n-help": "𐍃𐌰 𐍃𐍄𐌰𐌸𐍃 𐌳𐌿 𐌱𐌹𐌲𐌹𐍄𐌰𐌽",
    +	"tooltip-t-whatlinkshere": "𐍅𐌹𐌺𐍉 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 𐍅𐌹𐌺𐌾𐌰𐌻𐌰𐌿𐌱𐌴 𐌸𐌹𐌶𐌴𐌴𐌹 𐌱𐍂𐌹𐌲𐌲𐌰𐌽𐌳 𐌸𐌿𐌺 𐌷𐌹𐌳𐍂𐌴",
    +	"tooltip-t-recentchangeslinked": "𐌰𐌽𐌳𐍅𐌰𐌹𐍂𐌸𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍉𐍃 𐌹𐌽 𐌻𐌰𐌿𐌱𐌰𐌼 𐌲𐌰𐍅𐌹𐌳𐌰𐌽𐌰𐌹𐌼 𐌰𐍆 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰.",
    +	"tooltip-feed-atom": "𐌰𐍄𐍉𐌼 𐍆𐍉𐌳𐌴𐌹𐌽𐍃 𐌸𐌰𐌼𐌼𐌰 𐌻𐌰𐌿𐌱𐌰",
    +	"tooltip-t-contributions": "𐍅𐌹𐌺𐍉 𐌱𐌹𐌰𐌿𐌺𐌰𐌹𐌽𐌴 𐍆𐍂𐌰𐌼 {{GENDER:$1|𐌸𐌰𐌼𐌼𐌰 𐌱𐍂𐌿𐌺𐌾𐌹𐌽}}",
     	"tooltip-t-upload": "𐌿𐍃𐌷𐌻𐌰𐌸𐌰𐌽 𐍆𐌴𐌹𐌻𐌰𐌽𐍃",
    -	"tooltip-t-specialpages": "𐌻𐌴𐌹𐍃𐍄𐌰 𐌸𐌹𐌶𐍉 𐌿𐍃𐍃𐌹𐌽𐌳𐍃𐌴𐌹𐌳𐍉𐌽𐍉",
    -	"tooltip-t-print": "𐍅𐍂𐌴𐌹𐍄𐌼𐌰𐌷𐍄𐌴𐌹𐌲 𐌿𐍃𐌲𐌰𐌱𐍉𐍃 𐌸𐌹𐌶𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃",
    -	"tooltip-t-permalink": "𐍃𐌹𐌽𐍄𐌴𐌹𐌽𐍉 𐍃𐍄𐌰𐌽𐌳𐌰𐌽𐍃 𐌻𐌴𐌹𐌽𐌺𐌰 𐍅𐌹𐌸𐍂𐌰 𐌲𐌰𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽 𐌸𐌹𐌶𐍉𐍃 𐍃𐌴𐌹𐌳𐍉𐌽𐍃",
    -	"tooltip-ca-nstab-main": "𐍃𐌰𐌹𐍈𐌰𐌹𐍃 𐌸𐌰𐍄𐌰 𐌲𐌰𐌷𐌰𐌱𐌾𐌰 𐍃𐌴𐌹𐌳𐍉",
    -	"tooltip-ca-nstab-user": "𐍃𐌰𐌹𐍈𐌰𐌽 𐍃𐌰 𐌽𐌹𐌿𐍄𐌰𐌽𐌳𐌹𐍃𐍃𐌴𐌹𐌳𐍉",
    +	"tooltip-t-specialpages": "𐍅𐌹𐌺𐍉 𐌰𐌻𐌻𐌰𐌹𐌶𐌴 𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹𐌶𐌴 𐌻𐌰𐌿𐌱𐌴",
    +	"tooltip-t-print": "𐌿𐍃𐌼𐌴𐍂𐌴𐌹𐌽𐍃 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃 𐌳𐌿 𐌿𐍃𐌼𐌴𐌻𐌾𐌰𐌽",
    +	"tooltip-t-permalink": "𐌰𐌹𐍅𐌴𐌹𐌽𐌰 𐌲𐌰𐍅𐌹𐍃𐍃 𐌳𐌿 𐌸𐌹𐌶𐌰𐌹 𐌰𐍆𐍄𐍂𐌰𐍃𐌹𐌿𐌽𐌰𐌹 𐌸𐌹𐍃 𐌻𐌰𐌿𐌱𐌹𐍃",
    +	"tooltip-ca-nstab-main": "𐍃𐌰𐌹𐍈 𐌷𐌰𐌱𐌰𐌽𐌳𐌰𐌽 𐌻𐌰𐌿𐍆",
    +	"tooltip-ca-nstab-user": "𐍃𐌰𐌹𐍈 𐌱𐍂𐌿𐌺𐌾𐌰𐌻𐌰𐌿𐍆",
    +	"tooltip-ca-nstab-special": "𐍃𐌰 𐌹𐍃𐍄 𐌿𐍃𐍃𐌹𐌽𐌳𐍃 𐌻𐌰𐌿𐍆𐍃 𐌾𐌰𐌷 𐌽𐌹 𐌼𐌰𐌲 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌰𐌳𐌰.",
    +	"tooltip-ca-nstab-project": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍆𐌰𐌿𐍂𐌰𐍅𐌰𐌿𐍂𐍀𐌰𐌻𐌰𐌿𐍆",
     	"tooltip-ca-nstab-image": "𐍃𐌰𐌹𐍈𐌰𐌽 𐌸𐍉 𐍆𐌴𐌹𐌻𐌰𐍃𐌴𐌹𐌳𐍉𐌽",
     	"tooltip-ca-nstab-template": "𐍃𐌰𐌹𐍈𐌹𐍃 𐍆𐌰𐌿𐍂𐌰𐌼𐌴𐌻𐌴𐌹𐌽",
    -	"tooltip-ca-nstab-category": "𐍃𐌰𐌹𐍈𐌹𐍃 𐍃𐌴𐌹𐌳𐍉𐌽 𐌷𐌰𐌽𐍃𐍉",
    -	"tooltip-save": "𐍃𐌺𐍂𐌴𐌹𐌱𐌰𐌹𐌽 𐌸𐌴𐌹𐌽 𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃",
    +	"tooltip-ca-nstab-category": "𐍃𐌰𐌹𐍈 𐌺𐌿𐌽𐌾𐌰𐌻𐌰𐌿𐍆",
    +	"tooltip-save": "𐌲𐌰𐍆𐌰𐍃𐍄 𐌸𐌴𐌹𐌽𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃",
     	"tooltip-preview": "𐍆𐌰𐌿𐍂𐍃𐌰𐍈𐌹𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐍉𐍃 𐌸𐌴𐌹𐌽𐌰, 𐌱𐌹𐌳𐌾𐌰 𐌸𐌿𐌺 𐌱𐍂𐌿𐌺𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐍆𐌰𐌿𐍂𐌰 𐌼𐌴𐌻𐌾𐌹𐍃!",
    -	"tooltip-diff": "𐍃𐌰𐌹𐍈𐌹𐌸 𐌸𐌰𐌽𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐍉𐍃 𐌸𐌰𐍄𐌴𐌹 𐌱𐍂𐌿𐌺𐌾𐌹𐍃 𐌱𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳𐌹𐌽𐍃",
    +	"tooltip-diff": "𐌰𐍄𐌰𐌿𐌲𐌴𐌹 𐍈𐌹𐌻𐌴𐌹𐌺𐍉𐍃 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐌹𐌽𐍃 𐌲𐌰𐍄𐌰𐍅𐌹𐌳𐌴𐍃 𐌳𐌿 𐌸𐌰𐌹𐌼 𐌱𐍉𐌺𐍉𐌼",
     	"tooltip-rollback": "\"𐌰𐍆𐍅𐌰𐌻𐍅𐌾𐌰𐌽\" 𐌱𐌰𐌺𐌼𐌰𐌹𐌳𐌾𐌹𐌸 𐌹𐌽𐌼𐌰𐌹𐌳𐌾𐌴𐌹𐌽𐍃 𐌱𐌹 𐌸𐌹𐌶𐌰𐌹 𐍃𐌴𐌹𐌳𐍉𐌽 𐍅𐌹𐍃𐌰𐌽 𐍃𐍉 𐌲𐌰𐌼𐌰𐌳𐌾𐌴𐌹 𐌼𐌰𐌽𐌰𐌲𐌹𐍃𐍄𐍃 𐌽𐌹𐌿𐌾𐌰 𐌲𐌹𐌱𐌰𐌾𐌹𐌽𐍃 𐍆𐍂𐌰𐌼 𐌰𐌹𐌽𐍃 𐌺𐌻𐌹𐌺",
     	"tooltip-undo": "\"𐌽𐌹𐌿𐍃𐌺𐌰𐍀𐌾𐌰𐌽\" 𐌱𐌰𐌺𐌼𐌰𐌹𐌳𐌾𐌹𐌸 𐌹𐌽𐌼𐌰𐌹𐌳𐌲𐌴𐌹𐌽𐍃 𐌾𐌰𐌷 𐌿𐍃𐌻𐌿𐌺𐍉𐌸 𐌼𐌰𐌹𐌳𐌾𐌰𐍆𐍉𐍂𐌼𐍉𐌽 𐍃𐍅𐌴 𐍆𐌰𐌿𐍂𐍃𐌰𐌹𐍈𐌰 𐌷𐌹𐍅𐌾𐌰. 𐌸𐌰𐍄𐌰 𐌻𐌴𐍄 𐌰𐌽𐌰𐌿𐌺𐌰𐌽𐌰𐌽 𐍃𐌰𐌿𐌸𐌰 𐌹𐌽 𐌹𐌽𐌽𐌰𐌷𐌰𐌻𐌳𐌰𐌰𐌽𐌲𐌰𐌱𐌰.",
     	"tooltip-summary": "𐌰𐍄𐌲𐌰𐌲𐌲𐌹𐍃 𐌹𐌽𐌽𐌰𐌷𐌰𐌻𐌳𐌰𐌰𐌽𐌲𐌰𐌱𐌰 𐌼𐌰𐌿𐍂𐌲𐌾𐌰",
    +	"pageinfo-toolboxlink": "𐌺𐌿𐌽𐌸𐌹 𐌻𐌰𐌿𐌱𐌹𐍃",
     	"previousdiff": "← 𐌰𐍆𐍄𐌿𐌼𐌰 𐌰𐌹𐍂𐌹𐍃",
    -	"nextdiff": "Iftuma áiris →",
    +	"nextdiff": "𐌽𐌹𐌿𐌾𐌹𐌶𐌴𐌹 𐌹𐌽𐌼𐌰𐌹𐌳𐌴𐌹𐌽𐍃 →",
     	"file-info-size": "$1 × $2 𐍀𐌹𐌺𐍃𐌴𐌻𐌰, 𐍆𐌴𐌹𐌻𐍅𐌰𐌷𐍃𐍄𐌿𐍃: $3, 𐌼𐌹𐌼𐌴 𐌺𐌿𐌽𐌹: $4",
    -	"show-big-image": "Fullis wahstus",
    +	"show-big-image": "𐍆𐍂𐌿𐌼𐌹𐍃𐍄𐌰 𐌳𐌰𐍄𐌰",
    +	"show-big-image-preview": "𐌼𐌹𐌺𐌹𐌻𐌴𐌹 𐌸𐌹𐌶𐍉𐍃 𐍆𐌰𐌿𐍂𐌰𐍃𐌹𐌿𐌽𐌰𐌹𐍃: $1.",
    +	"show-big-image-size": "$1 × $2 𐍆𐍂𐌹𐍃𐌰𐌷𐍄𐌹𐍃𐍄𐌰𐌱𐌴𐌹𐍃",
     	"ilsubmit": "Sokeiþ",
     	"metadata": "𐌿𐍆𐌰𐍂𐌳𐌰𐍄𐌰",
    -	"namespacesall": "𐌰𐌻𐌻𐌹𐍃",
    +	"exif-colorspace": "𐍆𐌰𐍂𐍅𐌰𐍂𐌿𐌼",
    +	"exif-orientation-1": "𐌱𐌹 𐌱𐌹𐌿𐌷𐍄𐌾𐌰",
    +	"namespacesall": "𐌰𐌻𐌻",
     	"monthsall": "𐌰𐌻𐌻𐌹𐍃",
     	"imgmultigo": "Afgaggan!",
     	"table_pager_limit_submit": "Affgaggan",
    +	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|𐌲𐌰𐍅𐌰𐌿𐍂𐌳𐌾𐌰]])",
     	"version-other": "Anþar",
    -	"specialpages": "𐌿𐍃𐍃𐌹𐌽𐌳𐍃𐌴𐌹𐌳𐍉𐍃",
    +	"specialpages": "𐌿𐍃𐍃𐌹𐌽𐌳𐌰𐌹 𐌻𐌰𐌿𐌱𐍉𐍃",
     	"tag-filter": "[[Special:Tags|𐍄𐌰𐌹𐌺𐌽𐍉𐍃]] 𐍆𐌹𐌻𐌷𐌰",
    -	"rightsnone": "(ni áinshun)"
    +	"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳|𐍃𐍉𐌺𐌴𐌹𐌽𐌹𐍅𐌰𐌿𐍂𐌳𐌰}}]]: $2)",
    +	"tags-source-header": "𐌱𐍂𐌿𐌽𐌽𐌰",
    +	"tags-actions-header": "𐌳𐌴𐌳𐌴𐌹𐍃",
    +	"tags-source-none": "𐌽𐌹 𐌾𐌿 𐌱𐍂𐌿𐌺𐌾𐌰𐌳𐌰",
    +	"tags-delete": "𐌿𐍃𐌽𐌹𐌼",
    +	"tags-activate": "𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
    +	"tags-deactivate": "𐌿𐌽𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
    +	"tags-create-heading": "𐍃𐌺𐌰𐍀𐌴𐌹 𐌽𐌹𐌿𐌾𐌰𐍄𐌰 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳",
    +	"tags-create-tag-name": "𐌽𐌰𐌼𐍉 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳𐌹𐍃:",
    +	"tags-create-reason": "𐌳𐌿𐌸𐌸𐌴:",
    +	"tags-create-submit": "𐍃𐌺𐌰𐍀𐌴𐌹",
    +	"tags-create-warnings-below": "𐍅𐌹𐌻𐌴𐌹𐌶𐌿 𐌸𐌰𐌹𐍂𐍈𐌹𐍃𐌰𐌽 𐍃𐌺𐌰𐍀𐌾𐌰𐌽 𐌸𐌰𐍄𐌰 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳?",
    +	"tags-delete-title": "𐌿𐍃𐌽𐌹𐌼 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳",
    +	"tags-delete-explanation-initial": "𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐍃 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌿𐍃𐌽𐌹𐌼𐌰𐌽 𐌿𐍃 𐌲𐌹𐌱𐌰𐌲𐌰𐍃𐌰𐍄𐌴𐌹𐌽𐌰𐌹.",
    +	"tags-delete-reason": "𐌳𐌿𐌸𐌸𐌴:",
    +	"tags-delete-not-found": "𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌽𐌹𐍃𐍄.",
    +	"tags-activate-title": "𐌲𐌰𐌵𐌹𐌿𐌴𐌹 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳",
    +	"tags-activate-question": "𐍅𐌰𐌹𐍂𐌸𐌰𐌹𐍃 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌲𐌰𐌵𐌹𐌿𐌾𐌰𐌽.",
    +	"tags-activate-reason": "𐌳𐌿𐌸𐌸𐌴:",
    +	"tags-activate-not-found": "𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳 \"$1\" 𐌽𐌹𐍃𐍄.",
    +	"tags-activate-submit": "𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
    +	"tags-deactivate-title": "𐌿𐌽𐌲𐌰𐌵𐌹𐌿𐌴𐌹 𐍃𐍉𐌺𐌰𐍅𐌰𐌿𐍂𐌳",
    +	"tags-deactivate-reason": "𐌳𐌿𐌸𐌸𐌴:",
    +	"tags-deactivate-submit": "𐌿𐌽𐌲𐌰𐌵𐌹𐌿𐌴𐌹",
    +	"logentry-delete-delete": "$1 {{GENDER:$2|𐌿𐍃𐌽𐌰𐌼}} 𐌻𐌰𐌿𐍆 $3",
    +	"logentry-move-move": "$1 {{GENDER:$2|𐌼𐌹𐌸𐍃𐌰𐍄𐌹𐌳𐌰}} 𐌻𐌰𐌿𐍆𐍃 $3 𐌳𐌿 $4",
    +	"logentry-newusers-create": "𐌱𐍂𐌿𐌺𐌾𐌰𐌺𐌰𐍅𐍄𐍃𐌾𐍉 $1 𐍅𐌰𐍃 {{{{GENDER:$2|𐌲𐌰𐍃𐌺𐌰𐍀𐌰𐌽𐌰}}",
    +	"rightsnone": "(ni áinshun)",
    +	"searchsuggest-search": "𐍃𐍉𐌺𐌴𐌹"
     }
    diff --git a/languages/i18n/hak.json b/languages/i18n/hak.json
    index fd5e37f8b2..c7d7099508 100644
    --- a/languages/i18n/hak.json
    +++ b/languages/i18n/hak.json
    @@ -18,19 +18,19 @@
     			"Macofe"
     		]
     	},
    -	"tog-underline": "鏈接加底線:",
    -	"tog-hideminor": "隱藏最近更改肚嘅細微編寫",
    -	"tog-hidepatrolled": "隱藏最近更改肚巡查過嘅編寫",
    -	"tog-newpageshidepatrolled": "隱藏新頁面清單肚巡查過嘅頁面",
    -	"tog-extendwatchlist": "展開監視列表來顯示所有更改,毋單淨係最近嘅",
    -	"tog-usenewrc": "在最近更改和監視列表肚整合同一頁嘅修改",
    -	"tog-numberheadings": "標題自動編號",
    -	"tog-showtoolbar": "展示編寫工具欄",
    -	"tog-editondblclick": "雙撳編寫頁面",
    -	"tog-editsectiononrightclick": "允許右撳標題編寫段落",
    -	"tog-watchcreations": "加亻厓建立嘅頁面撈上傳嘅文件加入亻厓嘅監視列表",
    -	"tog-watchdefault": "將亻厓編寫嘅頁面撈檔案加入亻厓嘅監視列表",
    -	"tog-watchmoves": "將亻厓移動嘅頁面撈檔案加入亻厓嘅監視列表",
    +	"tog-underline": "Lièn-chiap kâ-tái sien:",
    +	"tog-hideminor": "Yún-chhông chui-khiûn kiên-kói tú ke se-mì phiên-siá",
    +	"tog-hidepatrolled": "Yún-chhông chui-khiûn kiên-kói tú sùn-chhà ko ke phiên-siá",
    +	"tog-newpageshidepatrolled": "Yún-chhông sîn ya̍p-mien chhîn-tân tú sùn-chhà ko ke ya̍p-mien",
    +	"tog-extendwatchlist": "Chán-khôi kâm-sṳ lie̍t-péu lòi hién-sṳ só-yû kiên-kói, m̀  tân-chhiang he chui-khiûn ke",
    +	"tog-usenewrc": "Chhai chui-khiûn kiên-kói lâu kâm-sṳ lie̍t-péu tú cháng-ha̍p thùng yit-ya̍p ke siû-kói",
    +	"tog-numberheadings": "Phiêu-thì chhṳ-thûng phiên-ho",
    +	"tog-showtoolbar": "Chán-sṳ phiên-siá kûng-khí-làn",
    +	"tog-editondblclick": "Sûng-khim phiên-siá ya̍p-mien",
    +	"tog-editsectiononrightclick": "Yún-hí yu-khim phiêu-thì phiên-siá thon-lo̍k",
    +	"tog-watchcreations": "Kâ ngài kien-li̍p ke ya̍p-mien lâu sông-chhòn ke vùn-khien kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
    +	"tog-watchdefault": "Chiông ngài phiên-siá ke ya̍p-mien lâu tóng-on kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
    +	"tog-watchmoves": "Chiông ngài yì-thûng ke ya̍p-mien lâu tóng-on kâ-ngi̍p ngài-ke kâm-sṳ lie̍t-péu",
     	"tog-watchdeletion": "加亻厓刪除嘅頁面撈文件入亻厓嘅監視列表",
     	"tog-minordefault": "默認標記全部編寫係細微修改",
     	"tog-previewontop": "在編寫框上頭顯示預覽",
    @@ -42,7 +42,7 @@
     	"tog-shownumberswatching": "展示監視中嘅使用人數目",
     	"tog-oldsig": "現有簽名:",
     	"tog-fancysig": "將簽名看做維基文字(毋會自動產生鏈接)",
    -	"tog-uselivepreview": "使用即時預覽(實驗中)",
    +	"tog-uselivepreview": "Sṳ́-yung chit-sṳ̀ yi-lám",
     	"tog-forceeditsummary": "還吂輸入編寫摘要時提醒亻厓",
     	"tog-watchlisthideown": "監視列表肚隱藏亻厓嘅編寫",
     	"tog-watchlisthidebots": "監視列表肚隱藏機器人嘅編寫",
    @@ -55,252 +55,256 @@
     	"tog-showhiddencats": "展示隱藏分類",
     	"tog-norollbackdiff": "执行回退後毋顯示差別",
     	"tog-useeditwarning": "當離開頁面之時變更還吂儲存,請提醒𠊎",
    -	"tog-prefershttps": "登入時一直使用安全連線",
    +	"tog-prefershttps": "Tên-ngi̍p sṳ̀ yit-chhṳ̍t sṳ́-yung ôn-chhiòn lièn-sien",
     	"underline-always": "總係使用",
    -	"underline-never": "從來毋用",
    -	"underline-default": "外皮或瀏覽器默認",
    +	"underline-never": "Chhiùng-lòi m̀-yung",
    +	"underline-default": "Ngoi-phì fe̍t liù-lám-hi me̍t-ngin",
     	"editfont-style": "編寫區字型樣式:",
    -	"editfont-default": "瀏覽器默認",
    +	"editfont-default": "Liù-lám-hi me̍t-ngin",
     	"editfont-monospace": "等距字型",
     	"editfont-sansserif": "無襯線字型",
     	"editfont-serif": "襯線字型",
    -	"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": "十一月",
    -	"december": "十二月",
    -	"january-gen": "一月",
    -	"february-gen": "二月",
    -	"march-gen": "三月",
    -	"april-gen": "四月",
    -	"may-gen": "五月",
    -	"june-gen": "六月",
    -	"july-gen": "七月",
    -	"august-gen": "八月",
    -	"september-gen": "九月",
    -	"october-gen": "十月",
    -	"november-gen": "十一月",
    -	"december-gen": "十二月",
    -	"jan": "1月",
    -	"feb": "2月",
    -	"mar": "3月",
    -	"apr": "4月",
    -	"may": "5月",
    -	"jun": "6月",
    -	"jul": "7月",
    -	"aug": "8月",
    -	"sep": "9月",
    -	"oct": "10月",
    -	"nov": "11月",
    -	"dec": "12月",
    -	"january-date": "1月$1日",
    -	"february-date": "2月$1日",
    -	"march-date": "3月$1日",
    -	"april-date": "4月$1日",
    -	"may-date": "5月$1日",
    -	"june-date": "6月$1日",
    -	"july-date": "7月$1日",
    -	"august-date": "8月$1日",
    -	"september-date": "9月$1日",
    -	"october-date": "10月$1日",
    -	"november-date": "11月$1日",
    -	"december-date": "12月$1日",
    -	"pagecategories": "$1隻分類",
    -	"category_header": "“$1”分類肚嘅頁面",
    -	"subcategories": "子分類",
    -	"category-media-header": "“$1”分類肚嘅媒體",
    -	"category-empty": "''邇隻分類目前還吂包含頁面或者媒體文件。''",
    -	"hidden-categories": "$1隻隱藏分類",
    -	"hidden-category-category": "隱藏分類",
    -	"category-subcat-count": "{{PLURAL:$2|邇隻分類有下背一隻子分類。|邇隻分類有$2隻子分類,下背列出矣$1隻。}}",
    +	"sunday": "Lî-pai-ngit",
    +	"monday": "Lî-pai-yit",
    +	"tuesday": "Lî-pai-ngi",
    +	"wednesday": "Lî-pai-sâm",
    +	"thursday": "Lî-pai-si",
    +	"friday": "Lî-pai-ńg",
    +	"saturday": "Lî-pai-liuk",
    +	"sun": "Ngit",
    +	"mon": "Yit",
    +	"tue": "Ngi",
    +	"wed": "Sâm",
    +	"thu": "Si",
    +	"fri": "Ńg",
    +	"sat": "Liuk",
    +	"january": "Yit-ngie̍t",
    +	"february": "Ngi-ngie̍t",
    +	"march": "Sâm-ngie̍t",
    +	"april": "Si-ngie̍t",
    +	"may_long": "Ńg-ngie̍t",
    +	"june": "Liuk-ngie̍t",
    +	"july": "Chhit-ngie̍t",
    +	"august": "Pat-ngie̍t",
    +	"september": "Kiú-ngie̍t",
    +	"october": "Sṳ̍p-ngie̍t",
    +	"november": "Sṳ̍p-yit-ngie̍t",
    +	"december": "Sṳ̍p-ngi-ngie̍t",
    +	"january-gen": "Yit-ngie̍t",
    +	"february-gen": "Ngi-ngie̍t",
    +	"march-gen": "Sâm-ngie̍t",
    +	"april-gen": "Si-ngie̍t",
    +	"may-gen": "Ńg-ngie̍t",
    +	"june-gen": "Liuk-ngie̍t",
    +	"july-gen": "Chhit-ngie̍t",
    +	"august-gen": "Pat-ngie̍t",
    +	"september-gen": "Kiú-ngie̍t",
    +	"october-gen": "Sṳ̍p-ngie̍t",
    +	"november-gen": "Sṳ̍p-yit-ngie̍t",
    +	"december-gen": "Sṳ̍p-ngi-ngie̍t",
    +	"jan": "Yit-ngie̍t",
    +	"feb": "Ngi-ngie̍t",
    +	"mar": "Sâm-ngie̍t",
    +	"apr": "Si-ngie̍t",
    +	"may": "Ńg-ngie̍t",
    +	"jun": "Liuk-ngie̍t",
    +	"jul": "Chhit-ngie̍t",
    +	"aug": "Pat-ngie̍t",
    +	"sep": "Kiú-ngie̍t",
    +	"oct": "Sṳ̍p-ngie̍t",
    +	"nov": "Sṳ̍p-yit-ngie̍t",
    +	"dec": "Sṳ̍p-ngi-ngie̍t",
    +	"january-date": "1-ngie̍t $1-ngit",
    +	"february-date": "2-ngie̍t $1-ngit",
    +	"march-date": "3-ngie̍t $1-ngit",
    +	"april-date": "4-ngie̍t $1-ngit",
    +	"may-date": "5-ngie̍t $1-ngit",
    +	"june-date": "6-ngie̍t $1-ngit",
    +	"july-date": "7-ngie̍t $1-ngit",
    +	"august-date": "8-ngie̍t $1-ngit",
    +	"september-date": "9-ngie̍t $1-ngit",
    +	"october-date": "10-ngie̍t $1-ngit",
    +	"november-date": "11-ngie̍t $1-ngit",
    +	"december-date": "12-ngie̍t $1-ngit",
    +	"pagecategories": "{{PLURAL:$1|Category|$1-chak fûn-lui}}",
    +	"category_header": "\"$1\" fûn-lui tú ke ya̍p-mien",
    +	"subcategories": "Chṳ́ fûn-lui",
    +	"category-media-header": "\"$1\" fûn-lui tú ke mòi-thí",
    +	"category-empty": "<em>Liá-chak fûn-lui muk-chhièn hàn-mò pâu-hàm ya̍p-mien fe̍t-chá mòi-thí vùn-khien.</em>",
    +	"hidden-categories": "$1-chak yún-chhông fûn-lui",
    +	"hidden-category-category": "Yún-chhông fûn-lui",
    +	"category-subcat-count": "{{PLURAL:$2|Liá-chak fûn-lui yû hâ-poi yit-chak chṳ́ fûn-lui.|Liá-chak fûn-lui yû $2-chak chṳ́ fûn-lui, hâ-poi lie̍t-chhut yí $1-chak.}}",
     	"category-subcat-count-limited": "邇隻分類有下背$1隻子分類。",
     	"category-article-count": "{{PLURAL:$2|本分類有下背一隻頁面。|本分類有$2隻頁面,下背列出矣$1隻。}}",
     	"category-article-count-limited": "邇隻分類有下背$1隻頁面。",
     	"category-file-count": "{{PLURAL:$2|邇隻分類有下背一隻文件。|邇隻分類有$2隻文件,下背列出矣$1隻。}}",
     	"category-file-count-limited": "邇隻分類有$1隻文件。",
    -	"listingcontinuesabbrev": "續",
    +	"listingcontinuesabbrev": "sa",
     	"index-category": "既索引嘅頁面",
    -	"noindex-category": "還無索引嘅頁面",
    +	"noindex-category": "Hàn-mò sok-yín ke ya̍p-mien",
     	"broken-file-category": "含有損壞文件鏈接嘅頁面",
    -	"about": "關於",
    -	"article": "內容頁面",
    -	"newwindow": "(在新視窗肚打開)",
    -	"cancel": "取消",
    -	"moredotdotdot": "還較多...",
    -	"morenotlisted": "邇列表吂完成。",
    +	"about": "kôan-yî",
    +	"article": "Nui-yùng ya̍p- mien",
    +	"newwindow": "(chhai sîn sṳ-chhûng tú tá-khôi)",
    +	"cancel": "Chhí-sêu",
    +	"moredotdotdot": "Hàn kha-tô...",
    +	"morenotlisted": "Liá lie̍t-péu mâng vàn-sṳ̀n.",
     	"mypage": "頁面",
    -	"mytalk": "交流",
    -	"anontalk": "本IP地址嘅交流",
    -	"navigation": "導航",
    -	"and": "&#32;撈",
    -	"qbfind": "找尋",
    -	"qbbrowse": "瀏覽",
    -	"qbedit": "編寫",
    -	"qbpageoptions": "頁面選項",
    -	"qbmyoptions": "𠊎嘅頁面",
    -	"faq": "常見問題解答",
    -	"faqpage": "Project:常見問題解答",
    -	"actions": "動作",
    -	"namespaces": "名字空間",
    -	"variants": "變換",
    -	"navigation-heading": "導航菜單",
    -	"errorpagetitle": "差錯",
    -	"returnto": "轉頭到$1。",
    -	"tagline": "從{{SITENAME}}來",
    -	"help": "幫手",
    -	"search": "搜尋",
    -	"searchbutton": "搜尋",
    -	"go": "入",
    -	"searcharticle": "入",
    -	"history": "頁面歷史",
    -	"history_short": "歷史",
    -	"updatedmarker": "亻厓上擺訪問以來嘅更新",
    -	"printableversion": "做得印刷嘅版本",
    -	"permalink": "固定連結",
    -	"print": "印刷",
    -	"view": "查看",
    -	"edit": "編寫",
    -	"create": "建立",
    -	"editthispage": "編寫本頁",
    -	"create-this-page": "建立本頁",
    -	"delete": "刪除",
    -	"deletethispage": "刪除本頁",
    -	"undeletethispage": "取消刪除邇頁",
    +	"mytalk": "Kâu-liù",
    +	"anontalk": "Kâu-liù",
    +	"navigation": "Thô-hòng",
    +	"and": "&#32;lâu",
    +	"qbfind": "Cháu-chhìm",
    +	"qbbrowse": "Liù-lám",
    +	"qbedit": "Phiên-siá",
    +	"qbpageoptions": "Ya̍p-mien sién-hong",
    +	"qbmyoptions": "Ngài-ke ya̍p-mien",
    +	"faq": "Sòng-kien mun-thì kié-tap",
    +	"faqpage": "Project:Sòng-kien mun-thì kié-tap",
    +	"actions": "Thûng-chok",
    +	"namespaces": "Miàng-sṳ khûng-kiên",
    +	"variants": "Pien-von",
    +	"navigation-heading": "Thô-hòng chhoi-tân",
    +	"errorpagetitle": "Chhâ-chho",
    +	"returnto": "Chón-thèu to $1.",
    +	"tagline": "Chhiùng {{SITENAME}} lòi",
    +	"help": "Pông-sú",
    +	"search": "Sêu-chhìm",
    +	"searchbutton": "Sêu-chhìm",
    +	"go": "Ngi̍p",
    +	"searcharticle": "Ngi̍p",
    +	"history": "Ya̍p-mien li̍t-sṳ́",
    +	"history_short": "Li̍t-sṳ́",
    +	"updatedmarker": "ngài sông-pái fóng-mun yî-lòi ke kiên-sîn",
    +	"printableversion": "Cho-tet yin-chho ke pán-pún",
    +	"permalink": "Ku-thin lièn-kiet",
    +	"print": "Yin-chho",
    +	"view": "Chhà-khon",
    +	"view-foreign": "Chhai $1 kiám-sṳ",
    +	"edit": "Phiên-siá",
    +	"create": "Kien-li̍p",
    +	"create-local": "Sîn-chen pún-thi sot-mìn",
    +	"editthispage": "Phiên-siá pún-ya̍p",
    +	"create-this-page": "Kien-li̍p pún-ya̍p",
    +	"delete": "San-chhù",
    +	"deletethispage": "San-chhù pún-ya̍p",
    +	"undeletethispage": "Chhí-sêu san-chhù liá-ya̍p.",
     	"undelete_short": "恢復$1隻分删除个编寫",
     	"viewdeleted_short": "查看$1項已刪除个修訂",
    -	"protect": "保護",
    -	"protect_change": "更改",
    -	"protectthispage": "保護本頁",
    +	"protect": "Pó-fu",
    +	"protect_change": "Kiên-kói",
    +	"protectthispage": "Pó-fu pún-ya̍p",
     	"unprotect": "更改保護",
     	"unprotectthispage": "更改本頁保護",
    -	"newpage": "新頁面",
    -	"talkpage": "討論本頁",
    -	"talkpagelinktext": "交流",
    -	"specialpage": "特殊頁面",
    -	"personaltools": "私人工具",
    -	"articlepage": "查看內容頁面",
    -	"talk": "討論",
    -	"views": "查看數",
    +	"newpage": "Sîn ya̍p-mien",
    +	"talkpage": "Thó-lun pún-ya̍p",
    +	"talkpagelinktext": "kâu-liù",
    +	"specialpage": "Thi̍t-sû ya̍p-mien",
    +	"personaltools": "Sṳ̂-ngìn kûng-khí",
    +	"articlepage": "Chhà-khon nui-yùng ya̍p-mien",
    +	"talk": "Thó-lun",
    +	"views": "Chhà-khon-sú",
     	"toolbox": "Kûng-khí-siông",
     	"userpage": "查看用戶頁面",
     	"projectpage": "查看項目頁面",
    -	"imagepage": "查看文件頁面",
    -	"mediawikipage": "查看消息頁面",
    -	"templatepage": "查看模板頁面",
    -	"viewhelppage": "查看幫手頁面",
    -	"categorypage": "查看分類頁面",
    -	"viewtalkpage": "查看討論",
    -	"otherlanguages": "其他語言",
    -	"redirectedfrom": "(重定向自$1)",
    -	"redirectpagesub": "重定向頁",
    -	"lastmodifiedat": "邇隻頁面最近修訂於$1 $2。",
    +	"imagepage": "Chhà-khon vùn-khien ya̍p-mien",
    +	"mediawikipage": "Chhà-khon sêu-sit ya̍p-mien",
    +	"templatepage": "Chhà-khon mù-pán ya̍p-mien",
    +	"viewhelppage": "Chhà-khon pông-sú ya̍p-mien",
    +	"categorypage": "Chhà-khon fûn-lui ya̍p-mien",
    +	"viewtalkpage": "Chhà-khon thó-lun",
    +	"otherlanguages": "Khì-thâ ngî-ngièn",
    +	"redirectedfrom": "(Chhùng-thin-hiong chhṳ $1)",
    +	"redirectpagesub": "Chhùng-thin-hiong ya̍p",
    +	"redirectto": "Chhùng-thin-hiong to:",
    +	"lastmodifiedat": "Liá-chak ya̍p-mien chui-khiûn siû-thin yî $1 $2.",
     	"viewcount": "邇隻頁面已經分人瀏覽過$1次。",
    -	"protectedpage": "受保護頁面",
    -	"jumpto": "跳轉到:",
    -	"jumptonavigation": "導航",
    -	"jumptosearch": "搜尋",
    +	"protectedpage": "Su pó-fu ya̍p-mien",
    +	"jumpto": "Thiàu-chón to:",
    +	"jumptonavigation": "thô-hòng",
    +	"jumptosearch": "sêu-chhìm",
     	"view-pool-error": "好抱歉,太多用戶嘗試緊瀏覽邇頁,使服務器超出負擔。請等多一刻再嘗試。\n\n$1",
     	"pool-timeout": "等待鎖定超時",
     	"pool-queuefull": "請求隊列满矣",
    -	"pool-errorunknown": "毋知得嘅差錯",
    -	"aboutsite": "關於 {{SITENAME}}",
    -	"aboutpage": "Project:關於",
    -	"copyright": "除非另有講明,否則本站內容都係以$1條款提供。",
    -	"copyrightpage": "{{ns:project}}:版權信息",
    -	"currentevents": "新聞動態",
    -	"currentevents-url": "Project:新聞動態",
    -	"disclaimers": "免責聲明",
    -	"disclaimerpage": "Project:一般免責聲明",
    -	"edithelp": "編寫幫手",
    -	"mainpage": "頭頁",
    -	"mainpage-description": "頭頁",
    -	"policy-url": "Project:方針",
    -	"portal": "社區主頁",
    -	"portal-url": "Project:社區主頁",
    -	"privacy": "隱私政策",
    -	"privacypage": "Project:隱私政策",
    -	"badaccess": "權限差錯",
    -	"badaccess-group0": "系統毋准汝執行頭先講求嘅操作。",
    +	"pool-errorunknown": "M̀ tî-tet ke chhâ-chho",
    +	"aboutsite": "Kôan-yî {{SITENAME}}",
    +	"aboutpage": "Project:Kôan-yî",
    +	"copyright": "Chhù-fî nang-yû kóng-mìn, féu-chet pún-chhàm nui-yùng tû-he yî $1 thiàu-khóan thì-kiûng.",
    +	"copyrightpage": "{{ns:project}}: Pán-khièn sin-sit",
    +	"currentevents": "Sîn-vùn thûng-thai",
    +	"currentevents-url": "Project:Sîn-vùn thûng-thai",
    +	"disclaimers": "Miên-chit sâng-mìn",
    +	"disclaimerpage": "Project:Yit-pân miên-chit sâng-mìn",
    +	"edithelp": "Phiên-siá pông-sú",
    +	"mainpage": "Thèu-ya̍p",
    +	"mainpage-description": "Thèu-ya̍p",
    +	"policy-url": "Project:Fông-chṳ̂m",
    +	"portal": "Sa-khî chú-ya̍p",
    +	"portal-url": "Project:Sa-khî chú-ya̍p",
    +	"privacy": "Yún-sṳ̂ chṳn-chhet",
    +	"privacypage": "Project:Yún-sṳ̂ chṳn-chhet",
    +	"badaccess": "Khièn-han chhâ-chho",
    +	"badaccess-group0": "Hì-thúng m̀ -chún ngì chṳp-hàng thèu-siên kóng-khiù ke chhâu-chok.",
     	"badaccess-groups": "汝正先請求嘅操作單淨有{{PLURAL:$2|邇隻|邇兜}}用戶群組嘅用戶做得使用:$1",
    -	"versionrequired": "愛有MediaWiki $1版",
    +	"versionrequired": "Oi yû MediaWiki $1 pán",
     	"versionrequiredtext": "愛有版本$1嘅MediaWiki正做得使用本頁。\n參詳[[Special:Version|版本頁面]]。",
    -	"ok": "做得",
    -	"retrievedfrom": "來自\"$1\"",
    -	"youhavenewmessages": "汝有$1($2)。",
    +	"ok": "Cho-tet",
    +	"retrievedfrom": "Lòi chhṳ \"$1\"",
    +	"youhavenewmessages": "Ngì yû $1 ($2)",
     	"youhavenewmessagesfromusers": "汝有來自{{PLURAL:$3|另一位用戶|$3位用戶}}嘅$1($2)。",
     	"youhavenewmessagesmanyusers": "汝有來自多位用戶嘅$1( $2 )。",
     	"newmessageslinkplural": "{{PLURAL:$1|yit-thiàu sîn sêu-sit|999=sîn sêu-sit}}",
     	"newmessagesdifflinkplural": "chui-khiun{{PLURAL:$1|kiên-kói|kiên-kói}}",
    -	"youhavenewmessagesmulti": "汝在$1肚有新消息",
    -	"editsection": "編寫",
    -	"editold": "編寫",
    -	"viewsourceold": "查看源碼",
    -	"editlink": "編寫",
    -	"viewsourcelink": "查看源碼",
    -	"editsectionhint": "編寫章節: $1",
    -	"toc": "目錄",
    -	"showtoc": "展示",
    -	"hidetoc": "隱藏",
    -	"collapsible-collapse": "摺叠",
    -	"collapsible-expand": "展開",
    -	"thisisdeleted": "查看或者恢復$1?",
    -	"viewdeleted": "查看$1?",
    -	"restorelink": "$1隻分人刪除嘅版本",
    -	"feedlinks": "訂閱:",
    -	"feed-invalid": "無效嘅訂閱類型。",
    +	"youhavenewmessagesmulti": "Ngì chhai $1-tú yû sîn sêu-sit",
    +	"editsection": "phiên-siá",
    +	"editold": "phiên-siá",
    +	"viewsourceold": "chhà-khon ngièn-ma",
    +	"editlink": "phiên-siá",
    +	"viewsourcelink": "chhà-khon ngièn-ma",
    +	"editsectionhint": "Phiên-siá chông-chiet: $1",
    +	"toc": "Muk-liu̍k",
    +	"showtoc": "Chán-sṳ",
    +	"hidetoc": "yún-chhông",
    +	"collapsible-collapse": "Chap-thia̍p",
    +	"collapsible-expand": "Chán-khôi",
    +	"thisisdeleted": "Chhà-khon fe̍t-chá fî-fu̍k $1?",
    +	"viewdeleted": "Chhà-khon $1?",
    +	"restorelink": "$1-chak fûn ngìn san-chhù ke pán-pún",
    +	"feedlinks": "Thin-ye̍t:",
    +	"feed-invalid": "Mò-háu ke thin-ye̍t lui-hîn.",
     	"feed-unavailable": "毋提供聯合訂閱源",
    -	"site-rss-feed": "$1嘅RSS訂閱",
    -	"site-atom-feed": "$1嘅Atom訂閱",
    -	"page-rss-feed": "“$1”嘅RSS訂閱",
    -	"page-atom-feed": "“$1”嘅Atom訂閱",
    -	"red-link-title": "$1(頁面還無存在)",
    +	"site-rss-feed": "$1-ke RSS thin-ye̍t",
    +	"site-atom-feed": "$1-ke Atom thin-ye̍t",
    +	"page-rss-feed": "\"$1\"-ke RSS thin-ye̍t",
    +	"page-atom-feed": "\"$1\" ke Atom thin-ye̍t",
    +	"red-link-title": "$1 (ya̍p-mien hàn-mò chhùn-chhai)",
     	"sort-descending": "降序",
     	"sort-ascending": "升序",
    -	"nstab-main": "頁面",
    -	"nstab-user": "用戶頁面",
    -	"nstab-media": "媒體頁面",
    -	"nstab-special": "特殊頁面",
    -	"nstab-project": "項目頁面",
    -	"nstab-image": "文件",
    -	"nstab-mediawiki": "信息",
    -	"nstab-template": "模板",
    -	"nstab-help": "幫手頁面",
    -	"nstab-category": "分類",
    -	"nosuchaction": "無邇條命令",
    +	"nstab-main": "Ya̍p-mien",
    +	"nstab-user": "Yung-fu ya̍p-mien",
    +	"nstab-media": "Mòi-thí ya̍p-mien",
    +	"nstab-special": "Thi̍t-sû ya̍p-mien",
    +	"nstab-project": "Hong-muk ya̍p-mien",
    +	"nstab-image": "Vùn-khien",
    +	"nstab-mediawiki": "Sin-sit",
    +	"nstab-template": "Mù-pán",
    +	"nstab-help": "Pông-sú ya̍p-mien",
    +	"nstab-category": "Fûn-lui",
    +	"mainpage-nstab": "Thèu-ya̍p",
    +	"nosuchaction": "Mò liá-thiàu miang-lin",
     	"nosuchactiontext": "邇URL所指定嘅動作無效。\n汝可能打錯URL,或撳到錯誤鏈接。\n還可能係{{SITENAME}}所使用嘅軟件出現矣錯誤。",
     	"nosuchspecialpage": "邇隻特殊页面毋存在",
     	"nospecialpagetext": "<strong>汝請求嘅特殊頁面無效。</strong>\n\n[[Special:SpecialPages|{{int:specialpages}}]]肚列出矣所有效特殊頁面嘅列表。",
    -	"error": "差錯",
    -	"databaseerror": "數據庫差錯",
    -	"databaseerror-text": "出現資料庫查詢錯誤。\n邇可能表示軟件肚存在錯誤。",
    +	"error": "Chhâ-chho",
    +	"databaseerror": "Sú-kí-khù chhâ-chho",
    +	"databaseerror-text": "Chhut-hien chṳ̂-liau-khù chhà-sûn chho-ngu. \nLiá khó-nèn péu-sṳ ngiôn-khien tú chhùn-chhai chho-ngu.",
     	"databaseerror-textcl": "chṳ̂-liau-ku chhà-chhìm chho-ngu",
     	"databaseerror-query": "chhà-chhìm:$1",
     	"databaseerror-function": "kûng-nèn:$1",
     	"databaseerror-error": "chho-ngu:$1",
    -	"laggedslavemode": "'''警告:'''頁面可能毋包含最近嘅更新。",
    -	"readonly": "數據庫分人鎖定",
    -	"enterlockreason": "請撳入禁止訪問原因, 包括估計重新開放嘅時間",
    +	"laggedslavemode": "<strong>Kín-ko:</strong> Ya̍p-mien khó-nèn m̀ pâu-hàm chui-khiûn ke kiên-sîn.",
    +	"readonly": "Sú-kí-khù fûn ngìn só-thin",
    +	"enterlockreason": "Chhiáng khim-ngi̍p kim-chṳ́ fóng-mun ngièn-yîn, pâu-koat kû-kie chhùng-sîn khôi-piong ke sṳ̀-kiên",
     	"readonlytext": "數據庫今下禁止輸入新內容撈更改,\n邇好有可能係由於數據庫維修緊,完成後就會恢復。\n\n管理員有下背嘅解釋:$1",
     	"missing-article": "數據庫尋毋到文字“$1”$2。\n\n邇通常係由於點撳矣鏈向過期毋同或曆史頁面嘅鏈接,但原有修訂已分刪除所導致嘅。\n\n假使情況毋係恁樣,汝可能尋到矣軟件嘅一隻臭蟲(bug)。請錄下URL地址,並向[[Special:ListUsers/sysop|管理員]]報告。",
     	"missingarticle-rev": "(修訂版本號#: $1)",
    @@ -320,12 +324,12 @@
     	"cannotdelete-title": "無辦法刪除頁面「$1」",
     	"delete-hook-aborted": "刪除分勾仔中止。\n其毋曾提供任何解釋。",
     	"no-null-revision": "mò-fap chhóng-kien \"$1\" ya̍p-mien sîn-ke khûng-pa̍k siû-thin",
    -	"badtitle": "有錯嘅標題",
    +	"badtitle": "Yû chho ke phiêu-thì",
     	"badtitletext": "所請求頁面嘅標題是無效嘅、毋存在嘅,跨語言或跨wiki鏈接嘅標題有錯。其可能包含一隻或還較多做毋得用於標題嘅字符。",
     	"perfcached": "下列係緩存數據,因此可能毋係最新嘅。最多{{PLURAL:$1|單淨有1嘅結果|$1嘅結果}}可用。",
     	"perfcachedts": "下列係緩存數據,其最後更新時間係$1。單淨有{{PLURAL:$4|一嘅結果|$4嘅結果}}會畀顯示。",
     	"querypage-no-updates": "當前禁止對邇頁面進行更新。\n邇位嘅數據將做毋得分立即重新整理。",
    -	"viewsource": "查看源碼",
    +	"viewsource": "Chhà-khon ngièn-ma",
     	"viewsource-title": "查看$1嘅源代碼",
     	"actionthrottled": "動作已經壓制",
     	"actionthrottledtext": "基於反垃圾嘅考量,短時間內毋可以多次重複某操作,今下汝已經超過邇隻上限。\n請在數分鐘後再嘗試。",
    @@ -342,79 +346,80 @@
     	"mycustomjsprotected": "汝無編輯邇頁JavaScript之權限。",
     	"myprivateinfoprotected": "汝無權限編輯汝个個人信息。",
     	"mypreferencesprotected": "汝無權限編輯汝个個人設定。",
    -	"ns-specialprotected": "邇兜特殊頁面係毋做得編輯嘅。",
    +	"ns-specialprotected": "Liá-têu thi̍t-sû ya̍p-mien he m̀ cho-tet phiên-si̍p ke.",
     	"titleprotected": "邇隻標題已經分[[User:$1|$1]]保護來防止建立。理由係<em>$2</em>。",
     	"filereadonlyerror": "無辦法修改文件「$1」因為文件庫「$2」處於唯讀模式。 !\n管理員鎖定其嘅解釋係:「$3」。",
     	"invalidtitle-knownnamespace": "使用名字空間「$2」與文本「$3」嘅無效標題",
     	"invalidtitle-unknownnamespace": "使用未知名字空間編號$1與文本“$2”嘅無效標題",
    -	"exception-nologin": "還吂登入",
    -	"exception-nologin-text": "汝愛[[Special:Userlogin|登入]]本wiki查看邇頁或者進行操作。",
    +	"exception-nologin": "Hàn-mò tên-ngi̍p",
    +	"exception-nologin-text": "Ngì oi [[Special:Userlogin|tên-ngi̍p]] pún wiki chhà-khon liá-ya̍p fe̍t-chá chin-hàng chhâu-chok.",
     	"virus-badscanner": "損壞設定: 未知嘅病毒掃瞄器: ''$1''",
     	"virus-scanfailed": "掃瞄失敗 (代碼 $1)",
    -	"virus-unknownscanner": "還吂知嘅反病毒軟件:",
    -	"logouttext": "'''汝今下既經登出。'''\n\n請注意一兜頁面可能還顯示汝係登入狀態,一直到汝清空汝嘅瀏覽器緩存為止。",
    -	"welcomeuser": "歡迎,$1!",
    +	"virus-unknownscanner": "hàn m̀-tî ke fán-phiang-thu̍k ngiôn-khien:",
    +	"logouttext": "'''Ngì kîm-hâ ki-kîn tên-chhut.'''\n\nChhiáng chu-yi yit-têu ya̍p-mien khó-nèn hàn hién-sṳ ngì he tên-ngi̍p chhong-thai, yit-chhṳ̍t to ngì chhîn-khûng ngì ke liù-lám-hi fòn-chhùn vì-chṳ́.",
    +	"welcomeuser": "Fôn-ngiàng, $1!",
     	"welcomecreation-msg": "汝嘅賬號已經建立。\n莫添忘訖設置[[Special:Preferences|{{SITENAME}}嘅個人參數]]。",
    -	"yourname": "用戶名:",
    -	"userlogin-yourname": "用戶名",
    -	"userlogin-yourname-ph": "輸入汝嘅用戶名",
    +	"yourname": "Yung-fu-miàng:",
    +	"userlogin-yourname": "Yung-fu-miàng:",
    +	"userlogin-yourname-ph": "Sû-ngi̍p ngì ke Yung-fu-miàng:",
     	"createacct-another-username-ph": "輸入用戶名:",
    -	"yourpassword": "密碼:",
    -	"userlogin-yourpassword": "密碼",
    -	"userlogin-yourpassword-ph": "輸入汝嘅密碼",
    -	"createacct-yourpassword-ph": "輸入汝嘅密碼",
    -	"yourpasswordagain": "再一擺輸入密碼:",
    -	"createacct-yourpasswordagain": "確認密碼",
    -	"createacct-yourpasswordagain-ph": "再一擺輸入密碼",
    -	"remembermypassword": "在邇隻瀏覽器上記下𠊎嘅登入狀態(最長$1日)",
    -	"userlogin-remembermypassword": "保持𠊎嘅登入狀態",
    +	"yourpassword": "Me̍t-ma:",
    +	"userlogin-yourpassword": "Me̍t-ma",
    +	"userlogin-yourpassword-ph": "Sû-ngi̍p ngì-ke me̍t-ma",
    +	"createacct-yourpassword-ph": "Sû-ngi̍p ngì-ke me̍t-ma",
    +	"yourpasswordagain": "Chai yit-pái sû-ngi̍p me̍t-ma:",
    +	"createacct-yourpasswordagain": "Khok-ngin me̍t-ma",
    +	"createacct-yourpasswordagain-ph": "Chai yit-pái sû-ngi̍p me̍t-ma",
    +	"remembermypassword": "Chhai liá-chak liù-lám-hi sông ki-hâ ngài-ke tên-ngi̍p chhong-thai (chui-chhòng $1-ngit)",
    +	"userlogin-remembermypassword": "Pó-chhṳ̀ ngài-ke tên-ngi̍p chhong-thai",
     	"userlogin-signwithsecure": "使用安全連線",
    -	"yourdomainname": "汝嘅域名:",
    +	"yourdomainname": "Ngì ke vet-miàng:",
     	"password-change-forbidden": "汝做毋得更改本wiki上嘅密碼。",
    -	"externaldberror": "邇可能係由於驗證數據庫差錯或者汝分系統禁止更新汝嘅外部賬號。",
    -	"login": "登入",
    -	"nav-login-createaccount": "登入/建立新帳號",
    -	"userlogin": "登入/建立新帳號",
    -	"userloginnocreate": "登入",
    -	"logout": "登出",
    -	"userlogout": "登出",
    -	"notloggedin": "還吂登入",
    -	"userlogin-noaccount": "還無帳戶係無?",
    -	"userlogin-joinproject": "參與 {{SITENAME}}",
    -	"nologin": "還無帳號係無?$1。",
    -	"nologinlink": "建立帳號",
    -	"createaccount": "建立帳號",
    -	"gotaccount": "已經擁有帳號係無?$1。",
    -	"gotaccountlink": "登入",
    -	"userlogin-resetlink": "毋記得汝嘅登入信息?",
    -	"userlogin-resetpassword-link": "添忘訖汝嘅密碼?",
    +	"externaldberror": "Liá khó-nèn he yù-yî ngiam-chṳn sú-kí-khù chhâ-chho fe̍t-chá ngì fûn hì-thúng kim-chṳ́ kiên-sîn ngì ke ngoi-phu chòng-ho.",
    +	"login": "Tên-ngi̍p",
    +	"nav-login-createaccount": "Tên-ngi̍p / kien-li̍p sîn chong-ho",
    +	"userlogin": "Tên-ngi̍p / kien-li̍p sîn chong-ho",
    +	"userloginnocreate": "Tên-ngi̍p",
    +	"logout": "Tên-chhut",
    +	"userlogout": "Tên-chhut",
    +	"notloggedin": "Hàn-mò tên-ngi̍p",
    +	"userlogin-noaccount": "Hàn-mò chong-fu he mò?",
    +	"userlogin-joinproject": "Chhâm-yi  {{SITENAME}}",
    +	"nologin": "Hàn-mò chong-ho he-mò? $1.",
    +	"nologinlink": "Kien-li̍p chong-ho",
    +	"createaccount": "Kien-li̍p chong-ho",
    +	"gotaccount": "Yí-kîn yúng-yû chong-ho he-mò? $1.",
    +	"gotaccountlink": "Tên-ngi̍p",
    +	"userlogin-resetlink": "M̀-ki-tet ngì-ke tên-ngi̍p sin-sit?",
    +	"userlogin-resetpassword-link": "Thiâm mong-ki ngì ke me̍t-ma?",
    +	"userlogin-helplink2": "Tên-ngi̍p hia̍p-chhu",
     	"userlogin-loggedin": "汝已作為{{GENDER:$1|$1}}登錄。\n利用以下表單以作為另一賬戶登錄。",
    -	"createacct-emailrequired": "電郵地址:",
    -	"createacct-emailoptional": "電郵地址(可選)",
    -	"createacct-email-ph": "設置電郵地址",
    +	"createacct-emailrequired": "Thien-yù thi-chí:",
    +	"createacct-emailoptional": "Thien-yù thi-chí (khó-sién)",
    +	"createacct-email-ph": "Sat-chì thien-yù thi-chí",
     	"createacct-another-email-ph": "輸入電郵地址",
    -	"createaccountmail": "使用一隻臨時嘅隨機密碼,並將其發送到指定嘅電子郵件地址",
    +	"createaccountmail": "Sṳ́-yung yit-chak lìm-sṳ̀ ke sùi-kî me̍t-ma, pin chiông khì fat-sung to chṳ́-thin ke thien-chṳ́ yù-khien thi-chí",
     	"createacct-realname": "實名(可選)",
    -	"createaccountreason": "原因:",
    -	"createacct-reason": "原因",
    +	"createaccountreason": "Ngièn-yîn:",
    +	"createacct-reason": "Ngièn-yîn:",
     	"createacct-reason-ph": "汝做麽嘅愛創建另一隻帳號",
    -	"createacct-submit": "建立帳號",
    -	"createacct-benefit-heading": "{{SITENAME}}是由撈您共樣嘅人建立。",
    -	"createacct-benefit-body1": "$1次編寫",
    -	"createacct-benefit-body2": "$1頁",
    -	"createacct-benefit-body3": "近期$1隻貢獻人",
    -	"badretype": "汝所撳入嘅密碼並毋相同",
    +	"createacct-submit": "Kien-li̍p chong-ho",
    +	"createacct-benefit-heading": "{{SITENAME}} he yù lâu Ngì khiung-ngióng ke ngìn kien-li̍p.",
    +	"createacct-benefit-body1": "$1-chhṳ phiên-siá",
    +	"createacct-benefit-body2": "$1-ya̍p",
    +	"createacct-benefit-body3": "khiûn-khì $1-chak kung-hien-ngìn",
    +	"badretype": "Ngì só khim-ngi̍p ke me̍t-ma pin m̀  siông-thùng.",
     	"userexists": "汝所填入嘅用戶名稱已經存在。\n請另選一隻名稱。",
    -	"loginerror": "登入差錯",
    -	"createacct-error": "帳戶建立差錯",
    -	"createaccounterror": "無辦法建立帳號:$1",
    +	"loginerror": "Tên-ngi̍p chhâ-chho",
    +	"createacct-error": "Chong-fu kien-li̍p chhâ-chho",
    +	"createaccounterror": "Mò phan-fap kien-li̍p chong-ho: $1",
     	"nocookiesnew": "本用戶賬號已分建立,但係汝登入失敗。{{SITENAME}}使用cookie登入。汝已停用cookie。請啓用cookie,之後使用汝嘅新用戶名和密碼登入。",
     	"nocookieslogin": "{{SITENAME}}用cookie登入。汝已停用cookie。請啓用cookie後再試一擺。",
     	"nocookiesfornew": "邇隻用戶嘅賬戶未建立,亻厓兜無法度確認其嘅來源。\n請確定汝已經開啟cookies,重新載入後再試一擺。",
     	"noname": "汝還吂輸入一隻有效嘅用戶名。",
    -	"loginsuccesstitle": "登入成功",
    -	"loginsuccess": "汝今下以\"$1\"嘅身份在{{SITENAME}}登入。",
    -	"nosuchuser": "尋毋到用戶 \"$1\"。\n用戶名稱係有大小寫區分嘅。\n檢查汝嘅拼寫,或者用下面嘅表格[[Special:CreateAccount|建立一隻新賬號]]。",
    +	"loginsuccesstitle": "Yí-kîn tên-ngi̍p",
    +	"loginsuccess": "Ngì kîm-hâ yî \"$1\"-ke sṳ̂n-fun chhai {{SITENAME}} tên-ngi̍p.",
    +	"nosuchuser": "Chhìm m̀ -to yung-fu \"$1\". \nYung-fu miàng-chhṳ̂n he yû thai-séu siá khî-fûn ke . \nKiám-chhà ngì ke piâng-siá, fe̍t-chá yung hâ-mien ke péu-kak [[Special:CreateAccount|kien-li̍p yit-chak sîn chòng-ho]].",
     	"nosuchusershort": "無有喊做“$1”嘅用戶。請檢查汝輸入嘅文字係毋係有差錯。",
     	"nouserspecified": "汝愛指定一隻用戶名。",
     	"login-userblocked": "邇隻用戶已分封鎖。毋做得登入。",
    @@ -423,18 +428,18 @@
     	"passwordtooshort": "汝嘅密碼毋得少過$1隻字符。",
     	"password-name-match": "汝嘅密碼必須撈汝嘅用戶名毋相同。",
     	"password-login-forbidden": "邇隻用戶名稱及密碼嘅使用係分禁止嘅。",
    -	"mailmypassword": "重設密碼",
    +	"mailmypassword": "Chhùng-sat me̍t-ma",
     	"passwordremindertitle": "{{SITENAME}}嘅新臨時密碼",
     	"passwordremindertext": "有人(可能係汝本人,來自IP地址$1)已請求{{SITENAME}}嘅新密碼 ($4)。\n用戶\"$2\"嘅一隻新臨時密碼今下已分設定好為\"$3\"。\n係話邇隻動作係汝所指示嘅,汝就愛立即登入並選擇一隻新嘅密碼。\n汝嘅臨時密碼將於{{PLURAL:$5|一|$5}}日之內過期。\n\n假使係其他人發出邇隻請求,或者汝已經回想起汝嘅密碼,故所毋準備改變其,\n汝可以忽略略邇條消息並且繼續使用汝嘅舊密碼。",
     	"noemail": "用戶“$1”無登記電子郵件地址。",
     	"noemailcreate": "汝愛提供一隻有效嘅電子郵件地址。",
     	"passwordsent": "用戶“$1”嘅新密碼已經寄到所登記嘅電子郵件地址。\n請在收到後再登入。",
     	"blocked-mailpassword": "汝嘅IP地址處於查封狀態故所毋允許編輯,為矣安全起見,密碼恢復功能已分禁用。",
    -	"eauthentsent": "一封確認信已經發送到汝設定嘅電郵地址。\n在任何其他郵件發到賬戶之前,汝必須首先照邇封信嘅指示,確認介隻賬戶確實係汝嘅。",
    +	"eauthentsent": "Yit-fûng khok-ngin sin yí-kîn fat-sung to ngì sat-thin ke thien-yù thi-chí. Chhai ngim-hò khì-thâ yù-khien fat-to chòng-fu chṳ̂-chhièn, ngì pit-sî sú-siên cheu liá fûng sin ke chṳ́-sṳ, khok-ngin kie-chak chòng-fu khok-sṳ̍t he ngì-ke.",
     	"throttled-mailpassword": "密碼提醒已經在最近$1小時內發送。\n為防止濫用,限定在$1小時內僅發送一次密碼提醒。",
     	"mailerror": "發送郵件出差錯:$1",
     	"acct_creation_throttle_hit": "在邇隻wiki上係話訪客利用汝个IP地址在昨天創建矣$1個賬戶,係在邇段時間肚的上限。\n結果利用這個IP地址个訪客在邇段時間中無辦法創建更多个賬戶。",
    -	"emailauthenticated": "汝嘅電郵地址已經於$2 $3確認。",
    +	"emailauthenticated": "Ngì ke thien-yù thi-chí yí-kîn yî $2 $3 khok-ngin.",
     	"emailnotauthenticated": "汝个電郵位址還㬟確認。\n將收毋到以下功能相關个電郵。",
     	"noemailprefs": "在嘅嘅偏好設定肚指定一隻電子郵件地址來使用邇隻功能。",
     	"emailconfirmlink": "確認汝嘅郵箱地址",
    @@ -447,35 +452,39 @@
     	"createaccount-text": "有人在{{SITENAME}}肚利用汝嘅電郵創建矣一隻喊做 \"$2\" 嘅新賬戶($4),密碼係 \"$3\" 。汝應該立即登入並更改密碼。\n\n如果該賬戶建立錯誤嘅話,汝可以忽略邇條訊息。",
     	"login-throttled": "汝已經嘗試多次登入動作。\n請等$1後再試。",
     	"login-abort-generic": "登入錯誤 - 中止",
    -	"loginlanguagelabel": "語言:$1",
    +	"loginlanguagelabel": "Ngî-ngièn: $1",
     	"suspicious-userlogout": "汝登出嘅要求已經分拒絕,因為其可能係由已損壞嘅瀏覽器或者緩存代理傳送。",
    +	"pt-login": "Tên-ngi̍p",
    +	"pt-login-button": "Tên-ngi̍p",
    +	"pt-createaccount": "Kien-li̍p chong-ho",
    +	"pt-userlogout": "Tên-chhut",
     	"php-mail-error-unknown": "在PHP嘅mail()參數肚嘅未知錯誤",
     	"user-mail-no-addy": "嘗試毋帶電郵地址發送電郵。",
     	"user-mail-no-body": "試圖發送空嘅或主體毋合理短嘅電子郵件。",
     	"changepassword": "更改密碼",
    -	"resetpass_announce": "汝係通過一隻發送到電子郵件肚嘅臨時代碼登入的。愛完成登入,汝必須在邇位設定一隻新密碼:",
    -	"resetpass_text": "<!-- 在邇處加入文字 -->",
    +	"resetpass_announce": "Oi vàn-sṳ̀n tên-ngi̍p, ngì pit-sî sat-thin yit-chak sîn me̍t-ma:",
    +	"resetpass_text": "<!-- Chhai liá-chhú kâ-ngi̍p vùn-sṳ -->",
     	"resetpass_header": "更改賬戶密碼",
    -	"oldpassword": "舊密碼:",
    -	"newpassword": "舊密碼:",
    -	"retypenew": "再一擺輸入密碼:",
    -	"resetpass_submit": "設定密碼並登入",
    -	"changepassword-success": "汝成功更改矣汝嘅密碼!\n今下為汝登入緊...",
    +	"oldpassword": "Khiu me̍t-ma:",
    +	"newpassword": "Sîn me̍t-ma:",
    +	"retypenew": "Chai yit-pái sû-ngi̍p sîn me̍t-ma:",
    +	"resetpass_submit": "Sat-thin me̍t-ma pin tên-ngi̍p",
    +	"changepassword-success": "Ngì yí-kîn kiên-kói ngì-ke me̍t-ma! \nKîm-hâ vì ngì tên-ngi̍p kín...",
     	"resetpass_forbidden": "無辦法更改密碼",
     	"resetpass-no-info": "汝必須登入後直接進入邇隻頁面。",
    -	"resetpass-submit-loggedin": "更改密碼",
    -	"resetpass-submit-cancel": "取消",
    +	"resetpass-submit-loggedin": "Kiên-kói me̍t-ma",
    +	"resetpass-submit-cancel": "Chhí-sêu",
     	"resetpass-wrong-oldpass": "無效嘅臨時或現有嘅密碼。\n汝可能已成功地更改矣汝嘅密碼,或者已經請求一隻新嘅臨時密碼。",
     	"resetpass-temp-password": "臨時密碼:",
     	"resetpass-abort-generic": "擴充插件已中止矣更改密碼操作。",
    -	"passwordreset": "重設密碼",
    +	"passwordreset": "Chhùng-sat me̍t-ma",
     	"passwordreset-disabled": "邇隻維基上已禁止矣重設密碼。",
     	"passwordreset-emaildisabled": "電子郵件功能在此 wiki 上已禁用。",
    -	"passwordreset-username": "用戶名:",
    -	"passwordreset-domain": "域名:",
    +	"passwordreset-username": "Yung-fu-miàng:",
    +	"passwordreset-domain": "Vet-miàng:",
     	"passwordreset-capture": "查看生成嘅電子郵件係無?",
     	"passwordreset-capture-help": "係講汝選中邇隻框,電子郵件(包括臨時密碼)將顯示,並發送分用戶。",
    -	"passwordreset-email": "電郵地址:",
    +	"passwordreset-email": "Thien-yù thi-chí:",
     	"passwordreset-emailtitle": "在{{SITENAME}}上嘅詳細信息",
     	"passwordreset-emailsentemail": "密碼重置電子郵件已發送。",
     	"changeemail": "更改電子郵件地址",
    @@ -483,33 +492,33 @@
     	"changeemail-no-info": "汝必須登入後直接進入邇隻頁面。",
     	"changeemail-oldemail": "當前電郵地址:",
     	"changeemail-newemail": "新嘅電郵地址:",
    -	"changeemail-none": "(無)",
    -	"changeemail-submit": "更改電郵地址",
    -	"bold_sample": "粗體文字",
    -	"bold_tip": "粗體文字",
    -	"italic_sample": "斜體文字",
    -	"italic_tip": "斜體文字",
    -	"link_sample": "鏈接標題",
    -	"link_tip": "內部鏈接",
    -	"extlink_sample": "http://www.example.com 鏈接標題",
    -	"extlink_tip": "外部鏈接(加前綴 http://)",
    -	"headline_sample": "大標題文字",
    -	"headline_tip": "2級標題文字",
    -	"nowiki_sample": "在邇插入非格式文字",
    -	"nowiki_tip": "插入非格式文字",
    -	"image_tip": "插入文件",
    -	"media_tip": "文件鏈接",
    -	"sig_tip": "帶有時間嘅簽名",
    -	"hr_tip": "水平線 (小心使用)",
    -	"summary": "摘要:",
    +	"changeemail-none": "(mò)",
    +	"changeemail-submit": "Kiên-kói thien-yù thi-chí",
    +	"bold_sample": "Chhû-thí vùn-sṳ",
    +	"bold_tip": "Chhû-thí vùn-sṳ",
    +	"italic_sample": "Chhià-thí vùn-sṳ",
    +	"italic_tip": "Chhià-thí vùn-sṳ",
    +	"link_sample": "Lièn-chiap phiêu-thì",
    +	"link_tip": "Nui-phu lièn-chiap",
    +	"extlink_sample": "http://www.example.com lièn-chiap phiêu-thì",
    +	"extlink_tip": "Ngoi-phu lièn-chiap (kâ chhièn-tot http://)",
    +	"headline_sample": "Thai phiêu-thì vùn-sṳ",
    +	"headline_tip": "2-kip phiêu-thì vùn-sṳ",
    +	"nowiki_sample": "Chhai liá chhap-ngi̍p fî kak-sṳt vùn-sṳ",
    +	"nowiki_tip": "Chhap-ngi̍p fî kak-sṳt vùn-sṳ",
    +	"image_tip": "Chhap-ngi̍p vùn-khien",
    +	"media_tip": "Vùn-khien lièn-chiap",
    +	"sig_tip": "Tai yû sṳ̀-kiên ke chhiâm-miàng",
    +	"hr_tip": "Súi-phìn sien  (séu-sîm sṳ́-yung)",
    +	"summary": "Chak-yeu:",
     	"subject": "標題:",
    -	"minoredit": "邇係一隻細微修改",
    -	"watchthis": "監視本頁",
    -	"savearticle": "保存本頁",
    +	"minoredit": "Liá-he yit-chak se-mì siû-kói",
    +	"watchthis": "Kâm-sṳ pún-ya̍p",
    +	"savearticle": "Pó-chhùn pún-ya̍p",
     	"preview": "預覽",
    -	"showpreview": "展示預覽",
    -	"showdiff": "展示差別",
    -	"anoneditwarning": "'''警告:'''汝還吂登入。\n汝嘅IP地址將記錄在邇頁嘅編寫歷史肚。",
    +	"showpreview": "Chán-sṳ yi-lám",
    +	"showdiff": "Chán-sṳ chhâ-phe̍t",
    +	"anoneditwarning": "<strong>Kín-ko : </strong>Ngì hàn-m̀ tên-ngi̍p. Ngì ke IP thi-chí chiông ki-liu̍k chhai liá-ya̍p ke phiên-siá li̍t-sṳ́ tú. Ká-sṳ́ ngì  <strong>[$1 tên-ngi̍p]</strong> fe̍t  <strong>[$2 kien-li̍p chong-ho]</strong>, ngì ke phiên-si̍p chiông-fi yî ngì ke sṳ́-yung-chá miàng-chhṳ̂n phiêu-sṳ, yúng-yû khì-thâ yù-tiám.",
     	"anonpreviewwarning": "“警告:汝還吂登入。汝嘅IP地址將會記錄在邇頁嘅編輯歷史中”",
     	"missingsummary": "'''提示:''' 汝無提供一隻編寫摘要。假使汝再次單擊「{{int:savearticle}}」,汝嘅編寫將毋帶編寫摘要保存。",
     	"missingcommenttext": "請在下背輸入評論。",
    @@ -524,14 +533,14 @@
     	"nosuchsectiontitle": "Mò-yû liá-ke thon-lo̍k",
     	"nosuchsectiontext": "Ngì sòng-chhṳ phiên-cho ke thon-lo̍k pin-put chhùn-chhai.",
     	"loginreqtitle": "愛登入",
    -	"loginreqlink": "登入",
    +	"loginreqlink": "tên-ngi̍p",
     	"loginreqpagetext": "汝必須$1正做得查看其他頁面。",
     	"accmailtitle": "密碼已經寄出",
     	"accmailtext": "'$1' ke pi-me̍t yí-kîn ki-kî to $2.",
    -	"newarticle": "(新)",
    -	"newarticletext": "汝入到矣一隻還吂建立嘅頁面。\n愛建立本頁面,請在下面嘅編寫框肚輸入內容(詳情參詳[$1 幫手])。\n係講汝係毋小心來到本頁面,直接點擊汝嘅瀏覽器肚嘅“轉頭”撳掣轉頭。",
    +	"newarticle": "(Sîn)",
    +	"newarticletext": "Ngì ngi̍p-to yí yit-chak hàn-mò kien-li̍p ke ya̍p-mien. \nOi kien-li̍p pún ya̍p-mien, chhiáng chhai hâ-mien ke phiên-siá khiông tú sû-ngi̍p nui-yùng (siòng-chhìn chhâm-siòng [$1 pông-sú]). \nHe-kóng ngì he-m̀ séu-sîm lòi-to pún ya̍p-mien, chhṳ̍t-chiap tiám-kit ngì-ke liù-lám-hi tú ke  <strong>chón-thèu </strong> khim chhe̍t chón-thèu.",
     	"anontalkpagetext": "---- ''Liá-he yit-ke hàn-mò kien-li̍p chong-ho ke ngia̍k-miàng yung-fu ke tui-fa-hong. Só-yî chṳ́-nèn yung IP thi-tiám lòi lâu kí lièn-lo̍k. Ke-IP thi-tiám khó-nèn yù-chhai kí-miàng yung-fu khiung-hióng. Kó-yèn ngì-he yit-miàng ngia̍k-miàng yung-fu ngin-vì pún-hong song ke phìn-lî kiên ngì mò-kôan, chhiáng [[Special:UserLogin|Chhóng-kien sîn chong-ho fe̍t-chá Tên-ngi̍p]] khó-yî phit-miên lòi-yì khì-thâ ngia̍k-miàng yung-fu ke fun-lon.''",
    -	"noarticletext": "邇頁當前無內容,汝做得在其他頁[[Special:Search/{{PAGENAME}}|搜尋邇頁標題]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋有關日誌],\n或[{{fullurl:{{FULLPAGENAME}}|action=edit}} 編寫邇頁]</span>。",
    +	"noarticletext": "Liá-ya̍p tông-chhièn mò nui-yùng, ngì cho-tet chhai khì-thâ [[Special:Search/{{PAGENAME}}|sêu-chhìm liá-ya̍p phiêu-thì]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} sêu-chhìm yû-kôan ngit-chì] fe̍t [{{fullurl:{{FULLPAGENAME}}|action=edit}} phiên-siá liá-ya̍p]</span>.",
     	"noarticletext-nopermission": "邇頁當前無內容。\n汝做得在其它頁[[Special:Search/{{PAGENAME}}|搜尋邇頁標題]],或者<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 搜尋有關日誌]</span>,但汝無權限建立邇頁。",
     	"userpage-userdoesnotexist": "用戶帳號“$1:還吂註冊。\n請在建立/編寫邇隻頁面前先檢查一下。",
     	"clearyourcache": "'''Chu-yi:''' Chhai tú-chhùn yî-heu, ngì pit-sî khoai chhái-chhí chhîn-chhù hi-khí chhòi-nèn khon-tó chok-chhut ke kói-pien. '''Mozilla / Firefox / Safari:''' on-tén ''Shift'' chai tiám-kit '' Chhùng-sîn chṳ́n-lî ''(fe̍t-chá on-hâ ''Ctrl-Shift-R'', chhai Phìn-kó Mac song on-hâ ''Cmd-Shift-R''); '''IE:''' on-tén ''Ctrl'' chai tiám-kit ''Chhùng-sîn chṳ́n-lî'', fe̍t-he on-hâ ''Ctrl-F5'';'''Konqueror:''' chak  sî-yeu tiám-kit ''Chhùng-sîn chṳ́n-lî''; '''Opera:''' yung-fu sî-yeu chhai ''kûng-khí-sat-thin'' chûng vàn-cháng-thi chhîn-chhù ke khoai-chhí.",
    @@ -540,23 +549,23 @@
     	"usercsspreview": "'''Chu-yi ngì chak-he chhai yi-liau ngì ke-ngìn CSS, hàn-mò tú-chhùn!'''",
     	"userjspreview": "'''記緊汝單單係在測試/預覽汝嘅用戶JavaScript。'''\n'''還吂保存!'''",
     	"userinvalidcssjstitle": "'''警告:''' 毋存在外皮“$1”。\n注意自定嘅.css撈.js頁愛使用小寫標題,例如,{{ns:user}}:Foo/vector.css撈 {{ns:user}}:Foo/Vector.css毋同。",
    -	"updated": "(已經更新)",
    -	"note": "'''注意:'''",
    +	"updated": "(Yí-kîn kiên-sîn)",
    +	"note": "<strong>Chu-yi:</strong>",
     	"previewnote": "'''請記到邇單淨係預覽。'''\n汝嘅更改還吂保存!",
     	"previewconflict": "邇隻預覽展示矣上片文字編寫區肚嘅內容。其將在汝選擇保存後出現。",
     	"session_fail_preview": "'''好抱歉!由於部份數據遺失,𠊎兜無辦法處理汝嘅編寫。'''\n請試多一擺。\n係講還係失敗,請[[Special:UserLogout|登出]]後重新登入。",
     	"session_fail_preview_html": "'''Chṳ̂n tui-put-hí! Phu-fun chṳ̂-liau yí-kîn yì-sṳt, mò-fap chhú-lî ngì-ke phiên-siá.'''\n\n'''Kó-yèn liá-ke phiên-siá ko-chhàng mò-yû mun-thì, chhiáng chai-chhṳ yit-chhṳ. Yìn-yèn yû mun-thì, chhiáng tên-chhut heu chhùng-sîn tên-ngi̍p yit-chhṳ.'''",
    -	"editing": "編寫 $1",
    -	"creating": "創建 $1",
    -	"editingsection": "編寫 $1 (段落)",
    +	"editing": "Phiên-siá $1",
    +	"creating": "Chhóng-kien $1",
    +	"editingsection": "Phiên-siá $1 (thon-lo̍k)",
     	"editingcomment": "Chang-chhai phiên-siá $1 (phìn-lun)",
    -	"editconflict": "編寫衝突:$1",
    +	"editconflict": "Phiên-siá chhûng-thu̍t: $1",
     	"explainconflict": "有人在汝開始編寫後更改矣頁面。\n上片嘅文字框內展示嘅是當前本頁嘅內容。\n汝所做嘅修改展示在下背嘅文字框肚。\n汝應該將汝所做嘅修改加入現有嘅內容肚。\n'''單淨'''在上片文字框肚嘅內容會在汝點擊「{{int:savearticle}}」後分保存。",
    -	"yourtext": "汝嘅文字",
    -	"storedversion": "已保存嘅修訂版本",
    +	"yourtext": "Ngì-ke vùn-sṳ",
    +	"storedversion": "Yí pó-chhùn ke siû-thin pán-pún",
     	"nonunicodebrowser": "'''警告: 汝嘅瀏覽器毋兼容Unicode編碼。'''邇位有一隻工作區將使汝做得安全編寫頁面: 非ASCII字符將以十六進製編碼模式出現在編輯框肚。",
     	"editingold": "'''警告:汝在編輯中嘅係本頁嘅舊版本。'''\n係講汝保存其嘅話,在本版本之後嘅任何更改都會遺失。",
    -	"yourdiff": "差別",
    +	"yourdiff": "Chhâ-phe̍t",
     	"copyrightwarning": "Chhiáng chu-yi ngì tui {{SITENAME}} ke só-yû kung-hien tû pûn-ngìn ngin-vì he chhai $2-hâ fat-phu, chhiáng chhà-khon chhai $1-ke se-chiet. Kó-yèn ngì chhin-mò hî-mong ngì-ke vùn-sṳ pûn-ngìn ngim-yi siù-chho lâu chai san-pu, chhiáng mò-yeu thì-kâu.<br /> Ngì thùng-sṳ̀ ya-yeu hiong Wikimedia pó-chṳn ngì só thì-kâu ke nui-yùng he chhṳ-kí só chok, fe̍t-chá lòi-chhṳ yit-ke mò-su pán-khièn pó-fu fe̍t-he siông-thùng chhṳ-yù ke lòi-ngièn. '''Mò-yeu chhai hàn-mò su-khièn ke chhìn-khóng-hâ fat-péu!'''<br />",
     	"copyrightwarning2": "請注意汝對{{SITENAME}}嘅所有貢獻\n都可能分其他貢獻人編寫、修改或刪除。\n係講汝毋希望您嘅文字分任意修改撈再散佈,請毋好提交。<br />\n汝同時也愛向𠊎兜保證汝所提交嘅內容係自家所作,或得自一隻毋受版權保護或相似自由嘅來源(參閱$1的細節)。\n'''毋好在未獲授權嘅情況下發表!'''",
     	"longpageerror": "'''Chho-ngu: Ngì só thì-kâu ke vùn-sṳ chhòng-thu yû $1KB, liá thai-yî $2KB ke chui-thai chhṳ̍t, ke-vùn-chông put-nèn pûn tú-chhùn.'''",
    @@ -564,30 +573,30 @@
     	"protectedpagewarning": "'''Kín-ko: Pún-chông yí-kîn pûn pó-fu, chṳ́-yû yúng-yû Kón-lî-yèn hí-khó-khièn ke yung-fu chhòi-nèn siù-chho.'''",
     	"semiprotectedpagewarning": "'''Chu-yi:''' Pún vùn-chông pûn só-thin, tên-ki ke yung-fu hí-khó phiên-siá.",
     	"cascadeprotectedwarning": "'''警告:'''本頁已經分保護,單淨係擁有管理員權限嘅用戶正做得修改,因為本頁已分下背連鎖保護嘅{{PLURAL:$1|一隻|多隻}}頁面所包含:",
    -	"templatesused": "邇頁面包含下背{{PLURAL:$1|模板|模板}}:",
    +	"templatesused": "Liá ya̍p-mien pâu-hàm hâ-poi {{PLURAL:$1|Mù-pán|Mù-pán}}:",
     	"templatesusedpreview": "Chhṳ́-chhṳ yi-siên chûng sṳ́-yung ke mù-pán yû:",
     	"templatesusedsection": "Chhai liá-ke thon-lo̍k song sṳ́-yung ke mù-pán yû:",
    -	"template-protected": "(保護)",
    -	"template-semiprotected": "(半保護)",
    -	"hiddencategories": "邇頁屬於$1隻隱藏分類嘅成員:",
    +	"template-protected": "(Pó-fu)",
    +	"template-semiprotected": "(Pan pó-fu)",
    +	"hiddencategories": "Liá-ya̍p su̍k-yî $1-chak yún-chhông fûn-lui ke sṳ̀n-yèn:",
     	"edittools": "<!-- 邇肚嘅文字將分展示在編寫撈上傳表單以下。 -->\n<div id=\"editpage-specialchars\" class=\"plainlinks edittools-version-test003\" style=\"margin-top: 15px; border-width: 1px; border-style: solid; border-color: #aaaaaa; padding: 2px;\"> <span id=\"edittools_main\">'''Insert:''' <charinsert>– — … ‘ “ ’ ” ° ″ ′ ≈ ≠ ≤ ≥ ± − × ÷ ← → · § </charinsert></span><span id=\"edittools_name\">&nbsp;&nbsp;'''Sign your username:''' <charinsert>--~~&#126;~</charinsert> <small>(on [[Help:Talk pages|talk pages]])</small></span> ---- <small id=\"edittools_newsectionshere\"><span id=\"edittools_hide_for_script_test\"><span id=\"edittools_wikimarkup\">'''Wiki markup:''' <charinsert><nowiki>{{</nowiki>+<nowiki>}}</nowiki> </charinsert> &nbsp; <charinsert><nowiki>{{{</nowiki>+<nowiki>}}}</nowiki> </charinsert> &nbsp; <charinsert><nowiki>|</nowiki></charinsert> &nbsp; <charinsert>[+]</charinsert> &nbsp; <charinsert>[[+]]</charinsert> &nbsp; <charinsert>[[Category:+]]</charinsert> &nbsp; <charinsert>#REDIRECT&#32;[[+]]</charinsert> &nbsp; <charinsert>{{Subst:Fôn-ngiàng}}</charinsert> &nbsp; <charinsert>{{Subst:PAGENAME}}</charinsert> &nbsp; <charinsert>&nbsp;</charinsert> &nbsp; <charinsert><s>+</s></charinsert> &nbsp; <charinsert><sup>+</sup></charinsert> &nbsp; <charinsert><sub>+</sub></charinsert> &nbsp; <charinsert><code>+</code></charinsert> &nbsp; <charinsert><blockquote>+</blockquote></charinsert> &nbsp; <charinsert><ref>+</ref></charinsert> &nbsp; <charinsert><nowiki>{{</nowiki>Reflist<nowiki>}}</nowiki></charinsert> &nbsp; <charinsert><references/></charinsert> &nbsp; <charinsert><includeonly>+</includeonly></charinsert> &nbsp; <charinsert><noinclude>+</noinclude></charinsert> &nbsp; <charinsert><nowiki>{{</nowiki>DEFAULTSORT:+<nowiki>}}</nowiki></charinsert> &nbsp; <charinsert>&lt;nowiki>+</nowiki></charinsert> &nbsp; <charinsert><nowiki><!-- </nowiki>+<nowiki> --></nowiki></charinsert>&nbsp; <charinsert><nowiki><span class=\"plainlinks\"></nowiki>+<nowiki></span></nowiki></charinsert>&nbsp;&nbsp;&bull;&nbsp; ([[Wikipedia:Template messages|templates]])<br/></span> <span id=\"edittools_symbols\">'''Symbols:''' <charinsert> ~ | ¡ ¿ † ‡ ↔ ↑ ↓ • ¶</charinsert> &nbsp; <charinsert> # ½ ⅓ ⅔ ¼ ¾ ⅛ ⅜ ⅝ ⅞ ∞ </charinsert> &nbsp; <charinsert> ‘ “ ’ ” «+»</charinsert> &nbsp; <charinsert> ¤ ₳ ฿ ₵ ¢ ₡ ₢ $ ₫ ₯ € ₠ ₣ ƒ ₴ ₭ ₤ ℳ ₥ ₦ № ₧ ₰ £ ៛ ₨ ₪ ৳ ₮ ₩ ¥ </charinsert> &nbsp; <charinsert> ♠ ♣ ♥ ♦ </charinsert>&nbsp; <charinsert>m²</charinsert>&nbsp;<charinsert>m³</charinsert><br/></span> <span id=\"edittools_characters\">'''Characters:''' <span class=\"latinx\"> <charinsert> Á á Ć ć É é Í í Ĺ ĺ Ḿ ḿ Ń ń Ó ó Ŕ ŕ Ś ś Ú ú Ý ý Ź ź </charinsert> &nbsp; <charinsert> À à È è Ì ì M̀ m̀  Ǹ ǹ Ò ò Ù ù </charinsert> &nbsp; <charinsert>  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> &nbsp; <charinsert> A̤ a̤ E̤ e̤ I̤ i̤ O̤ o̤ Ṳ ṳ </charinsert> &nbsp;\n<charinsert> A̍ a̍ E̍ e̍ I̍ i̍ O̍ o̍ U̍ u̍ </charinsert> &nbsp; <charinsert> À̤ à̤ È̤ è̤ Ì̤ ì̤ Ò̤ ò̤ Ṳ̀ ṳ̀ </charinsert> &nbsp;\n<charinsert> Á̤ á̤ É̤ é̤ Í̤ í̤ Ó̤ ó̤ Ṳ́ ṳ́ </charinsert> &nbsp; <charinsert> A̤̍ a̤̍ E̤̍ e̤̍ I̤̍ i̤̍ O̤̍ o̤̍ Ṳ̍ ṳ̍ </charinsert> &nbsp;\n<charinsert> Â̤ â̤ Ê̤ ê̤ Î̤ î̤ Ô̤ ô̤ Ṳ̂ ṳ̂ </charinsert> &nbsp; <charinsert>  â Ĉ ĉ Ê ê Ĝ ĝ Ĥ ĥ Î î Ĵ ĵ Ô ô Ŝ ŝ Û û Ŵ ŵ Ŷ ŷ </charinsert> &nbsp; <charinsert> Ä ä Ë ë Ï ï Ö ö Ü ü Ÿ ÿ </charinsert> &nbsp; <charinsert> ß </charinsert> &nbsp; <charinsert> à ã Ẽ ẽ Ĩ ĩ Ñ ñ Õ õ Ũ ũ Ỹ ỹ</charinsert> &nbsp; <charinsert> Ç ç Ģ ģ Ķ ķ Ļ ļ Ņ ņ Ŗ ŗ Ş ş Ţ ţ </charinsert> &nbsp; <charinsert> Đ đ </charinsert> &nbsp; <charinsert> Ů ů </charinsert> &nbsp; <charinsert> Ǎ ǎ Č č Ď ď Ě ě Ǐ ǐ Ľ ľ Ň ň Ǒ ǒ Ř ř Š š Ť ť Ǔ ǔ Ž ž </charinsert> &nbsp; <charinsert> Ā ā Ē ē Ī ī Ō ō Ū ū Ȳ ȳ Ǣ ǣ </charinsert> &nbsp; <charinsert> ǖ ǘ ǚ ǜ </charinsert> &nbsp; <charinsert> Ă ă Ĕ ĕ Ğ ğ Ĭ ĭ Ŏ ŏ Ŭ ŭ </charinsert> &nbsp; <charinsert> Ċ ċ Ė ė Ġ ġ İ ı Ż ż </charinsert> &nbsp; <charinsert> Ą ą Ę ę Į į Ǫ ǫ Ų ų </charinsert> &nbsp; <charinsert> Ḍ ḍ Ḥ ḥ Ḷ ḷ Ḹ ḹ Ṃ ṃ Ṇ ṇ Ṛ ṛ Ṝ ṝ Ṣ ṣ Ṭ ṭ </charinsert> &nbsp; <charinsert> Ł ł </charinsert> &nbsp; <charinsert> Ő ő Ű ű </charinsert> &nbsp; <charinsert> Ŀ ŀ </charinsert> &nbsp; <charinsert> Ħ ħ </charinsert> &nbsp; <charinsert> Ð ð Þ þ </charinsert> &nbsp; <charinsert> Œ œ </charinsert> &nbsp; <charinsert> Æ æ Ø ø Å å </charinsert> &nbsp; <charinsert> Ə ə </charinsert></span>&nbsp;<span id=\"edittools_latinx_template\">&nbsp;&bull;&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>Unicode|</nowiki>+<nowiki>}}</nowiki></charinsert></span><br/></span> <span id=\"edittools_greek\">'''Hî-lia̍p-vùn:''' <charinsert> Ά ά Έ έ Ή ή Ί ί Ό ό Ύ ύ Ώ ώ </charinsert> &nbsp; <charinsert> Α α Β β Γ γ Δ δ </charinsert> &nbsp; <charinsert> Ε ε Ζ ζ Η η Θ θ </charinsert> &nbsp; <charinsert> Ι ι Κ κ Λ λ Μ μ </charinsert> &nbsp; <charinsert> Ν ν Ξ ξ Ο ο Π π </charinsert> &nbsp; <charinsert> Ρ ρ Σ σ ς Τ τ Υ υ </charinsert> &nbsp; <charinsert> Φ φ Χ χ Ψ ψ Ω ω </charinsert> &nbsp;<span id=\"edittools_greek_template\">•&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>Polytonic|</nowiki>+<nowiki>}}</nowiki></charinsert></span> &nbsp;<span id=\"edittools_greek_example\">•&nbsp; ([[Greek diacritics#Computer encoding|polytonic list]])</span><br/></span> <span id=\"edittools_cyrillic\">'''Cyrillic:''' <charinsert> А а Б б В в Г г </charinsert> &nbsp; <charinsert> Ґ ґ Ѓ ѓ Д д Ђ ђ </charinsert> &nbsp; <charinsert> Е е Ё ё Є є Ж ж </charinsert> &nbsp; <charinsert> З з Ѕ ѕ И и І і </charinsert> &nbsp; <charinsert> Ї ї Й й Ј ј К к </charinsert> &nbsp; <charinsert> Ќ ќ Л л Љ љ М м </charinsert> &nbsp; <charinsert> Н н Њ њ О о П п </charinsert> &nbsp; <charinsert> Р р С с Т т Ћ ћ </charinsert> &nbsp; <charinsert> У у Ў ў Ф ф Х х </charinsert> &nbsp; <charinsert> Ц ц Ч ч Џ џ Ш ш </charinsert> &nbsp; <charinsert> Щ щ Ъ ъ Ы ы Ь ь </charinsert> &nbsp; <charinsert> Э э Ю ю Я я </charinsert> &nbsp;<br/></span> <span id=\"edittools_ipa\">'''IPA:''' <span title=\"Pronunciation in IPA\" class=\"IPA\"><charinsert>t̪ d̪ ʈ ɖ ɟ ɡ ɢ ʡ ʔ </charinsert> &nbsp; <charinsert> ɸ ʃ ʒ ɕ ʑ ʂ ʐ ʝ ɣ ʁ ʕ ʜ ʢ ɦ </charinsert> &nbsp; <charinsert> ɱ ɳ ɲ ŋ ɴ </charinsert> &nbsp; <charinsert> ʋ ɹ ɻ ɰ </charinsert> &nbsp; <charinsert> ʙ ʀ ɾ ɽ </charinsert> &nbsp; <charinsert> ɫ ɬ ɮ ɺ ɭ ʎ ʟ </charinsert> &nbsp; <charinsert> ɥ ʍ ɧ </charinsert> &nbsp; <charinsert> ɓ ɗ ʄ ɠ ʛ </charinsert> &nbsp; <charinsert> ʘ ǀ ǃ ǂ ǁ </charinsert> &nbsp; <charinsert> ɨ ʉ ɯ </charinsert> &nbsp; <charinsert> ɪ ʏ ʊ </charinsert> &nbsp; <charinsert> ɘ ɵ ɤ </charinsert> &nbsp; <charinsert> ə ɚ </charinsert> &nbsp; <charinsert> ɛ ɜ ɝ ɞ ʌ ɔ </charinsert> &nbsp; <charinsert> ɐ ɶ ɑ ɒ </charinsert> &nbsp; <charinsert> ʰ ʷ ʲ ˠ ˤ ⁿ ˡ </charinsert> &nbsp; <charinsert> ˈ ˌ ː ˑ ̪ </charinsert>&nbsp;</span> &nbsp;&bull;&nbsp; <charinsert><nowiki>{{</nowiki><nowiki>IPA|</nowiki>+<nowiki>}}</charinsert></small>\n</div>",
     	"nocreatetext": "Chhṳ́ mióng-chham han-chṳ chhóng-chho sîn hong-mien ke kûng-yung. ngì khó-yî fán-fì pin phiên-cho yí-kîn yû ke hong-mien, fe̍t-chá [[Special:UserLogin|tên-liu̍k fe̍t-he chhóng-kien sîn chong-fu]].",
     	"nocreate-loggedin": "汝並無權限去創建新頁面。",
    -	"permissionserrors": "權限差錯",
    +	"permissionserrors": "Khièn-han chhâ-chho",
     	"permissionserrorstext": "Kîn-kí yî-ha ke ngièn-yîn, ngì vù-yû khièn-han hi-tso yî-ha ke thung-tsok:",
     	"permissionserrorstext-withaction": "根據下背嘅{{PLURAL:$1|原因|原因}},汝並無權限去做$2:",
     	"recreate-moveddeleted-warn": "'''警告:汝今下重新建立一隻先前曾經刪除過嘅頁面。'''\n\n汝應該愛考慮一下繼續編寫邇一隻頁面係毋係合適。\n為到方便,邇一個頁面嘅刪除日誌已經在下背提供:",
    -	"moveddeleted-notice": "邇隻頁面已經刪除。\n邇隻頁面嘅刪除撈移動日誌已經在下背提供來參考。",
    -	"log-fulllog": "查看完整日誌",
    -	"edit-hook-aborted": "編寫分鈎取消。\n其並無分出解釋。",
    +	"moveddeleted-notice": "Liá-chak ya̍p-mien yí-kîn san-chhù. \nLiá-chak ya̍p-mien ke san-chhù lâu yì-thûng ngit-chì yí-kîn chhai hâ-poi thì-kiûng lòi chhâm-kháu.",
    +	"log-fulllog": "Chhà-khon vàn-cháng ngit-chì",
    +	"edit-hook-aborted": "Phiên-siá fûn-keu chhí-sêu. \nKhì pin-mò fûn-chhut kié-sṳt.",
     	"edit-gone-missing": "毋做得更新頁面。\n其可能正正分刪除。",
    -	"edit-conflict": "編寫衝突。",
    +	"edit-conflict": "Phiên-siá chhûng-thu̍t.",
     	"edit-no-change": "汝嘅編寫已經略過,因為文字無任何改動。",
     	"edit-already-exists": "毋做得建立一隻新頁面。\n其已經存在。",
    -	"defaultmessagetext": "默認消息文字",
    +	"defaultmessagetext": "Me̍t-ngin sêu-sit vùn-sṳ",
     	"invalid-content-data": "無效嘅數據內容",
    -	"content-model-wikitext": "wiki語法",
    -	"content-model-text": "純文字",
    +	"content-model-wikitext": "Wki ngî-fap",
    +	"content-model-text": "sùn vùn-sṳ",
     	"content-model-javascript": "JavaScript",
     	"content-model-css": "CSS",
     	"post-expand-template-inclusion-warning": "警告: 包含模板大小過大。\n一兜模板將毋會包含。",
    @@ -598,27 +607,27 @@
     	"undo-failure": "由於中途嘅編寫毋一致,本編輯毋做得撤銷。",
     	"undo-norev": "由於其嘅修訂版本毋存在或已刪除,本編寫毋做得撤銷。",
     	"undo-summary": "Chhí-sêu yù [[Special:Contributions/$2|$2]] ([[User talk:$2|tui-fa]]) só chok-chhut ke siû-thin $1",
    -	"cantcreateaccounttitle": "無法建立帳號",
    +	"cantcreateaccounttitle": "Mò-fap kien-li̍p chong-ho",
     	"cantcreateaccount-text": "從邇隻IP地址('''$1''')建立帳號已經分[[User:$3|$3]]禁止。\n\n當中分$3封禁嘅原因是''$2''",
    -	"viewpagelogs": "查看邇隻頁面嘅日誌",
    +	"viewpagelogs": "Chhà-khon liá-chak ya̍p-mien ke ngit-chì",
     	"nohistory": "無本頁嘅修訂版本記錄。",
     	"currentrev": "最新版本",
    -	"currentrev-asof": "$1嘅最新修訂版本",
    -	"revisionasof": "$1嘅修訂版本",
    -	"revision-info": "在$1由$2所做嘅修訂版本",
    -	"previousrevision": "←上隻版本",
    -	"nextrevision": "下隻版本→",
    -	"currentrevisionlink": "最新版本",
    -	"cur": "當前",
    +	"currentrev-asof": "$1 ke chui-sîn siû-thin pán-pún",
    +	"revisionasof": "$1 ke siû-thin pán-pún",
    +	"revision-info": "chhai $1 yù {{GENDER:$6|$2}} só cho ke siû-thin pán-pún $7",
    +	"previousrevision": "← Sông-chak pán-pún",
    +	"nextrevision": "Hâ-chak pán-pún →",
    +	"currentrevisionlink": "Chui-sîn pán-pún",
    +	"cur": "tông-chhièn",
     	"next": "下一隻",
    -	"last": "上一隻",
    -	"page_first": "最早",
    -	"page_last": "最尾",
    +	"last": "sông yit-chak",
    +	"page_first": "chui-chó",
    +	"page_last": "chui-mî",
     	"histlegend": "差別選擇:標記愛比較版本嘅單選按鈕並點擊底部嘅按鈕進行比較。<br />\n說明:'''({{int:cur}})''' 指撈最新版本比較,'''({{int:last}})''' 指撈上隻版本比較,'''{{int:minoreditletter}}''' = 細微修改。",
    -	"history-fieldset-title": "瀏覽歷史",
    -	"history-show-deleted": "單淨係已刪除嘅",
    -	"histfirst": "最早",
    -	"histlast": "最新",
    +	"history-fieldset-title": "Liù-lám li̍t-sṳ́",
    +	"history-show-deleted": "Tân-chhiang he yí san-chhù ke",
    +	"histfirst": "chui-chó",
    +	"histlast": "chui-sîn",
     	"historysize": "($1字節)",
     	"historyempty": "(空)",
     	"history-feed-title": "修訂歷史",
    @@ -630,7 +639,7 @@
     	"rev-deleted-event": "(日誌已刪除)",
     	"rev-deleted-text-permission": "Ke-vùn-chông siû-thin yí-kîn pûn-chhiùng kûng-khiung vùn-tóng chûng yì-chhù. Chhai [{{fullurl:{{#Special:Log}}/suppress|page={{PAGENAMEE}}}} chhù-thet ngit-ki] chûng khó-nèn kiám-chhà to siòng-se ke sin-sit.",
     	"rev-deleted-text-view": "Ke-vùn-chông siû-thin yí-kîn pûn-chhiùng kûng-khiung vùn-tóng chûng yì-chhù. Chok-vi mióng-chham ke kón-lî-yèn, khó-yî kiám-chhà; Chhai[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} chhù-thet ngit-ki] chûng khó-nèn kiám-chhà to siòng-se ke sin-sit.",
    -	"rev-delundel": "展現/隱藏",
    +	"rev-delundel": "chán-hien / yún-chhông",
     	"rev-showdeleted": "展現",
     	"revisiondelete": "刪除/恢復刪除修訂版本",
     	"revdelete-nooldid-title": "無效嘅目標修訂版本",
    @@ -659,68 +668,70 @@
     	"mergehistory-from": "來源頁面:",
     	"mergehistory-into": "目的頁面:",
     	"mergehistory-list": "做得合併嘅編寫歷史",
    -	"mergehistory-merge": "以下[[:$1]]嘅修訂可以合併到[[:$2]]。用邇選項按鈕欄去合併單淨有在指定時間以前所創建嘅修訂。愛留意嘅係使用導航連接就會重設邇一欄。",
    +	"mergehistory-merge": "Yî-hâ [[:$1]] ke siû-thin cho-tet ha̍p-pìn to [[:$2]]. Yung liá sién-hong on-néu-làn hi ha̍p-pìn tân-chhiang yû chhai chṳ́-thin sṳ̀-kiên yî-chhièn só chhóng-kien ke siû-thin. Oi liù-yi ke he sṳ́-yung thô-hòng lièn-chiap chhiu-fi chhùng-sat liá-yit làn.",
     	"revertmerge": "解除合併",
    -	"history-title": "“$1”嘅修訂歷史",
    -	"lineno": "第$1行:",
    +	"history-title": "\"$1\" ke siû-thin li̍t-sṳ́",
    +	"difference-title": "\"$1\" siû-thin kiên ke chhâ-bie",
    +	"lineno": "Thi $1 hàng:",
     	"compareselectedversions": "比較選定嘅修訂版本",
    -	"editundo": "撤銷",
    -	"searchresults": "搜尋結果",
    -	"searchresults-title": "搜尋\"$1\"嘅結果",
    +	"editundo": "Chha̍t-siau",
    +	"searchresults": "Sêu-chhìm kiet-kó",
    +	"searchresults-title": "Sêu -chhìm \"$1\" ke kiet-kó",
     	"titlematches": "頁面標題相符",
     	"textmatches": "頁面內容配得上",
     	"notextmatches": "無頁面內容配上",
    -	"prevn": "前頭$1隻",
    -	"nextn": "後背$1隻",
    +	"prevn": "chhièn-thèu $1 chak",
    +	"nextn": "heu-poi $1 chak",
     	"prevn-title": "前頭$1隻結果",
    -	"nextn-title": "後背$1隻結果",
    -	"shown-title": "每頁展示$1項結果",
    -	"viewprevnext": "查看($1 {{int:pipe-separator}} $2)($3)",
    +	"nextn-title": "Heu-poi $1-chak kiet-kó",
    +	"shown-title": "Mî-ya̍p chán-sṳ $1-hong kiet-kó",
    +	"viewprevnext": "Chhà-khon ( $1 {{int:pipe-separator}} $2) ( $3)",
     	"searchmenu-exists": "'''在邇隻wiki上已經有一頁喊做“[[:$1]]”。'''",
    -	"searchmenu-new": "'''在本wiki上建立邇隻頁面“[[:$1]]”!'''",
    -	"searchprofile-articles": "內容頁面",
    -	"searchprofile-images": "多媒體",
    -	"searchprofile-everything": "全部",
    -	"searchprofile-advanced": "高級",
    -	"searchprofile-articles-tooltip": "在$1肚搜尋",
    -	"searchprofile-images-tooltip": "搜尋文件",
    -	"searchprofile-everything-tooltip": "搜索全部(包括討論頁面)",
    -	"searchprofile-advanced-tooltip": "在用戶安名空間肚搜尋",
    -	"search-result-size": "$1 ($2隻字)",
    +	"searchmenu-new": "<strong>Chhai pún Wiki sông kien-li̍p liá-chak ya̍p-mien \"[[:$1]]\"!</strong>{{PLURAL:$2|0=|fe̍t chhiáng chhâm-kháu ngì sû-ngi̍p ke thiàu-khien cháu-to ke sêu-chhìm kiet-kó. |fe̍t chhiáng chhâm-kháu khì-thâ sêu-chhìm kiet-kó.}}",
    +	"searchprofile-articles": "Nui-yùng ya̍p-mien",
    +	"searchprofile-images": "Tô mòi-thí",
    +	"searchprofile-everything": "Chhiòn-phu",
    +	"searchprofile-advanced": "Kô-kip",
    +	"searchprofile-articles-tooltip": "Chhai $1 tú sêu-chhìm",
    +	"searchprofile-images-tooltip": "Sêu-chhìm vùn-khien",
    +	"searchprofile-everything-tooltip": "Sêu-sok chhiòn-phu (pâu-koat thó-lun ya̍p-mien)",
    +	"searchprofile-advanced-tooltip": "Chhai yung-fu ôn-miàng khûng-kiên tú sêu-chhìm",
    +	"search-result-size": "$1 ($2-chak sá¹³)",
     	"search-result-category-size": "$1隻成員($2隻子分類,$3隻文件)",
    -	"search-redirect": "(重定向 $1)",
    -	"search-section": "(段落 $1)",
    -	"search-suggest": "汝係毋係尋:$1",
    +	"search-redirect": "(Chhùng-thin-hiong $1)",
    +	"search-section": "(thon-lo̍k $1)",
    +	"search-suggest": "Ngì he-m̀-he chhìm: $1",
     	"search-interwiki-caption": "姊妹計劃",
     	"search-interwiki-default": "來自$1嘅結果:",
     	"search-interwiki-more": "(還較多)",
     	"searchrelated": "相關",
    -	"searchall": "全部",
    +	"searchall": "chhiòn-phu",
     	"showingresults": "Ha-mien hién-sṳ chhiùng thi-'''$2'''-thiàu khôi-sṳ́ ke '''$1'''-thiàu kiet-kó:",
    -	"search-nonefound": "在查詢肚無結果相符。",
    +	"search-showingresults": "{{PLURAL:$4|thi <strong>$1</strong> pit kiet-kó, khiung <strong>$3</strong> pit |thi <strong>$1 - $2</strong> pit kiet-kó, khiung <strong>$3</strong> pit }}",
    +	"search-nonefound": "Chhai chhà-sûn tú mò kiet-kó siông-fù.",
     	"powersearch-legend": "高級搜尋",
     	"powersearch-ns": "在下背嘅名字空間肚搜尋:",
     	"powersearch-togglelabel": "監查:",
     	"searchdisabled": "{{SITENAME}}由於性能方面嘅原因,全文搜已分暫時停用。汝做得暫時通過Google搜尋。請留意佢兜嘅索引可能會過時。",
     	"preferences": "偏好設定",
    -	"mypreferences": "偏好設定",
    -	"prefs-skin": "外皮",
    +	"mypreferences": "Phiên-hó sat-thin",
    +	"prefs-skin": "Ngoi-phì",
     	"skin-preview": "預覽",
     	"datedefault": "預設值",
     	"prefs-personal": "用戶資料",
    -	"prefs-rc": "最近更改",
    +	"prefs-rc": "Chui-khiûn kiên-kói",
     	"prefs-watchlist": "監視列表",
     	"prefs-watchlist-days": "Kam-sṳ lie̍t-péu chûng hién-sṳ ki-liu̍k ke thiên-su:",
     	"prefs-watchlist-edits": "擴展監視列表肚顯示更改次數上限:",
     	"prefs-misc": "雜項",
     	"saveprefs": "保存",
    -	"restoreprefs": "恢復所有默認設定",
    +	"restoreprefs": "Fî-fu̍k só-yû me̍t-ngin sat-thin (só-yû hong-muk)",
     	"prefs-editing": "編寫緊",
     	"rows": "行数:",
     	"columns": "列:",
     	"searchresultshead": "搜尋",
     	"stub-threshold": "<a href=\"#\" class=\"stub\">短頁面鏈接</a>格式門檻值(字節):",
    -	"recentchangesdays": "最近更改肚嘅顯示日數:",
    +	"recentchangesdays": "Chui-khiûn kiên-kói tú ke hién-sṳ ngit-sú:",
     	"recentchangescount": "Chui-khiûn kiên-kói chûng ke phiên-siá chúng-su:",
     	"savedprefs": "汝嘅個人偏好設定已經保存。",
     	"timezonelegend": "Sṳ̀-khî",
    @@ -740,7 +751,7 @@
     	"badsiglength": "Tshiâm-miàng ko-liong.\nTshòng-tón pit-sî chhai $1-ke sṳ-ngièn yî-ha.",
     	"email": "電子郵件",
     	"prefs-help-realname": "真名係做得選嘅。\n假使汝選擇提供其,其會用在貢獻署名。",
    -	"prefs-help-email": "電郵地址係選填項目,但係,假使汝毋記得汝嘅密碼,其做得用於重設密碼。",
    +	"prefs-help-email": "Thien-yù thi-chí he sién-thiàm hong-muk, than-he, ká-sṳ́ ngì m̀-ki-tet ngì-ke me̍t-ma, khì cho-tet yung-yî chhùng-sat me̍t-ma.",
     	"prefs-help-email-others": "汝也做得選擇分其他用戶通過汝嘅用戶頁或交流頁上嘅鏈接用電子郵件聯繫汝。\n其他用戶聯繫汝時汝嘅電子郵件毋會顯示出來。",
     	"userrights": "用戶權限管理",
     	"userrights-lookup-user": "管理用戶群組",
    @@ -761,51 +772,66 @@
     	"group-bureaucrat-member": "行政員",
     	"grouppage-bot": "{{ns:project}}:機器人",
     	"grouppage-sysop": "{{ns:project}}:管理員",
    -	"right-upload": "上傳文件",
    -	"newuserlogpage": "新建用戶名冊",
    +	"right-upload": "Sông-chhòn vùn-khien",
    +	"right-writeapi": "Sṳ́-yung siá-ngi̍p API",
    +	"newuserlogpage": "Sîn-kien yung-fu miàng-chhak",
     	"newuserlogpagetext": "邇係一隻最近人創建用戶嘅新日誌",
     	"rightslog": "用戶權限日誌",
     	"rightslogtext": "下背記錄矣用戶權限嘅更改日誌。",
     	"action-edit": "編寫本頁",
     	"nchanges": "$1次更改",
    -	"recentchanges": "最近更改",
    -	"recentchanges-legend": "最近更改選項",
    -	"recentchanges-summary": "跟蹤本wiki上嘅最新更改。",
    -	"recentchanges-feed-description": "跟蹤本訂閱在wiki上嘅最近更改。",
    -	"recentchanges-label-newpage": "邇次編輯建立起一隻新頁面",
    -	"recentchanges-label-minor": "邇係一隻細微修改",
    -	"recentchanges-label-bot": "邇次編寫係由機器人進行",
    -	"recentchanges-label-unpatrolled": "邇次編寫還吂巡查過",
    +	"enhancedrc-history": "Li̍t-sṳ́",
    +	"recentchanges": "Chui-khiûn kiên-kói",
    +	"recentchanges-legend": "Chui-khiûn kiên-kói sién-hong",
    +	"recentchanges-summary": "Kiên-chiûng pún wiki sông ke chui-sîn kiên-kói.",
    +	"recentchanges-feed-description": "Kiên-chiûng pún thin-ye̍t chhai wiki sông ke chui-khiûn kiên-kói.",
    +	"recentchanges-label-newpage": "Liá-chhṳ phiên-si̍p kien-li̍p hí yit-chak sîn ya̍p-mien",
    +	"recentchanges-label-minor": "Liá-he yit-chak se-mì siû-kói",
    +	"recentchanges-label-bot": "Liá-chhṳ phiên-siá he yù kî-hi-ngìn chin-hàng",
    +	"recentchanges-label-unpatrolled": "Liá-chhṳ phiên-siá hàn-mò sùn-chhà ko",
    +	"recentchanges-label-plusminus": "Kâi ya̍p-mien kiên-kói ke thai-séu  (vi-ngièn-chû)",
    +	"recentchanges-legend-heading": "<strong>Chu-yi:</strong>",
    +	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (chhiáng chhâm-siòng [[Special:NewPages|sîn ya̍p-mien]])",
     	"rcnotefrom": "下背係從'''$2'''起嘅更改(最多展示'''$1'''):",
    -	"rclistfrom": "展示從$3 $2以來嘅新更改",
    +	"rclistfrom": "Chán-sṳ chhiùng $3 $2 yî-lòi ke sîn kiên-kói",
     	"rcshowhideminor": "$1細微編寫",
    -	"rcshowhidebots": "$1機器人嘅編寫",
    -	"rcshowhideliu": "$1已登入用戶嘅編寫",
    -	"rcshowhideanons": "$1匿名用戶嘅編寫",
    +	"rcshowhideminor-show": "Chán-sṳ",
    +	"rcshowhideminor-hide": "Yún-chhông",
    +	"rcshowhidebots": "$1 kî-hi-ngìn ke phiên-siá",
    +	"rcshowhidebots-show": "Chán-sṳ",
    +	"rcshowhidebots-hide": "Yún-chhông",
    +	"rcshowhideliu": "$1 yí-kîn tên-ngi̍p ke yung-fu",
    +	"rcshowhideliu-hide": "Yún-chhông",
    +	"rcshowhideanons": "$1 nit-miàng yung-fu ke phiên-siá",
    +	"rcshowhideanons-show": "Chán-sṳ",
    +	"rcshowhideanons-hide": "Yún-chhông",
     	"rcshowhidepatr": "$1巡查過嘅編寫",
    -	"rcshowhidemine": "$1亻厓嘅編寫",
    -	"rclinks": "展示最近$2日內最新嘅$1次改動。<br />$3",
    -	"diff": "差別",
    -	"hist": "歷史",
    -	"hide": "隱藏",
    -	"show": "展示",
    -	"minoreditletter": "ç´°å¾®",
    -	"newpageletter": "新",
    -	"boteditletter": "機",
    +	"rcshowhidemine": "$1 ngài-ke phiên-siá",
    +	"rcshowhidemine-show": "Chán-sṳ",
    +	"rcshowhidemine-hide": "Yún-chhông",
    +	"rclinks": "Chán-sṳ chui-khiûn $2-ngit nui chui-sîn ke $1 chhṳ kói-thûng. <br />$3",
    +	"diff": "chhâ-phe̍t",
    +	"hist": "li̍t-sṳ́",
    +	"hide": "Yún-chhông",
    +	"show": "Chán-sṳ",
    +	"minoreditletter": "se-mì",
    +	"newpageletter": "Sîn",
    +	"boteditletter": "kî",
     	"number_of_watching_users_pageview": "[$1隻用戶關注]",
     	"rc_categories": "分類界限(以“|”分割)",
     	"rc_categories_any": "任意",
    +	"rc-change-size-new": "Kiên-kói heu ke $1 vi-ngièn-chû",
     	"rc-enhanced-expand": "展示細節 (愛有JavaScript)",
     	"rc-enhanced-hide": "隱藏細節",
    -	"recentchangeslinked": "相關更改",
    +	"recentchangeslinked": "Siông-kôan kiên-kó",
     	"recentchangeslinked-feed": "相關更改",
    -	"recentchangeslinked-toolbox": "相關更改",
    -	"recentchangeslinked-title": "撈“$1”有關嘅更改",
    +	"recentchangeslinked-toolbox": "Siông-kôan kiên-kói",
    +	"recentchangeslinked-title": "lâu \"$1\" yû-kôan ke kiên-kói",
     	"recentchangeslinked-summary": "邇一隻特殊頁面列示''由''所分出嘅一隻頁面之鏈接到頁面嘅最近更改(或者是對於指定分類嘅成員)。\n在[[Special:Watchlist|汝嘅監視列表]]肚嘅頁面會用'''粗體'''顯示。",
    -	"recentchangeslinked-page": "頁面名:",
    -	"recentchangeslinked-to": "展示連到所分出嘅頁面",
    -	"upload": "上傳文件",
    -	"uploadbtn": "上傳文件",
    +	"recentchangeslinked-page": "Ya̍p-mien miàng:",
    +	"recentchangeslinked-to": "Chán-sṳ lièn-to só fûn-chhut ke ya̍p-mien",
    +	"upload": "Sông-chhòn vùn-khien",
    +	"uploadbtn": "Sông-chhòn vùn-khien",
     	"reuploaddesc": "取消上載並返回上載表單",
     	"uploadnologin": "還吂登入",
     	"uploadnologintext": "汝必須先[[Special:UserLogin|登入]]\n正做得上傳文件。",
    @@ -815,7 +841,7 @@
     	"uploadlogpage": "上傳日誌",
     	"uploadlogpagetext": "Yî-ha he chui-khiûn song-chhòn vùn-khien ke chúng-péu.",
     	"filename": "文件名",
    -	"filedesc": "文件說明",
    +	"filedesc": "Vùn-khien sot-mìn",
     	"fileuploadsummary": "文件摘要:",
     	"filestatus": "版權狀態:",
     	"filesource": "來源:",
    @@ -841,51 +867,53 @@
     	"php-uploaddisabledtext": "PHP文件上傳已經停用。請檢查file_uploads設定。",
     	"uploadscripted": "邇文件包含可能分網絡瀏覽器錯誤解釋嘅HTML或腳本代碼。",
     	"uploadvirus": "邇文件包含有病毒!\n詳情:$1",
    -	"sourcefilename": "來源文件名",
    -	"destfilename": "目標文件名",
    -	"watchthisupload": "監視本文件",
    +	"sourcefilename": "Lòi-ngièn vùn-khien miàng:",
    +	"destfilename": "Muk-phiêu vùn-khien miàng",
    +	"watchthisupload": "Kâm-sṳ pún vùn-khien",
     	"filewasdeleted": "早先已經有一隻同名文件分上傳後又分刪除矣。在上傳邇文件之前汝愛檢查$1。",
     	"upload-proto-error": "協議毋著",
     	"upload-proto-error-text": "遠程上傳要求URL以<code>http://</code>或 <code>ftp://</code>開頭。",
     	"upload-file-error": "內部差錯",
    -	"upload-file-error-text": "當嘗試在服務器上建立臨時檔案時發生內部差錯。請撈[[Special:ListUsers/sysop|管理員]]聯繫。",
    +	"upload-file-error-text": "Tông sòng-sṳ chhai fu̍k-vu-hi sông kien-li̍p lìm-sṳ̀ tóng-on sṳ̀ fat-sâng nui-phu chhâ-chho. Chhiáng lâu [[Special:ListUsers/sysop|Kón-lî-yèn]] lièn-hì.",
     	"upload-misc-error": "吂知嘅上傳差錯",
    -	"upload-misc-error-text": "在上傳時發生還吂知嘅錯誤。請驗証使用矣正確並可訪問嘅 URL,然後重新嘗試。假使問題還係存在,請撈[[Special:ListUsers/sysop|管理員]]聯繫。",
    +	"upload-misc-error-text": "Chhai sông-chhòn sṳ̀ fat-sâng hàn mâng-tî ke chho-ngu. Chhiáng ngiam-chṳn sṳ́-yung yí chang-khok pin-khó fóng-mun ke URL, yèn-heu chhùng-sîn sòng-sṳ. Ká-sṳ́ mun-thì hàn-he chhùn-chhai, chhiáng lâu [[Special:ListUsers/sysop|Kón-lî-yèn]] lièn-hì.",
     	"upload-curl-error6": "無法訪問URL",
     	"upload-curl-error6-text": "無法訪問所提供嘅URL。請再次檢查邇URL係毋係正確,並且網站嘅訪問係毋係正常。",
     	"upload-curl-error28": "上傳超時",
     	"upload-curl-error28-text": "網站回應時間過長。請檢查邇網站嘅訪問係毋係正常,過一陣再試。汝可能愛在網路訪問有閒時節再試。",
     	"license": "授權:",
    -	"license-header": "授權",
    +	"license-header": "Su-khièn",
     	"nolicense": "無有選定",
     	"upload_source_url": " (一隻有效、做得公開訪問嘅URL)",
     	"upload_source_file": " (在汝電腦上嘅一隻文件)",
     	"listfiles_search_for": "按媒體名搜尋:",
    -	"imgfile": "文件",
    +	"imgfile": "vùn-khien",
     	"listfiles": "文件列表",
     	"listfiles_date": "日期",
     	"listfiles_name": "名",
     	"listfiles_user": "用戶",
     	"listfiles_size": "大細",
     	"listfiles_description": "描述",
    -	"file-anchor-link": "文件",
    -	"filehist": "文件歷史",
    -	"filehist-help": "點撳日期/時間來查看當時出現過嘅文件。",
    +	"file-anchor-link": "vùn-khien",
    +	"filehist": "Vùn-khien li̍t-sṳ́",
    +	"filehist-help": "Tiám-khim ngit-khì / sṳ̀-kiên lòi chhà-khon tông-sṳ̀ chhut-hien-ko ke vùn-khien.",
     	"filehist-deleteone": "刪除",
     	"filehist-revert": "恢復",
    -	"filehist-current": "當前",
    -	"filehist-datetime": "日期/時間",
    -	"filehist-thumb": "縮略圖",
    -	"filehist-thumbtext": "$1嘅版本嘅縮略圖",
    -	"filehist-user": "用戶",
    -	"filehist-dimensions": "維度",
    -	"filehist-comment": "意見",
    -	"imagelinks": "文件用處",
    -	"linkstoimage": "下背嘅$1隻頁面鏈接到本文件:",
    -	"nolinkstoimage": "無頁面鏈接到本文件。",
    -	"sharedupload": "本檔案來自於$1,渠可能在其它計劃項目肚分人應用。",
    +	"filehist-current": "tông-chhièn",
    +	"filehist-datetime": "Ngit khì / Sṳ̀-kiên",
    +	"filehist-thumb": "Suk-lio̍k-thù",
    +	"filehist-thumbtext": "$1 ke pán-pún ke Suk-lio̍k-thù",
    +	"filehist-user": "Yung-fu",
    +	"filehist-dimensions": "Vì-thu",
    +	"filehist-comment": "Yi-kien",
    +	"imagelinks": "Vùn-khien yung-chhú",
    +	"linkstoimage": "Hâ poi ke $1-chak ya̍p-mien lièn-chiap to pún vùn-khien:",
    +	"nolinkstoimage": "Mò ya̍p-mien lièn-chiap to pún vùn-khien.",
    +	"sharedupload": "Pún tóng-on lòi-chhṳ yî $1, khî khó-nèn chhai khì-thâ kie-va̍k hong-muk tú fûn-ngìn yin-yung.",
     	"sharedupload-desc-here": "邇文件來自於$1,其可能在其它計劃項目肚分應用。\n其在[$2文件描述頁面]介片上嘅描述在下背展示。",
     	"uploadnewversion-linktext": "上傳邇隻文件嘅新版本",
    +	"shared-repo-name-wikimediacommons": "Wikimedia Commons",
    +	"upload-disallowed-here": "Ngì mò-fap fu̍k-koi liá-chak tóng-on.",
     	"filedelete-submit": "刪除",
     	"mimesearch": "MIME搜尋",
     	"mimesearch-summary": "本頁面啟用文件MIME類型過濾器。撳入︰內容類型/子類型,如 <code>image/jpeg</code>。",
    @@ -896,7 +924,7 @@
     	"unusedtemplates": "吂使用嘅模板",
     	"unusedtemplatestext": "<p>Chhiáng chu-yi khì-thâ mióng-chham khó-nèn chhṳ̍t-chiap theu-ko URL lièn-chiap chhṳ́ thù-hìn, só-yî liá-piên clie̍t-chhut ke thù-hìn yû khó-nèn pûn sṳ́-yung.</p>",
     	"unusedtemplateswlh": "其他鏈接",
    -	"randompage": "隨機頁面",
    +	"randompage": "Sùi-kî ya̍p-mien",
     	"randompage-nopages": "Chhai liá-ke miàng-sṳ khûng-kiên chûng mò-yû hong-mien.",
     	"randomredirect": "隨機重定向頁",
     	"randomredirect-nopages": "Chhai liá-ke miàng-sṳ khûng-kiên mò-yû chhùng-thin hong-mien.",
    @@ -911,10 +939,10 @@
     	"withoutinterwiki": "無有語言鏈接頁面",
     	"withoutinterwiki-summary": "下背嘅頁面還吂有語言鏈接到其它語言版本。",
     	"fewestrevisions": "最少修訂嘅頁面",
    -	"nbytes": "$1字節",
    +	"nbytes": "$1 sá¹³-chiet",
     	"ncategories": "$1隻分類",
     	"nlinks": "$1隻鏈接",
    -	"nmembers": "$1隻成員",
    +	"nmembers": "$1-chak sṳ̀n-yèn",
     	"nrevisions": "$1隻修訂版本",
     	"specialpage-empty": "本報告無結果。",
     	"lonelypages": "孤立頁面",
    @@ -940,7 +968,7 @@
     	"protectedpagesempty": "在邇兜參數下無頁面保護緊。",
     	"listusers": "用戶列表",
     	"usercreated": "$1 $2{{GENDER:$3|建立}}",
    -	"newpages": "新頁面",
    +	"newpages": "Sîn ya̍p-mien",
     	"newpages-username": "用戶名:",
     	"ancientpages": "最舊頁面",
     	"move": "移動",
    @@ -950,13 +978,14 @@
     	"notargettitle": "無目標",
     	"notargettext": "汝還吂指定一隻目標頁面或用戶來進行邇項操作。",
     	"pager-newer-n": "新$1次",
    -	"pager-older-n": "舊$1次",
    -	"booksources": "網絡書源",
    -	"booksources-search-legend": "尋找網絡書源",
    +	"pager-older-n": "khiu $1-chhá¹³",
    +	"booksources": "Mióng-lok sû-ngièn",
    +	"booksources-search-legend": "Chhìm-cháu mióng-lok sû-ngièn",
    +	"booksources-search": "Chhìm-cháu",
     	"booksources-text": "下背係一份銷售新書或二手書嘅列表,並可能有汝尋找緊嘅書嘅進一步信息:",
     	"specialloguserlabel": "Yung-fu:",
     	"speciallogtitlelabel": "Phêu-thì:",
    -	"log": "日誌",
    +	"log": "Ngit-chì",
     	"alllogstext": "Lièn-ha̍p hién-sṳ song-chhòn, chhù-chhiang, pó-fu, chhà-fûng yî-khi̍p chham-vu",
     	"logempty": "在日誌肚無匹配項。",
     	"log-title-wildcard": "搜尋以邇隻文字開頭嘅標題",
    @@ -965,12 +994,12 @@
     	"prevpage": "上一頁($1)",
     	"allpagesfrom": "顯示從邇處開始嘅頁面:",
     	"allpagesto": "顯示從邇位結束嘅頁面:",
    -	"allarticles": "全部頁面",
    +	"allarticles": "Chhiòn-phu ya̍p-mien",
     	"allinnamespace": "所有頁面(屬於$1名字空間)",
    -	"allpagessubmit": "提交",
    +	"allpagessubmit": "Thì-kâu",
     	"allpagesprefix": "顯示有邇前綴(名字空間)嘅頁面:",
     	"allpagesbadtitle": "分定嘅頁面標題係非法嘅,或者有一隻內部語言或內部wiki嘅前綴。其可能包含一隻或還較多毋做得用於標題嘅字符。",
    -	"categories": "分類",
    +	"categories": "Fûn-lui",
     	"categoriespagetext": "Yî-ha lie̍t-chhut só-yû ke hong-mien fûn-lui.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
     	"linksearch": "Ngoi-phu lièn-chiap",
     	"linksearch-ok": "搜尋",
    @@ -996,14 +1025,14 @@
     	"emailsent": "電子郵件已發送",
     	"emailsenttext": "汝嘅電子郵件已經發出。",
     	"watchlist": "監視列表",
    -	"mywatchlist": "監視列表",
    +	"mywatchlist": "Kâm-sṳ lie̍t-péu",
     	"watchlistfor2": "$1嘅監視列表$2",
     	"nowatchlist": "汝嘅監視列表係空嘅。",
     	"watchlistanontext": "請$1來查看或編寫汝嘅監視列表。",
     	"watchnologin": "還吂登入",
     	"addedwatchtext": "Hong-mien \"[[:$1]]\" yí-kîn pûn kâ-ngi̍p to ngì-ke [[Special:Watchlist|Kam-sṳ chhîn-tân]] chûng. Chiông-lòi yû-kôan chhṳ́ hong-mien khi̍p khì-thâ thó-lun-hong ke ngim-hò siû-cháng chiông-voi chhai hong-mien lie̍t-chhut, song-chhiá hàn-voi chhai [[Special:RecentChanges|Chui-khiûn ke kiên-kói]] chûng ke '''chhû-thí''' hìn-sṳt lie̍t-chhut. Kó-yèn  ngì heu-lòi sióng chhiùng hong-mien kam-sṳ chhîn-tân chûng chhîn-chhù, hí-khó tiám-kit thô-hòng thiàu-chûng \"thìn-chṳ́ kam-sṳ\" ke lièn-kiet。",
     	"removedwatchtext": "Vùn-chông \"[[:$1]]\" yí-kîn chhiùng Ngì kekam-sṳ lie̍t-péu mien-chûng yì-chhù.",
    -	"watch": "監視",
    +	"watch": "Kâm-sṳ",
     	"watchthispage": "監視本頁",
     	"unwatch": "取消監視",
     	"unwatchthispage": "停止監視",
    @@ -1036,7 +1065,7 @@
     	"actioncomplete": "操作完成",
     	"actionfailed": "操作失敗",
     	"deletedtext": "“$1”已經分刪除。最近刪除嘅記錄請參見$2。",
    -	"dellogpage": "刪除日誌",
    +	"dellogpage": "San-chhù ngit-chì",
     	"dellogpagetext": "下背係最近刪除嘅列表。",
     	"deletionlog": "刪除日誌",
     	"reverted": "恢復到早期版本",
    @@ -1044,14 +1073,15 @@
     	"deleteotherreason": "其它/附加理由:",
     	"deletereasonotherlist": "其它理由",
     	"rollback": "編寫倒轉頭",
    -	"rollbacklink": "打轉頭",
    +	"rollbacklink": "tá chón-thèu",
    +	"rollbacklinkcount": "chha̍t-siau $1 chhṳ phiên-siá",
     	"rollbackfailed": "無法倒轉頭",
     	"cantrollback": "編寫無法打轉頭;最後嘅貢獻者人本文嘅唯一作者。",
     	"alreadyrolled": "Mò-fap fî-fu̍k yù [[User:$2|$2]] ([[User talk:$2|thó-lun]]) chin-hàng ke [[$1]] ke chui-heu phiên-si̍p; khì-thâ ngìn yí-kîn phiên-siá fe̍t-he fî-fu̍k liáu ke-hong. Chui-heu phiên-si̍p-chá: [[User:$3|$3]] ([[User talk:$3|Thó-lun]])。",
     	"editcomment": "Phiên-siá sot-mìn he: <em>$1</em>。",
     	"revertpage": "Fî-fu̍k yù [[Special:Contributions/$2|$2]] ([[User talk:$2|tui-fa]]) ke phiên-cho; kiên-kói fì-fu̍k [[User:$1|$1]] ke chui-heu yit-ke pán-pún",
     	"sessionfailure": "汝嘅登入會話好像有問題;\n為到防止會話劫持,邇次操作已經畀取消。\n請轉到先前嘅頁面,重新載入邇頁面,然後重試。",
    -	"protectlogpage": "保護日誌",
    +	"protectlogpage": "Pó-fu ngit-chì",
     	"protectlogtext": "Ha-mien he vùn-chông só-thin lâu chhí-sêu só-thin ke lie̍t-péu. Chhiáng chhâm-kháu [[Special:ProtectedPages|Pó-fu vùn-chông chhîn-tân]] yî-khi̍p kiám-sṳ tông-chhièn chin-hàng ke vùn-chông pó-fu.",
     	"protectedarticle": "已保護“[[$1]]”",
     	"modifiedarticleprotection": "已經更改“[[$1]]”嘅保護等級",
    @@ -1098,32 +1128,34 @@
     	"undeleterevdel": "Kó-yèn pá chui-sîn siû-thin phu-fun chhù-thet, fán chhù-hi phien mò-fap chin-hàng. Kó-yèn ngi-to liá-chúng chhìn-khóng, ngì pit-sî fán-sién fe̍t-chá fán-chhòng chui-sîn yí-kîn chhù-hi ke siû-thin. Tui-yî ngì mò-yû khièn-han hi kiám-sṳ ke siû-thin he mò-fap fî-fu̍k ke.",
     	"undeletehistorynoadmin": "邇隻頁面已經分刪除,刪除原因顯示在下方編寫摘要肚。分刪除前嘅所有修訂版本,連同刪除前貢獻用戶等等細節單淨管理員做得看見。",
     	"undelete-revision": "Chhù-thet pán-pún $1 chhṳ $2:",
    -	"undeleterevision-missing": "無效或者丟失嘅修訂版本。汝可能使用矣有差錯嘅鏈接,或者本修訂版本既經分從存檔肚恢復或移除。",
    +	"undeleterevision-missing": "Mò-háu fe̍t-chá tiû-sṳt ke siû-thin pán-pún. \nNgì khó-nèn sṳ́-yung yí yû chhâ-chho ke lièn-chiap, fe̍t-chá pún siû-thin pán-pún ki kîn-fûn chhiùng chhùn-tóng tú fî-fu̍k fe̍t yì-chhù.",
     	"undeletebtn": "恢復",
     	"undeletelink": "查看/恢復",
     	"undeleteviewlink": "查看",
     	"undeletecomment": "Ngièn-yîn:",
    -	"undeletedrevisions": "$1隻修訂版本已經恢復",
    -	"undeletedrevisions-files": "$1隻版本撈$2隻文件分恢復",
    -	"undeletedfiles": "$1隻文件分恢復",
    +	"undeletedrevisions": "$1-chak siû-thin pán-pún yí-kîn fî-fu̍k",
    +	"undeletedrevisions-files": "$1-chak pán-pún lâu $2-chak vùn-khien fûn fî-fu̍k",
    +	"undeletedfiles": "$1-chak vùn-khien fûn fî-fu̍k",
     	"cannotundelete": "Fî-fu̍k sṳt-phai; khó-nèn chṳ̂-chhièn yí-kîn pûn khì-thâ-ngìn fî-fu̍k.",
    -	"undeletedpage": "'''$1已經分恢復''' 請參考[[Special:Log/delete|刪除日誌]]來查詢刪除撈恢復記錄。",
    -	"undelete-header": "假使愛查詢最近嘅記錄請參看[[Special:Log/delete|刪除日誌]]。",
    -	"undelete-search-box": "搜尋已刪除頁面",
    -	"undelete-search-prefix": "展示頁面自:",
    -	"undelete-search-submit": "搜尋",
    -	"undelete-no-results": "刪除記錄肚無符合嘅結果。",
    -	"namespace": "名字空間:",
    -	"invert": "反向選擇",
    -	"blanknamespace": "(主要)",
    -	"contributions": "{{GENDER:$1|用戶}}貢獻",
    +	"undeletedpage": "<strong>$1 yí-kîn fûn fî-fu̍k</strong>\n\nChhiáng chhâm-kháu [[Special:Log/delete|san-chhù ngit-chì]] lòi chhà-sûn san-chhù lâu fî-fu̍k ki-liu̍k.",
    +	"undelete-header": "Ká-sṳ́ oi chhà-sûn chui-khiûn ke ki-liu̍k chhiáng chhâm-khon [[Special:Log/delete|san-chhù ngit-chì]].",
    +	"undelete-search-box": "Sêu-chhìm yí san-chhù ya̍p-mien",
    +	"undelete-search-prefix": "Chán-sṳ ya̍p-mien chhṳ:",
    +	"undelete-search-submit": "Sêu-chhìm",
    +	"undelete-no-results": "San-chhù ki-liu̍k tú mò fù-ha̍p ke kiet-kó.",
    +	"namespace": "Miàng-sṳ khûng-kiên:",
    +	"invert": "Fán-hiong sién-tho̍k",
    +	"namespace_association": "Siông-kôan miang-miàng khûng-kiên",
    +	"blanknamespace": "(Chú-yeu)",
    +	"contributions": "{{GENDER:$1|Yung-fu}} kung-hien",
     	"contributions-title": "$1嘅用戶貢獻",
    -	"mycontris": "貢獻",
    +	"mycontris": "Kung-hien",
    +	"anoncontribs": "Kung-hien",
     	"contribsub2": "$1嘅貢獻($2)",
     	"nocontribs": "毋尋到符合特徵嘅更改。",
     	"uctop": "(最新修改)",
    -	"month": "從邇月(或還較早):",
    -	"year": "從邇年(或還較早):",
    +	"month": "Chhiùng liá-ngie̍t (fe̍t hàn kha-chó):",
    +	"year": "Chhiùng liá-ngièn (fe̍t hàn kha-chó):",
     	"sp-contributions-newbies": "單淨展示新建用戶嘅貢獻",
     	"sp-contributions-newbies-sub": "新手",
     	"sp-contributions-blocklog": "封禁日誌",
    @@ -1135,76 +1167,76 @@
     	"sp-contributions-username": "IP地址或用戶名:",
     	"sp-contributions-toponly": "單淨展示最新修訂版本嘅編寫",
     	"sp-contributions-submit": "搜尋",
    -	"whatlinkshere": "鏈接入頁面",
    -	"whatlinkshere-title": "鏈接到“$1”嘅頁面",
    -	"whatlinkshere-page": "頁面:",
    -	"linkshere": "下背頁面鏈接到[[:$1]]:",
    +	"whatlinkshere": "Lièn-chiap ngi̍p ya̍p-mien",
    +	"whatlinkshere-title": "Lièn-chiap to \"$1\" ke ya̍p-mien",
    +	"whatlinkshere-page": "Ya̍p-mien:",
    +	"linkshere": "Hâ-poi ya̍p-mien lièn-chiap to <strong>[[:$1]]</strong>:",
     	"nolinkshere": "無頁面鏈接到'''[[:$1]]'''。",
    -	"nolinkshere-ns": "在所選嘅名字空間肚無頁面連接到[[:$1]]。",
    -	"isredirect": "重定向頁",
    -	"istemplate": "包含",
    -	"isimage": "文件鏈接",
    -	"whatlinkshere-prev": "前頭$1隻",
    -	"whatlinkshere-next": "後背$1隻",
    -	"whatlinkshere-links": "←連入",
    -	"whatlinkshere-hideredirs": "$1重定向",
    -	"whatlinkshere-hidetrans": "$1嵌入",
    -	"whatlinkshere-hidelinks": "$1鏈接",
    +	"nolinkshere-ns": "Chhai só-sién ke miàng-sṳ khûng-kiên tú mò ya̍p-mien lièn-chiap to [[:$1]].",
    +	"isredirect": "chhùng-thin-hiong ya̍p",
    +	"istemplate": "pâu-hàm",
    +	"isimage": "vùn-khien lièn-chiap",
    +	"whatlinkshere-prev": "chhièn-thèu $1-chak",
    +	"whatlinkshere-next": "heu-poi $1-chak",
    +	"whatlinkshere-links": "← lièn-ngi̍p",
    +	"whatlinkshere-hideredirs": "$1 Chhùng-thin-hiong",
    +	"whatlinkshere-hidetrans": "$1 pâu-hàm",
    +	"whatlinkshere-hidelinks": "$1 lièn-kiet",
     	"whatlinkshere-hideimages": "$1條文件鏈接",
    -	"whatlinkshere-filters": "過濾器",
    -	"blockip": "封禁用戶",
    +	"whatlinkshere-filters": "Ko-lì-hi",
    +	"blockip": "Fûng-kim {{GENDER:$1|yung-fu}}",
     	"blockiptext": "用下背嘅表單來禁止來自某一特定IP地址嘅修改許可權。\n單淨在為防止破壞,撈符合[[{{MediaWiki:Policy-url}}|守則]]嘅情況下正做得採取邇行動。\n請在下背輸入一隻具體嘅理由(例如引述一隻分破壞嘅頁面)。",
    -	"ipaddressorusername": "IP地址或用戶名:",
    -	"ipbexpiry": "期限:",
    -	"ipbreason": "原因:",
    -	"ipbreason-dropdown": "*一般嘅封禁理由\n** 多次加入虛假資料\n** 刪除頁面內容\n** 外部鏈接廣告\n** 在頁面肚增加無意義文字\n** 無禮嘅行為、攻擊/騷擾別儕\n** 濫用多隻賬號\n** 做毋得接受嘅用戶名",
    -	"ipbcreateaccount": "阻止創建新賬號",
    -	"ipbenableautoblock": "自動查封邇用戶最後所用嘅IP地址,撈後來試圖編寫所用嘅所有地址",
    -	"ipbsubmit": "查封邇用戶",
    +	"ipaddressorusername": "IP thi-chí fe̍t yung-fu-miàng:",
    +	"ipbexpiry": "Khì-han:",
    +	"ipbreason": "Ngièn-yîn:",
    +	"ipbreason-dropdown": "*Yit-pân ke fûng-kim lî-yù \n** Tô-chhṳ kâ-ngi̍p hî-ká chṳ̂-liau \n** San-chhù ya̍p-mien nui-yùng \n** Ngoi-phu lièn-chiap kóng-ko \n** Chhai ya̍p-mien tú chen-kâ mò yi-ngi vùn-sṳ \n** Mò-lî ke hàng-vì, kûng-kit / sâu-yéu phe̍t-sâ \n** Làm-yung tô-chak chòng-ho \n** Cho-m̀ tet chiap-su ke yung-fu-miàng",
    +	"ipbcreateaccount": "Chú-chṳ́ chhóng-kien sîn chòng-ho",
    +	"ipbenableautoblock": "Chhṳ-thûng chhà-fûng liá yung-fu chui-heu só yung ke IP thi-chí, lâu heu-lòi sṳ-thù phiên-siá só yung ke só-yû thi-chí",
    +	"ipbsubmit": "Chhà-fûng liá yung-fu",
     	"ipbother": "其它時間:",
     	"ipboptions": "2小時:2 hours,1日:1 day,3日:3 days,1星期:1 week,2星期:2 weeks,1隻月:1 month,3隻月:3 months,6隻月:6 months,1年:1 year,無限期:infinite",
     	"ipbhidename": "Chhai chhà-fûng ngit-ki, fa̍t-chhiok chhà-fûng lie̍t-péu yî-khi̍p yung-fu lie̍t-péu chûng yún-chhòng yung-fu-miàng.",
    -	"badipaddress": "無效IP地址",
    -	"blockipsuccesssub": "查封成功",
    +	"badipaddress": "Mò-háu IP thi-chí",
    +	"blockipsuccesssub": "Chhà-fûng sṳ̀n-kûng",
     	"blockipsuccesstext": "[[Special:Contributions/$1|$1]] yí-kîn pûn chhà-fûng. <br />Chhâm-siòng [[Special:BlockList|pûn-fûng IP thi-tiám lie̍t-péu]] yî fu̍k-sṳ́m chhà-fûng.",
    -	"ipb-edit-dropdown": "編寫查封原因",
    -	"ipb-unblock-addr": "解封$1",
    -	"ipb-unblock": "解封用戶名或IP地址",
    -	"ipb-blocklist": "查看今下嘅封禁",
    -	"unblockip": "解封用戶",
    -	"unblockiptext": "用下背嘅表單來恢復先前分查封嘅IP地址或用戶嘅寫權限。",
    +	"ipb-edit-dropdown": "Phiên-siá chhà-fûng ngièn-yîn",
    +	"ipb-unblock-addr": "Kié-fûng $1",
    +	"ipb-unblock": "Kié-fûng yung-fu miàng fe̍t IP thi-chí",
    +	"ipb-blocklist": "Chhà-khon kîm-hâ ke fûng-kim",
    +	"unblockip": "Kié-fûng yung-fu",
    +	"unblockiptext": "Yung hâ-poi ke péu-tân lòi fî-fu̍k siên-chhièn fûn chhà-fûng ke IP thi-chí fe̍t yung-fu ke siá-khièn han.",
     	"ipusubmit": "Kié-chhù kim-fûng",
     	"unblocked": "[[User:$1|$1]]已經分解封。",
    -	"unblocked-id": "封禁$1已經分移除",
    +	"unblocked-id": "Fûng-kim $1 yí-kîn fûn yì-chhù。",
     	"ipblocklist": "分封用戶列表",
    -	"ipblocklist-submit": "搜尋",
    -	"infiniteblock": "無限期",
    +	"ipblocklist-submit": "Sêu-chhìm",
    +	"infiniteblock": "mò-han-khì",
     	"expiringblock": "$1 $2 to-khì",
    -	"anononlyblock": "單淨匿名用戶",
    -	"noautoblockblock": "禁用自動查封",
    -	"createaccountblock": "禁止創建賬戶",
    -	"ipblocklist-empty": "查封列表係空嘅。",
    -	"ipblocklist-no-results": "所請求嘅IP地址/用戶名無分查封。",
    -	"blocklink": "查封",
    +	"anononlyblock": "tân-chhiang nit-miàng yung-fu",
    +	"noautoblockblock": "kim-yung chhṳ-thûng chhà-fûng",
    +	"createaccountblock": "kim-chṳ́ chhóng-kien chòng-fu",
    +	"ipblocklist-empty": "Chhà-fûng lie̍t-péu he khûng ke.",
    +	"ipblocklist-no-results": "Só chhiáng-khiù ke IP thi-chí fe̍t yung-fu-miàng mò-fûn chhà-fûng.",
    +	"blocklink": "chhà-fûng",
     	"unblocklink": "解封",
     	"change-blocklink": "更改封禁",
    -	"contribslink": "貢獻",
    +	"contribslink": "Kung-hien",
     	"autoblocker": "Ngì-ke IP lâu pûn fûng-liáu ke \"$1\" he yit-yong ke. Fûng-só ngièn-yîn: \"$2\".",
     	"blocklogpage": "查封日誌",
     	"blocklogentry": "封禁[[$1]],到期時間係$2$3",
     	"blocklogtext": "Liá-he kôan-yî yung-fu fûng-kim lâu kié-chhù fûng-kim chhâu-chok ke ki-liu̍k. Pûn chhṳ-thung fûng-kim ke IP thi-tiám mò-yû lie̍t-chhut. Chhiáng chhâm-kháu [[Special:BlockList|Pûn chhà-fûng ke IP thi-tiám lâu yung-fu lie̍t-péu]].",
     	"unblocklogentry": "$1已分解封",
    -	"block-log-flags-anononly": "單淨匿名用戶",
    +	"block-log-flags-anononly": "tân-chhiang nit-miàng yung-fu",
     	"block-log-flags-nocreate": "帳號建立已禁",
    -	"block-log-flags-noautoblock": "禁用自動查封",
    -	"range_block_disabled": "單淨管理員正做得創建禁止查封嘅範圍。",
    +	"block-log-flags-noautoblock": "kim-yung chhṳ-thûng chhà-fûng",
    +	"range_block_disabled": "Tân-chhiang Kón-lî-yèn chang cho-tet chhóng-kien kim-chṳ́ chhà-fûng ke fam-vì.",
     	"ipb_expiry_invalid": "無效嘅終止時間。",
     	"ipb_hide_invalid": "Put-tet yit-chak yung-fu; Kì yû chhêu-ko {{PLURAL:$1|$1}} chhṳ-su phiên-siá",
     	"ipb_already_blocked": "Yí-kîn fûng-só \"$1\"",
    -	"ipb_cant_unblock": "差錯: 尋毋到查封ID$1。可能已經解除封禁。",
    -	"ip_range_invalid": "無效嘅IP範圍。",
    -	"proxyblocker": "代理封鎖器",
    -	"proxyblockreason": "汝嘅IP地址係一隻開放嘅代理,其已經分封鎖。請聯繫汝嘅網際網路服務提供商或技術支援者並講佢兜聽邇隻嚴重嘅安全問題。",
    +	"ipb_cant_unblock": "Chhâ-chho: Chhìm m̀ -to chhà-fûng ID $1. Khó-nèn yí-kîn kié-chhù fûng-kim.",
    +	"ip_range_invalid": "Mò-háu ke IP fam-vì.",
    +	"proxyblocker": "Thoi-lî fûng-só-hi",
    +	"proxyblockreason": "Ngì ke IP thi-chí he yit-chak khôi-piong ke thoi-lî, khì yí-kîn fûn-fûng-só. \nChhiáng lièn-hì ngì ke mióng-chi mióng-lu fu̍k-vu thì-kiûng-sông fe̍t kî-su̍t kî-yên-chá pin kóng kì-têu thâng liá-chak ngiàm-chhùng ke ôn-chhiòn mun-thì.",
     	"sorbsreason": "Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí.",
     	"sorbs_create_account_reason": "Ngì-ke IP chhô-vi pûn DNSBL lie̍t-vi su̍k-yî khôi-fong thoi-lî fu̍k-vu-khí. Só-yî ngì mò-fap kien-li̍p chong-ho.",
     	"lockdb": "鎖定數據庫",
    @@ -1233,15 +1265,15 @@
     	"movepage-moved": "'''\"$1\" yí-kîn pûn yì-thung to \"$2\"'''",
     	"articleexists": "Ke miàng-sṳ ke hong-mien yí-kîn chhùn-chhai, fe̍t-chá ngì sién-chet ke miàng-sṳ mò-háu. Chhiáng chai-hi sién yit-ke miàng-sṳ.",
     	"movetalk": "Chhiáng thùng-sṳ̀ yì-thung tui-fa-chông",
    -	"movelogpage": "移動日誌",
    +	"movelogpage": "Yì-thûng ngit-chì",
     	"movelogpagetext": "Yî-ha he yí-kîn yì-thung ke vùn-chông chhîn-tân.",
    -	"movereason": "原因:",
    +	"movereason": "Ngièn-yîn:",
     	"revertmove": "恢復",
    -	"delete_and_move_text": "==愛刪除==\n\n目標頁面\"[[:$1]]\"已經存在。汝確認愛刪除原頁面並進行移動係無?",
    +	"delete_and_move_text": "Muk-phiêu ya̍p-mien \"[[:$1]]\" yí-kîn chhùn-chhai. \nNgì khok-ngin oi san-chhù ngièn ya̍p-mien pin chin-hàng yì-thûng he-mò?",
     	"delete_and_move_confirm": "著,刪除邇頁",
     	"delete_and_move_reason": "Chhù-thet yî-phien yì-thung",
     	"selfmove": "Ngièn-sṳ́ phêu-thì khi̍p muk-phêu phêu-thì siông-thùng, vù-nèn yì-thung yit-chông fu̍k-koi pún-sṳ̂n.",
    -	"export": "導出頁面",
    +	"export": "Thô-chhut ya̍p-mien",
     	"exporttext": "汝做得將特定頁面或一組頁面嘅文字以及編輯歷史用XML格式導出;恁樣做得將有關頁面通過「[[Special:Import|導入頁面]]」頁面導入到另一隻執行MediaWiki嘅網站。\n\n愛導出頁面,請在下背嘅文字框肚輸入頁面標題,每行一隻標題,並選擇汝係毋係愛匯出帶有頁面歷史嘅以前嘅修訂版本,或係單淨選擇導出帶有最後一次編寫信息嘅當前修訂版本。\n\n另外汝還可以利用鏈接導出文件,例如汝做得使用[[{{#Special:Export}}/{{MediaWiki:Mainpage}}]]導出「[[{{MediaWiki:Mainpage}}]]」頁面。",
     	"exportcuronly": "單淨導出當前版本,毋包含完整歷史版本",
     	"exportnohistory": "----\n'''注意:''' 由於性能原因,從本表單導出頁面嘅全部歷史已分停用。",
    @@ -1254,7 +1286,7 @@
     	"allmessagescurrent": "Tông-chhièn ke vùn-sṳ",
     	"allmessagestext": "Liá-piên lie̍t-chhut só-yû hí-khó thin-chṳ ke ne-thúng kie-mien.\nPlease visit [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] and [https://translatewiki.net translatewiki.net] if you wish to contribute to the generic MediaWiki localisation.",
     	"allmessagesnotsupportedDB": "Ne-thúng kie-mien kûng-yung chhu-yî kôan-pit chong-thai (wgUseDatabaseMessages)。",
    -	"thumbnail-more": "放大",
    +	"thumbnail-more": "Piong-thai",
     	"filemissing": "Mò-fap cháu-to tóng-on",
     	"thumbnail_error": "建立縮略圖差錯:$1",
     	"djvu_page_error": "DjVu頁面超出範圍",
    @@ -1281,67 +1313,67 @@
     	"importlogpagetext": "管理性導入在其他Wiki上有編寫歷史嘅頁面",
     	"import-logentry-upload-detail": "$1-ke siû-thin",
     	"import-logentry-interwiki-detail": "Lòi-chhṳ $2-ke $1-ke siû-thin",
    -	"tooltip-pt-userpage": "汝嘅用戶頁面",
    +	"tooltip-pt-userpage": "{{GENDER:|Ngì ke sṳ́-yung-chá}} ya̍p-mien",
     	"tooltip-pt-anonuserpage": "Ngì-ke phiên-siá pún-chham só yung IP ke tui-yin yung-fu-chông",
    -	"tooltip-pt-mytalk": "汝嘅交流頁",
    +	"tooltip-pt-mytalk": "{{GENDER:|Ngì ke}} kâu-liù ya̍p",
     	"tooltip-pt-anontalk": "Tui-yî lòi-chhṳ chhṳ́IP thi-tiám phiên-siá ke tui-fa",
    -	"tooltip-pt-preferences": "汝嘅偏好設定",
    -	"tooltip-pt-watchlist": "汝監視中頁面嘅更改列表",
    -	"tooltip-pt-mycontris": "汝嘅貢獻列表",
    -	"tooltip-pt-login": "建議汝登入,但係並非必須嘅",
    -	"tooltip-pt-logout": "登出",
    -	"tooltip-ca-talk": "關於頁面正文嘅討論",
    -	"tooltip-ca-edit": "汝做得編寫邇頁,請在保存前用預覽撳掣。",
    -	"tooltip-ca-addsection": "開始一隻新段落",
    -	"tooltip-ca-viewsource": "本頁面受到保護。\n汝做得查看其嘅源碼。",
    -	"tooltip-ca-history": "本頁面早先嘅修訂版本",
    +	"tooltip-pt-preferences": "{{GENDER:|Ngì ke}} phiên-hó sat-thin",
    +	"tooltip-pt-watchlist": "Ngì kâm-sṳ chûng ya̍p-mien ke kiên-kói lie̍t-péu",
    +	"tooltip-pt-mycontris": "{{GENDER:|Ngì ke}} kung-hien lie̍t-péu",
    +	"tooltip-pt-login": "Kien-ngi ngì tên-ngi̍p, than-he pin fî pit-sî ke",
    +	"tooltip-pt-logout": "Tên-chhut",
    +	"tooltip-ca-talk": "Kôan-yî ya̍p-mien chang-vùn ke thó-lun",
    +	"tooltip-ca-edit": "Phiên-siá pún-ya̍p",
    +	"tooltip-ca-addsection": "Khôi-sṳ́ yit-chak sîn thon-lo̍k",
    +	"tooltip-ca-viewsource": "Pún ya̍p-mien su-to pó-fu. \nNgì cho-tet chhà-khon khì ke ngièn-ma.",
    +	"tooltip-ca-history": "Pún ya̍p-mien chó-siên ke siû-thin pán-pún",
     	"tooltip-ca-protect": "保護邇頁",
     	"tooltip-ca-delete": "刪除邇頁",
     	"tooltip-ca-undelete": "Chiông liá-ke vùn-chông fî-fu̍k to pûn chhù-hi yî-chhièn ke chhong-khóng",
    -	"tooltip-ca-move": "移動本頁",
    -	"tooltip-ca-watch": "加邇頁入監視列表",
    +	"tooltip-ca-move": "Yì-thûng pún-ya̍p",
    +	"tooltip-ca-watch": "Kâ liá-ya̍p ngi̍p kâm-sṳ lie̍t-péu",
     	"tooltip-ca-unwatch": "從監視列表肚移除本頁",
    -	"tooltip-search": "搜尋{{SITENAME}}",
    -	"tooltip-search-go": "係講相同嘅標題存在嘅話就直接到遐頁",
    -	"tooltip-search-fulltext": "搜查包含邇兜文字嘅頁",
    -	"tooltip-p-logo": "訪問頭頁",
    -	"tooltip-n-mainpage": "探訪頭頁",
    -	"tooltip-n-mainpage-description": "探訪頭頁",
    -	"tooltip-n-portal": "關於本計劃,汝可以做麼嘅,應該愛樣般做",
    -	"tooltip-n-currentevents": "提供當前新聞事件嘅背景信息",
    -	"tooltip-n-recentchanges": "列出網站肚嘅最近修改",
    -	"tooltip-n-randompage": "隨機載入一隻頁面",
    -	"tooltip-n-help": "尋找幫手",
    -	"tooltip-t-whatlinkshere": "全部鏈接入本頁嘅維基頁面列表",
    -	"tooltip-t-recentchangeslinked": "頁面鏈接出嘅所有頁面嘅更改",
    +	"tooltip-search": "Sêu-chhìm {{SITENAME}}",
    +	"tooltip-search-go": "He kóng siông-thùng ke phiêu-thì chhùn-chhai ke fa chhiu chhṳ̍t-chiap to hâ-ya̍p",
    +	"tooltip-search-fulltext": "Sêu-chhà pâu-hàm liá-têu vùn-sṳ ke ya̍p",
    +	"tooltip-p-logo": "Fóng-mun thèu-ya̍p",
    +	"tooltip-n-mainpage": "Thâm-fóng thèu-ya̍p",
    +	"tooltip-n-mainpage-description": "Thâm-fóng thèu-ya̍p",
    +	"tooltip-n-portal": "Kôan-yî pún kie-va̍k, ngì cho-tet cho má-ke, yin-kâi oi ngióng-pân cho",
    +	"tooltip-n-currentevents": "Thì-kiûng tông-chhièn sîn-vùn sṳ-khien ke poi-kín sin-sit",
    +	"tooltip-n-recentchanges": "Lie̍t-chhut mióng-chhàm tú ke chui-khiûn siû-kói",
    +	"tooltip-n-randompage": "Sùi-kî chai-ngi̍p yit-chak ya̍p-mien",
    +	"tooltip-n-help": "Chhìm-cháu pông-sú",
    +	"tooltip-t-whatlinkshere": "Chhiòn-phu lièn-chiap ngi̍p pún-ya̍p ke Vì-kî ya̍p-mien lie̍t-péu",
    +	"tooltip-t-recentchangeslinked": "Ya̍p-mien lièn-chiap chhut ke só-yû ya̍p-mien ke kiên-kói",
     	"tooltip-feed-rss": "Chṳ́-thin pún vùn-chông li̍t-sṳ́ ke RSS chṳ̂-liau",
    -	"tooltip-feed-atom": "訂閱邇頁嘅Atom源",
    -	"tooltip-t-contributions": "查看邇隻用戶嘅貢獻列表",
    +	"tooltip-feed-atom": "Thin-ye̍t liá-ya̍p ke Atom ngièn",
    +	"tooltip-t-contributions": "Chhà-khon {{GENDER:$1|liá-chak yung-fu}} ke kung-hien lie̍t-péu",
     	"tooltip-t-emailuser": "向邇隻用戶發送電子郵件",
    -	"tooltip-t-upload": "上傳文件",
    -	"tooltip-t-specialpages": "全部特殊文章嘅列表",
    -	"tooltip-t-print": "本頁面做得打印嘅版本",
    -	"tooltip-t-permalink": "邇隻頁面版本嘅固定連結",
    -	"tooltip-ca-nstab-main": "查看內容頁",
    -	"tooltip-ca-nstab-user": "查看用戶頁面",
    +	"tooltip-t-upload": "Sông-chhòn vùn-khien",
    +	"tooltip-t-specialpages": "Chhiòn-phu thi̍t-sû vùn-chông ke lie̍t-péu",
    +	"tooltip-t-print": "Pún ya̍p-mien cho-tet tá-yin ke pán-pún",
    +	"tooltip-t-permalink": "Liá-chak ya̍p-mien pán-pún ke ku-thin lièn-kiet",
    +	"tooltip-ca-nstab-main": "Chhà-khon nui-yùng ya̍p",
    +	"tooltip-ca-nstab-user": "Chhà-khon yung-fu ya̍p-mien",
     	"tooltip-ca-nstab-media": "Chhà-khon hìn-thí-chông",
    -	"tooltip-ca-nstab-special": "本頁面係特殊頁面,汝做毋得編寫本頁",
    -	"tooltip-ca-nstab-project": "查看項目頁面",
    -	"tooltip-ca-nstab-image": "查看文件頁面",
    +	"tooltip-ca-nstab-special": "Pún ya̍p-mien he thi̍t-sû ya̍p-mien, ngì cho-m̀-tet phiên-siá pún-ya̍p",
    +	"tooltip-ca-nstab-project": "Chhà-khon hong muk ya̍p-mien",
    +	"tooltip-ca-nstab-image": "Chhà-khon vùn-khien ya̍p-mien",
     	"tooltip-ca-nstab-mediawiki": "Chhà-khon ne-thúng chṳ̂-liau",
    -	"tooltip-ca-nstab-template": "查看模板",
    +	"tooltip-ca-nstab-template": "Chhà-khon mù-pán",
     	"tooltip-ca-nstab-help": "Chhà-khon pông-chhu thiàu-muk",
    -	"tooltip-ca-nstab-category": "查看分類頁面",
    +	"tooltip-ca-nstab-category": "Chhà-khon fûn-lui ya̍p-mien",
     	"tooltip-minoredit": "標記做細微修改",
    -	"tooltip-save": "保存汝嘅修改",
    -	"tooltip-preview": "預覽汝嘅編寫,請先使用本功能後再保存!",
    -	"tooltip-diff": "展示汝對頁面嘅貢獻",
    +	"tooltip-save": "Pó-chhùn ngì-ke siû-kói",
    +	"tooltip-preview": "Yi-lám ngì-ke phiên-siá, chhiáng siên sṳ́-yung pún kûng-nèn heu chai pó-chhùn.",
    +	"tooltip-diff": "Chán-sṳ ngì tui ya̍p-mien ke kung-hien",
     	"tooltip-compareselectedversions": "查看本頁分點選嘅兩個版本間嘅差別",
     	"tooltip-watch": "加邇頁入監視列表",
     	"tooltip-recreate": "Chhùng-kien ke-vùn-chông, mò-lun he-feu pûn chhù-chhîn",
    -	"tooltip-rollback": "撳“打轉頭”恢復上一位貢獻人對本頁面嘅編寫",
    +	"tooltip-rollback": "Khim \"tá chón-thèu\" fî-fu̍k sông yit-vi kung-hien-ngìn tui pún ya̍p-mien ke phiên-siá",
     	"tooltip-undo": "“撤銷”做得在編寫模式上開啟編輯寫表格來方便復原。其允許在摘要肚加入原因。",
    -	"tooltip-summary": "輸入一條簡短嘅摘要",
    +	"tooltip-summary": "Sû-ngi̍p yit-thiàu kién-tón ke chak-yeu",
     	"common.css": "/* Chhṳ́-chhu ke CSS chiông-chhiu yin-yung chhai só-yû ke mien-pán */",
     	"common.js": "/* Chhṳ́-chhu ke JavaScript chiông chai-ngi̍p yî só-yû ying-fu mî yit-ke vùn-chông. */",
     	"anonymous": "{{SITENAME}} ke ngia̍k-miàng yung-fu",
    @@ -1358,6 +1390,8 @@
     	"spambot_username": "MediaWiki kóng-ko chhîn-chhù",
     	"spam_reverting": "Fî-fu̍k to put pâu-hàm lièn-kiet chṳ $1 ke chui-khiûn pán-pún",
     	"spam_blanking": "Só-yû pâu-hàm lièn-kiet chṳ $1 ke siû-thin, chhîn-v",
    +	"simpleantispam-label": "Fòng là-sap sêu-sit kiám-chhà yung ke. \nChhiáng  <strong>cho-m̀-tet </strong> thiàm-siá liá-chak làn-vi!",
    +	"pageinfo-toolboxlink": "Ya̍p-mien chṳ̂-sín",
     	"markaspatrolleddiff": "Phêu-ki sṳ̀n-vì yí-kîn kiám-chhà",
     	"markaspatrolledtext": "Phêu-ki chhṳ́ vùn-chông sṳ̀n-vì yí-kîn kiám-chhà",
     	"markedaspatrolled": "Phêu-ki yí-kîn kiám-chhà",
    @@ -1369,16 +1403,19 @@
     	"markedaspatrollederror-noautopatrol": "Ngì mò-fap chiông ngì chhṳ-kí só-chok ke kiên-kói phêu-ki sṳ̀n-vì yí-kîn kiám-chhà.",
     	"patrol-log-page": "巡邏檢查日誌",
     	"deletedrevision": "已刪除舊版本$1",
    -	"previousdiff": "←上隻版本",
    -	"nextdiff": "下隻版本→",
    +	"previousdiff": "← Sông-hak pán-pún",
    +	"nextdiff": "Hâ-chak pán-pún →",
     	"mediawarning": "'''Kín-ko''': Ke-tóng-on khó-nèn pâu-hàm ok-yi am-ho, chṳp-hàng kì khó-nèn tui ngì-ke ne-thúng tai-lòi ngùi-hiám.",
     	"imagemaxsize": "Chhai thù-chhiong mèu-siá chông tui thù-chhiong thai-séu han-chṳ he:",
     	"thumbsize": "Lio̍k-thù thai-séu:",
     	"file-info": "tóng-on thai-séu: $1, MIME lui-hìn: $2",
    -	"file-info-size": "$1 × $2像素,文件大小:$3,MIME類型:$4",
    -	"file-nohires": "無做得提供嘅還較高分辨率。",
    +	"file-info-size": "$1 × $2 chhiong-su, vùn-khien thai-séu: $3, MIME lui-hîn: $4",
    +	"file-nohires": "Mò cho-tet thì-kiûng ke hàn kha-kô fûn-phièn-sut.",
     	"svg-long-desc": "SVG文件,尺寸:$1×$2像素,文件大細:$3",
    -	"show-big-image": "完整分辨率",
    +	"show-big-image": "Ngièn-pún tóng-on",
    +	"show-big-image-preview": "Yi-lám thai séu: $1.",
    +	"show-big-image-other": "Khì-thâ {{PLURAL:$2||}} kié-sak-thu: $1.",
    +	"show-big-image-size": "$1 × $2 chhiong-su",
     	"newimages": "Sîn-kien thù-chhiong ke va̍k-lòng",
     	"imagelisttext": "Yî-ha he on $2 phài-lie̍t ke $1-ke tóng-on lie̍t-péu.",
     	"noimages": "Mò-khó kiám-sṳ thù-chhiong.",
    @@ -1386,13 +1423,25 @@
     	"bydate": "on-cheu ngit-khì",
     	"sp-newimages-showfrom": "Chhiùng $1 khôi-sṳ́ hién-sṳ sîn thù-phién",
     	"bad_image_list": "請按照下列格式編寫:\n\n單淨係有(以*開頭)列出嘅項目會分考慮。\n每一行嘅第一條鏈接必須係損壞文件嘅鏈接。\n然後同一行後方嘅鏈接會分看做例外,也就係講邇文件做得在哪兜頁面肚分顯示。",
    -	"metadata": "元數據",
    +	"metadata": "Ngièn sú-kí",
     	"metadata-help": "邇文件肚包含有擴展嘅信息。邇兜信息可能係由數碼相機或掃描儀在創建或數字化過程肚所加入嘅。\n\n係講邇文件嘅源文件已經分修改,一兜信息在修改後嘅文件肚將毋做得完全反映出來。",
     	"metadata-expand": "Hién-sṳ siòng-se ke chṳ̂-liau",
     	"metadata-collapse": "Yún-chhòng siòng-se ke chṳ̂-liau",
     	"metadata-fields": "在本信息肚所列出嘅EXIF元數據域將包含在圖片顯示頁面,當元數據表損壞時單淨顯示下背信息。\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",
    -	"namespacesall": "全部",
    -	"monthsall": "全部",
    +	"exif-orientation": "Fông-vi",
    +	"exif-xresolution": "Súi-phìn kié-sak-thu",
    +	"exif-yresolution": "Chhùi-chhṳ̍t kié-sak-thu",
    +	"exif-datetime": "Tóng-on siû-kói ngit-khì sṳ̀-kiên",
    +	"exif-make": "Siông-kî chṳ-chho-sông",
    +	"exif-model": "Siông-kî hîn-ho",
    +	"exif-software": "Sṳ́-yung ngiôn-thí",
    +	"exif-exifversion": "Exif pán-pún",
    +	"exif-colorspace": "Set-chhái khûng-kiên",
    +	"exif-datetimeoriginal": "Chṳ̂-liau sán-sâng ke ngit-khì sṳ̀-kiên",
    +	"exif-datetimedigitized": "Sú-vi-fa ke ngit-khì sṳ̀-kiên",
    +	"exif-orientation-1": "Phiêu-chún",
    +	"namespacesall": "chhiòn-phu",
    +	"monthsall": "chhiòn-phu",
     	"confirmemail": "確認電郵地址",
     	"confirmemail_noemail": "汝還吂在汝嘅[[Special:Preferences|用戶偏好設定]]肚輸入一隻有效嘅電郵地址。",
     	"confirmemail_text": "Chhṳ́ mióng-chham yêu-khiù ngì chhai sṳ́-yung sin-siông kûng-nèn chṳ̂-chhièn ngiam-chṳn ngì-ke sin-siông thi-tiám. Tiám-kit yî-ha on-néu chhṳ̍t-hiong ngì-ke sin-siông fat-sung yit-fûng khok-ngin sin-siông. Ke-sin-siông pâu-hàm yû yit-hòng me̍t-me̍t lièn-kiet; chhiáng chhai ngì-ke hi-khí chûng kâ-chai chhṳ́ lièn-kiet yî khok-ngin ngì-ke sin-siông thi-tiám he yû-háu ke.",
    @@ -1437,14 +1486,21 @@
     	"watchlisttools-view": "查看有關更改",
     	"watchlisttools-edit": "查看並編寫監視列表",
     	"watchlisttools-raw": "編寫原始監視列表",
    +	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|kâu-liù]])",
     	"duplicate-defaultsort": "'''警告:'''默認排序關鍵字“$2”蓋過矣先前嘅默認排序關鍵字“$1”。",
     	"version": "Pán-pún",
     	"fileduplicatesearch-submit": "Chhìm-cháu",
    -	"specialpages": "特殊頁",
    +	"specialpages": "Thi̍t-sû ya̍p",
     	"external_image_whitelist": " #留下撈邇行一樣嘅文字<pre>\n#在下背(//中間部份)輸入正則表達式\n#邇兜將會撈外部(已超鏈接嘅)圖片配合\n#遐兜配合上嘅會顯示成圖片,否則就單淨會顯示成鏈接\n#有#開頭嘅行會當成意見\n#大小寫並無區分\n\n#在邇行上片輸入全部正則表達式。留下撈邇行一樣嘅文字</pre>",
    -	"tag-filter": "[[Special:Tags|標籤]]過濾器:",
    +	"tag-filter": "[[Special:Tags|Phiêu-chhiam]] ko-lì-hi:",
    +	"tag-list-wrapper": "([[Special:Tags|$1 ke phiêu-chhiam]]: $2)",
    +	"logentry-delete-delete": "$1 san-chhù ya̍p-mien $3",
     	"revdelete-restricted": "yí-kîn yin-yung han-tsṳ tsṳ tshâu-tsok-yèn",
     	"revdelete-unrestricted": "yí-kîn yì-tshù yû-kûan tshâu-tsok-yè ke han-tsṳ",
    +	"logentry-move-move": "$1 {{GENDER:$2|yí-kîn yì-thûng}} ya̍p-mien $3 to $4",
    +	"logentry-newusers-create": "Yí-kîn {{GENDER:$2|kien-li̍p}} sṳ́-yung-chá chong-ho  $1",
    +	"logentry-upload-upload": "$1 {{GENDER:$2|yí-kîn sông-chhòn}} $3",
     	"rightsnone": "(無)",
    -	"revdelete-summary": "piên-sip tsak-yêu"
    +	"revdelete-summary": "piên-sip tsak-yêu",
    +	"searchsuggest-search": "Chhìm-cháu"
     }
    diff --git a/languages/i18n/he.json b/languages/i18n/he.json
    index f1218d06ff..881f419da8 100644
    --- a/languages/i18n/he.json
    +++ b/languages/i18n/he.json
    @@ -42,7 +42,7 @@
     	"tog-hideminor": "הסתרת עריכות משניות בדף השינויים האחרונים",
     	"tog-hidepatrolled": "הסתרת עריכות בדוקות בדף השינויים האחרונים",
     	"tog-newpageshidepatrolled": "הסתרת דפים בדוקים ברשימת הדפים החדשים",
    -	"tog-hidecategorization": "הסתרת שינויים בקטגוריות של דפים",
    +	"tog-hidecategorization": "הסתרת שינויים בקטגוריות",
     	"tog-extendwatchlist": "הרחבת רשימת המעקב כך שתציג את כל השינויים, לא רק את השינויים האחרונים בכל דף",
     	"tog-usenewrc": "קיבוץ השינויים לפי דפים בדף השינויים האחרונים וברשימת המעקב",
     	"tog-numberheadings": "מספור כותרות אוטומטי",
    @@ -60,7 +60,7 @@
     	"tog-previewonfirst": "הצגת תצוגה מקדימה בעריכה הראשונה",
     	"tog-enotifwatchlistpages": "לשלוח אליי דוא\"ל כאשר משתנה דף או קובץ ברשימת המעקב שלי",
     	"tog-enotifusertalkpages": "לשלוח אליי דוא\"ל כאשר נעשה שינוי בדף שיחת המשתמש שלי",
    -	"tog-enotifminoredits": "לשלוח אליי דוא\"ל גם על עריכות משניות של דפים וקבצים",
    +	"tog-enotifminoredits": "לשלוח אליי דוא\"ל גם על עריכות משניות בדפים וקבצים",
     	"tog-enotifrevealaddr": "חשיפת כתובת הדוא\"ל שלי בהתראות דוא\"ל",
     	"tog-shownumberswatching": "הצגת מספר המשתמשים העוקבים",
     	"tog-oldsig": "החתימה הנוכחית:",
    @@ -74,7 +74,7 @@
     	"tog-watchlistreloadautomatically": "רענון אוטומטי של רשימת המעקב בכל פעם שמסנן משתנה (דרוש JavaScript)",
     	"tog-watchlisthideanons": "הסתרת עריכות של משתמשים אנונימיים ברשימת המעקב",
     	"tog-watchlisthidepatrolled": "הסתרת עריכות בדוקות ברשימת המעקב",
    -	"tog-watchlisthidecategorization": "הסתרת שינויים בקטגוריות של דפים",
    +	"tog-watchlisthidecategorization": "הסתרת שינויים בקטגוריות",
     	"tog-ccmeonemails": "לשלוח אליי העתקים של הודעות דוא\"ל שאני {{GENDER:|שולח|שולחת}} למשתמשים",
     	"tog-diffonly": "לא להציג את תוכן הדף מתחת להבדלים בין הגרסאות",
     	"tog-showhiddencats": "הצגת קטגוריות מוסתרות",
    @@ -157,7 +157,7 @@
     	"category_header": "דפים בקטגוריה \"$1\"",
     	"subcategories": "קטגוריות משנה",
     	"category-media-header": "קובצי מדיה בקטגוריה \"$1\"",
    -	"category-empty": "<strong>קטגוריה זו אינה כוללת דפים או קובצי מדיה.</strong>",
    +	"category-empty": "<em>קטגוריה זו אינה מכילה כרגע דפים או קובצי מדיה.</em>",
     	"hidden-categories": "{{PLURAL:$1|קטגוריה מוסתרת|קטגוריות מוסתרות}}",
     	"hidden-category-category": "קטגוריות מוסתרות",
     	"category-subcat-count": "{{PLURAL:$2|קטגוריה זו כוללת את קטגוריית המשנה הבאה בלבד.|קטגוריה זו כוללת את {{PLURAL:$1|קטגוריית המשנה המוצגת להלן|$1 קטגוריות המשנה המוצגות להלן}}, וכוללת בסך־הכול $2 קטגוריות משנה.}}",
    @@ -276,8 +276,8 @@
     	"privacy": "מדיניות הפרטיות",
     	"privacypage": "Project:מדיניות הפרטיות",
     	"badaccess": "שגיאה בהרשאות",
    -	"badaccess-group0": "אינך מורשה לבצע את הפעולה שביקשת.",
    -	"badaccess-groups": "הפעולה שביקשת לבצע מוגבלת למשתמשים ב{{PLURAL:$2|קבוצה הבאה|אחת הקבוצות הבאות}}: $1.",
    +	"badaccess-group0": "אין {{GENDER:|לך|לך|לכם}} הרשאה לבצע את הפעולה ש{{GENDER:|ביקשת|ביקשת|ביקשתם}}.",
    +	"badaccess-groups": "הפעולה ש{{GENDER:|ביקשת|ביקשת|ביקשתם}} לבצע מוגבלת למשתמשים ב{{PLURAL:$2|קבוצה הבאה|אחת הקבוצות הבאות}}: $1.",
     	"versionrequired": "נדרשת גרסה $1 של מדיה־ויקי",
     	"versionrequiredtext": "גרסה $1 של מדיה־ויקי נדרשת לשימוש בדף זה. למידע נוסף, ראו את [[Special:Version|דף הגרסה]].",
     	"ok": "אישור",
    @@ -385,13 +385,13 @@
     	"actionthrottled": "הפעולה הוגבלה",
     	"actionthrottledtext": "כאמצעי נגד שימוש לרעה, קיימת מגבלה על ביצוע פעולה זו פעמים רבות מדי בזמן קצר, וחרגת מהמגבלה הזאת.\nנא לנסות שוב בעוד מספר דקות.",
     	"protectedpagetext": "דף זה מוגן כדי למנוע עריכה ופעולות אחרות.",
    -	"viewsourcetext": "באפשרותכם לצפות בטקסט המקור של הדף ולהעתיקו.",
    +	"viewsourcetext": "ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} לצפות בטקסט המקור של הדף ולהעתיקו.",
     	"viewyourtext": "באפשרותך לצפות בטקסט המקור של <strong>העריכות שלך</strong> בדף הזה ולהעתיקו.",
    -	"protectedinterface": "דף זה הוא אחד מסדרת דפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}, והוא מוגן כדי למנוע השחתות.\nכדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
    -	"editinginterface": "<strong>אזהרה:</strong> הדף ש{{GENDER:|אתה עורך|את עורכת|אתם עורכים}} הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}.\nשינויים בדף הזה ישפיעו על תצוגת ממשק המשתמש של משתמשים אחרים באתר.",
    +	"protectedinterface": "דף זה הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}, והוא מוגן כדי למנוע השחתות.\nכדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
    +	"editinginterface": "<strong>אזהרה:</strong> הדף ש{{GENDER:|אתה עורך|את עורכת|אתם עורכים}} הוא אחד הדפים המספקים הודעות מערכת לתוכנה שמפעילה את {{SITENAME}}.\nשינויים בדף הזה ישפיעו על ממשק המשתמש של משתמשים אחרים באתר.",
     	"translateinterface": "כדי להוסיף או לשנות תרגומים של הודעות מערכת עבור כל אתרי הוויקי, יש להשתמש ב־[https://translatewiki.net/ translatewiki.net], פרויקט התרגום של מדיה־ויקי.",
     	"cascadeprotected": "דף זה מוגן מעריכה כי הוא מוכלל {{PLURAL:$1|בדף הבא, שמופעלת עליו|בדפים הבאים, שמופעלת עליהם}} הגנה מדורגת:\n$2",
    -	"namespaceprotected": "אין לך הרשאה לערוך דפים במרחב השם <strong>$1</strong>.",
    +	"namespaceprotected": "אין {{GENDER:|לך|לך|לכם}} הרשאה לערוך דפים במרחב השם <strong>$1</strong>.",
     	"customcssprotected": "אינך מורשה לערוך דף CSS זה כיוון שהוא כולל הגדרות אישיות של משתמש אחר.",
     	"customjsprotected": "אינך מורשה לערוך דף JavaScript זה כיוון שהוא כולל הגדרות אישיות של משתמש אחר.",
     	"mycustomcssprotected": "אין לך הרשאה לערוך דף CSS זה.",
    @@ -475,7 +475,7 @@
     	"createacct-benefit-body3": "{{PLURAL:$1|תורם|תורמים}} לאחרונה",
     	"badretype": "הסיסמאות שהזנת אינן מתאימות.",
     	"usernameinprogress": "יצירת חשבון עבור שם המשתמש הזה כבר התחילה.\nנא להמתין.",
    -	"userexists": "שם המשתמש שבחרתם כבר נמצא בשימוש.\nאנא בחרו שם אחר.",
    +	"userexists": "שם המשתמש שבחרת כבר נמצא בשימוש.\nנא לבחור שם אחר.",
     	"loginerror": "שגיאה בכניסה לחשבון",
     	"createacct-error": "שגיאה ביצירת חשבון",
     	"createaccounterror": "לא ניתן היה ליצור את החשבון: $1",
    @@ -585,8 +585,8 @@
     	"resetpass-temp-password": "סיסמה זמנית:",
     	"resetpass-abort-generic": "שינוי הסיסמה בוטל על־ידי הרחבה.",
     	"resetpass-expired": "סיסמתכם פקעה. אנא הגדירו סיסמה חדשה כדי להיכנס.",
    -	"resetpass-expired-soft": "סיסמתכם פקעה ויש לאפס אותה. אנא בחרו סיסמה חדשה כעת, או לחצו על \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס אותה מאוחר יותר.",
    -	"resetpass-validity-soft": "סיסמתך אינה תקינה: $1\n\nיש לבחור סיסמה חדשה עכשיו או ללחוץ \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס את הסיסמה מאוחר יותר.",
    +	"resetpass-expired-soft": "הסיסמה שלך פקעה, וצריך לאפס אותה. יש לבחור סיסמה חדשה כעת, או ללחוץ על \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס אותה מאוחר יותר.",
    +	"resetpass-validity-soft": "הסיסמה שלך אינה תקינה: $1\n\nיש לבחור סיסמה חדשה כעת או ללחוץ על \"{{int:authprovider-resetpass-skip-label}}\" כדי לאפס את הסיסמה מאוחר יותר.",
     	"passwordreset": "איפוס סיסמה",
     	"passwordreset-text-one": "מלאו טופס זה כדי לקבל סיסמה זמנית בדוא\"ל.",
     	"passwordreset-text-many": "{{PLURAL:$1||מלאו אחד מהשדות הבאים כדי לקבל סיסמה זמנית בדוא\"ל.}}",
    @@ -653,13 +653,15 @@
     	"minoredit": "זוהי עריכה משנית",
     	"watchthis": "מעקב אחרי דף זה",
     	"savearticle": "שמירת הדף",
    +	"savechanges": "שמירת השינויים",
     	"publishpage": "פרסום הדף",
    +	"publishchanges": "פרסום השינויים",
     	"preview": "תצוגה מקדימה",
     	"showpreview": "תצוגה מקדימה",
     	"showdiff": "הצגת שינויים",
     	"blankarticle": "<strong>אזהרה:</strong> הדף שאתם יוצרים הוא ריק.\nאם תלחצו שוב על \"{{int:savearticle}}\", הדף ייווצר ללא תוכן.",
     	"anoneditwarning": "<strong>אזהרה:</strong> אינכם מחוברים לחשבון. כתובת ה־IP שלכם תוצג בפומבי אם תבצעו עריכות כלשהן. אם <strong>[$1 תיכנסו לחשבון]</strong> או <strong>[$2 תיצרו חשבון]</strong>, העריכות שלכם תיוחסנה לשם המשתמש שלכם ותקבלו גם יתרונות אחרים.",
    -	"anonpreviewwarning": "''אינכם מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.''",
    +	"anonpreviewwarning": "<em>אתם לא מחוברים לחשבון. שמירה תגרום לכתובת ה־IP שלכם להירשם בהיסטוריית העריכות של הדף.</em>",
     	"missingsummary": "<strong>תזכורת:</strong> לא הזנת תקציר עריכה.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום לעריכה שלך להישמר בלעדיו.",
     	"selfredirect": "<strong>אזהרה:</strong> ניסית ליצור הפניה מדף זה לעצמו.\nאולי כתבת יעד שגוי להפניה, ואולי ערכת את הדף הלא־נכון.\nלחיצה חוזרת על הכפתור \"{{int:savearticle}}\" תגרום להפניה להיווצר בכל זאת.",
     	"missingcommenttext": "יש להקליד את ההודעה למטה.",
    @@ -682,14 +684,14 @@
     	"accmailtext": "סיסמה אקראית עבור [[User talk:$1|$1]] נשלחה אל $2. ניתן לשנותה בדף '''[[Special:ChangePassword|שינוי הסיסמה]]''' לאחר הכניסה.",
     	"newarticle": "(חדש)",
     	"newarticletext": "{{GENDER:|הגעת|הגעת|הגעתם}} לדף שעדיין אינו קיים.\nכדי ליצור את הדף הזה, {{GENDER:|התחל|התחילי|התחילו}} להקליד בתיבת הטקסט שלמטה ({{GENDER:|ראה|ראי|ראו}} את [$1 דף העזרה] למידע נוסף).\nאם {{GENDER:|הגעת|הגעת|הגעתם}} לכאן בטעות, {{GENDER:|לחץ|לחצי|לחצו}} על כפתור ה<strong>חזרה</strong> (Back) בדפדפן {{GENDER:|שלך|שלך|שלכם}}.",
    -	"anontalkpagetext": "----\n<em>זהו דף שיחה של משתמש אנונימי שעדיין לא יצר חשבון במערכת, או שהוא לא משתמש בו.</em>\nלכן עלינו להשתמש בכתובת ה־IP המספרית כדי לזהותו.\nייתכן שכתובת IP זו תהיה משותפת למספר משתמשים.\nאם אתם משתמשים אנונימיים ומרגישים שקיבלתם הודעות בלתי רלוונטיות, אנא [[Special:CreateAccount|צרו חשבון]] או [[Special:UserLogin|היכנסו לחשבון]] כדי להימנע מבלבולים עתידיים עם משתמשים אנונימיים נוספים.",
    +	"anontalkpagetext": "----\n<em>זהו דף שיחה של משתמש אנונימי שעדיין לא יצר חשבון באתר, או שהוא לא משתמש בו.</em>\nלכן עלינו להשתמש בכתובת ה־IP המספרית כדי לזהותו.\nייתכן שכתובת IP זו תהיה משותפת למספר משתמשים.\nאם אתם משתמשים אנונימיים ומרגישים שקיבלתם הודעות שאינן רלוונטיות עבורכם, אנא [[Special:CreateAccount|צרו חשבון]] או [[Special:UserLogin|היכנסו לחשבון]] כדי להימנע מבלבולים עתידיים עם משתמשים אנונימיים אחרים.",
     	"noarticletext": "אין כרגע טקסט בדף הזה.\nבאפשרותך [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים],\nאו [{{fullurl:{{FULLPAGENAME}}|action=edit}} ליצור את הדף]</span>.",
     	"noarticletext-nopermission": "אין כרגע טקסט בדף הזה.\nבאפשרותך [[Special:Search/{{PAGENAME}}|לחפש את כותרת הדף]] בדפים אחרים או <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} לחפש את הדף ביומנים]</span>, אך אין לך הרשאה ליצור את הדף.",
     	"missing-revision": "גרסה #$1 של הדף \"{{FULLPAGENAME}}\" אינה קיימת.\n\nזה נגרם בדרך־כלל עקב לחיצה על קישור ישן לגרסה של דף שנמחק.\nאפשר למצוא פרטים ב[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} יומן המחיקות].",
    -	"userpage-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.\nנא לבדוק אם ברצונך ליצור/לערוך את הדף הזה.",
    +	"userpage-userdoesnotexist": "חשבון המשתמש \"$1\" אינו רשום.\nאנא {{GENDER:|בדוק|בִדקי|בִדקו}} אם {{GENDER:|ברצונך|ברצונך|ברצונכם}} ליצור/לערוך את הדף הזה.",
     	"userpage-userdoesnotexist-view": "חשבון המשתמש \"$1\" אינו רשום.",
     	"blocked-notice-logextract": "{{GENDER:$1|המשתמש הזה חסום|המשתמשת הזו חסומה}} כרגע.\nהפעולה האחרונה ביומן החסימות מוצגת להלן:",
    -	"clearyourcache": "<strong>הערה:</strong> לאחר השמירה, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.\n* <strong>פיירפוקס / ספארי:</strong> להחזיק את המקש <em>Shift</em> בעת לחיצה על <strong>טעינה מחדש</strong> (Reload), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em> או <em>Ctrl-R</em> (במחשב מק: <em dir=\"ltr\">⌘-R</em>)\n* <strong>גוגל כרום:</strong> ללחוץ על צירוף המקשים <em>Ctrl-Shift-R</em> (במחשב מק: <em dir=\"ltr\">⌘-Shift-R</em>)\n* <strong>אינטרנט אקספלורר:</strong> ללחוץ ולהחזיק את המקש <em>Ctrl</em> בעת לחיצה על <strong>רענן</strong> (Refresh), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em>\n* <strong>אופרה:</strong> לפתוח <em>תפריט ← הגדרות</em> (במחשב מק <em>Opera ← העדפות</em>) ואז ללחוץ על <em>פרטיות ואבטחה ← מחק היסטוריית גלישה ← Cached images and files</em>.",
    +	"clearyourcache": "<strong>הערה:</strong> לאחר השמירה, ייתכן שיהיה צורך לנקות את זיכרון המטמון (cache) של הדפדפן כדי להבחין בשינויים.\n* <strong>פיירפוקס / ספארי:</strong> להחזיק את המקש <em>Shift</em> בעת לחיצה על <strong>טעינה מחדש</strong> (Reload), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em> או <em>Ctrl-R</em> (במחשב מק: <em dir=\"ltr\">⌘-R</em>).\n* <strong>גוגל כרום:</strong> ללחוץ על צירוף המקשים <em>Ctrl-Shift-R</em> (במחשב מק: <em dir=\"ltr\">⌘-Shift-R</em>).\n* <strong>אינטרנט אקספלורר:</strong> להחזיק את המקש <em>Ctrl</em> בעת לחיצה על <strong>רענן</strong> (Refresh), או ללחוץ על צירוף המקשים <em>Ctrl-F5</em>.\n* <strong>אופרה:</strong> לפתוח <em>תפריט ← הגדרות</em> (במחשב מק: <em>Opera ← העדפות</em>) ואז ללחוץ על <em>פרטיות ואבטחה ← מחק היסטוריית גלישה ← Cached images and files</em>.",
     	"usercssyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את גיליון ה־CSS החדש שלכם לפני השמירה.",
     	"userjsyoucanpreview": "<strong>עצה:</strong> השתמשו בכפתור \"{{int:showpreview}}\" כדי לבחון את סקריפט ה־JavaScript החדש שלכם לפני השמירה.",
     	"usercsspreview": "<strong>זִכרו שזו רק תצוגה מקדימה של גיליון ה־CSS שלכם.\nהוא עדיין לא נשמר!</strong>",
    @@ -738,8 +740,8 @@
     	"sectioneditnotsupported-title": "עריכת פסקאות אינה נתמכת",
     	"sectioneditnotsupported-text": "עריכת פסקאות אינה נתמכת בדף זה.",
     	"permissionserrors": "שגיאת הרשאה",
    -	"permissionserrorstext": "אינכם מורשים לבצע פעולה זו, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
    -	"permissionserrorstext-withaction": "אינכם מורשים $2, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
    +	"permissionserrorstext": "אין ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} לבצע פעולה זו, {{PLURAL:$1|מהסיבה הבאה|מהסיבות הבאות}}:",
    +	"permissionserrorstext-withaction": "אין ב{{GENDER:|אפשרותך|אפשרותך|אפשרותכם}} $2, מה{{PLURAL:$1|סיבה הבאה|סיבות הבאות}}:",
     	"contentmodelediterror": "לא ניתן לערוך את הגרסה הזאת כי מודל התוכן שלה הוא <code>$1</code>, השונה ממודל התוכן הנוכחי של הדף, <code>$2</code>.",
     	"recreate-moveddeleted-warn": "'''אזהרה: הנכם יוצרים דף חדש שנמחק בעבר.'''\n\nכדאי לשקול אם יהיה זה נכון להמשיך לערוך את הדף.\nיומני המחיקות וההעברות של הדף מוצגים להלן:",
     	"moveddeleted-notice": "דף זה נמחק.\nיומני המחיקות וההעברות של הדף מוצגים להלן.",
    @@ -757,11 +759,11 @@
     	"content-failed-to-parse": "פענוח $2 כתוכן מסוג $1 נכשל: $3",
     	"invalid-content-data": "מידע שגוי על התוכן",
     	"content-not-allowed-here": "תוכן מסוג \"$1\" אינו מותר בדף [[$2]]",
    -	"editwarning-warning": "עזיבת הדף הזה עלולה לגרום לך לאבד את כל השינויים שביצעת. אם יש לך חשבון באתר, באפשרותך לבטל את האזהרה הזאת בחלק \"{{int:prefs-editing}}\" שבהעדפות שלך.",
    +	"editwarning-warning": "עזיבת הדף הזה עלולה לגרום לך לאבד את כל השינויים שביצעת.\nאם יש לך חשבון באתר, באפשרותך לבטל את האזהרה הזאת בחלק \"{{int:prefs-editing}}\" שבהעדפות שלך.",
     	"editpage-notsupportedcontentformat-title": "סוג התוכן אינו נתמך",
     	"editpage-notsupportedcontentformat-text": "תוכן מסוג $1 אינו נתמך על־ידי מודל התוכן $2.",
     	"content-model-wikitext": "קוד ויקי",
    -	"content-model-text": "טקסט פשוט",
    +	"content-model-text": "טקסט רגיל",
     	"content-model-javascript": "JavaScript",
     	"content-model-css": "CSS",
     	"content-json-empty-object": "אוביקט ריק",
    @@ -812,10 +814,10 @@
     	"page_last": "אחרון",
     	"histlegend": "בחירת גרסאות להשוואה: סמנו את תיבות האפשרויות של הגרסאות המיועדות להשוואה, והקישו על Enter או על הכפתור למטה.<br />\nמקרא: '''({{int:cur}})''' = השוואה עם הגרסה הנוכחית, '''({{int:last}})''' = השוואה עם הגרסה הקודמת, '''{{int:minoreditletter}}''' = שינוי משני.",
     	"history-fieldset-title": "חיפוש בהיסטוריית הדף",
    -	"history-show-deleted": "רק מחוקות",
    +	"history-show-deleted": "עריכות מוסתרות בלבד",
     	"histfirst": "הישנות ביותר",
     	"histlast": "החדשות ביותר",
    -	"historysize": "({{PLURAL:$1|בית אחד|$1 בתים}})",
    +	"historysize": "({{PLURAL:$1|בייט אחד|$1 בייטים}})",
     	"historyempty": "(ריק)",
     	"history-feed-title": "היסטוריית גרסאות",
     	"history-feed-description": "היסטוריית הגרסאות של הדף הזה בוויקי",
    @@ -966,7 +968,7 @@
     	"search-suggest": "האם התכוונת ל: $1",
     	"search-rewritten": "מוצגות התוצאות עבור $1. ניתן לחפש $2 במקום זאת.",
     	"search-interwiki-caption": "מיזמי אחות",
    -	"search-interwiki-default": "תוצאות מ{{GRAMMAR:תחילית|$1}}:",
    +	"search-interwiki-default": "תוצאות מתוך $1:",
     	"search-interwiki-more": "(עוד)",
     	"search-relatedarticle": "קשור",
     	"searchrelated": "קשור",
    @@ -1030,7 +1032,7 @@
     	"savedprefs": "ההעדפות שלך נשמרו.",
     	"savedrights": "ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} \"$1\" נשמרו.",
     	"timezonelegend": "אזור זמן:",
    -	"localtime": "זמן מקומי:",
    +	"localtime": "שעה מקומית:",
     	"timezoneuseserverdefault": "ברירת המחדל של האתר ($1)",
     	"timezoneuseoffset": "אחר (יש לציין את ההפרש)",
     	"servertime": "השעה הנוכחית בשרת:",
    @@ -1053,7 +1055,7 @@
     	"prefs-custom-css": "קובץ CSS מותאם אישית",
     	"prefs-custom-js": "קובץ JavaScript מותאם אישית",
     	"prefs-common-css-js": "קובצי CSS/JavaScript משותפים לכל העיצובים:",
    -	"prefs-reset-intro": "באפשרותך להשתמש בדף זה כדי להחזיר את ההעדפות שלך להגדרות ברירת המחדל של האתר.\nלא ניתן לבטל פעולה זו.",
    +	"prefs-reset-intro": "באפשרותך להשתמש באפשרות זו כדי להחזיר את ההעדפות שלך להגדרות ברירת המחדל של האתר.\nלא ניתן לבטל פעולה זו.",
     	"prefs-emailconfirm-label": "אימות כתובת דוא\"ל:",
     	"youremail": "דואר אלקטרוני:",
     	"username": "שם {{GENDER:$1|המשתמש|המשתמשת}}:",
    @@ -1075,7 +1077,7 @@
     	"email": "דוא\"ל",
     	"prefs-help-realname": "לא חובה למלא את השם האמיתי.\nאם סופק, הוא עשוי לשמש כדי לייחס לך את עבודתך.",
     	"prefs-help-email": "כתובת דואר אלקטרוני היא אופציונלית, אבל היא חיונית לאיפוס הסיסמה במקרה ש{{GENDER:|תשכח|תשכחי}} אותה.",
    -	"prefs-help-email-others": "באפשרותך גם לבחור לאפשר למשתמשים ליצור איתך קשר באמצעות דוא\"ל דרך קישור בדף המשתמש או בדף השיחה שלך.\nכתובת הדוא\"ל שלך לא תיחשף כשמשתמשים ייצרו איתך קשר.",
    +	"prefs-help-email-others": "באפשרותך גם לאפשר למשתמשים ליצור איתך קשר באמצעות דוא\"ל דרך קישור בדף המשתמש או בדף השיחה שלך.\nכתובת הדוא\"ל שלך לא תיחשף כשמשתמשים ייצרו איתך קשר.",
     	"prefs-help-email-required": "כתובת דואר אלקטרוני נדרשת לכתיבה באתר.",
     	"prefs-info": "מידע בסיסי",
     	"prefs-i18n": "בינאום",
    @@ -1149,12 +1151,12 @@
     	"right-movefile": "העברת קבצים",
     	"right-suppressredirect": "הימנעות מיצירת הפניות מדפי המקור בעת העברת דפים",
     	"right-upload": "העלאת קבצים",
    -	"right-reupload": "דריסת קבצים קיימים",
    -	"right-reupload-own": "דריסת קבצים קיימים שהועלו על־ידי אותו המשתמש",
    +	"right-reupload": "העלאת גרסאות חדשות של קבצים קיימים",
    +	"right-reupload-own": "העלאת גרסאות חדשות של קבצים קיימים שהועלו על־ידי המשתמש עצמו",
     	"right-reupload-shared": "דריסה מקומית של קבצים מאתר קובצי המדיה המשותף",
    -	"right-upload_by_url": "העלאת קובץ מכתובת אינטרנט",
    +	"right-upload_by_url": "העלאת קבצים מכתובת אינטרנט (URL)",
     	"right-purge": "רענון זיכרון המטמון של האתר ללא מעבר בדף אישור",
    -	"right-autoconfirmed": "עקיפת הגבלות הקצב המבוססות על כתובת IP",
    +	"right-autoconfirmed": "עקיפת ההגבלה על קצב הפעולות שניתן לבצע מכתובת IP מסוימת",
     	"right-bot": "התייחסות לעריכות כאוטומטיות",
     	"right-nominornewtalk": "ביטול שליחת התראה על הודעה חדשה למשתמש בעת עריכה משנית בדף השיחה שלו",
     	"right-apihighlimits": "שימוש ב־API עם פחות הגבלות",
    @@ -1163,12 +1165,12 @@
     	"right-bigdelete": "מחיקת דפים המכילים כמות גדולה של עריכות בהיסטוריית הגרסאות",
     	"right-deletelogentry": "מחיקה ושחזור של פעולות יומן",
     	"right-deleterevision": "מחיקה ושחזור של גרסאות מסוימות בדפים",
    -	"right-deletedhistory": "צפייה בפרטים של גרסאות מחוקות, ללא הטקסט השייך להן",
    +	"right-deletedhistory": "צפייה בפרטים של גרסאות שנמחקו, ללא התוכן השייך להן",
     	"right-deletedtext": "צפייה בתוכן שנמחק ובהבדלים בין גרסאות שנמחקו",
     	"right-browsearchive": "חיפוש דפים מחוקים",
    -	"right-undelete": "שחזור דף מחוק",
    -	"right-suppressrevision": "הצגה, הסתרה וביטול הסתרה של גרסאות מסוימות של דפים מכל המשתמשים",
    -	"right-viewsuppressed": "הצגת גרסאות שמוסתרות מכל המשתמשים",
    +	"right-undelete": "שחזור דפים מחוקים",
    +	"right-suppressrevision": "צפייה, הסתרה וביטול הסתרה של גרסאות מסוימות בדפים מכל המשתמשים",
    +	"right-viewsuppressed": "צפייה בגרסאות שהוסתרו מכל המשתמשים",
     	"right-suppressionlog": "צפייה ביומנים פרטיים",
     	"right-block": "חסימת משתמשים מעריכה",
     	"right-blockemail": "חסימת משתמשים משליחת דואר אלקטרוני",
    @@ -1187,21 +1189,21 @@
     	"right-editmyuserjs": "עריכת קובצי JavaScript של המשתמש עצמו",
     	"right-viewmywatchlist": "צפייה ברשימת המעקב של המשתמש עצמו",
     	"right-editmywatchlist": "עריכת רשימת המעקב של המשתמש עצמו. מספר פעולות יוסיפו דפים גם ללא הרשאה זו.",
    -	"right-viewmyprivateinfo": "צפייה במידע הפרטי של המשתמש עצמו (כגון כתובת דוא\"ל, שם אמיתי)",
    +	"right-viewmyprivateinfo": "צפייה במידע הפרטי של המשתמש עצמו (כגון: כתובת דוא\"ל, שם אמיתי)",
     	"right-editmyprivateinfo": "עריכת המידע הפרטי של המשתמש עצמו (כגון: כתובת דוא\"ל, שם אמיתי)",
     	"right-editmyoptions": "עריכת ההעדפות של המשתמש עצמו",
    -	"right-rollback": "שחזור מהיר של עריכות המשתמש האחרון שערך דף מסוים",
    +	"right-rollback": "שחזור מהיר של העריכות שנעשו על־ידי העורך האחרון בדפים",
     	"right-markbotedits": "סימון עריכות משוחזרות כעריכות של בוט",
    -	"right-noratelimit": "עקיפת הגבלת קצב העריכות",
    +	"right-noratelimit": "עקיפת ההגבלה על קצב הפעולות",
     	"right-import": "ייבוא דפים מאתרי ויקי אחרים",
     	"right-importupload": "ייבוא דפים באמצעות העלאת קבצים",
     	"right-patrol": "סימון עריכות של אחרים כבדוקות",
     	"right-autopatrol": "סימון אוטומטי של עריכות המשתמש עצמו כבדוקות",
     	"right-patrolmarks": "הבחנה בין עריכות שנבדקו לעריכות שטרם נבדקו בדף השינויים האחרונים",
    -	"right-unwatchedpages": "הצגת רשימה של דפים שאינם במעקב",
    +	"right-unwatchedpages": "צפייה ברשימת הדפים שאינם במעקב",
     	"right-mergehistory": "מיזוג היסטוריית גרסאות של דפים",
    -	"right-userrights": "עריכת כל הרשאות המשתמש",
    -	"right-userrights-interwiki": "עריכת הרשאות המשתמש של משתמשים באתרי ויקי אחרים",
    +	"right-userrights": "שינוי כל הרשאות המשתמש",
    +	"right-userrights-interwiki": "שינוי הרשאות של משתמשים באתרי ויקי אחרים",
     	"right-siteadmin": "נעילה וביטול נעילה של בסיס הנתונים",
     	"right-override-export-depth": "ייצוא דפים כולל הדפים המקושרים (עד עומק של 5 דפים)",
     	"right-sendemail": "שליחת דואר אלקטרוני למשתמשים אחרים",
    @@ -1246,10 +1248,10 @@
     	"rightslogtext": "יומן זה מציג את השינויים בהרשאות של המשתמשים.",
     	"action-read": "לקרוא דף זה",
     	"action-edit": "לערוך דף זה",
    -	"action-createpage": "ליצור דפים",
    -	"action-createtalk": "ליצור דפי שיחה",
    -	"action-createaccount": "ליצור את חשבון המשתמש הזה",
    -	"action-autocreateaccount": "ליצור את חשבון המשתמש החיצוני הזה",
    +	"action-createpage": "ליצור דף זה",
    +	"action-createtalk": "ליצור דף זה",
    +	"action-createaccount": "ליצור חשבונות משתמש חדשים",
    +	"action-autocreateaccount": "ליצור את חשבון המשתמש החיצוני הזה באופן אוטומטי",
     	"action-history": "לצפות בהיסטוריה של דף זה",
     	"action-minoredit": "לסמן עריכה זו כמשנית",
     	"action-move": "להעביר דף זה",
    @@ -1264,32 +1266,32 @@
     	"action-writeapi": "להשתמש ב־API לשינוי דפים",
     	"action-delete": "למחוק דף זה",
     	"action-deleterevision": "למחוק גרסה זו",
    -	"action-deletedhistory": "לצפות בהיסטוריה המחוקה של דף זה",
    +	"action-deletedhistory": "לצפות בהיסטוריה המחוקה של דפים",
     	"action-browsearchive": "לחפש דפים מחוקים",
     	"action-undelete": "לשחזר דף זה",
     	"action-suppressrevision": "לבדוק ולשחזר גרסה מוסתרת זו",
    -	"action-suppressionlog": "לצפות ביומן פרטי זה",
    -	"action-block": "לחסום משתמש זה מעריכה",
    -	"action-protect": "לשנות את רמת ההגנה על דף זה",
    -	"action-rollback": "לשחזר במהירות את עריכות המשתמש האחרון שערך דף מסוים",
    -	"action-import": "לייבא דפים מאתר ויקי אחר",
    -	"action-importupload": "לייבא דפים באמצעות העלאת קובץ",
    +	"action-suppressionlog": "לצפות ביומן הפרטי הזה",
    +	"action-block": "לחסום משתמשים מעריכה",
    +	"action-protect": "לשנות את רמת ההגנה של דף זה",
    +	"action-rollback": "לבצע שחזור מהיר של העריכות שנעשו על־ידי העורך האחרון בדפים",
    +	"action-import": "לייבא דפים מאתרי ויקי אחרים",
    +	"action-importupload": "לייבא דפים באמצעות העלאת קבצים",
     	"action-patrol": "לסמן עריכות של אחרים כבדוקות",
    -	"action-autopatrol": "לסמן את העריכות שלך כבדוקות",
    +	"action-autopatrol": "לסמן את העריכות {{GENDER:|שלך|שלך|שלכם}} כבדוקות",
     	"action-unwatchedpages": "לצפות ברשימת הדפים שאינם במעקב",
    -	"action-mergehistory": "למזג את ההיסטוריה של דף זה",
    -	"action-userrights": "לערוך את כל הרשאות המשתמש",
    -	"action-userrights-interwiki": "לערוך את ההרשאות של משתמשים באתרי ויקי אחרים",
    -	"action-siteadmin": "לנעול או לבטל את נעילת בסיס הנתונים",
    -	"action-sendemail": "לשלוח דואר אלקטרוני",
    -	"action-editmywatchlist": "לערוך את רשימת המעקב שלך",
    -	"action-viewmywatchlist": "לצפות ברשימת המעקב שלך",
    -	"action-viewmyprivateinfo": "לצפות במידע הפרטי שלך",
    -	"action-editmyprivateinfo": "לערוך את המידע הפרטי שלך",
    -	"action-editcontentmodel": "לערוך את מודל התוכן של דף",
    -	"action-managechangetags": "ליצור, להפעיל ולבטל תגיות",
    -	"action-applychangetags": "להחיל תגיות יחד עם השינויים שלכם",
    -	"action-changetags": "להוסיף ולהסיר תגיות כלשהן לגרסאות מסוימות ולרשומות יומן",
    +	"action-mergehistory": "למזג את היסטוריית הגרסאות של דף זה",
    +	"action-userrights": "לשנות את כל הרשאות המשתמש",
    +	"action-userrights-interwiki": "לשנות הרשאות של משתמשים באתרי ויקי אחרים",
    +	"action-siteadmin": "לנעול או לבטל את הנעילה של בסיס הנתונים",
    +	"action-sendemail": "לשלוח דואר אלקטרוני למשתמשים",
    +	"action-editmywatchlist": "לערוך את רשימת המעקב {{GENDER:|שלך|שלך|שלכם}}",
    +	"action-viewmywatchlist": "לצפות ברשימת המעקב {{GENDER:|שלך|שלך|שלכם}}",
    +	"action-viewmyprivateinfo": "לצפות במידע הפרטי {{GENDER:|שלך|שלך|שלכם}}",
    +	"action-editmyprivateinfo": "לערוך את המידע הפרטי {{GENDER:|שלך|שלך|שלכם}}",
    +	"action-editcontentmodel": "לשנות את מודל התוכן של דפים",
    +	"action-managechangetags": "ליצור, להפעיל או לבטל תגיות",
    +	"action-applychangetags": "להחיל תגיות יחד עם שינויים",
    +	"action-changetags": "להוסיף או להסיר תגיות מגרסאות ומרשומות יומן",
     	"action-deletechangetags": "למחוק תגיות מבסיס הנתונים",
     	"nchanges": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}",
     	"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|מאז ביקורך האחרון}}",
    @@ -1328,10 +1330,10 @@
     	"rcshowhidemine": "$1 עריכות שלי",
     	"rcshowhidemine-show": "הצגת",
     	"rcshowhidemine-hide": "הסתרת",
    -	"rcshowhidecategorization": "$1 שינויים בקטגוריות של דפים",
    +	"rcshowhidecategorization": "$1 שינויים בקטגוריות",
     	"rcshowhidecategorization-show": "הצגת",
     	"rcshowhidecategorization-hide": "הסתרת",
    -	"rclinks": "הצגת $1 שינויים אחרונים ב־$2 הימים האחרונים.<br /> $3",
    +	"rclinks": "הצגת $1 השינויים האחרונים ב־$2 הימים האחרונים<br />$3",
     	"diff": "הבדל",
     	"hist": "היסטוריה",
     	"hide": "הסתרת",
    @@ -1385,7 +1387,7 @@
     	"ignorewarnings": "התעלמות מכל האזהרות",
     	"minlength1": "שמות קבצים צריכים להיות בני תו אחד לפחות.",
     	"illegalfilename": "שם הקובץ \"$1\" מכיל תווים שאינם מותרים בכותרות דפים.\nנא לשנות את השם ולנסות להעלותו שנית.",
    -	"filename-toolong": "שמות קבצים לא יכולים להיות ארוכים מ־240 בתים.",
    +	"filename-toolong": "שמות של קבצים לא יכולים להיות ארוכים יותר מ־240 בייטים.",
     	"badfilename": "שם הקובץ שונה ל־\"$1\".",
     	"filetype-mime-mismatch": "סיומת הקובץ \".$1\" אינה מתאימה לסוג ה־MIME שנמצא לקובץ זה ($2).",
     	"filetype-badmime": "לא ניתן להעלות קבצים שסוג ה־MIME שלהם הוא \"$1\".",
    @@ -1465,6 +1467,8 @@
     	"upload-http-error": "התרחשה שגיאת HTTP‏: $1",
     	"upload-copy-upload-invalid-domain": "העלאת קבצים משרת זה אינה אפשרית.",
     	"upload-foreign-cant-upload": "באתר הוויקי הזה לא מופעלת האפשרות להעלאת קבצים למאגר הקבצים הזר המבוקש.",
    +	"upload-foreign-cant-load-config": "טעינת ההגדרות הדרושות להעלאת קבצים למאגר הקבצים הזר נכשלה.",
    +	"upload-dialog-disabled": "אין אפשרות להעלות קבצים באמצעות תיבת הדו־שיח הזאת באתר זה.",
     	"upload-dialog-title": "העלאת קובץ",
     	"upload-dialog-button-cancel": "ביטול",
     	"upload-dialog-button-done": "בוצע",
    @@ -1503,7 +1507,7 @@
     	"backend-fail-closetemp": "לא הייתה אפשרות לסגור את הקובץ הזמני.",
     	"backend-fail-read": "לא ניתן היה לקרוא את הקובץ \"$1\".",
     	"backend-fail-create": "לא ניתן היה לכתוב את הקובץ \"$1\".",
    -	"backend-fail-maxsize": "לא ניתן היה לכתוב את הקובץ \"$1\" כיוון שהוא גדול יותר {{PLURAL:$2|מבית אחד|מ־$2 בתים}}.",
    +	"backend-fail-maxsize": "לא ניתן היה לכתוב את הקובץ \"$1\" כיוון שהוא גדול יותר {{PLURAL:$2|מבייט אחד|מ־$2 בייטים}}.",
     	"backend-fail-readonly": "מאגר האחסון לקבצים \"$1\" הוא כרגע במצב קריאה בלבד. הסיבה שניתנה לכך היא: <em>$2</em>",
     	"backend-fail-synced": "הקובץ \"$1\" נמצא במצב לא עקבי בתוך מאגרי אחסון הקבצים הפנימיים",
     	"backend-fail-connect": "לא ניתן היה להתחבר למאגר אחסון הקבצים הפנימי \"$1\".",
    @@ -1732,8 +1736,8 @@
     	"mostimages": "הקבצים המקושרים ביותר",
     	"mostinterwikis": "הדפים עם המספר הרב ביותר של קישורי בינוויקי",
     	"mostrevisions": "הדפים עם מספר העריכות הגבוה ביותר",
    -	"prefixindex": "כל דפים עם התחילית",
    -	"prefixindex-namespace": "כל דפים עם התחילית (במרחב השם $1)",
    +	"prefixindex": "כל הדפים עם התחילית",
    +	"prefixindex-namespace": "כל הדפים עם התחילית (במרחב השם $1)",
     	"prefixindex-submit": "הצגה",
     	"prefixindex-strip": "הסתרת התחילית ברשימה",
     	"shortpages": "דפים קצרים",
    @@ -1756,7 +1760,7 @@
     	"protectedpages-unknown-timestamp": "לא ידוע",
     	"protectedpages-unknown-performer": "משתמש לא ידוע",
     	"protectedtitles": "כותרות מוגנות",
    -	"protectedtitles-summary": "בדף זה רשומות הכותרות שמוגנות כעת מפני יצירה. לרשימת הדפים הקיימים שמוגנים, ראו [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
    +	"protectedtitles-summary": "בדף זה רשומות הכותרות של הדפים שמוגנים כעת מפני יצירה. לרשימת הדפים הקיימים שמוגנים, {{GENDER:|ראה|ראי|ראו}} [[{{#special:ProtectedPages}}|{{int:protectedpages}}]].",
     	"protectedtitlesempty": "אין כרגע כותרות מוגנות עם הפרמטרים האלה.",
     	"protectedtitles-submit": "הצגת הדפים",
     	"listusers": "רשימת משתמשים",
    @@ -1879,21 +1883,21 @@
     	"activeusers-noresult": "לא נמצאו משתמשים.",
     	"activeusers-submit": "הצגת משתמשים פעילים",
     	"listgrouprights": "רשימת הרשאות לקבוצה",
    -	"listgrouprights-summary": "זוהי רשימה של קבוצות המשתמש המוגדרות באתר זה, עם ההרשאות של כל אחת.\nמידע נוסף על ההרשאות ניתן למצוא [[{{MediaWiki:Listgrouprights-helppage}}|כאן]].",
    +	"listgrouprights-summary": "זוהי רשימה של קבוצות המשתמש המוגדרות באתר זה, עם ההרשאות של כל קבוצה.\nמידע נוסף על ההרשאות ניתן למצוא [[{{MediaWiki:Listgrouprights-helppage}}|כאן]].",
     	"listgrouprights-key": "מקרא:\n* <span class=\"listgrouprights-granted\">הרשאה שהוענקה</span>\n* <span class=\"listgrouprights-revoked\">הרשאה שהוסרה</span>",
     	"listgrouprights-group": "קבוצה",
     	"listgrouprights-rights": "הרשאות",
     	"listgrouprights-helppage": "Help:הרשאות",
     	"listgrouprights-members": "(רשימת חברים)",
     	"listgrouprights-right-display": "<span class=\"listgrouprights-granted\">$1 <code dir=\"ltr\">($2)</code></span>",
    -	"listgrouprights-addgroup": "הוספת {{PLURAL:$2|הקבוצה|הקבוצות}}: $1",
    -	"listgrouprights-removegroup": "הסרת {{PLURAL:$2|הקבוצה|הקבוצות}}: $1",
    -	"listgrouprights-addgroup-all": "הוספת כל הקבוצות",
    -	"listgrouprights-removegroup-all": "הסרת כל הקבוצות",
    -	"listgrouprights-addgroup-self": "הוספת {{PLURAL:$2|הקבוצה|הקבוצות}} לחשבון האישי: $1",
    -	"listgrouprights-removegroup-self": "הסרת {{PLURAL:$2|הקבוצה|הקבוצות}} מהחשבון האישי: $1",
    -	"listgrouprights-addgroup-self-all": "הוספת כל הקבוצות לחשבון האישי",
    -	"listgrouprights-removegroup-self-all": "הסרת כל הקבוצות מהחשבון האישי",
    +	"listgrouprights-addgroup": "הוספת משתמשים ל{{PLURAL:$2|קבוצה|קבוצות}}: $1",
    +	"listgrouprights-removegroup": "הסרת משתמשים מה{{PLURAL:$2|קבוצה|קבוצות}}: $1",
    +	"listgrouprights-addgroup-all": "הוספת משתמשים לכל הקבוצות",
    +	"listgrouprights-removegroup-all": "הסרת משתמשים מכל הקבוצות",
    +	"listgrouprights-addgroup-self": "הוספת המשתמש עצמו ל{{PLURAL:$2|קבוצה|קבוצות}}: $1",
    +	"listgrouprights-removegroup-self": "הסרת המשתמש עצמו מה{{PLURAL:$2|קבוצה|קבוצות}}: $1",
    +	"listgrouprights-addgroup-self-all": "הוספת המשתמש עצמו לכל הקבוצות",
    +	"listgrouprights-removegroup-self-all": "הסרת המשתמש עצמו מכל הקבוצות",
     	"listgrouprights-namespaceprotection-header": "הגבלות על מרחבי שם",
     	"listgrouprights-namespaceprotection-namespace": "מרחב השם",
     	"listgrouprights-namespaceprotection-restrictedto": "ההרשאה או ההרשאות המאפשרות למשתמשים לערוך",
    @@ -1978,7 +1982,7 @@
     	"wlshowhideanons": "משתמשים אנונימיים",
     	"wlshowhidepatr": "עריכות בדוקות",
     	"wlshowhidemine": "עריכות שלי",
    -	"wlshowhidecategorization": "שינויים בקטגוריות של דפים",
    +	"wlshowhidecategorization": "שינויים בקטגוריות",
     	"watchlist-options": "אפשרויות ברשימת המעקב",
     	"watching": "בהוספה לרשימת המעקב...",
     	"unwatching": "בהסרה מרשימת המעקב...",
    @@ -2107,7 +2111,7 @@
     	"restriction-level": "רמת ההגנה:",
     	"minimum-size": "גודל מינימלי",
     	"maximum-size": "גודל מרבי:",
    -	"pagesize": "(בבתים)",
    +	"pagesize": "(בבייטים)",
     	"restriction-edit": "עריכה",
     	"restriction-move": "העברה",
     	"restriction-create": "יצירה",
    @@ -2121,7 +2125,7 @@
     	"viewdeletedpage": "הצגה של דפים מחוקים",
     	"undeletepagetext": "{{PLURAL:$1|הדף שלהלן נמחק, אך הוא עדיין בארכיון וניתן לשחזר אותו|הדפים שלהלן נמחקו, אך הם עדיין בארכיון וניתן לשחזר אותם}}.\nייתכן שהארכיון ינוקה מעת לעת.",
     	"undelete-fieldset-title": "שחזור גרסאות",
    -	"undeleteextrahelp": "כדי לשחזר את היסטוריית הגרסאות המלאה של הדף, אל {{GENDER:|תסמן|תסמני|תסמנו}} שום תיבת סימון; פשוט {{GENDER:|לחץ|לחצי|לחצו}} על <strong><em>{{int:undeletebtn}}</em></strong>.\nכדי לשחזר גרסאות מסוימות בלבד, {{GENDER:|סמן|סמני|סמנו}} את הגרסאות ש{{GENDER:|ברצונך|ברצונך|ברצונכם}} לשחזר ולאחר מכן {{GENDER:|לחץ|לחצי|לחצו}} על <strong><em>{{int:undeletebtn}}</em></strong>.",
    +	"undeleteextrahelp": "כדי לשחזר את היסטוריית הגרסאות המלאה של הדף, אל {{GENDER:|תסמן|תסמני|תסמנו}} שום תיבת סימון; פשוט {{GENDER:|לחץ|לחצי|לחצו}} על <strong>{{int:undeletebtn}}</strong>.\nכדי לשחזר גרסאות מסוימות בלבד, {{GENDER:|סמן|סמני|סמנו}} את הגרסאות ש{{GENDER:|ברצונך|ברצונך|ברצונכם}} לשחזר ולאחר מכן {{GENDER:|לחץ|לחצי|לחצו}} על <strong>{{int:undeletebtn}}</strong>.",
     	"undeleterevisions": "{{PLURAL:$1|גרסה אחת נמחקה|$1 גרסאות נמחקו}}",
     	"undeletehistory": "אם {{GENDER:|תשחזר|תשחזרי|תשחזרו}} את הדף, הגרסאות ישוחזרו להיסטוריית השינויים שלו.\nאם הדף הזה נמחק בעבר ולאחר מכן נוצר מחדש, הגרסאות ש{{GENDER:|תשחזר|תשחזרי|תשחזרו}} ימוזגו להיסטוריית השינויים של הדף ויופיעו בתור הגרסאות הישנות ביותר שלו.",
     	"undeleterevdel": "השחזור לא יכול להתבצע אם הגרסה האחרונה של הדף מחוקה או מוסתרת.\nבמקרה כזה, יש לבטל קודם את ההסתרה של הגרסה האחרונה.",
    @@ -2187,6 +2191,7 @@
     	"sp-contributions-username": "כתובת IP או שם משתמש:",
     	"sp-contributions-toponly": "הצגת עריכות שהן הגרסאות האחרונות בלבד",
     	"sp-contributions-newonly": "הצגת עריכות שהן יצירות של דפים בלבד",
    +	"sp-contributions-hideminor": "הסתרת עריכות משניות",
     	"sp-contributions-submit": "חיפוש",
     	"whatlinkshere": "דפים המקושרים לכאן",
     	"whatlinkshere-title": "דפים המקשרים לדף \"$1\"",
    @@ -2264,7 +2269,7 @@
     	"ipblocklist-localblock": "חסימה מקומית",
     	"ipblocklist-otherblocks": "{{PLURAL:$1|חסימה אחרת|חסימות אחרות}}",
     	"infiniteblock": "ללא הגבלת זמן",
    -	"expiringblock": "החסימה פוקעת ב{{GRAMMAR:תחילית|$1}} בשעה $2",
    +	"expiringblock": "החסימה פוקעת ב־$1 בשעה $2",
     	"anononlyblock": "משתמשים אנונימיים בלבד",
     	"noautoblockblock": "חסימה אוטומטית מבוטלת",
     	"createaccountblock": "יצירת חשבונות נחסמה",
    @@ -2334,7 +2339,7 @@
     	"move-page-legend": "העברת דף",
     	"movepagetext": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהלן כדי לשנות את השם של הדף הזה, ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\n{{GENDER:|באפשרותך|באפשרותך|באפשרותכם}} לעדכן באופן אוטומטי דפי הפניה שכרגע מפנים לשם הנוכחי של הדף.\nאם {{GENDER:|תבחר|תבחרי|תבחרו}} לא לעשות זאת, אנא {{GENDER:|ודא|ודאי|ודאו}} לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]].\nב{{GENDER:|אחריותך|אחריותך|אחריותכם}} לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\n{{GENDER:|שים|שימי|שימו}} לב שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש ש{{GENDER:|תבחר|תבחרי|תבחרו}}, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר ש{{GENDER:|תוכל|תוכלי|תוכלו}} להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת {{GENDER:|לבך|לבך|לבכם}}:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nאנא {{GENDER:|ודא שאתה מבין|ודאי שאת מבינה|ודאו שאתם מבינים}} את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
     	"movepagetext-noredirectfixer": "{{GENDER:|השתמש|השתמשי|השתמשו}} בטופס שלהלן כדי לשנות את השם של הדף הזה, ולהעביר את כל היסטוריית העריכות שלו לשם החדש.\nהשם הישן יהפוך לדף הפניה אל השם החדש.\nאנא {{GENDER:|ודא|ודאי|ודאו}} לאחר ההעברה שאין [[Special:DoubleRedirects|הפניות כפולות]] או [[Special:BrokenRedirects|הפניות שבורות]].\nב{{GENDER:|אחריותך|אחריותך|אחריותכם}} לוודא שכל הקישורים ימשיכו לקשר למקומות שאליהם הם אמורים לקשר.\n\n{{GENDER:|שים|שימי|שימו}} לב שהדף <strong>לא</strong> יועבר אם כבר יש דף תחת השם החדש ש{{GENDER:|תבחר|תבחרי|תבחרו}}, אלא אם כן הדף עם השם החדש הוא הפניה ואין לו עריכות קודמות.\nזה אומר ש{{GENDER:|תוכל|תוכלי|תוכלו}} להחזיר את הדף לשם המקורי במקרה שתיעשה טעות, אבל לא ניתן \"לדרוס\" דף קיים.\n\n<strong>לתשומת {{GENDER:|לבך|לבך|לבכם}}:</strong>\nהעברה זו עלולה להיות שינוי דרסטי ומהותי לדף פופולרי;\nאנא {{GENDER:|ודא שאתה מבין|ודאי שאת מבינה|ודאו שאתם מבינים}} את התוצאות של הפעולה הזאת לפני ביצוע ההעברה.",
    -	"movepagetalktext": "אם התיבה הזאת מסומנת, דף השיחה של דף זה יועבר אוטומטית לכותרת החדשה, אלא אם קיים שם דף שיחה שאינו ריק.\n\nבמקרה הזה, תצטרכו להעביר או לשלב את הדפים באופן ידני, אם תרצו.",
    +	"movepagetalktext": "אם האפשרות הזאת מסומנת, דף השיחה של הדף הזה יועבר אוטומטית לשם החדש, אלא אם קיים דף שיחה שאינו ריק תחת השם החדש. במקרה כזה, יש להעביר או למזג את הדפים באופן ידני, במידת הצורך.",
     	"moveuserpage-warning": "'''אזהרה:''' אתם עומדים להעביר דף משתמש. שימו לב שרק הדף יועבר וששם המשתמש '''לא''' ישתנה.",
     	"movecategorypage-warning": "<strong>אזהרה:</strong> אתם עומדים להעביר דף קטגוריה. שימו לב שרק הדף יועבר ושכל הדפים בקטגוריה הישנה <strong>לא</strong> יסווגו לקטגוריה החדשה.",
     	"movenologintext": "עליכם להיות רשומים ו[[Special:UserLogin|להיכנס לחשבון]] כדי להעביר דפים.",
    @@ -2361,7 +2366,7 @@
     	"movepage-page-unmoved": "לא ניתן להעביר את הדף $1 לשם $2.",
     	"movepage-max-pages": "{{PLURAL:$1|דף אחד כבר הועבר|$1 דפים כבר הועברו}}. זה המספר המרבי ולא ניתן להעביר דפים נוספים אוטומטית.",
     	"movelogpage": "יומן העברות",
    -	"movelogpagetext": "להלן רשימה של כל הדפים שהועברו.",
    +	"movelogpagetext": "להלן רשימה של כל הדפים ששמם שוּנה.",
     	"movesubpage": "{{PLURAL:$1|דף משנה|דפי משנה}}",
     	"movesubpagetext": "לדף זה יש {{PLURAL:$1|דף משנה אחד המוצג להלן|$1 דפי משנה המוצגים להלן}}.",
     	"movenosubpage": "לדף זה אין דפי משנה.",
    @@ -2487,14 +2492,14 @@
     	"tooltip-pt-userpage": "דף {{GENDER:|המשתמש|המשתמשת}} שלך",
     	"tooltip-pt-anonuserpage": "דף המשתמש של משתמש אנונימי זה",
     	"tooltip-pt-mytalk": "דף השיחה שלך",
    -	"tooltip-pt-anontalk": "דיון על העריכות שנעשו מכותבת ה־IP הזאת",
    +	"tooltip-pt-anontalk": "דיון על העריכות שנעשו מכתובת ה־IP הזאת",
     	"tooltip-pt-preferences": "ההעדפות שלך",
     	"tooltip-pt-watchlist": "רשימת הדפים ש{{GENDER:|אתה עוקב|את עוקבת}} אחרי השינויים בהם",
    -	"tooltip-pt-mycontris": "רשימת התרומות שלך",
    +	"tooltip-pt-mycontris": "רשימת העריכות שביצעת",
     	"tooltip-pt-anoncontribs": "רשימת העריכות שנעשו מכתובת ה־IP הזאת",
    -	"tooltip-pt-login": "מומלץ להיכנס לחשבון, אבל לא חובה לעשות זאת",
    +	"tooltip-pt-login": "מומלץ להיכנס לחשבון, אך אין חובה לעשות זאת",
     	"tooltip-pt-logout": "יציאה מהחשבון",
    -	"tooltip-pt-createaccount": "מומלץ ליצור חשבון ולהיכנס אליו, אבל לא חובה לעשות זאת",
    +	"tooltip-pt-createaccount": "מומלץ ליצור חשבון ולהיכנס אליו, אך אין חובה לעשות זאת",
     	"tooltip-ca-talk": "שיחה על דף זה",
     	"tooltip-ca-edit": "עריכת דף זה",
     	"tooltip-ca-addsection": "הוספת פסקה חדשה",
    @@ -2507,18 +2512,18 @@
     	"tooltip-ca-move": "שינוי השם של דף זה",
     	"tooltip-ca-watch": "הוספת דף זה לרשימת המעקב שלך",
     	"tooltip-ca-unwatch": "הסרת דף זה מרשימת המעקב שלך",
    -	"tooltip-search": "חיפוש ב{{grammar:תחילית|{{SITENAME}}}}",
    +	"tooltip-search": "חיפוש ב{{GRAMMAR:תחילית|{{SITENAME}}}}",
     	"tooltip-search-go": "מעבר לדף בשם הזה בדיוק, אם הוא קיים",
     	"tooltip-search-fulltext": "חיפוש טקסט זה בדפים",
     	"tooltip-p-logo": "ביקור בעמוד הראשי",
     	"tooltip-n-mainpage": "ביקור בעמוד הראשי",
     	"tooltip-n-mainpage-description": "ביקור בעמוד הראשי",
    -	"tooltip-n-portal": "אודות המיזם, כיצד תוכלו לעזור, היכן למצוא דברים",
    +	"tooltip-n-portal": "אודות המיזם, איך אפשר לעזור, איפה למצוא דברים",
     	"tooltip-n-currentevents": "מציאת מידע רקע על האירועים האחרונים",
     	"tooltip-n-recentchanges": "רשימת השינויים האחרונים באתר",
     	"tooltip-n-randompage": "טעינת דף אקראי",
     	"tooltip-n-help": "עזרה בשימוש באתר",
    -	"tooltip-t-whatlinkshere": "רשימת כל הדפים המקושרים לכאן",
    +	"tooltip-t-whatlinkshere": "רשימה של כל הדפים שמכילים קישורים לדף הזה",
     	"tooltip-t-recentchangeslinked": "השינויים האחרונים שבוצעו בדפים המקושרים מדף זה",
     	"tooltip-feed-rss": "הזנת RSS עבור דף זה",
     	"tooltip-feed-atom": "הזנת Atom עבור דף זה",
    @@ -2526,7 +2531,7 @@
     	"tooltip-t-emailuser": "שליחת דואר אלקטרוני {{GENDER:$1|למשתמש זה|למשתמשת זו}}",
     	"tooltip-t-info": "מידע נוסף על דף זה",
     	"tooltip-t-upload": "העלאת קבצים",
    -	"tooltip-t-specialpages": "רשימה של כל הדפים המיוחדים",
    +	"tooltip-t-specialpages": "רשימה של כל הדפים המיוחדים באתר",
     	"tooltip-t-print": "גרסה להדפסה של דף זה",
     	"tooltip-t-permalink": "קישור קבוע לגרסה זו של הדף",
     	"tooltip-ca-nstab-main": "צפייה בדף התוכן",
    @@ -2594,10 +2599,10 @@
     	"pageinfo-header-properties": "מאפייני הדף",
     	"pageinfo-display-title": "כותרת התצוגה",
     	"pageinfo-default-sort": "מפתח המיון הרגיל",
    -	"pageinfo-length": "אורך הדף (בבתים)",
    +	"pageinfo-length": "אורך הדף (בבייטים)",
     	"pageinfo-article-id": "מזהה הדף",
     	"pageinfo-language": "שפת התוכן של הדף",
    -	"pageinfo-content-model": "סוג התוכן של הדף",
    +	"pageinfo-content-model": "מודל התוכן של הדף",
     	"pageinfo-robot-policy": "איסוף על־ידי רובוטים של מנועי חיפוש",
     	"pageinfo-robot-index": "מותר",
     	"pageinfo-robot-noindex": "אסור",
    @@ -3135,7 +3140,7 @@
     	"table_pager_limit_label": "מספר פריטים בדף:",
     	"table_pager_limit_submit": "הצגה",
     	"table_pager_empty": "ללא תוצאות",
    -	"autosumm-blank": "הסרת כל התוכן מדף זה",
    +	"autosumm-blank": "הסרת כל התוכן מהדף",
     	"autosumm-replace": "החלפת הדף בתוכן \"$1\"",
     	"autoredircomment": "הפניה לדף [[$1]]",
     	"autosumm-new": "יצירת דף עם התוכן \"$1\"",
    @@ -3144,16 +3149,20 @@
     	"size-kilobytes": "{{PLURAL:$1|קילו־בייט אחד|$1 קילו־בייטים}}",
     	"size-megabytes": "{{PLURAL:$1|מגה־בייט אחד|$1 מגה־בייטים}}",
     	"size-gigabytes": "{{PLURAL:$1|ג'יגה־בייט אחד|$1 ג'יגה־בייטים}}",
    -	"size-terabytes": "$1 טרה־בייט",
    +	"size-terabytes": "{{PLURAL:$1|טרה־בייט אחד|$1 טרה־בייטים}}",
     	"size-petabytes": "{{PLURAL:$1|פטה־בייט אחד|$1 פטה־בייטים}}",
     	"size-exabytes": "{{PLURAL:$1|אקסה־בייט אחד|$1 אקסה־בייטים}}",
    -	"size-zetabytes": "$1 זטה־בייט",
    -	"size-yottabytes": "$1 יוטה־בייט",
    +	"size-zetabytes": "{{PLURAL:$1|זטה־בייט אחד|$1 זטה־בייטים}}",
    +	"size-yottabytes": "{{PLURAL:$1|יוטה־בייט אחד|$1 יוטה־בייטים}}",
     	"size-pixel": "{{PLURAL:$1|פיקסל אחד|$1 פיקסלים}}",
     	"size-kilopixel": "{{PLURAL:$1|קילו־פיקסל אחד|$1 קילו־פיקסלים}}",
     	"size-megapixel": "{{PLURAL:$1|מגה־פיקסל אחד|$1 מגה־פיקסלים}}",
     	"size-gigapixel": "{{PLURAL:$1|ג'יגה־פיקסל אחד|$1 ג'יגה־פיקסלים}}",
    +	"size-terapixel": "{{PLURAL:$1|טרה־פיקסל אחד|$1 טרה־פיקסלים}}",
    +	"size-petapixel": "{{PLURAL:$1|פטה־פיקסל אחד|$1 פטה־פיקסלים}}",
     	"size-exapixel": "{{PLURAL:$1|אקסה־פיקסל אחד|$1 אקסה־פיקסלים}}",
    +	"size-zetapixel": "{{PLURAL:$1|זטה־פיקסל אחד|$1 זטה־פיקסלים}}",
    +	"size-yottapixel": "{{PLURAL:$1|יוטה־פיקסל אחד|$1 יוטה־פיקסלים}}",
     	"lag-warn-normal": "שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
     	"lag-warn-high": "בגלל עיכוב בעדכון בסיס הנתונים, שינויים שבוצעו לפני פחות מ{{PLURAL:$1|שנייה אחת|־$1 שניות}} אינם מוצגים ברשימה זו.",
     	"watchlistedit-normal-title": "עריכת רשימת המעקב",
    @@ -3613,9 +3622,9 @@
     	"limitreport-ppvisitednodes": "מספר הצמתים שקדם־המפענח ביקר בהם",
     	"limitreport-ppgeneratednodes": "מספר הצמתים שקדם־המפענח יצר",
     	"limitreport-postexpandincludesize": "גודל הטקסט המוכלל לאחר הפריסה",
    -	"limitreport-postexpandincludesize-value": "{{PLURAL:$2|$1 מתוך בית אחד|$1/$2 בתים}}",
    +	"limitreport-postexpandincludesize-value": "{{PLURAL:$2|$1 מתוך בייט אחד|$1/$2 בייטים}}",
     	"limitreport-templateargumentsize": "גודל הפרמטרים של התבניות",
    -	"limitreport-templateargumentsize-value": "{{PLURAL:$2|$1 מתוך בית אחד|$1/$2 בתים}}",
    +	"limitreport-templateargumentsize-value": "{{PLURAL:$2|$1 מתוך בייט אחד|$1/$2 בייטים}}",
     	"limitreport-expansiondepth": "עומק הפריסה הגבוה ביותר",
     	"limitreport-expensivefunctioncount": "מספר פונקציות המפענח שגוזלות משאבים",
     	"expandtemplates": "פריסת תבניות",
    @@ -3651,9 +3660,9 @@
     	"default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>מבוטל</strong>)",
     	"mediastatistics": "סטטיסטיקות קבצים",
     	"mediastatistics-summary": "סטטיסטיקה על סוגי קבצים שהועלו. הסטטיסטיקה כוללת רק את הגרסה החדשה ביותר של הקובץ: גרסאות ישנות או מחוקות של קבצים אינן כלולות.",
    -	"mediastatistics-nbytes": "{{PLURAL:$1|בית אחד|$1 בתים}} ($2; $3%)",
    -	"mediastatistics-bytespertype": "הגודל הכולל של הקבצים בפרק זה: {{PLURAL:$1|בית אחד|$1 בתים}} ($2; $3%).",
    -	"mediastatistics-allbytes": "הגודל הכולל של כל הקבצים: {{PLURAL:$1|בית אחד|$1 בתים}} ($2).",
    +	"mediastatistics-nbytes": "{{PLURAL:$1|בייט אחד|$1 בייטים}} ($2; $3%)",
    +	"mediastatistics-bytespertype": "הגודל הכולל של הקבצים בפרק זה: {{PLURAL:$1|בייט אחד|$1 בייטים}} ($2; $3%).",
    +	"mediastatistics-allbytes": "הגודל הכולל של כל הקבצים: {{PLURAL:$1|בייט אחד|$1 בייטים}} ($2).",
     	"mediastatistics-table-mimetype": "סוג MIME",
     	"mediastatistics-table-extensions": "סיומות אפשריות",
     	"mediastatistics-table-count": "מספר הקבצים",
    @@ -3706,7 +3715,6 @@
     	"mw-widgets-dateinput-no-date": "לא נבחר תאריך",
     	"mw-widgets-titleinput-description-new-page": "הדף עדיין לא קיים",
     	"mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
    -	"api-error-blacklisted": "נא לבחור כותרת אחרת, המתארת טוב יותר את התוכן.",
     	"sessionmanager-tie": "לא ניתן לצרף מספר סוגי אימות זהות: $1.",
     	"sessionprovider-generic": "התחברויות של $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "התחברויות המבוססות על עוגיות",
    @@ -3722,7 +3730,7 @@
     	"log-action-filter-patrol": "סוג הסימונים של השינויים כבדוקים:",
     	"log-action-filter-protect": "סוג ההגנות:",
     	"log-action-filter-rights": "סוג שינויי ההרשאות:",
    -	"log-action-filter-suppress": "סוג ההעלמות",
    +	"log-action-filter-suppress": "סוג ההעלמות:",
     	"log-action-filter-upload": "סוג ההעלאות:",
     	"log-action-filter-all": "הכול",
     	"log-action-filter-block-block": "חסימות",
    @@ -3759,7 +3767,7 @@
     	"log-action-filter-suppress-delete": "העלמות של דפים",
     	"log-action-filter-suppress-block": "העלמות של משתמשים באמצעות חסימה",
     	"log-action-filter-suppress-reblock": "העלמות של משתמשים באמצעות חסימה מחדש",
    -	"log-action-filter-upload-upload": "העלאות חדשות",
    +	"log-action-filter-upload-upload": "העלאות של קבצים חדשים",
     	"log-action-filter-upload-overwrite": "דריסות של קבצים קיימים",
     	"authmanager-authn-not-in-progress": "האימות נכשל או שנתוני הפעולה נאבדו. נא להתחיל את התהליך מחדש.",
     	"authmanager-authn-no-primary": "לא ניתן היה לאמת את האישורים שסופקו.",
    @@ -3831,5 +3839,6 @@
     	"linkaccounts-success-text": "החשבון קושר.",
     	"linkaccounts-submit": "קישור החשבונות",
     	"unlinkaccounts": "ביטול הקישור של החשבונות",
    -	"unlinkaccounts-success": "קישור החשבון בוטל."
    +	"unlinkaccounts-success": "קישור החשבון בוטל.",
    +	"authenticationdatachange-ignored": "השינוי בנתוני האימות לא הצליח. ייתכן שלא הוגדר ספק."
     }
    diff --git a/languages/i18n/hr.json b/languages/i18n/hr.json
    index e101e44036..04be786cfe 100644
    --- a/languages/i18n/hr.json
    +++ b/languages/i18n/hr.json
    @@ -33,10 +33,11 @@
     			"Srdjan m",
     			"Teoo3",
     			"Matma Rex",
    -			"Vrhnje"
    +			"Vrhnje",
    +			"Ivi104"
     		]
     	},
    -	"tog-underline": "Podcrtane poveznice",
    +	"tog-underline": "Podcrtavanje poveznica",
     	"tog-hideminor": "Sakrij manje izmjene u nedavnim promjenama",
     	"tog-hidepatrolled": "Sakrij pregledane izmjene u nedavnim promjenama",
     	"tog-newpageshidepatrolled": "Sakrij pregledane stranice iz popisa novih stranica",
    @@ -76,7 +77,7 @@
     	"tog-ccmeonemails": "Pošalji mi kopiju e-maila kojeg pošaljem drugim suradnicima",
     	"tog-diffonly": "Ne prikazuj sadržaj stranice prilikom usporedbe inačica",
     	"tog-showhiddencats": "Prikaži skrivene kategorije",
    -	"tog-norollbackdiff": "Izostavi razliku nakon upotrebe ukloni",
    +	"tog-norollbackdiff": "Izostavi razliku nakon vračanja",
     	"tog-useeditwarning": "Upozori me kad napuštam stranicu za uređivanje bez spremanja izmjena",
     	"tog-prefershttps": "Uvijek koristi sigurnu vezu kod prijave",
     	"underline-always": "Uvijek",
    @@ -344,6 +345,7 @@
     	"readonly_lag": "Baza podataka je automatski zaključana dok se sekundarni bazni poslužitelji ne usklade s glavnim",
     	"internalerror": "Pogreška sustava",
     	"internalerror_info": "Interna pogrješka: $1",
    +	"internalerror-fatal-exception": "Terminalna pogreška \"$1\"",
     	"filecopyerror": "Ne mogu kopirati datoteku \"$1\" u \"$2\".",
     	"filerenameerror": "Ne mogu preimenovati datoteku \"$1\" u \"$2\".",
     	"filedeleteerror": "Ne mogu obrisati datoteku \"$1\".",
    @@ -357,6 +359,7 @@
     	"cannotdelete": "Ne može se obrisati stranica ili datoteka \"$1\".\nMoguće je da ju je netko drugi već obrisao.",
     	"cannotdelete-title": "Brisanje stranice \"$1\" nije moguće",
     	"delete-hook-aborted": "Brisanje prekinuto softverskim priključkom (hook).\nNema obrazloženja ili poruke o pogrješci.",
    +	"no-null-revision": "Ne mogu stvoriti praznu izmjenu stranice \"$1\"",
     	"badtitle": "Loš naslov",
     	"badtitletext": "Navedeni naslov stranice nepravilan ili loše formirana interwiki poveznica.",
     	"title-invalid-empty": "Naslov tražene stranice je prazan ili sadrži samo naziv prostora imena.",
    @@ -364,13 +367,15 @@
     	"title-invalid-interwiki": "Traženi naziv stranice sadrži interwiki poveznicu koja se ne može koristiti u nazivima.",
     	"title-invalid-talk-namespace": "Traženi naziv stranice odnosi se na stranicu rasprave koja ne može postojati.",
     	"title-invalid-characters": "Traženi naziv stranice sadrži nevažeće znakove: \"$1\"",
    +	"title-invalid-relative": "Naslov ima relativan put. Relativni putovi u naslovu su nevažeći, jer ih web pretraživač često ne može doseći.",
    +	"title-invalid-too-long": "Naslov stranice je predugačak. Naslov ne smije biti duži od $1 {{PLURAL:$1|bajt|bajtova}} u UTF-8 kodiranju.",
     	"perfcached": "Sljedeći podaci su iz međuspremnika i možda nisu najsvježiji. Međuspremnik sadrži $1 {{PLURAL:$1|rezultat|rezultata}} pretraživanja.",
     	"perfcachedts": "Sljedeći podaci su iz međuspremnika i posljednji puta su ažurirani u $1. Međuspremnik sadrži $4 {{PLURAL:$4|rezultat|rezultata}} pretraživanja.",
     	"querypage-no-updates": "Osvježavanje ove stranice je trenutačno onemogućeno. Nove promjene neće biti vidljive.",
     	"viewsource": "Vidi izvornik",
     	"viewsource-title": "Vidi kôd stranice $1",
     	"actionthrottled": "Uređivanje je usporeno",
    -	"actionthrottledtext": "Kao anti-spam mjeru, ograničeni ste u broju ovih radnji u određenom vremenu, i trenutačno ste dosegli to ograničenje. Pokušajte opet za koju minutu.",
    +	"actionthrottledtext": "Kao mjera protiv spama, ograničeni vam je broj ovih radnji u određenom vremenu, i trenutačno ste dostigli to ograničenje. Pokušajte opet za par minuta.",
     	"protectedpagetext": "Ova stranica je zaključana da bi se onemogućile izmjene.",
     	"viewsourcetext": "Možete pogledati i kopirati izvorni sadržaj ove stranice.",
     	"viewyourtext": "Možete vidjeti i kopirati tekst <strong>vaših uređivanja</strong> na ovoj stranici.",
    @@ -419,6 +424,7 @@
     	"password-change-forbidden": "Ne možete promjeniti zaporku na ovom projektu.",
     	"externaldberror": "Došlo je do pogreške s vanjskom autorizacijom ili Vam nije dopušteno osvježavanje vanjskog suradničkog računa.",
     	"login": "Prijavi se",
    +	"login-security": "Potvrdite svoj identitet",
     	"nav-login-createaccount": "Prijavi se",
     	"userlogin": "Prijavi se / stvori račun",
     	"userloginnocreate": "Prijavi se",
    @@ -2378,6 +2384,7 @@
     	"svg-long-error": "Nevaljana SVG datoteka: $1",
     	"show-big-image": "Vidi sliku u punoj veličini",
     	"show-big-image-preview": "Veličina ovog prikaza: $1.",
    +	"show-big-image-preview-differ": "Veličina ovog $3 prikaza ove $2 datoteke: $1.",
     	"show-big-image-other": "{{PLURAL:$2|Druga rezolucija|Ostale rezolucije}}: $1.",
     	"show-big-image-size": "$1 × $2 piksela",
     	"file-info-gif-looped": "animacija se ponavlja",
    diff --git a/languages/i18n/hu.json b/languages/i18n/hu.json
    index 63f963d588..1a51e601ea 100644
    --- a/languages/i18n/hu.json
    +++ b/languages/i18n/hu.json
    @@ -162,7 +162,7 @@
     	"december-date": "December $1",
     	"period-am": "de.",
     	"period-pm": "du.",
    -	"pagecategories": "{{PLURAL:$1|Kategória|Kategóriák}}",
    +	"pagecategories": "{{PLURAL:$1|Kategória|Kategória}}",
     	"category_header": "A(z) „$1” kategóriába tartozó lapok",
     	"subcategories": "Alkategóriák",
     	"category-media-header": "A(z) „$1” kategóriába tartozó médiafájlok",
    @@ -527,6 +527,7 @@
     	"createacct-another-realname-tip": "A valódi nevet nem kötelező megadni, de ha úgy döntesz, hogy megadod, azzal leszel feltüntetve a munkád szerzőjeként.",
     	"pt-login": "Bejelentkezés",
     	"pt-login-button": "Bejelentkezés",
    +	"pt-login-continue-button": "Bejelentkezés folytatása",
     	"pt-createaccount": "Fiók létrehozása",
     	"pt-userlogout": "Kijelentkezés",
     	"php-mail-error-unknown": "Ismeretlen hiba a PHP mail() függvényében",
    @@ -641,6 +642,7 @@
     	"minoredit": "Apró változtatás",
     	"watchthis": "A lap figyelése",
     	"savearticle": "Lap mentése",
    +	"publishpage": "Lap mentése",
     	"preview": "Előnézet",
     	"showpreview": "Előnézet megtekintése",
     	"showdiff": "Változtatások megtekintése",
    @@ -1194,6 +1196,7 @@
     	"right-managechangetags": "[[Special:Tags|címkék]] létrehozása és törlése az adatbázisban",
     	"right-applychangetags": "[[Special:Tags|címkék]] alkalmazása a változakra",
     	"right-changetags": "egyedi lapváltozatokon és naplóbejegyzéseken tetszőleges [[Special:Tags|címkék]] hozzáadása és törlése",
    +	"right-deletechangetags": "[[Special:Tags|Címkék]] törlése az adatbázisból",
     	"grant-generic": "„$1” jogosultságcsomag",
     	"grant-group-page-interaction": "interakció lapokkal",
     	"grant-group-file-interaction": "interakció médiával",
    @@ -1273,6 +1276,7 @@
     	"action-managechangetags": "adatbázis címkék létrehozása és törlése",
     	"action-applychangetags": "változtatások címkézése",
     	"action-changetags": "egyedi változtatások és napló bejegyzések tetszőleges címkével való ellátása és törlése",
    +	"action-deletechangetags": "címkék törlése az adatbáziból",
     	"nchanges": "$1 változtatás",
     	"enhancedrc-since-last-visit": "$1 az utolsó látogatás óta",
     	"enhancedrc-history": "történet",
    @@ -2145,6 +2149,7 @@
     	"sp-contributions-username": "IP-cím vagy felhasználónév:",
     	"sp-contributions-toponly": "Csak a jelenleg utolsónak számító változtatásokat mutassa",
     	"sp-contributions-newonly": "Csak az új oldalt létrehozó szerkesztéseket mutassa",
    +	"sp-contributions-hideminor": "Apró szerkesztések elrejtése",
     	"sp-contributions-submit": "Keresés",
     	"whatlinkshere": "Mi hivatkozik erre",
     	"whatlinkshere-title": "A(z) „$1” lapra hivatkozó lapok",
    @@ -2285,6 +2290,7 @@
     	"lockdbsuccesstext": "Az adatbázist zárolták.\n<br />A karbantartás befejezése után ne feledd el [[Special:UnlockDB|kinyitni]].",
     	"unlockdbsuccesstext": "Az adatbázis kinyitása kész.",
     	"lockfilenotwritable": "Az adatbázist zároló fájl nem írható. Az adatbázis zárolásához vagy kinyitásához ennek a webkiszolgáló által írhatónak kell lennie.",
    +	"databaselocked": "Az adatbázis már le van zárva.",
     	"databasenotlocked": "Az adatbázis nincs lezárva.",
     	"lockedbyandtime": "($1 zárta le $2 $3-kor)",
     	"move-page": "$1 átnevezése",
    @@ -2498,6 +2504,7 @@
     	"tooltip-ca-nstab-category": "A kategória megtekintése",
     	"tooltip-minoredit": "A szerkesztés megjelölése apróként",
     	"tooltip-save": "A változtatásaid elmentése",
    +	"tooltip-publish": "Változtatásaid közzététele",
     	"tooltip-preview": "Mielőtt elmentenéd a lapot, ellenőrizd, biztosan úgy néz-e ki, ahogy szeretnéd!",
     	"tooltip-diff": "Nézd meg, milyen változtatásokat végeztél eddig a szövegen",
     	"tooltip-compareselectedversions": "A két kiválasztott változat közötti eltérések megjelenítése",
    @@ -3046,6 +3053,8 @@
     	"confirm-watch-top": "Hozzá szeretnéd adni a lapot a figyelőlistádhoz?",
     	"confirm-unwatch-button": "OK",
     	"confirm-unwatch-top": "El szeretnéd távolítani a lapot a figyelőlistádról?",
    +	"confirm-rollback-button": "OK",
    +	"confirm-rollback-top": "Visszavonod a változtatásokat?",
     	"ellipsis": "…",
     	"quotation-marks": "„$1”",
     	"imgmultipageprev": "← előző oldal",
    @@ -3402,6 +3411,7 @@
     	"searchsuggest-containing": "tartalmazza…",
     	"api-error-badaccess-groups": "Nincs jogod fájlokat feltölteni erre a wikire.",
     	"api-error-badtoken": "Belső hiba: hibás token.",
    +	"api-error-blocked": "Letiltották a szerkesztési jogosultságodat.",
     	"api-error-copyuploaddisabled": "Az URL-címes feltöltés nem engedélyezett ezen a kiszolgálón.",
     	"api-error-duplicate": "Már van {{PLURAL:$1|egy|néhány}} másik fájl az oldalon ugyanilyen tartalommal.",
     	"api-error-duplicate-archive": "Az oldalon {{PLURAL:$1|szerepelt|szerepeltek}} más {{PLURAL:$1|fájl|fájlok}} is ugyanezzel a tartalommal, de törölve {{PLURAL:$1|lett|lettek}}.",
    @@ -3562,14 +3572,24 @@
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sütialapú munkamenetek",
     	"sessionprovider-nocookies": "A sütik le lehetnek tiltva. Engedélyezd a sütiket, és próbáld meg újra!",
     	"randomrootpage": "Véletlen lap a gyökérből",
    +	"log-action-filter-block": "Blokk típusa:",
     	"log-action-filter-delete": "Törlés típusa:",
     	"log-action-filter-import": "Importálás típusa:",
    +	"log-action-filter-move": "Átnevezés típusa:",
    +	"log-action-filter-patrol": "Járőrözés típusa:",
    +	"log-action-filter-protect": "Lapvédelem típusa:",
     	"log-action-filter-all": "Mind",
     	"log-action-filter-block-block": "Blokk",
     	"log-action-filter-block-reblock": "Blokk módosítása",
     	"log-action-filter-block-unblock": "Blokk feloldása",
    +	"log-action-filter-delete-delete": "Laptörlés",
    +	"log-action-filter-delete-restore": "Visszaállítás",
    +	"log-action-filter-delete-event": "Naplótörlés",
     	"log-action-filter-newusers-autocreate": "Automatikus létrehozás",
     	"log-action-filter-protect-protect": "Lapvédelem",
     	"log-action-filter-protect-unprotect": "Védelem feloldása",
    -	"log-action-filter-upload-upload": "Új feltöltés"
    +	"log-action-filter-upload-upload": "Új feltöltés",
    +	"authprovider-resetpass-skip-label": "Kihagy",
    +	"cannotauth-not-allowed-title": "Engedély megtagadva",
    +	"credentialsform-account": "Fiók neve:"
     }
    diff --git a/languages/i18n/ia.json b/languages/i18n/ia.json
    index 336b8de539..655058d452 100644
    --- a/languages/i18n/ia.json
    +++ b/languages/i18n/ia.json
    @@ -633,7 +633,9 @@
     	"minoredit": "Isto es un modification minor",
     	"watchthis": "Observar iste pagina",
     	"savearticle": "Publicar pagina",
    +	"savechanges": "Salveguardar modificationes",
     	"publishpage": "Publicar pagina",
    +	"publishchanges": "Publicar modificationes",
     	"preview": "Previsualisation",
     	"showpreview": "Monstrar previsualisation",
     	"showdiff": "Detaliar modificationes",
    @@ -1226,8 +1228,8 @@
     	"rightslogtext": "Isto es un registro de cambios in derectos de usator.",
     	"action-read": "leger iste pagina",
     	"action-edit": "modificar iste pagina",
    -	"action-createpage": "crear paginas",
    -	"action-createtalk": "crear paginas de discussion",
    +	"action-createpage": "crear iste pagina",
    +	"action-createtalk": "crear iste pagina de discussion",
     	"action-createaccount": "crear iste conto de usator",
     	"action-autocreateaccount": "crear automaticamente iste conto de usator externe",
     	"action-history": "vider le historia de iste pagina",
    @@ -1445,6 +1447,8 @@
     	"upload-http-error": "Un error HTTP occurreva: $1",
     	"upload-copy-upload-invalid-domain": "Le incargamento de copias non es disponibile ab iste dominio.",
     	"upload-foreign-cant-upload": "Iste wiki non es configurate pro incargar files al repositorio de files externe demandate.",
    +	"upload-foreign-cant-load-config": "Impossibile cargar le configuration pro le incargamento de files al repositorio de files externe.",
    +	"upload-dialog-disabled": "Le incargamento de files con iste dialogo es disactivate in iste wiki.",
     	"upload-dialog-title": "Incargar file",
     	"upload-dialog-button-cancel": "Cancellar",
     	"upload-dialog-button-done": "Facite",
    @@ -2163,6 +2167,7 @@
     	"sp-contributions-username": "Adresse IP o nomine de usator:",
     	"sp-contributions-toponly": "Monstrar solmente le versiones recente",
     	"sp-contributions-newonly": "Monstrar solmente le modificationes que es creationes de pagina",
    +	"sp-contributions-hideminor": "Celar modificationes minor",
     	"sp-contributions-submit": "Cercar",
     	"whatlinkshere": "Paginas ligate a iste",
     	"whatlinkshere-title": "Paginas con ligamines verso $1",
    @@ -3062,6 +3067,7 @@
     	"confirm-watch-top": "Adder iste pagina a tu observatorio?",
     	"confirm-unwatch-button": "OK",
     	"confirm-unwatch-top": "Remover iste pagina de tu observatorio?",
    +	"confirm-rollback-button": "OK",
     	"confirm-rollback-top": "Reverter le modificationes a iste pagina?",
     	"quotation-marks": "“$1”",
     	"imgmultipageprev": "← precedente pagina",
    @@ -3715,5 +3721,6 @@
     	"linkaccounts-success-text": "Le conto ha essite ligate.",
     	"linkaccounts-submit": "Ligar contos",
     	"unlinkaccounts": "Disligar contos",
    -	"unlinkaccounts-success": "Le conto ha essite disligate."
    +	"unlinkaccounts-success": "Le conto ha essite disligate.",
    +	"authenticationdatachange-ignored": "Le cambiamento del datos de authentication non ha succedite. Pote esser que nulle fornitor ha essite configurate?"
     }
    diff --git a/languages/i18n/inh.json b/languages/i18n/inh.json
    index 9bb9554aad..d7359912e4 100644
    --- a/languages/i18n/inh.json
    +++ b/languages/i18n/inh.json
    @@ -11,7 +11,8 @@
     			"Shirayuki",
     			"ElizaMag",
     			"Adam-Yourist",
    -			"Matma Rex"
    +			"Matma Rex",
    +			"Tusholi"
     		]
     	},
     	"tog-underline": "ТIахьожаярга кIала така хьакхар:",
    @@ -209,7 +210,7 @@
     	"imagepage": "Файла оагIон бIаргтоха",
     	"mediawikipage": "Хьахьокха хоам бара оагIув",
     	"templatepage": "Лера оагIон бIаргтоха",
    -	"viewhelppage": "ГӀо хьаэцар",
    +	"viewhelppage": "Новкъостал эцар",
     	"categorypage": "Категорен оагIон бIаргтоха",
     	"viewtalkpage": "Дувца оттадара бIаргтоха",
     	"otherlanguages": "Кхыча меттаех",
    @@ -228,14 +229,14 @@
     	"poolcounter-usage-error": "Пайда эцара гIалат: $1",
     	"aboutsite": "{{grammar:genitive|{{SITENAME}}}} лаьца дар",
     	"aboutpage": "Project:Сурт оттадар",
    -	"copyright": "$1 чулоацамаца тIакхоачаш да.",
    +	"copyright": "Чудара тIакхоачилга $1 лицензе бокъонца да, нагахьа кхыдар белгалдаь деце.",
     	"copyrightpage": "{{ns:project}}:Автора бокъонаш",
     	"currentevents": "ХӀанзара хинна хIамаш",
     	"currentevents-url": "Project:ХӀанзара хинна хIамаш",
     	"disclaimers": "Бехктокхам тIацаэцар",
     	"disclaimerpage": "Project:Бехктокхам тIацаэцар",
     	"edithelp": "Хувцам бара новкъостал",
    -	"helppage-top-gethelp": "ГӀо",
    +	"helppage-top-gethelp": "Новкъoстал",
     	"mainpage": "Керттера оагӀув",
     	"mainpage-description": "Керттера оагӀув",
     	"policy-url": "Project:Бокъонаш",
    @@ -245,12 +246,12 @@
     	"privacypage": "Project:КъайлагIара хIамай политика",
     	"badaccess": "ТIакхоачилга гӀалат",
     	"badaccess-group0": "Оаш дIадийха хинна ардам кхоачашде йиш яц шун.",
    -	"badaccess-groups": "Дахта кхоачашдар {{PLURAL:$2|1=тоабачара|тоабашкара}} $1 дакъалаьцархой мара де бокъо яц.",
    +	"badaccess-groups": "ДIадийха ардам кхоачашде могаш ба алхха доакъашхой {{PLURAL:$2|1=тоабан «$1»|укх тоабаш чура: $1}}",
     	"versionrequired": "Эшаш я $1 версех йола MediaWiki",
     	"versionrequiredtext": "Укх оагIонца болх бергболаш $1 версех йола MediaWiki эша. Хьажа [[Special:Version|програмни Iалашдарах бола хоамага]].",
     	"ok": "Мега",
     	"retrievedfrom": "Хьаст — «$1»",
    -	"youhavenewmessages": "Хьога кхачаб $1 ($2).",
    +	"youhavenewmessages": "{{PLURAL:$3|Хьога денад}} $1 ($2).",
     	"youhavenewmessagesmulti": "Хьога кхаьчад керда хоамаш $1 чу",
     	"editsection": "нийсде",
     	"editold": "хувца",
    @@ -260,9 +261,9 @@
     	"editsectionhint": "Дáкъа хувца: $1",
     	"toc": "Чудар",
     	"showtoc": "хьахьокха",
    -	"hidetoc": "къайладаккха",
    +	"hidetoc": "хьулде",
     	"collapsible-collapse": "дIахьулде",
    -	"collapsible-expand": "хьадоаржаде",
    +	"collapsible-expand": "доаржаде",
     	"confirmable-yes": "XӀа-а",
     	"confirmable-no": "A",
     	"thisisdeleted": "БIаргтоха е юхаметтаоттае $1?",
    @@ -282,13 +283,13 @@
     	"nstab-image": "Файл",
     	"nstab-mediawiki": "Хоамбар",
     	"nstab-template": "Ло",
    -	"nstab-help": "ГӀо",
    +	"nstab-help": "Новкъостал",
     	"nstab-category": "Категори",
     	"mainpage-nstab": "Керттера",
     	"nosuchaction": "Цу тайпара ардам дац",
     	"nosuchspecialpage": "Изза мо гIулакха оагӀув яц",
     	"error": "ГӀалат",
    -	"databaseerror-query": "Дехар: $1",
    +	"databaseerror-query": "ДIадехар: $1",
     	"databaseerror-function": "Функци: $1",
     	"databaseerror-error": "ГIалат: $1",
     	"missing-article": "Дарий гуллам чу дIайийха текст яц укх оагIон «$1» чура $2 корадар дезаш хинна.\n\nИз мо гIалат нийсалуш хул тишъенна тIахьожаярга гIолла дIадаьккха оагӀон хувцама истори тӀа дехьавала гӀертача.\n\nНагахьа санна из иштта децe, шоана программни Ӏалашдар чу гIалат кораяь хила мега.\nДехар да, цу гIулакха хоам бе цхьа [[Special:ListUsers/sysop|мазаурхалдерчунга]], укхазар URL белгаляьккха.",
    @@ -307,7 +308,7 @@
     	"yourname": "Дагара йоазон цIи:",
     	"userlogin-yourname": "Доакъашхочун цӀи",
     	"userlogin-yourname-ph": "Iочуязъе хьай учёта яздара (доакъашхочун) цӀи",
    -	"createacct-another-username-ph": "Чуйоалае доакъашхочун цӀи",
    +	"createacct-another-username-ph": "Iочуязъе доакъашхочун цӀи",
     	"yourpassword": "КъайладIоагIа:",
     	"userlogin-yourpassword": "Пароль",
     	"userlogin-yourpassword-ph": "Iочуязъе хьа пароль",
    @@ -315,7 +316,7 @@
     	"yourpasswordagain": "Юхаязде къайладIоагIа:",
     	"createacct-yourpasswordagain": "Бакъйе пароль",
     	"createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Iочуязъе пароль",
    -	"remembermypassword": "(укх $1 {{PLURAL:$1|1=ден|деношкахь}}) мара са чувалара/чуялара дагалоаца дезаш дац",
    +	"remembermypassword": "ДагайоагIаш хилийта са дагара йоазув укх компьютер тӀа (цхьан $1 {{PLURAL:$1|дийнахь}})",
     	"userlogin-remembermypassword": "Система чу виса",
     	"yourdomainname": "Хьа нана-цIа:",
     	"login": "Чувала/яла",
    @@ -338,7 +339,7 @@
     	"userlogin-createanother": "Кхыдола дагара йоазув хьакхолла",
     	"createacct-emailoptional": "Электронни почта адрес (ца яздича мегаш да)",
     	"createacct-email-ph": "Iочуязде хьа электронни почта адрес",
    -	"createaccountmail": "КъайладIоагIа д-хоамнец хьадайта",
    +	"createaccountmail": "Пайда эца ца ховш нийсденна къайладIоагIа, иштта хьадайта из белгалдаь электронни почта адреса тӀа.",
     	"createaccountreason": "Бахьан:",
     	"createacct-reason": "Бахьан",
     	"createacct-submit": "Хьакхолла учета яздар",
    @@ -361,11 +362,19 @@
     	"oldpassword": "Къаьна къайладIоагӀа:",
     	"newpassword": "Керда къайладIоагӀа:",
     	"retypenew": "Юхаязде керда къайладIоагӀа:",
    +	"botpasswords-label-appid": "Бóта цӀи:",
    +	"botpasswords-label-create": "Хьакхолла",
    +	"botpasswords-label-update": "Кердадаккха",
    +	"botpasswords-label-cancel": "Эшац",
    +	"botpasswords-label-delete": "ДIадаккха",
    +	"botpasswords-label-resetpassword": "Пароль тIеракхоссар",
     	"resetpass-submit-loggedin": "КъайладIоагӀа дӀахувца",
     	"resetpass-submit-cancel": "Эшац",
     	"passwordreset": "Пароль тIеракхоссар",
     	"passwordreset-username": "Доакъашхочун цӀи:",
    +	"passwordreset-domain": "Домен:",
     	"passwordreset-email": "Электронни почта адрес:",
    +	"resettokens-tokens": "Токенаш:",
     	"bold_sample": "Сома йоазон текст",
     	"bold_tip": "Сома йоазон текст",
     	"italic_sample": "Сиха йоазон текст",
    @@ -383,7 +392,7 @@
     	"sig_tip": "Хьа кулгаяздар а, хӀанзара ха а",
     	"hr_tip": "ПхьорагIен така (цох пайда эцар тIехдаьнна кастта ма де)",
     	"summary": "Хувцамий сурт оттадар",
    -	"subject": "БӀагал/кортале:",
    +	"subject": "Тема/даькъа цIи:",
     	"minoredit": "ЗӀамига хувцам",
     	"watchthis": "Зем бе укх оагӀон",
     	"savearticle": "ОагӀув дIаязъе",
    @@ -392,7 +401,7 @@
     	"showdiff": "Даь дола хувцамаш",
     	"anoneditwarning": "<strong>Теркам бе!</strong> Хьо автор хинна система чуваьннавац. Нагахьа санна Iа моллагIа хувцам бой, Хьа IP-адрес дийла массанен бIаргагуш хургда. Нагахьа санна Хьо <strong>[$1 хьачувоале]</strong> е <strong>[$2 дагара йоазув хьакхолле]</strong>, нийсдараш (хувцамаш) бувзам болаш хургда Хьа доакъашхой цIерца, иштта кхыдола толажагIи гIойленагIи дола дикаьш хургда Хьона.",
     	"summary-preview": "Сурт оттадар хургда:",
    -	"subject-preview": "Кортале хургья:",
    +	"subject-preview": "Даькъа цIи хургья иштта:",
     	"blockedtitle": "Доакъашхочун чIега техаб",
     	"blockednoreason": "бахьан белгалдаьккха дац",
     	"loginreqlink": "довзийта",
    @@ -403,28 +412,28 @@
     	"noarticletext": "ХIанза укх оагӀон тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи хьоаяр кораде]] кхыйола оагIонаш тIа, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарий дIаяздаьраш], е\n'''[{{fullurl:{{FULLPAGENAME}}|action=edit}} изза мо цӀи йолаш оагӀув хьакхолла]'''</span>.",
     	"noarticletext-nopermission": "ХIанз укх оагӀон тӀа текст яц.\nШун аьттув ба [[Special:Search/{{PAGENAME}}|цу тайпара цӀи белгалъяр хьалаха]] кхыйола оагIонаш тIа, иштта\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} тара дола тептарай дIаяздаьраш].</span> Ер оагӀув хьакхолла Хьа бокъо яц.",
     	"note": "'''Белгалдоахар:'''",
    -	"previewnote": "'''Хьалхе б|аргтассам мара бац.'''\nЯздам кхы яздаь дац!",
    +	"previewnote": "'''Теркам бе, ер хьалххе бIаргтохар мара бац.'''\nХьа хувцамаш хIанза а дIаяздаь дац!",
     	"editing": "Хувцам: $1",
     	"creating": "«$1» оагIув хьакхоллар",
     	"editingsection": "Хувцам: $1 (оагӀон дáкъа)",
    -	"editingcomment": "ГӀалатнийсдар $1 (керда декъам)",
    -	"editconflict": "ГӀалатнийсдара къовсам: $1",
    -	"yourtext": "Хьа яздам",
    -	"copyrightwarning": "Теркам бе, $2 ($1 хьажа) бокъонаца лорадеш, тӀахьежама кӀала уллаш, оаш мел чуяккхаш дола хоамаш, яздамаш долга.\nНаггахь санна шоай яздамаш пурам доацаш мала волашву саго хувца е кхы дола моттиге яздердолаш, безам беци, укхаз Ӏочуцаяздеча, дикаьгӀа да.<br />\nОаш дош лу, даь дола хувцама да волга/йолга, е оаш пурам долаш Ӏочуяздеш да кхычера меттигара шоай яздамаш/хоамаш.\n'''Яздархой бокъоца лорадеш дола хӀамаш, цара пурам доацаш, Ӏочумаязаде!'''",
    +	"editingcomment": "Хувцам: $1 (оагӀон керда дáкъа)",
    +	"editconflict": "Хувцама вIашдухьалъоттам: $1",
    +	"yourtext": "Хьа текст",
    +	"copyrightwarning": "Теркам бе, статьяй текста деррига хувцамаш а, тIатохараш а укх лицензи $2 хьалашца (условия) лоархIаш да (хь. $1).\nНагахь санна Шоай тексташ Шун пурам доацаш лоIаме даржийта а, моллагIа волча саго хувца йиш йолаш хилийта а Шун безам беце, уж укхаз (Википейде) ма язде.<br />\nИштта, Оаш бакъду Шоай тIатохама Шо автораш хилар, е из кеп яьккха укхаз хьачудаккхар лоIаме чудар долча хьаста (источник) тIара.\n'''АВТОРСКИ БОКЪОНАШЦА ЛОРАДЕШ ДОЛА МАТЕРИАЛАШ УКХАЗ ЧУ МА ДАХА!'''",
     	"templatesused": "Укх оагIон тIа {{PLURAL:$1|1=пайда эца ло|пайда эца лераш}}:",
    -	"templatesusedpreview": "Хьалхе бӀаргтассама оагӀув тӀа леладеш дола {{PLURAL:$1|1=Куцкеп|Куцкепаш}}:",
    +	"templatesusedpreview": "БIаргтохара раже {{PLURAL:$1|1=пайда эцаш ло|пайда эцаш лераш}}:",
     	"template-protected": "(лорадаь да)",
     	"template-semiprotected": "(цхьа долча даькъе гIо оттадаь да)",
     	"hiddencategories": "Ер оагIув {{PLURAL:$1|$1 къайла категориех|1=цаI къайла категорех}} я:",
     	"permissionserrorstext-withaction": "Ер $2 де Хьа бокъо яц {{PLURAL:$1|1=из бахьан долаш|из бахьанаш долаш}}:",
    -	"recreate-moveddeleted-warn": "'''Зем бе! Шо хьалххе дIайоаккхаш хинна оагӀув хьае гӀерта.'''\n\nХьажа, бокъонцахь езаш йолга.\nКӀалхагIа укх оагӀуви дӀадаккхами цӀи хувцами тептараш хьекха да.",
    +	"recreate-moveddeleted-warn": "'''Теркам бе. Хьо юхакхолла гӀерта хьалха дIаяьккха хинна оагӀув.'''\n\nДIатахка, боккъонца эший хьона из оагIув юхакхолла.\nКӀалхагIа хьекха да укх оагӀон дӀадаккхари цӀи хувцари тептараш.",
     	"moveddeleted-notice": "Ер оагӀув дӀаяккха хиннай.\nНовкъостала, кӀалха хьахьекха да дӀадаккхама а хувцама а тептарашкара дIаяздаьраш.",
    -	"log-fulllog": "Деррига таптара бӀаргтасса",
    -	"edit-conflict": "Хувцамий къовсам.",
    -	"post-expand-template-inclusion-warning": "Зембаккхам: жамIан чIабалаш чулоаца дустам геттара доккха да.\nЦхьадола чIабалаш чулоацалургдац.",
    -	"post-expand-template-inclusion-category": "Чулоаца чIабала мегаш дола дустам дукхалена тӀехьайоала оагӀувнаш",
    -	"post-expand-template-argument-warning": "Зем бе! Ер оагӀув цаӀ куцкепа |аьлдош мара чулоацац, юхадастара сел доккха дустам йолаш.\nЦу тайпара |аьлдешаш ӀокӀаладаькха да.",
    -	"post-expand-template-argument-category": "Куцкепий теркамза |аьлдешаш чулоаца оагӀувнаш",
    +	"log-fulllog": "БIаргтоха таптарага бIарчча",
    +	"edit-conflict": "Хувцама вIашдухьалъоттам.",
    +	"post-expand-template-inclusion-warning": "<strong>Хьалхдаккхар:</strong> юкъебаьккха лерий жамIа боарам сов боккха ба. Цхьаццабола лераш хьалсага хургбац.",
    +	"post-expand-template-inclusion-category": "Ший чулоацача лерий мегаш бола боарам совбаьнна йола оагӀонаш",
    +	"post-expand-template-argument-warning": "'''Теркам бе:''' укх оагIон чу даржар сов доккха дола белгало (аргумент) йолаш тешаме цаI ло ба.\nЦу тайпара белгалонаш гучадаьккха дац.",
    +	"post-expand-template-argument-category": "Лерий теркал яь йоаца белгалонаш (аргументаш) чулоацаш оагӀонаш",
     	"viewpagelogs": "Укх оагӀон тептараш хьахьокха",
     	"currentrev-asof": "тӀеххьара верси $1",
     	"revisionasof": "Верси $1",
    @@ -435,49 +444,49 @@
     	"cur": "хӀанза.",
     	"next": "тӀехь.",
     	"last": "хьалха.",
    -	"page_first": "хьалхара",
    +	"page_first": "цхьоаллагIа",
     	"page_last": "тӀехьара",
    -	"histlegend": "Кхетам: (хӀанз.) = хӀанза йолачунна бӀаргоагӀувни хьакъоастам ба; (хьалх.) = хьалха хинначунна бӀаргоагӀувни хьакъоастам ба; '''зӀ''' = зӀамига хьахувцам ба.",
    -	"history-fieldset-title": "Исторе бӀаргтасса",
    -	"history-show-deleted": "ДӀадаьккхараш мара",
    -	"histfirst": "къаьнараш",
    -	"histlast": "кердараш",
    -	"historyempty": "(даьсса)",
    +	"histlegend": "Версий хоржам: белгалъе шун вIаши йиста безам бола оагIон версеш, тIаккха тоIае '''{{int:compare-submit}}'''.<br />\nКхетавар: '''({{int:cur}})''' — карара версеца дола башхалонаш; '''({{int:last}})''' — хьалха йоагIаш версеца дола башхалонаш; '''{{int:minoreditletter}}''' — зIамига хувцамаш.",
    +	"history-fieldset-title": "Исторена бIаргтоха",
    +	"history-show-deleted": "Алхха дӀадаьккхараш",
    +	"histfirst": "эггара къаьнагIа",
    +	"histlast": "эггара кердагIа",
    +	"historyempty": "(яьсса)",
     	"history-feed-title": "Хувцамий истори",
    -	"history-feed-description": "Укх оагӀуви вики тӀа хувцамий истори",
    -	"history-feed-item-nocomment": "$1гӀара $2гӀачу",
    +	"history-feed-description": "Укх оагӀон Википейде дола хувцамий истори",
    +	"history-feed-item-nocomment": "$1 → укх хан $2",
     	"rev-delundel": "хьахьокха/къайлаяккха",
     	"rev-showdeleted": "хьахьокха",
    -	"revdelete-show-file-submit": "XӀаа",
    +	"revdelete-show-file-submit": "XӀа-а",
     	"revdelete-radio-set": "Къайла",
     	"revdelete-radio-unset": "Гуш йола",
     	"revdelete-log": "Бахьан",
    -	"revdel-restore": "Кустгойтам хувца",
    -	"pagehist": "ОагӀува истори",
    -	"deletedhist": "ДӀадаккхамий истори",
    +	"revdel-restore": "Куц хувца",
    +	"pagehist": "ОагIон истори",
    +	"deletedhist": "ДӀадаккхарий истори",
     	"revdelete-reasonotherlist": "Кхыдола бахьан",
    -	"mergehistory-list": "ВIашагIатоха хувцамий истори",
    -	"mergehistory-go": "ВIашагIатоха хувцамаш хьахьокха",
    -	"mergehistory-submit": "Хувцамаш вIашагIатоха",
    -	"mergehistory-empty": "ВIашагIатохара хувцамаш кораяь яц.",
    +	"mergehistory-list": "ВIашагIхотталуш дола нийсдарий истори",
    +	"mergehistory-go": "Хьахьокха вIашагIхотталуш дола нийсдараш",
    +	"mergehistory-submit": "ВIашагIхотта нийсдараш",
    +	"mergehistory-empty": "Корадинзар нийсдараш вIашагIхоттадерглолаш.",
     	"mergehistory-reason": "Бахьан:",
    -	"revertmerge": "Декъа",
    +	"revertmerge": "Дéкъа",
     	"history-title": "\"$1\" — хувцамай истори",
     	"difference-title": "$1 — версешта юкъе йола башхало",
     	"lineno": "МугI $1:",
    -	"compareselectedversions": "Хьаржа доржамаша тарона тIа хьажа",
    +	"compareselectedversions": "ВIаши йиста хержа версеш",
     	"editundo": "юхадаккха",
     	"diff-multi-sameuser": "({{PLURAL:$1|цхьа юкъ хулаш йола верси|$1 юкъ хулаш йола версеш}} гуш яц цу доакъашхочун)",
     	"searchresults": "Лахар чакхдоалаш корадаьр",
     	"searchresults-title": "«$1» лахар",
    -	"notextmatches": "ОагIувнаша яздамий вIашагIакхетараш дац",
    +	"notextmatches": "ОагIонай тексташта юкъе цхьатара хилар дац",
     	"prevn": "{{PLURAL:$1|1=хьалхайогIар|хьалхайогIараш}} $1",
     	"nextn": "{{PLURAL:$1|1=тIехьайоагIар|тIехьайоагIараш}} $1",
     	"prevn-title": "{{PLURAL:$1|1=$1 хьалхара йоазув|$1 хьалхара йоазувнаш}}",
     	"nextn-title": "{{PLURAL:$1|ТIадоагIа $1 яздар|ТIадоагIа $1 яздараш}}",
     	"shown-title": "Гойта $1 {{PLURAL:$1|яздаьр|яздаьраш}} укх оáгIон тIа",
     	"viewprevnext": "ДIахьажа ($1 {{int:pipe-separator}} $2) ($3)",
    -	"searchmenu-exists": "'''Укх масса-хьахьоадайтамач ер оаг|ув \"[[:$1]]\" я'''",
    +	"searchmenu-exists": "'''Укх вики чу йолаш я оагӀув «[[:$1]]»'''",
     	"searchmenu-new": "<strong>Хьакхолла оагIув «[[:$1]]» укх вики-проекте!</strong>\n{{PLURAL:$2|0=|Иштта хьажа Iайха лийха оагIонга.|Иштта хьажа хьай лахара хьахиннарашка.}}",
     	"searchprofile-articles": "Кертера оагIонаш",
     	"searchprofile-images": "Мультимедиа",
    @@ -492,91 +501,91 @@
     	"search-redirect": "(дIа-сахьожадар $1 тIара)",
     	"search-section": "(дáкъа «$1»)",
     	"search-suggest": "Хьона эшар ер хила мега: $1",
    -	"search-interwiki-caption": "Гаргалон хьахьоадайтамаш",
    -	"search-interwiki-default": "$1 хьахиннараш:",
    -	"search-interwiki-more": "(кха)",
    -	"search-relatedarticle": "шоайл дола",
    -	"searchrelated": "гаргара",
    +	"search-interwiki-caption": "Гаргара проекташ",
    +	"search-interwiki-default": "Хьахиннараш укхазар $1:",
    +	"search-interwiki-more": "(кхы а)",
    +	"search-relatedarticle": "ВIашагIдувзаденна",
    +	"searchrelated": "вIашагIдувзаденна",
     	"searchall": "деррига",
     	"search-showingresults": "{{PLURAL:$4|Кораяьй <strong>$1</strong> — цхьа оагӀув|Из дош корадаьд <strong>$3</strong> оагӀонашка, царех гойта $2 оагӀув}}",
     	"search-nonefound": "Хьа дехар дара вIаши нийса доагIаш дар корадаьдац.",
    -	"powersearch-legend": " Доккха тахкар",
    -	"powersearch-ns": " ЦIерий аренашкахь лахар",
    +	"powersearch-legend": "Шердаь лахар",
    +	"powersearch-ns": "ЦIерий аренашкахь лахар:",
     	"powersearch-toggleall": "Деррига",
     	"powersearch-togglenone": "Цхьаккха",
    -	"preferences": "Оттамаш",
    +	"preferences": "ГIирс тоаяраш",
     	"mypreferences": "ГIирсаш",
    -	"prefs-skin": "БIагала куц",
    +	"prefs-skin": "ТIера кийчдара тема",
     	"skin-preview": "Хьалххе бIаргтохар",
    -	"prefs-personal": "Хьа хьай далам",
    -	"prefs-rc": "Керда хувцамаш",
    +	"prefs-personal": "Доакъашхочун дараш",
    +	"prefs-rc": "Керда нийсдараш",
     	"prefs-watchlist": "Зем бара хьаязъяьр",
    -	"prefs-watchlist-days": "Ден дукхал",
    -	"prefs-resetpass": "КъайладIоагIа хувца",
    -	"prefs-rendering": "ТIера бIаса",
    -	"saveprefs": "Дита",
    -	"prefs-editing": "ГIалатнийсдар",
    +	"prefs-watchlist-days": "Дéной дукхал:",
    +	"prefs-resetpass": "Хувца къайладIоагIа",
    +	"prefs-rendering": "ТIера куц",
    +	"saveprefs": "ДIаязде",
    +	"prefs-editing": "Хувцам",
     	"searchresultshead": "Лахаp",
    -	"timezonelegend": "Сахьати юкъ:",
    -	"localtime": "Вола/Йола моттиги ха:",
    -	"timezoneregion-africa": "Аьприк",
    -	"timezoneregion-america": "Iаьмрик",
    -	"timezoneregion-antarctica": "Энтарцит",
    -	"timezoneregion-arctic": "Эрцит",
    -	"timezoneregion-asia": "Iаьзик",
    -	"timezoneregion-atlantic": "Iаьтланта форд",
    -	"timezoneregion-australia": "Устралик",
    -	"timezoneregion-europe": "Аьроп",
    -	"timezoneregion-indian": "ХIинда форд",
    -	"timezoneregion-pacific": "Тийна форд",
    +	"timezonelegend": "Сахьата оаса:",
    +	"localtime": "Моттига ха:",
    +	"timezoneregion-africa": "Африка",
    +	"timezoneregion-america": "Америка",
    +	"timezoneregion-antarctica": "Антарктика",
    +	"timezoneregion-arctic": "Арктика",
    +	"timezoneregion-asia": "Ази",
    +	"timezoneregion-atlantic": "Малхбузера океан",
    +	"timezoneregion-australia": "Астрали",
    +	"timezoneregion-europe": "Европа",
    +	"timezoneregion-indian": "ХIиндий океан",
    +	"timezoneregion-pacific": "Тийна океан",
     	"prefs-searchoptions": "Лахар",
     	"prefs-namespaces": "ЦIерий аренаш",
    -	"prefs-files": "Паьлаш",
    -	"youremail": "Д-хоамни:",
    -	"username": "{{GENDER:$1|Доакъошхочун ц|и}}:",
    -	"yourrealname": "Шун цIи:",
    +	"prefs-files": "Файлаш",
    +	"youremail": "Электронни почта:",
    +	"username": "{{GENDER:$1|Доакъашхочун цӀи}}:",
    +	"yourrealname": "Бокъонца йола цIи:",
     	"yourlanguage": "Мотт:",
    -	"gender-male": "Массаоаг|онаш нийсaеш ва из",
    -	"gender-female": "Массаоаг|онаш нийсаеш я из",
    -	"email": "Д-хоамни",
    -	"prefs-help-email": "Д-хоамни моттиг ала эшаш дац, амма новкъа даца, наггахь санна къайладIоагIа шоана дийцалой, цу тIа хьатIадайтаргда.",
    -	"prefs-help-email-others": "Кхыбола дакъалаьцархоша шоаца бувзам я йийшхургья шун оагIува тIа гIолла, д-хоамни хьаела ца езаш.",
    -	"prefs-signature": "Кулгяздар",
    +	"gender-male": "ВикиоагIонаш нийсaеш ва из",
    +	"gender-female": "ВикиоагIонаш нийсaеш я из",
    +	"email": "Email",
    +	"prefs-help-email": "Электронни почта адрес оттаде параз дац, амма из эшаш хургда, нагахьа санна хьона хьа къайладIоагIа дицлой.",
    +	"prefs-help-email-others": "Иштта цунца кхыболча доакъашхошта аьттув хургба шоаца бувзам бе а, шун оагIон тIа е шун дувца оттадара оагIон тIа йола тIахьожаяргаца.\nШун электронни почта адрес цхьаннена гуш хургъяц.",
    +	"prefs-signature": "Кулг яздар",
     	"prefs-preview": "Хьалххе бIаргтохар",
    -	"userrights-user-editname": "Дакъалаьцархочунна цIи Iоязаде",
    -	"editusergroup": "Дакъалаьцархочунна тоабаш хувца",
    -	"saveusergroups": "Дакъалаьцархочунна тоабаш дита",
    -	"userrights-groupsmember": "Тоабий дакъалаьцархо:",
    +	"userrights-user-editname": "Iочуязъе доакъашхочун цӀи:",
    +	"editusergroup": "Хувца {{GENDER:$1|доакъашхочун}} тоабаш",
    +	"saveusergroups": "ДIаязъе {{GENDER:$1|доакъашхочун}} тоабаш",
    +	"userrights-groupsmember": "Дакъа лоаца тоабаш чу:",
     	"userrights-reason": "Бахьан:",
     	"userrights-changeable-col": "Оаш хувца мегаш йола тоабаш",
    -	"userrights-unchangeable-col": "Оаш хувца мегаш йоаца тоабаш",
    -	"group": "Тоаб:",
    -	"group-user": "Дакъалаьцархой",
    -	"group-bot": "БIаташ",
    -	"group-sysop": "Мазакулгалхой",
    +	"userrights-unchangeable-col": "Хьа хувца йиш йоаца тоабаш",
    +	"group": "Тоаба:",
    +	"group-user": "Доакъашхой",
    +	"group-bot": "Бóташ",
    +	"group-sysop": "Администратораш",
     	"group-all": "(деррига)",
    -	"group-user-member": "{{GENDER:$1|дакъалаьцархо|дакъалаьцархо}}",
    -	"group-bot-member": "{{GENDER:$1|бIат}}",
    -	"group-sysop-member": "{{GENDER:$1|мазакулгалхо}}",
    -	"grouppage-user": "{{ns:project}}:Дакъалаьцархой",
    -	"grouppage-bot": "{{ns:project}}:БIаташ",
    -	"grouppage-sysop": "{{ns:project}}:Мазакулгалхой",
    -	"right-read": "ОагIувнаш деша",
    -	"right-edit": "ОагIувнаш хувца",
    -	"right-createtalk": "дувцама оагIувний хьакхоллам",
    -	"right-move": "ОагIувний цIи хувца",
    -	"right-movefile": "Паьлий цIи хувца",
    +	"group-user-member": "{{GENDER:$1|доакъашхо}}",
    +	"group-bot-member": "{{GENDER:$1|бот}}",
    +	"group-sysop-member": "{{GENDER:$1|администратор}}",
    +	"grouppage-user": "{{ns:project}}:Доакъашхой",
    +	"grouppage-bot": "{{ns:project}}:Боташ",
    +	"grouppage-sysop": "{{ns:project}}:Администратораш",
    +	"right-read": "оагӀонашка хьажар",
    +	"right-edit": "оагӀонаш нийсъяр",
    +	"right-createtalk": "дувца оттадара оагӀонаш кхоллар",
    +	"right-move": "оагIонай цIераш хувцар",
    +	"right-movefile": "файлай цӀераш хувцар",
     	"right-writeapi": "ДIаяздара лаьрххIа API пайда эцар",
     	"newuserlogpage": "Доакъашхой дIаязбаь таптар",
    -	"rightslog": "Дакъалаьцархочунна бокъона тептар",
    -	"action-read": "Укх оагIуви дешам",
    -	"action-edit": "Ер оагIув хувца",
    -	"nchanges": "$1 {{PLURAL:$1|1=хувцам|хувцамаш}}",
    +	"rightslog": "Доакъашхочун бокъоний тéптар",
    +	"action-read": "ер оагӀув éшар",
    +	"action-edit": "ер оагIув хувцар",
    +	"nchanges": "$1 {{PLURAL:$1|хувцам}}",
     	"enhancedrc-history": "истори",
     	"recentchanges": "Керда хувцамаш",
     	"recentchanges-legend": "Керда хувцамий гIирсаш тоаяраш",
     	"recentchanges-summary": "КIалхагIа ханашца нийсдаь дIаяьздаь да {{grammar:genitive|{{SITENAME}}}}  оагIонай тIеххьара хувцамаш.",
    -	"recentchanges-feed-description": "Укх ларамца тIехьара массахувцамашт теркам бе.",
    +	"recentchanges-feed-description": "Хьéжа укх потоке вики чу тIехьара хувцамашка.",
     	"recentchanges-label-newpage": "Укх хувцамаца керда оагIув кхелла хиннай",
     	"recentchanges-label-minor": "Ер зIамига хувцам ба",
     	"recentchanges-label-bot": "Ер хувцам ботаца баь ба",
    @@ -597,7 +606,9 @@
     	"rcshowhideanons": "$1 цIияккханза доакъашхой",
     	"rcshowhideanons-show": "Хьахьокха",
     	"rcshowhideanons-hide": "Къайлабаха",
    -	"rcshowhidepatr": "$1 теркам даь хувцамаш",
    +	"rcshowhidepatr": "$1 техка хувцамаш",
    +	"rcshowhidepatr-show": "Хьахьокха",
    +	"rcshowhidepatr-hide": "Къайладаккха",
     	"rcshowhidemine": "$1 хьа нийсдараш",
     	"rcshowhidemine-show": "Хьахьокха",
     	"rcshowhidemine-hide": "Къайладаккха",
    @@ -609,32 +620,32 @@
     	"minoreditletter": "зI",
     	"newpageletter": "К",
     	"boteditletter": "б",
    -	"rc_categories_any": "МоллагIа а",
    +	"rc_categories_any": "МоллагIа яр хержа йолчарна юкъера",
     	"rc-change-size-new": "Хувцам баьнначул тӀехьагIа бола боарам: $1 {{PLURAL:$1|байт}}",
    -	"rc-enhanced-expand": "Ма дарра чулоацамаш хьахьокха (JavaScriptаца)",
    -	"rc-enhanced-hide": "Ма дарра чулоацамаш къайладаккха",
    +	"rc-enhanced-expand": "Хьахьокха ма дарра",
    +	"rc-enhanced-hide": "Къайладаккха ма дарра дар",
     	"recentchangeslinked": "ВIашагIдувзаденна нийсдараш",
    -	"recentchangeslinked-feed": "Гаргалон хувцамаш",
    +	"recentchangeslinked-feed": "ВIашагIдувзаденна нийсдараш",
     	"recentchangeslinked-toolbox": "ВIашагIдувзаденна хувцамаш",
     	"recentchangeslinked-title": "$1ца вIашидувзаденна хувцамаш",
     	"recentchangeslinked-summary": "Белгалаяь йола оагIув тIахьожавеш (е белгалаяь йола категорен юкъейоагIаш) йолча оагIонашта даь хувцамаш да ераш.\n[[Special:Watchlist|Хьа зем бара хьаязъяьра]] юкъейоагIаш оагIонаш '''белгалаяьй'''.",
     	"recentchangeslinked-page": "ОагIон цIи",
     	"recentchangeslinked-to": "Вешта, белгаляьккха оагIон тIахьожавеш дола оагIонашта даь хувцамаш хьахьокха.",
     	"upload": "Файл чуяккха",
    -	"uploadbtn": "Паьл чуяьккха",
    -	"uploadlogpage": "Чуяьккхамий тептар",
    +	"uploadbtn": "Файл чуяккха",
    +	"uploadlogpage": "Чуяьккхарий тептар",
     	"filedesc": "Лоаца йоазонца сурт оттадар",
    -	"fileuploadsummary": "Лоаца лоацам:",
    -	"license": "ЦIийяздар",
    +	"fileuploadsummary": "Лоаца сурт оттадар:",
    +	"license": "Лицензи ялар:",
     	"license-header": "Лицензировани",
     	"imgfile": "файл",
    -	"listfiles": "Паьлий дагарче",
    -	"listfiles_date": "Денха",
    -	"listfiles_name": "Паьла цIи",
    -	"listfiles_user": "Дакъалаьцархо",
    -	"listfiles_size": "Дустам",
    -	"listfiles_description": "Лоацам",
    -	"listfiles_count": "Доржамаш",
    +	"listfiles": "Файлай хьаязъяьр",
    +	"listfiles_date": "Таьрахь",
    +	"listfiles_name": "Файла цӀи",
    +	"listfiles_user": "Доакъашхо",
    +	"listfiles_size": "Боарам",
    +	"listfiles_description": "Йоазонца сурт оттадар",
    +	"listfiles_count": "Верси",
     	"file-anchor-link": "Файл",
     	"filehist": "Файла истори",
     	"filehist-help": "Таьрахь/ха тIа тоIабе цу хан файл мишта хиннай хьожаpгдолаш",
    @@ -645,77 +656,77 @@
     	"filehist-thumbtext": "ЗIамига сурт укх версин $1",
     	"filehist-user": "Доакъашхо",
     	"filehist-dimensions": "Файла боарам",
    -	"filehist-filesize": "Паьла юстарал",
    +	"filehist-filesize": "Файла боарам",
     	"filehist-comment": "Белгалдаккхар",
     	"imagelinks": "Файлах пайда эцар",
     	"linkstoimage": "{{PLURAL:$1|1=ТIехьайоагIача $1 оагIо тIахьожаву|ТIехьайоагIача $1 оагIонаш тIахьожаву}} укх файла тIа:",
     	"nolinkstoimage": "Укх файла тIахьожавеш йола оагIонаш яц.",
    -	"sharedupload": "Ер паьла $1чера я, кхыча хьахьоадайтамча хьахайраде йийшайолаш я.",
    +	"sharedupload": "Ер файл $1 чура я, из пайда эцаш лелае мегаш я кхыйола проекташ чу.",
     	"sharedupload-desc-here": "Ер файл $1 чура я, иштта кхыйола проекташ чу пайда эца аьттув болаш я.\nЦун [$2 сурт оттадара оагIон] хоам кIалхахь хьабоалабаьб.",
    -	"uploadnewversion-linktext": "Укх паьлий керда бIаса чуяьккха",
    +	"uploadnewversion-linktext": "Чуяккха укх файла керда верси",
     	"upload-disallowed-here": "Хьа бокъо яц ер файл юха дӀаязъе.",
     	"filerevert-comment": "Бахьан:",
     	"filedelete-comment": "Бахьан:",
    -	"filedelete-submit": "ДIадаккха",
    +	"filedelete-submit": "ДӀаяккха",
     	"filedelete-reason-otherlist": "Кхыдола бахьан",
    -	"download": "хьачуяьккха",
    -	"unwatchedpages": "Теркамза оагIувнаш",
    +	"download": "хьачуяккха",
    +	"unwatchedpages": "Цхьанне а зем беш йоаца оагIонаш",
     	"randompage": "Ца ховш нийсъенна статья",
    -	"statistics": "Дагара куц",
    +	"statistics": "Статистика",
     	"statistics-articles": "Статьяш",
     	"statistics-pages": "ОагIонаш",
    -	"brokenredirects-edit": "хувца",
    -	"brokenredirects-delete": "дIадаккха",
    +	"brokenredirects-edit": "нийсъе",
    +	"brokenredirects-delete": "дӀаяккха",
     	"withoutinterwiki-submit": "Хьахьокха",
     	"nbytes": "$1 {{PLURAL:$1|байт}}",
     	"nmembers": "$1 {{PLURAL:$1|объект}}",
    -	"prefixindex": "ОагIувнаший хьалхера цIи хьагойтар",
    -	"shortpages": "Лоаца оагIувнаш",
    -	"longpages": "Доккхий оагIувнаш",
    +	"prefixindex": "Хьокхар оагIонай цIера дешхьалхех",
    +	"shortpages": "Лоаца оагIонаш",
    +	"longpages": "ЙIаьха оагIонаш",
     	"protectedpages-page": "ОагIув",
    -	"usercreated": "{{GENDER:$3|Чуваьннав|Чуяьннай}} $1  $2",
    +	"usercreated": "{{GENDER:$3|система чу дӀаязвеннав|система чу дӀаязъяннай}} $1 $2",
     	"newpages": "Керда оагIонаш",
     	"move": "ЦIи хувца",
    -	"movethispage": "Укх оагIува цIи хувца",
    +	"movethispage": "ЦIи хувца укх оагIон",
     	"pager-newer-n": "{{PLURAL:$1|кердагIа дара|кердагIа дараш|кердагIа долачаьрахь}} $1",
     	"pager-older-n": "{{PLURAL:$1|къаьнара дара|къаьнара дараш|къаьнара долaчарех}} $1",
     	"booksources": "Джейнай хьасташ (источники)",
     	"booksources-search-legend": "Джейнах лаьца хоам лахар",
     	"booksources-search": "Хьалáха",
     	"log": "Тептараш",
    -	"allpages": "Еррига оагIувнаш",
    -	"prevpage": "($1) хьалхара оагIув",
    -	"allpagesfrom": "Цу тайпара ювлаж йола оагIувнаш белгал е:",
    -	"allpagesto": "Укх оагIувнаш тIа бIарга дита:",
    +	"allpages": "Еррига оагIонаш",
    +	"prevpage": "Хьалха йоагIа оагIув ($1)",
    +	"allpagesfrom": "Гучаяккха оагIонаш йолалуш йола укхох:",
    +	"allpagesto": "Араяккхар соцадé укх тӀа:",
     	"allarticles": "Еррига оагIонаш",
     	"allpagessubmit": "Кхоачашде",
     	"categories": "Категореш",
    -	"linksearch": "Т|ера|инкаш лахар",
    +	"linksearch": "Арахьара тIахьожаяргаш лахар",
     	"linksearch-ns": "ЦIерий аренаш:",
     	"linksearch-ok": "Хьалáха",
    -	"linksearch-line": "$1 тIа Iинк $2 юкъера",
    -	"listgrouprights-members": "(тоабий дагарче)",
    +	"linksearch-line": "$2 — тIахьожаярг укхаз $1",
    +	"listgrouprights-members": "(доакъашхой хьаязъяьр)",
     	"listgrouprights-namespaceprotection-namespace": "ЦIерий аре",
    -	"emailuser": "Дакъалаьцархочоа д-хоамни:",
    +	"emailuser": "Доакъашхочоа каьхат",
     	"watchlist": "Зем бара хьаязъяьр",
     	"mywatchlist": "Зем бара хьаязъяьр",
    -	"watchlistfor2": "$1 $2 царна",
    -	"addedwatchtext": "\"[[:$1]]\" оагIув, шун [[Special:Watchlist|теркама дагаршкахь]] чуяккха я. \nТехьара мел йола укх оагIувни хувцамаш цу дагаршкахь хоам беш хургья. Вешта [[Special:RecentChanges|керда хувцама дагаршкаехь]] сома къоалмаца хьакъоастлуш хургья.",
    -	"removedwatchtext": "\"[[:$1]]\" оагIув, шун [[Special:Watchlist|теркама дарагчера]] дIаяккха хиннай.",
    +	"watchlistfor2": "Цунна $1 $2",
    +	"addedwatchtext": "Статья «[[:$1]]» а, цун дувца оттадара оагIув а тIатехай хьа [[Special:Watchlist|зем бара хьаязъяьра]].",
    +	"removedwatchtext": "Статья «[[:$1]]» а, иштта цун дувца оттадара оагIув а дIаяьккхай хьа [[Special:Watchlist|зем бара хьаязъяьр]] чура.",
     	"watch": "Зем бе",
    -	"watchthispage": "Укх оагIува теркам бе",
    -	"unwatch": "Лора ма де",
    +	"watchthispage": "Зем бе укх оагӀон",
    +	"unwatch": "Ма бе зем",
     	"notanarticle": "Статья яц",
    -	"watchlist-details": "Шун теркама дагарченгахь йола  $1 {{PLURAL:$1|1=оагIув|оагIувнаш}}, дувцама оагIувнаш ца лоархIаш.",
    -	"wlshowlast": "Тlехьара $1 сахьаташ $2 денош  хьахьокха",
    -	"watchlist-options": "Зем баккха дагарена хувцамаш",
    -	"watching": "Тохкам беча оагIув тIа тIадаккха",
    -	"unwatching": "Тохкам беча оагIув тIера дIадаккха",
    -	"deletepage": "ОагIув дIаяьккха",
    -	"confirmdeletetext": "Оаш оагIувни (е сурти) барча дIадаккхар хьайийхай кха еррига хувцамий истори долама ковчера. \nДехар да, жоп дала, шоай из бокъонцахь де безам болаш да, шоай даьчоахь хургдолчоахь кхеташ долга, [[{{MediaWiki:Policy-url}}]] декъамачу Iоязадаь дола адаташ ца из деш долга.",
    -	"actioncomplete": "ДулархIам баьб",
    -	"actionfailed": "Оттам даьдац",
    -	"deletedtext": "\"$1\" дIаяьккха хиннай.\nТIехьара дIадаьккха дагарчена хьожаргволаш/хьожаргьйолаш, $2 хьажа.",
    +	"watchlist-details": "Хьа зем бара хьаязъяьр чу $1 {{PLURAL:$1|оагIув}} я, дувца оттадара оагIонаш ца лоархIаш.",
    +	"wlshowlast": "Хьахьокха тIехьара $1 сахьатах $2 дийнахь",
    +	"watchlist-options": "Зем бара хьаязъяьра тоадараш",
    +	"watching": "Зем бара хьаязъяьр чу тIатохар",
    +	"unwatching": "Зем бара хьаязъяьр чура дIадаккхар",
    +	"deletepage": "ДIаяккха оагIув",
    +	"confirmdeletetext": "Оаш дIадийхад бIарчча дIадаккхар оагIон а (е сурта), цун деррига хувцара истори а. '''Дехар да''', бакъде шоай из бокъонца де безам болаш долга а, из дича хургдар кхеташ долга а, из дар укх [[{{MediaWiki:Policy-url}}|бокъонашца]] долга.",
    +	"actioncomplete": "Ардам кхоачашдаьд",
    +	"actionfailed": "Ардам кхоачашдаьдац",
    +	"deletedtext": "«$1» дIаяьккхай.\nХьажа $2 тIехьара дIадаккхарий хьаязъяьрга бIаргтохаргболаш.",
     	"dellogpage": "ДIадаккхарай тептар",
     	"deletecomment": "Бахьан:",
     	"deleteotherreason": "Кхыдола бахьан/тIатохар:",
    @@ -723,30 +734,30 @@
     	"rollbacklink": "юхаяккха",
     	"rollbacklinkcount": "юхататта $1 {{PLURAL:$1|нийсдар}}",
     	"protectlogpage": "ГIон тептар",
    -	"protectedarticle": "\"[[$1]]\" оагIув лорам деж я",
    -	"modifiedarticleprotection": "\"[[$1]]\" оагIувни лорама лагIа хувцаяьннай",
    +	"protectedarticle": "Лораяьй оагӀув «[[$1]]»",
    +	"modifiedarticleprotection": "Лорадара лагIа хийцад оагIон «[[$1]]»",
     	"protectcomment": "Бахьан:",
    -	"protectexpiry": "Кхоачалуш латта:",
    -	"protect_expiry_invalid": "Чакхабоала лорама харца ха",
    -	"protect_expiry_old": "Чакхайоала ха - яха зама я.",
    -	"protect-text": "'''$1''' укхаз шоана шоай оагIув лорамлагIа хувца a бIаргтасса a йийш хургья.",
    -	"protect-locked-access": "Шун лархIама йоазуви нидза кхоачаш бац оагIувни лорама лагIа хувца. '''$1''' оагIувни дIаоттамаш:",
    +	"protectexpiry": "Чакхдоала:",
    +	"protect_expiry_invalid": "Лорадар чакхадоала харцахьа ха",
    +	"protect_expiry_old": "Чакхадалара ха — дахáр да.",
    +	"protect-text": "Хьа йиш я оагIон '''$1''' лорадара лагIа бIаргтоха a, хувца a .",
    +	"protect-locked-access": "Хьа дагара йоазонга тоъал бокъо яц оагIон лорадара лагIа хувца. '''$1''' оагIон карара оттадараш:",
     	"protect-cascadeon": "{{PLURAL:$1|1=КIалхахь хьагойташ йола оагIувчу|КIалхахь хьагойташ йола оагIувнашчу}} ер оагIув чуяккха халарахь, лорам Iоттая я, хурхала лорам Iоттая я. Укх оагIувни лорама лагIа хувца йийш йолаш я, амма хурхала лорам хувцлургдац.",
    -	"protect-default": "Лорамза",
    -	"protect-fallback": "\"$1\" пурам эша",
    -	"protect-level-autoconfirmed": "Керда а, дакъалаьцабоацачаьрахь а лораде",
    -	"protect-level-sysop": "Мазакулгалхо мара чувала бокъо яц",
    -	"protect-summary-cascade": "хурхала",
    -	"protect-expiring": "чакхайоала $1 (UTC)",
    -	"protect-cascade": "Укх оагIувач чуяьккха оагIуваш лорае (хурхала лорам)",
    -	"protect-cantedit": "Шун укх оагIувни лорама лагIа хувца мегаш дац, гIалатнийсдара шун бокъо йоацандаь.",
    +	"protect-default": "Лорадар доацаш",
    +	"protect-fallback": "Могадаьд алхха ше «$1» волача доакъашхошта",
    +	"protect-level-autoconfirmed": "Могадаьд алхха ше-ше къоабалбаь хинна доакъашхошта",
    +	"protect-level-sysop": "Могадаьд алхха администраторашта",
    +	"protect-summary-cascade": "каскадни",
    +	"protect-expiring": "чакхъйоала $1 (UTC)",
    +	"protect-cascade": "Лорае укх оагIон чуяьккха оагIонаш (каскадни лорадар)",
    +	"protect-cantedit": "Хьа хувца йиш яц укх оагIон лорадара лагIа, цун хувцам бе хьа бокъо ца хиларах.",
     	"restriction-type": "Бокъонаш:",
    -	"restriction-level": "Чувоала лагIа:",
    -	"restriction-edit": "ГIалатнийсдар",
    +	"restriction-level": "ТIакхоачилга лагIа:",
    +	"restriction-edit": "Хувцам",
     	"restriction-move": "ЦIи хувцаp",
     	"restriction-create": "Хьакхоллар",
    -	"restriction-upload": "Чудаккхар",
    -	"undeletelink": "БIаргтасса/юхаметтаоттаде",
    +	"restriction-upload": "Доттар",
    +	"undeletelink": "бIаргтоха/юхадаккха",
     	"undeleteviewlink": "хьажа",
     	"undelete-search-submit": "Хьалáха",
     	"namespace": "ЦIерий аренаш:",
    @@ -756,27 +767,27 @@
     	"tooltip-namespace_association": "Оттае ер белгало, иштта хержа цIерий ареца вIашагIъювзаенна дувца оттадара цIерий аре (е кхыяр) юкъейоаккхаргйолаш",
     	"blanknamespace": "(Кертера)",
     	"contributions": "{{GENDER:$1|Доакъашхочун}} къахьегам",
    -	"contributions-title": "$1 дакъалаьцархочунна къахьегам",
    +	"contributions-title": "{{GENDER:$1|Доакъашхочун}} $1 къахьегам",
     	"mycontris": "Са къахьегам",
     	"anoncontribs": "Къахьегам",
    -	"contribsub2": "{{GENDER:$3|$1}} ($2) баь болх",
    -	"uctop": "(xIанзара)",
    +	"contribsub2": "Къахьегам {{GENDER:$3|$1}} ($2)",
    +	"uctop": "(карара)",
     	"month": "Укх бетт (кхы хьалхагIа)",
     	"year": "Укх шер (кхы хьалхагIа):",
    -	"sp-contributions-newbies": "Керда даязья йоазоначера мара баь бола къахьегам ма хьокха",
    -	"sp-contributions-blocklog": "чIегаш",
    -	"sp-contributions-uploads": "чуяьккхамаш",
    +	"sp-contributions-newbies": "Хьахьокха алхха керда дагара йоазонашца баь бола къахьегам",
    +	"sp-contributions-blocklog": "чIега тохараш",
    +	"sp-contributions-uploads": "чуяьккхараш",
     	"sp-contributions-logs": "тептараш",
    -	"sp-contributions-talk": "дувцам",
    +	"sp-contributions-talk": "дувца оттадар",
     	"sp-contributions-search": "Къахьегама лахар",
    -	"sp-contributions-username": "IP-моттиг е цIи:",
    -	"sp-contributions-toponly": "ТIехьара доржамаш лоархаш дола хувцамаш мара ма хьокха",
    +	"sp-contributions-username": "IP-адрес е доакъашхочун цӀи:",
    +	"sp-contributions-toponly": "Гойта алхха тIехьара версеш санна лоархIаш дола нийсдараш",
     	"sp-contributions-submit": "Хьалáха",
     	"whatlinkshere": "ТIахьожаяргаш укхаза",
     	"whatlinkshere-title": "\"$1а\" тIахьожавеш йола оагIонаш",
     	"whatlinkshere-page": "ОагIув:",
     	"linkshere": "ТIехьайоагIа оагIонаш тIахьожаву «'''[[:$1]]'''»:",
    -	"nolinkshere": "'''[[:$1]]''' оагIув тIа, кхыдола оагIувашкара Iинкаш йоацаш я",
    +	"nolinkshere": "ОагIона '''[[:$1]]''' кхыйола оагIонашкара тIахьожаяргаш йоацаш я.",
     	"isredirect": "оагIув-дIа-сахьожадар",
     	"istemplate": "юкъейоалаяр",
     	"isimage": "Файлови тIахьожаярг",
    @@ -786,42 +797,42 @@
     	"whatlinkshere-hideredirs": "$1 дIа-сахьожадараш",
     	"whatlinkshere-hidetrans": "$1 юкъейоалаяраш",
     	"whatlinkshere-hidelinks": "$1 тIахьожаяргаш",
    -	"whatlinkshere-hideimages": "$1 суртIинкаш",
    +	"whatlinkshere-hideimages": "$1 файлай тIахьожаяргаш",
     	"whatlinkshere-filters": "Фильтраш",
    -	"blockip": "Укх {{GENDER:$1|доакъошхочоа}} ч|ега бола",
    -	"ipboptions": "2 сахьат:2 hours,1 ди:1 day,3 ди:3 days,1 кIира:1 week,2 кIира:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шу:1 year,сиха ца луш:infinite",
    -	"ipblocklist": "ЧIега бела дакъалаьцархой",
    +	"blockip": "ЧIега тоха {{GENDER:$1|доакъашхочун}}",
    +	"ipboptions": "2 сахьат:2 hours,1 ди:1 day,3 ди:3 days,1 кIира:1 week,2 кIира:2 weeks,1 бутт:1 month,3 бутт:3 months,6 бутт:6 months,1 шу:1 year,хоадаяь ха йоаца:infinite",
    +	"ipblocklist": "ЧIега теха доакъашхой",
     	"ipblocklist-submit": "Хьалáха",
     	"blocklink": "чIегa тоха",
     	"unblocklink": "чIега баста",
    -	"change-blocklink": "ЧIегатохар хувца",
    +	"change-blocklink": "ЧIега тохар хувца",
     	"contribslink": "къахьегам",
    -	"blocklogpage": "ЧIегаш тoха таптар",
    -	"blocklogentry": "[[$1]] чIега белаб,  $2 $3 ха ялалца",
    -	"unblocklogentry": "$1 юха яста я",
    -	"block-log-flags-nocreate": "ЛархIамий дагарчена цIи яьккхар пурам янза я.",
    -	"move-page-legend": "ОагIува цIи хувца",
    +	"blocklogpage": "ЧIегаш тoхара таптар",
    +	"blocklogentry": "укхан [[$1]] чIега техаб $2 чакхдалалца $3",
    +	"unblocklogentry": "чIега баьстаб $1",
    +	"block-log-flags-nocreate": "дагара йоазонаш кхоллар пурам деннадац",
    +	"move-page-legend": "ОагIон цIи хувцар",
     	"movepagetext": "КIалхара кепаца болхабеча, оаш оагIувни цIи хувцаргья, цунна хувцамий тептар кхыйола меттиге дIачудоаккхаш.\nКIаьнара цIерахь керда цIерий дIачудаккхам хургда.\nКIаьнара цIера тIа даь дола дIачудаккхамаш, шун ший лоIамахь кердадаккха йийш хургья.\nИз оаш ца дой, дехар да, [[Special:DoubleRedirects|шолха]] кхы [[Special:BrokenRedirects|вIашагIаяккха дIачудаккхамий]] кардоламахь хьажа.\nОаш жоп лу, шоай чуяккха йола Iинкаш, даим болхбеш хургдолга.\n\nЗем бахка, оагIувни цIи хувцалургьяц, изза мо цIи йолаш оагIув хилача. \nЙолаш йола оагIув хувца йийш яц, амма хийца йола оагIув юха хьахувца йийш я. \n\n'''Хоамхайтар'''\n\nЦIи хувцар, йовзаш йола оагIувнаший, доккха а цаьхха а хувцамшка дIатIадала мегаш да.\nДехар да, оаш дIахо болх белаьхь, хургдола хIама кхеташ долга, кхеталаш.",
     	"movepagetalktext": "ТIатеха дувцама оагIув, ший лоIамахь цIи хувлургья, '''ер дага а доацар, доаца:'''\n\n*Изза мо цIи йолаш яьсса дувцама оагIув я е\n*Оаш кIалхахь белгало даьдац.\n\nИз иштта дале, кулги новкъосталца оагIувнаш вIашагIатоха  е дIадехьаяккха деза шун.",
    -	"newtitle": "Керда цIи",
    -	"move-watch": "Ер оагIув теркама дагаршкахь чуяккха",
    -	"movepagebtn": "ОагIува цIи хувца",
    -	"pagemovedsub": "ОагIув керд цIи тилла я",
    -	"movepage-moved": "'''\"$1\" оагув \"$2\" хьийца я'''",
    -	"articleexists": "Изза мо цIи йола оагIув, йолаш я е оаш тила цIи мегаш яц.\nДехар да, кхыйола цIи хьаржа.",
    -	"movetalk": "МаIан чулоаца дувцама оагIувни цIи хувца",
    +	"newtitle": "Керда цIи:",
    +	"move-watch": "Ер оагIув зем бара хьаязъяьра юкъеяьккха",
    +	"movepagebtn": "ОагIон цIи хувца",
    +	"pagemovedsub": "ОагIон керда цIи тиллай",
    +	"movepage-moved": "'''«$1» оагIон ер «$2» цIи тиллай'''",
    +	"articleexists": "Изза мо цIи йола оагIув тхьовре йолаш я е оаш тилла цIи мегаш яц.\nДехар да, кхыйола цIи харжа.",
    +	"movetalk": "ЦIи хувца дувца оттадара оагIон а",
     	"movelogpage": "ЦIи хувцара тептар",
    -	"movereason": "Бахьан",
    -	"revertmove": "юхаяьккха",
    +	"movereason": "Бахьан:",
    +	"revertmove": "юха",
     	"export": "ОагIонай экспорт",
    -	"allmessagesname": "ЦIи",
    -	"allmessagesdefault": "Сатийна улла яздам",
    -	"allmessages-filter-all": "Дерригаш",
    +	"allmessagesname": "Хоам",
    +	"allmessagesdefault": "Массаза йола текст",
    +	"allmessages-filter-all": "Еррига",
     	"allmessages-language": "Мотт:",
    -	"allmessages-filter-submit": "Дехьа гӀо",
    +	"allmessages-filter-submit": "Дехьавала",
     	"thumbnail-more": "Хьадоаккхаде",
    -	"thumbnail_error": "ЗIамигасуртанчий кхеллама гIалат: $1",
    -	"import-upload-filename": "ПаьлацIи:",
    +	"thumbnail_error": "ЗIамига сурт кхоллара гIалат: $1",
    +	"import-upload-filename": "Файла цӀи:",
     	"tooltip-pt-userpage": "{{GENDER:|Хьа}} доакъашхочун оагIув",
     	"tooltip-pt-mytalk": "{{GENDER:|Хьа}} дувца оттадара оагIув",
     	"tooltip-pt-preferences": "{{GENDER:|Хьа гIирсаш}}",
    @@ -835,11 +846,11 @@
     	"tooltip-ca-addsection": "Керда дáкъа хьаде",
     	"tooltip-ca-viewsource": "Ер оагIув хувцамбарах гIо теха (лорая) я, амма цунна дIадолалу текстага хьажа а, из тIерхьаязъе а бокъо я.",
     	"tooltip-ca-history": "Укх оагIон даь хувцамаш тIа дола тептар",
    -	"tooltip-ca-protect": "Eр оагIув лорае",
    -	"tooltip-ca-delete": "Ер оагIув дIаяькха",
    +	"tooltip-ca-protect": "Лорае ер оагIув хувцамаш дергдоацаш",
    +	"tooltip-ca-delete": "ДӀаяккха ер оагӀув",
     	"tooltip-ca-move": "Укх оагIон цIи хувца",
     	"tooltip-ca-watch": "ТIатоха ер оагIув хьа зем бара хьаязъяьра",
    -	"tooltip-ca-unwatch": "Ер оагIув теркам беча каьхата тIара дIаяькха",
    +	"tooltip-ca-unwatch": "ДIаяккха ер оагIув шоай зем бара хьаязъяьр тIара",
     	"tooltip-search": "Хьалáха {{grammar:prepositional|{{SITENAME}}}} чу",
     	"tooltip-search-go": "Изза мо цӀи йолаш оагӀон тӀa дехьавала",
     	"tooltip-search-fulltext": "Изза мо текст йолаш оагӀонаш лаха",
    @@ -853,10 +864,10 @@
     	"tooltip-n-help": "Новкъостал лаха мегаш йола моттиг",
     	"tooltip-t-whatlinkshere": "Укхаза тIахьожавеш йола оагIонаш",
     	"tooltip-t-recentchangeslinked": "Укх оагIо тIахьожавеш йолча оагIонай тIеххьара хувцамаш",
    -	"tooltip-feed-rss": "Укх оагIувна RSSчу гойтар",
    +	"tooltip-feed-rss": "RSS чу гойтар укх оагIон",
     	"tooltip-feed-atom": "Укх оагIонна лаьрххIа Atom чу трансляци яр",
     	"tooltip-t-contributions": "{{GENDER:$1|Укх доакъашхочо хийца}} йола оагIонаш",
    -	"tooltip-t-emailuser": "Укх дакъалаьцархочоа зIы яхьийта",
    +	"tooltip-t-emailuser": "ДIахьийта каьхат {{GENDER:$1|укх доакъашхочун}}",
     	"tooltip-t-upload": "Файлаш чуяккха",
     	"tooltip-t-specialpages": "ГIулакха оагIонаш",
     	"tooltip-t-print": "Укх оагIон зарба тохара верси",
    @@ -867,14 +878,14 @@
     	"tooltip-ca-nstab-project": "Проектан оагIув",
     	"tooltip-ca-nstab-image": "Файла оагӀув",
     	"tooltip-ca-nstab-template": "Лера оагIув",
    -	"tooltip-ca-nstab-help": "ГӀон оагIув",
    +	"tooltip-ca-nstab-help": "Новкъостала оагIув",
     	"tooltip-ca-nstab-category": "Категорен оагӀув",
    -	"tooltip-minoredit": "Ер хувцар башха доаца санна белгалде",
    +	"tooltip-minoredit": "Ер хувцар кIезига дар санна белгалде",
     	"tooltip-save": "Хьа хувцамаш лорадеш дIаязде",
     	"tooltip-preview": "Дехар да, оагӀув лораешь дIаязъелехь из мишта я тахка хьалххе бIаргтохарах пайда эцаш!",
     	"tooltip-diff": "ДIадолалу текстаца даь хувцамаш хьахьокха",
    -	"tooltip-compareselectedversions": "Укх оагIувни шин доржамаш тIа юкъера хувцамаш зе.",
    -	"tooltip-watch": "Ер оагIув теркам беча каьхата тIа яькха",
    +	"tooltip-compareselectedversions": "Укх оагIон хержа шин версешта юкъе йола башхалога хьажа.",
    +	"tooltip-watch": "ТIатоха ер оагIув хьа зем бара хьаязъяьра",
     	"tooltip-rollback": "Цкъа пIелг тоIабе дIадаккха тIехьара редакторас даь хувцамаш",
     	"tooltip-undo": "Даь хувцар дIадаьккха, хьалххе бIаргтохар хьахьокха, дIадаккхара бахьан Iочуязде аьттув болаш.",
     	"tooltip-summary": "Лоаца сурт оттадар Iочуязде",
    @@ -890,13 +901,13 @@
     	"show-big-image-preview": "Боарам хьалххе бIаргтохач хан: $1.",
     	"show-big-image-other": "{{PLURAL:$2|1=Кхыбола тIера боарам|Кхыбола тIера боарам}}: $1.",
     	"show-big-image-size": "$1 × $2 пиксель",
    -	"noimages": "Суртaш бIаргагуш дац.",
    +	"noimages": "Суртaш дац.",
     	"ilsubmit": "Хьалáха",
    -	"bad_image_list": "Бустам цу тайпара хила беза:\n\nДагарлен хьаракъаш мара лоарх|аш хургьяц (укх тамагIалгацa * дувлашду мугIараш).\nМугIарен хьалхара Iинк, сурт Iоттае пурам доаца Iинка, хила еза. \nЦу мугIара тIехьайоагIа Iинкаш, арадаккхар мо лоарх|аш хургья, вешта аьлча, йоазувашка чуIоттаде мегаш дола сурт санна ларх|а мега.",
    +	"bad_image_list": "Формат хила еза иштта:\n\nЛоархIаш хургда алхха хьаязъяьра элементаш (укх * бехкама белгалонаца долалуш дола могIараш).\nМогIара цхьоаллагIа тIахьожаярг чуоттаде мегаш доаца сурта тIахьожавеш хила еза.\nЦу могIара тIехьайоагIа тIахьожаяргаш лоархIаш хургья эргамаш (исключения) санна, вешта аьлча, сурт чуоттаде мегаш йола статьяш санна.",
     	"metadata": "Мета-дараш",
     	"metadata-help": "Файло кхыдола дараш чулоаца, цифровой суртдоакхарго е сканеро тIатохаш дола. Нагахьа файл чуякхачул тIехьа хийца хинна дале, цхьаццайола параметраш хIанзара сурта тIара йоацаш хила мегаш я.",
    -	"metadata-expand": "Кхыдола хIамаш хьахьокха",
    -	"metadata-collapse": "Кхыдола хIамаш къайладаккха",
    +	"metadata-expand": "Хьахьокха кхыдола дараш",
    +	"metadata-collapse": "Къайладаккха кхыдола дараш",
     	"metadata-fields": "Укх хьаяьзъяра чу дагaрадаь суртий метахоамий йистош, хьахьекха хургда сурта оагIон тIа, хьоарчадаь метахоамий ильг долаш. Юхедиса йистош къайла хургда.\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": "Лакхал",
    @@ -908,80 +919,80 @@
     	"exif-make": "Камера кийчъяь арахийцар",
     	"exif-model": "Камера модель",
     	"exif-software": "Программни Iалашдар",
    -	"exif-artist": "Яздархо",
    +	"exif-artist": "Автор",
     	"exif-exifversion": "Верси Exif",
     	"exif-colorspace": "Бесай мотт",
     	"exif-pixelxdimension": "Сурта шорал",
     	"exif-pixelydimension": "Сурта лакхал",
     	"exif-datetimeoriginal": "Оригинальни таьрахьи хаи",
     	"exif-datetimedigitized": "Оцифровк яь таьрахь а, ха а",
    -	"exif-writer": "Яздама да",
    +	"exif-writer": "Текста автор",
     	"exif-languagecode": "Мотт",
    -	"exif-iimcategory": "Цатег",
    +	"exif-iimcategory": "Категори",
     	"exif-orientation-1": "гIаьхьа",
    -	"exif-scenecapturetype-1": "ЛаьттабIаса",
    -	"exif-scenecapturetype-2": "Сурт",
    -	"exif-iimcategory-edu": "Дешар",
    -	"exif-iimcategory-evn": "Арен буне",
    -	"exif-iimcategory-hth": "Могар",
    -	"exif-iimcategory-hum": "Адамий искараш",
    -	"exif-iimcategory-rel": "Дини тешари",
    -	"exif-iimcategory-sci": "Iилмаи кулгболхи",
    -	"exif-iimcategory-soi": "Сагий хаттараш",
    -	"exif-iimcategory-spo": "Нидзоамал",
    -	"exif-iimcategory-war": "ТIемаш, кховсамаши латтараши",
    +	"exif-scenecapturetype-1": "Ландшафт",
    +	"exif-scenecapturetype-2": "Сага сурт",
    +	"exif-iimcategory-edu": "Дешарца Iомадар",
    +	"exif-iimcategory-evn": "Гонахье",
    +	"exif-iimcategory-hth": "УнахцIано",
    +	"exif-iimcategory-hum": "ЧIоагIа дика истореш",
    +	"exif-iimcategory-rel": "Ди а, тешар а",
    +	"exif-iimcategory-sci": "Ӏилма а, техника а",
    +	"exif-iimcategory-soi": "Социальни хаттараш",
    +	"exif-iimcategory-spo": "Спорт",
    +	"exif-iimcategory-war": "ТIемáш, вIашдухьалъóттамаш, кéгараш",
     	"exif-iimcategory-wea": "Хаоттам",
     	"namespacesall": "деррига",
     	"monthsall": "деррига",
    -	"confirm_purge_button": "ХIаа",
    -	"imgmultigo": "Дехьа гӀо!",
    -	"imgmultigoto": "$1 оагIув тIа дехьавала",
    +	"confirm_purge_button": "Мега",
    +	"imgmultigo": "Дехьавала!",
    +	"imgmultigoto": "$1 оагIон тIа дехьавала",
     	"table_pager_limit_submit": "Кхоачашде",
    -	"watchlisttools-view": "Дагарчера оагIувнаш тIа хувцамаш",
    -	"watchlisttools-edit": "Дагарче хьажа/хувца",
    -	"watchlisttools-raw": "Яздам мо хувца",
    +	"watchlisttools-view": "Хьаязъяьр чура оагIонаш тIа дола хувцамаш",
    +	"watchlisttools-edit": "Хьажа а хувца а хьаязъяьр",
    +	"watchlisttools-raw": "Массаза йола текст санна хувца",
     	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|дувца оттадар]])",
    -	"duplicate-defaultsort": "Зем бе. Сатийна дIа-хьа хьоржама доагI \"$2\" хьалхара сатийна дIа-хьа хьоржама доагI \"$1\" хьахьоржа.",
    -	"version": "Доржам",
    +	"duplicate-defaultsort": "Теркам. Долча тайпара дIанийсдара дIоагIа «$2» юхакъоастаду долча тайпара дIанийсдара хьалха хинна дIоагIа «$1».",
    +	"version": "Верси",
     	"version-specialpages": "ГIулакха оагӀонаш",
     	"version-version": "($1)",
    -	"version-software-version": "Доржам",
    -	"fileduplicatesearch-filename": "ПаьлацIи:",
    +	"version-software-version": "Верси",
    +	"fileduplicatesearch-filename": "Файла цӀи:",
     	"fileduplicatesearch-submit": "Хьалáха",
     	"specialpages": "ЛаьрххIа йола оагIонаш",
    -	"specialpages-group-users": "Дакъалаьцархой, цара бокъо",
    -	"specialpages-group-pages": "ОагIувний дагарченаш",
    -	"specialpages-group-pagetools": "ОагIувнаша гIирсаш",
    -	"external_image_whitelist": "#Ер мугI ший долаш тайпара дита<pre>\n#Каст-каста оаламаш укхаза дIаязаде(юкъе дола дакъа //)\n#арара суртий URLца дIанийсалургда уш.\n#Пайдан дола, сурташ мо хьахьекха хургья, дахIодараш, сурта тIа Iинкаш мо хуpгья хьахьекха.\n#Укх # тамагIалгаца дIадувлаш дола мугIанаш, оалам мо лоархаш да.\n#МугIанаш яздaтакха каьда да\n\n#Каст-каста оаламаш укх мугIа лакхе дIаязаде. Из мугI ший долаш тайпара дита</pre>",
    +	"specialpages-group-users": "Доакъашхойи бокъонаши",
    +	"specialpages-group-pages": "ОагIонай хьаязъяьраш",
    +	"specialpages-group-pagetools": "ОагIонашта дола гIирсаш",
    +	"external_image_whitelist": "#Ер мугI ший болча тайпара бита<pre>\n#Укхаз оттаде кастта дувлача выражений фрагменташ (// юкъе дола дакъа)\n#арахьара суртий URL адресашца дIанийсалургда уш.\n#Мегаргдола сурташ санна хьахьекха хургда, дIаходараш, сурташта тIахьожаяргаш санна хьахьекха хургда.\n#Укханца # долалуш дола могIараш алараш санна лоархIаш да.\n#МогIараш регистраца кIаьда дац\n\n#Укх могIара лакхе оттаде кастта дувлача выражений фрагменташ. Ер мугI ший болча тайпара бита</pre>",
     	"tag-filter": "[[Special:Tags|Белгалонай]] фильтр:",
    -	"tag-filter-submit": "ЦIенъе",
    +	"tag-filter-submit": "Литта",
     	"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|1=Белгало|Белгалонаш}}]]: $2)",
    -	"tags-title": "Йоазонаш",
    -	"tags-tag": "Йоазон цIи",
    -	"tags-hitcount-header": "Белгалаяь хувцамаш",
    -	"tags-edit": "хувца",
    +	"tags-title": "Белгалонаш",
    +	"tags-tag": "Белгалон цӀи",
    +	"tags-hitcount-header": "Белгалдаь нийсдараш",
    +	"tags-edit": "нийсде",
     	"tags-hitcount": "$1 {{PLURAL:$1|1=хувцам|хувцамаш}}",
     	"tags-create-submit": "Хьакхолла",
     	"compare-page1": "ЦхьоаллагIа оагIув",
     	"compare-page2": "ШоллагIа оагӀув",
    -	"compare-rev1": "1. Доржам",
    -	"compare-rev2": "2. Доржам",
    +	"compare-rev1": "ЦхьоаллагIа верси",
    +	"compare-rev2": "ШоллагӀа верси",
     	"htmlform-submit": "ДIадахьийта",
     	"htmlform-reset": "Хувцамаш юхадаккха",
    -	"htmlform-selectorother-other": "Кхыдола",
    +	"htmlform-selectorother-other": "Кхыдар",
     	"logentry-delete-delete": "$1 {{GENDER:$2|дIаяккхай}} оагIув $3",
     	"logentry-move-move": "$1 {{GENDER:$2|цӀи хийцай}} $3 → $4",
     	"logentry-newusers-create": "{{GENDER:$2|Доакъашхочо хьакхеллад}} дагара йоазув $1",
     	"logentry-upload-upload": "$1 {{GENDER:$2|чуяьккхай}} $3",
    -	"rightsnone": "(а)",
    -	"revdelete-summary": "хувцамий лоацам",
    +	"rightsnone": "(яц)",
    +	"revdelete-summary": "хувцамий сурт оттадар",
     	"searchsuggest-search": "Лахар",
     	"expand_templates_preview": "Хьалххе бIаргтохар",
     	"pagelang-name": "ОагIув",
    -	"special-characters-group-latin": "Лаьтмий",
    -	"special-characters-group-greek": "Джелтий",
    -	"special-characters-group-cyrillic": "Цырилиций",
    -	"special-characters-group-arabic": "Ӏарбий",
    -	"special-characters-group-persian": "Фаьранзий",
    +	"special-characters-group-latin": "Латиной",
    +	"special-characters-group-greek": "Эллиной",
    +	"special-characters-group-cyrillic": "Кириллица",
    +	"special-characters-group-arabic": "Iарбий",
    +	"special-characters-group-persian": "Фаьрсий",
     	"special-characters-group-hebrew": "Жугтий"
     }
    diff --git a/languages/i18n/is.json b/languages/i18n/is.json
    index 7a8e57a005..8048a840b4 100644
    --- a/languages/i18n/is.json
    +++ b/languages/i18n/is.json
    @@ -1151,8 +1151,8 @@
     	"rightslogtext": "Þetta er skrá yfir breytingar á réttindum notenda.",
     	"action-read": "lesa þessa síðu",
     	"action-edit": "breyta þessari síðu",
    -	"action-createpage": "skapa síður",
    -	"action-createtalk": "skapa spjallsíður",
    +	"action-createpage": "skapa þessa síðu",
    +	"action-createtalk": "skapa þessa spjallsíðu",
     	"action-createaccount": "skapa þennan notandaaðgang",
     	"action-autocreateaccount": "búa sjálfvirkt til þennan ytri notandaaðgang",
     	"action-history": "skoða breytingaskrá þessarar síðu",
    @@ -3513,7 +3513,6 @@
     	"mw-widgets-dateinput-placeholder-month": "ÁÁÁÁ-MM",
     	"mw-widgets-titleinput-description-new-page": "síðan er ekki enn til",
     	"mw-widgets-titleinput-description-redirect": "tilvísun á $1",
    -	"api-error-blacklisted": "Veldu annan lýsandi titil",
     	"sessionmanager-tie": "Get ekki sameinað margar gerðir auðkenningarbeiðna: $1.",
     	"sessionprovider-generic": "$1 setur",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "setur með vefkökum",
    diff --git a/languages/i18n/it.json b/languages/i18n/it.json
    index 8cc198587e..59146ee9b5 100644
    --- a/languages/i18n/it.json
    +++ b/languages/i18n/it.json
    @@ -98,7 +98,8 @@
     			"Mpiva",
     			"Urielejh",
     			"Matma Rex",
    -			"Matteocng"
    +			"Matteocng",
    +			"Einreiher"
     		]
     	},
     	"tog-underline": "Sottolinea i collegamenti:",
    @@ -450,7 +451,7 @@
     	"viewyourtext": "È possibile visualizzare e copiare il codice sorgente delle <strong>tue modifiche</strong> a questa pagina.",
     	"protectedinterface": "Questa pagina contiene un elemento che fa parte dell'interfaccia utente del software di questo sito ed è protetta per evitare possibili abusi.\nPer aggiungere o modificare le traduzioni valide su tutti i wiki, usa [https://translatewiki.net/ translatewiki.net], il progetto di localizzazione di MediaWiki.",
     	"editinginterface": "<strong>Attenzione:</strong> il testo di questa pagina fa parte dell'interfaccia utente del software di questo sito. Tutte le modifiche apportate a questa pagina si riflettono sui messaggi visualizzati per tutti gli utenti su questo wiki.",
    -	"translateinterface": "Per aggiungere o modificare le traduzioni valide su tutti i wiki, usa [https://translatewiki.net/ translatewiki.net], il progetto MediaWiki per la localizzazione.",
    +	"translateinterface": "Per aggiungere o modificare le traduzioni valide su tutti i wiki, usa [https://translatewiki.net/ translatewiki.net], il progetto di localizzazione MediaWiki.",
     	"cascadeprotected": "Su questa pagina non è possibile effettuare modifiche perché è inclusa {{PLURAL:$1|nella pagina indicata di seguito, che è stata protetta|nelle pagine indicate di seguito, che sono state protette}} selezionando la protezione \"ricorsiva\":\n$2",
     	"namespaceprotected": "Non si dispone dei permessi necessari per modificare le pagine del namespace '''$1'''.",
     	"customcssprotected": "Non si dispone dei permessi necessari alla modifica di questa pagina CSS, in quanto contiene le impostazioni personali di un altro utente.",
    @@ -716,7 +717,9 @@
     	"minoredit": "Questa è una modifica minore",
     	"watchthis": "Aggiungi agli osservati speciali",
     	"savearticle": "Salva la pagina",
    +	"savechanges": "Salva le modifiche",
     	"publishpage": "Pubblica pagina",
    +	"publishchanges": "Pubblica modifiche",
     	"preview": "Anteprima",
     	"showpreview": "Visualizza anteprima",
     	"showdiff": "Mostra modifiche",
    @@ -765,8 +768,8 @@
     	"previewnote": "'''Ricorda che questa è solo un'anteprima.'''\nLe tue modifiche NON sono ancora state salvate!",
     	"continue-editing": "Vai all'area di modifica",
     	"previewconflict": "L'anteprima corrisponde al testo presente nella casella di modifica superiore e rappresenta la pagina come apparirà se si sceglie di salvarla in questo momento.",
    -	"session_fail_preview": "Spiacenti! Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\nPotresti essere stato disconnesso. <strong>Verifica che sei ancora collegato e riprova</strong>.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
    -	"session_fail_preview_html": "Spiacenti! Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\n<em>Poiché {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
    +	"session_fail_preview": "Spiacenti. Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\nPotresti essere stato disconnesso. <strong>Verifica di essere ancora collegato e riprova</strong>.\nSe il problema persiste, puoi provare a [[Special:UserLogout|scollegarti]] ed effettuare un nuovo l'accesso, controllando che il tuo browser accetti i cookie da questo sito.",
    +	"session_fail_preview_html": "Spiacenti. Non è stato possibile elaborare la modifica perché sono andati persi i dati relativi alla sessione.\n\n<em>Siccome {{SITENAME}} ha dell'HTML grezzo attivato e c'è stata una perdita dei dati della sessione, l'anteprima è nascosta come precauzione contro gli attacchi JavaScript.</em>\n\n<strong>Se si tratta di un normale tentativo d'anteprima, riprova.</strong> \nSe il problema persiste, puoi provare a [[Special:UserLogout|scollegarti]] ed effettuare un nuovo l'accesso, controllando che il tuo browser accetti i cookie da questo sito.",
     	"token_suffix_mismatch": "'''La modifica non è stata salvata perché il client ha mostrato di gestire in modo errato i caratteri di punteggiatura nel token associato alla stessa. Per evitare una possibile corruzione del testo della pagina, è stata rifiutata l'intera modifica. Questa situazione può verificarsi, talvolta, quando vengono usati alcuni servizi di proxy anonimi via web che presentano dei bug.'''",
     	"edit_form_incomplete": "'''Alcune parti del modulo di modifica non hanno raggiunto il server; controllare che le modifiche siano intatte e riprovare.'''",
     	"editing": "Modifica di $1",
    @@ -1309,8 +1312,8 @@
     	"rightslogtext": "Di seguito sono elencate le modifiche ai diritti assegnati agli utenti.",
     	"action-read": "leggere questa pagina",
     	"action-edit": "modificare questa pagina",
    -	"action-createpage": "creare pagine",
    -	"action-createtalk": "creare pagine di discussione",
    +	"action-createpage": "creare questa pagina",
    +	"action-createtalk": "creare questa pagina di discussione",
     	"action-createaccount": "effettuare questa registrazione",
     	"action-autocreateaccount": "creare automaticamente questa utenza esterna",
     	"action-history": "vedere la cronologia di questa pagina",
    @@ -1528,6 +1531,7 @@
     	"upload-http-error": "Si è verificato un errore HTTP: $1",
     	"upload-copy-upload-invalid-domain": "Non è consentito il caricamento di copie da questo dominio.",
     	"upload-foreign-cant-upload": "Questo wiki non è configurato per caricare i file nel repository di file esterno richiesto.",
    +	"upload-dialog-disabled": "Il caricamento di file tramite questa finestra di dialogo è disabilitato in questo wiki.",
     	"upload-dialog-title": "Carica file",
     	"upload-dialog-button-cancel": "Annulla",
     	"upload-dialog-button-done": "Fatto",
    @@ -1848,7 +1852,7 @@
     	"apisandbox": "Pagina di prova API",
     	"apisandbox-jsonly": "È richiesto JavaScript per utilizzare la sandbox API.",
     	"apisandbox-api-disabled": "Le funzionalità API sono disabilitate su questo sito.",
    -	"apisandbox-intro": "Utilizza questa pagina per sperimentare con le <strong>API web service MediaWiki</strong>.\nPer ulteriori dettagli di utilizzo delle API, fai riferimento alla [[mw:API:Main page|documentazione API]]. Esempio: [https://www.mediawiki.org/wiki/API#A_simple_example ottenere il contenuto della pagina principale]. Seleziona un'azione per vedere altri esempi.\n\nNota che, anche se questa è una pagina per le prove, le azioni che esegui qui potrebbero modificare il wiki.",
    +	"apisandbox-intro": "Utilizza questa pagina per fare pratica con le <strong>API web service MediaWiki</strong>.\nPer ulteriori dettagli di utilizzo delle API, fai riferimento alla [[mw:API:Main page|documentazione API]]. Esempio: [https://www.mediawiki.org/wiki/API#A_simple_example ottenere il contenuto della pagina principale]. Seleziona un'azione per vedere altri esempi.\n\nNota che, anche se questa è una pagina per le prove, le azioni che esegui qui potrebbero modificare il wiki.",
     	"apisandbox-fullscreen": "Espandi pannello",
     	"apisandbox-fullscreen-tooltip": "Espandi il pannello sandbox per riempire la finestra del browser.",
     	"apisandbox-unfullscreen": "Mostra la pagina",
    @@ -2249,6 +2253,7 @@
     	"sp-contributions-username": "Indirizzo IP o nome utente:",
     	"sp-contributions-toponly": "Mostra solo i contributi che sono le ultime versioni per la pagina",
     	"sp-contributions-newonly": "Visualizza solo le modifiche che sono creazioni di pagina",
    +	"sp-contributions-hideminor": "Nascondi le modifiche minori",
     	"sp-contributions-submit": "Ricerca",
     	"whatlinkshere": "Puntano qui",
     	"whatlinkshere-title": "Pagine che puntano a \"$1\"",
    @@ -2468,7 +2473,7 @@
     	"allmessagesname": "Nome",
     	"allmessagesdefault": "Testo predefinito",
     	"allmessagescurrent": "Testo attuale",
    -	"allmessagestext": "Questa è la lista di tutti i messaggi di sistema disponibili nel namespace MediaWiki.\nVisitare [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [https://translatewiki.net translatewiki.net] se si desidera contribuire alla localizzazione generica di MediaWiki.",
    +	"allmessagestext": "Questa è la lista di tutti i messaggi di sistema disponibili nel namespace MediaWiki.\nVisita [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] e [https://translatewiki.net translatewiki.net] se vuoi contribuire alla localizzazione generica di MediaWiki.",
     	"allmessagesnotsupportedDB": "Non è possibile utilizzare questa pagina perché il flag '''$wgUseDatabaseMessages''' non è attivo.",
     	"allmessages-filter-legend": "Filtro",
     	"allmessages-filter": "Filtra per stato di modifica:",
    @@ -2527,7 +2532,7 @@
     	"import-nonewrevisions": "Nessuna versione importata (erano già tutte presenti, o saltate a causa di errori)",
     	"xml-error-string": "$1 a riga $2, colonna $3 (byte $4): $5",
     	"import-upload": "Carica dati XML",
    -	"import-token-mismatch": "I dati relativi alla sessione sono andati persi. Riprovare.\n\nPotresti essere stato disconnesso. <strong>Verifica che sei ancora collegato e riprova</strong>.\nSe il problema persiste, si può tentare di [[Special:UserLogout|scollegarsi]] ed effettuare un nuovo accesso, e controllare che il tuo browser accetti i cookie da questo sito.",
    +	"import-token-mismatch": "I dati relativi alla sessione sono andati persi. Riprovare.\n\nPotresti essere stato disconnesso. <strong>Verifica di essere ancora collegato e riprova</strong>.\nSe il problema persiste, puoi provare a [[Special:UserLogout|scollegarti]] ed effettuare un nuovo l'accesso, controllando che il tuo browser accetti i cookie da questo sito.",
     	"import-invalid-interwiki": "Impossibile importare dal progetto wiki indicato.",
     	"import-error-edit": "La pagina \"$1\" non è stata importata poiché non sei autorizzato a modificarla.",
     	"import-error-create": "La pagina \"$1\" non è stata importata poiché non sei autorizzato a crearla.",
    @@ -3171,7 +3176,7 @@
     	"confirm-unwatch-button": "OK",
     	"confirm-unwatch-top": "Elimina questa pagina dalla tua lista degli osservati speciali?",
     	"confirm-rollback-button": "OK",
    -	"confirm-rollback-top": "Ripristinare le modifiche a questa pagina?",
    +	"confirm-rollback-top": "Ripristinare le modifiche di questa pagina?",
     	"percent": "$1&#160;%",
     	"quotation-marks": "«$1»",
     	"imgmultipageprev": "← pagina precedente",
    @@ -3430,7 +3435,7 @@
     	"htmlform-float-invalid": "Il valore specificato non è un numero.",
     	"htmlform-int-toolow": "Il valore specificato è inferiore al minimo di $1",
     	"htmlform-int-toohigh": "Il valore specificato è superiore al massimo di $1",
    -	"htmlform-required": "Questo valore è obligatorio.",
    +	"htmlform-required": "Questo valore è obbligatorio.",
     	"htmlform-submit": "Invia",
     	"htmlform-reset": "Annulla modifiche",
     	"htmlform-selectorother-other": "Altro",
    @@ -3703,7 +3708,6 @@
     	"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
     	"mw-widgets-titleinput-description-new-page": "questa pagina non esiste ancora",
     	"mw-widgets-titleinput-description-redirect": "reindirizzamento a $1",
    -	"api-error-blacklisted": "Per favore scegli un titolo diverso e descrittivo.",
     	"sessionmanager-tie": "Non è possibile combinare più tipi di richieste di autenticazione: $1.",
     	"sessionprovider-generic": "sessioni $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sessioni basate su cookie",
    @@ -3718,8 +3722,8 @@
     	"log-action-filter-newusers": "Tipo di creazione utenza:",
     	"log-action-filter-patrol": "Tipo di verifica:",
     	"log-action-filter-protect": "Tipo di protezione:",
    -	"log-action-filter-rights": "Tipo di modifica diritti",
    -	"log-action-filter-suppress": "Tipo di soppressione",
    +	"log-action-filter-rights": "Tipo di modifica diritti:",
    +	"log-action-filter-suppress": "Tipo di soppressione:",
     	"log-action-filter-upload": "Tipo di caricamento:",
     	"log-action-filter-all": "Tutto",
     	"log-action-filter-block-block": "Blocco",
    diff --git a/languages/i18n/ja.json b/languages/i18n/ja.json
    index 5eefbd9833..2264e1d23b 100644
    --- a/languages/i18n/ja.json
    +++ b/languages/i18n/ja.json
    @@ -77,9 +77,9 @@
     	"tog-underline": "リンクの下線:",
     	"tog-hideminor": "最近の更新に細部の編集を表示しない",
     	"tog-hidepatrolled": "最近の更新に巡回済みの編集を表示しない",
    -	"tog-newpageshidepatrolled": "新しいページの一覧に、巡回済みのページを表示しない",
    +	"tog-newpageshidepatrolled": "新しいページの一覧に巡回済みのページを表示しない",
     	"tog-hidecategorization": "ページのカテゴリ追加・除去を表示しない",
    -	"tog-extendwatchlist": "ウォッチリストを拡張し、最新のものだけではなくすべての変更を表示",
    +	"tog-extendwatchlist": "ウォッチリストを拡張して最新の変更以外もすべて表示",
     	"tog-usenewrc": "最近の更新とウォッチリストで、複数の変更をページごとにまとめる",
     	"tog-numberheadings": "見出しに番号を自動的に振る",
     	"tog-showtoolbar": "編集用のツールバーを表示",
    @@ -114,7 +114,7 @@
     	"tog-ccmeonemails": "他の利用者に送信したメールの控えを自分にも送信",
     	"tog-diffonly": "差分の下にページ内容を表示しない",
     	"tog-showhiddencats": "隠しカテゴリを表示",
    -	"tog-norollbackdiff": "ロールバック後の差分を表示しない",
    +	"tog-norollbackdiff": "巻き戻し後の差分を表示しない",
     	"tog-useeditwarning": "変更を保存せずに編集画面から離れようとしたら警告",
     	"tog-prefershttps": "ログインする際、常に安全な接続を使用する",
     	"underline-always": "常に付ける",
    @@ -193,7 +193,7 @@
     	"category_header": "カテゴリ「$1」にあるページ",
     	"subcategories": "下位カテゴリ",
     	"category-media-header": "カテゴリ「$1」にあるメディア",
    -	"category-empty": "<em>このカテゴリには現在、ページやメディアが何もありません。</em>",
    +	"category-empty": "<em>現在このカテゴリには、ページまたはメディアがありません。</em>",
     	"hidden-categories": "{{PLURAL:$1|隠しカテゴリ}}",
     	"hidden-category-category": "隠しカテゴリ",
     	"category-subcat-count": "{{PLURAL:$2|このカテゴリには以下の下位カテゴリのみが含まれています。|このカテゴリには下位カテゴリ $2 件が含まれており、そのうち以下の{{PLURAL:$1| $1 件}}を表示しています。}}",
    @@ -468,6 +468,7 @@
     	"password-change-forbidden": "このウィキではパスワードを変更できません。",
     	"externaldberror": "認証データベースでエラーが発生したか、または外部アカウントの更新が許可されていません。",
     	"login": "ログイン",
    +	"login-security": "あなたが同一人であることを確認します",
     	"nav-login-createaccount": "ログインまたはアカウント作成",
     	"userlogin": "ログインまたはアカウント作成",
     	"userloginnocreate": "ログイン",
    @@ -485,6 +486,7 @@
     	"userlogin-resetpassword-link": "パスワードをお忘れですか?",
     	"userlogin-helplink2": "ログインについてのヘルプ",
     	"userlogin-loggedin": "{{GENDER:$1|$1}} として既にログインしています。\n別の利用者としてログインするには下のフォームを使用してください。",
    +	"userlogin-reauth": "あなたが {{GENDER:$1|$1}} であることを確認するために、再度ログインする必要があります。",
     	"userlogin-createanother": "別アカウントを作成",
     	"createacct-emailrequired": "メールアドレス",
     	"createacct-emailoptional": "メールアドレス (省略可能)",
    @@ -495,8 +497,11 @@
     	"createaccountreason": "理由:",
     	"createacct-reason": "理由",
     	"createacct-reason-ph": "アカウントを作成する理由",
    +	"createacct-reason-help": "アカウント作成記録に表示されるメッセージ",
     	"createacct-submit": "アカウントを作成",
     	"createacct-another-submit": "アカウントを作成",
    +	"createacct-continue-submit": "アカウント作成を続行",
    +	"createacct-another-continue-submit": "アカウント作成を続行",
     	"createacct-benefit-heading": "{{SITENAME}}は、あなたのような人々が創っています。",
     	"createacct-benefit-body1": "{{PLURAL:$1|編集}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|ページ}}",
    @@ -511,6 +516,7 @@
     	"nocookieslogin": "{{SITENAME}}ではログインに Cookie を使用します。\nCookie を無効にしているようです。\nCookie を有効にしてから、もう一度試してください。",
     	"nocookiesfornew": "発信元を確認できなかったため、アカウントは作成されませんでした。\nCookieを有効にしていることを確認して、このページを再読込してもう一度試してください。",
     	"nocookiesforlogin": "{{int:nocookieslogin}}",
    +	"createacct-loginerror": "アカウントは正常に作成されましたが、自動的にログインすることができませんでした。[[Special:UserLogin|手動でログイン]]をしてください。",
     	"noname": "有効な利用者名が指定されていません。",
     	"loginsuccesstitle": "ログイン済み",
     	"loginsuccess": "<strong>{{SITENAME}}に「$1」としてログインしました。</strong>",
    @@ -601,6 +607,7 @@
     	"botpasswords-invalid-name": "指定された利用者名には、ボット用パスワードの区切りである「$1」 が含まれていません。",
     	"botpasswords-not-exist": "利用者「$1」はボット「$2」のパスワードを所持していません。",
     	"resetpass_forbidden": "パスワードは変更できません",
    +	"resetpass_forbidden-reason": "パスワードは変更できません: $1",
     	"resetpass-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
     	"resetpass-submit-loggedin": "パスワードを変更",
     	"resetpass-submit-cancel": "中止",
    @@ -630,7 +637,11 @@
     	"passwordreset-emailsentusername": "この利用者名に関連付けられたメールアドレスがある場合は、パスワードリセットのメールが送信されます。",
     	"passwordreset-emailsent-capture": "下記の内容の、パスワード再設定メールをお送りしました。",
     	"passwordreset-emailerror-capture": "以下の内容のパスワード再設定メールを生成しましたが、{{GENDER:$2|利用者}}への送信に失敗しました: $1",
    -	"changeemail": "メールアドレスを変更または除去",
    +	"passwordreset-emailsent-capture2": "パスワードリセットの{{PLURAL:$1|メール}}が送信されました。{{PLURAL:$1|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
    +	"passwordreset-emailerror-capture2": "{{GENDER:$2|利用者}}へのメール送信に失敗しました: $1{{PLURAL:$3|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
    +	"passwordreset-ignored": "パスワードのリセットが処理されませんでした。プロバイダーが設定されていない可能性があります。",
    +	"passwordreset-invalideamil": "無効なメールアドレスです",
    +	"changeemail": "メールアドレスの変更または除去",
     	"changeemail-header": "あなたのメールアドレスを変更するには、このフォームを完成させます。もし、あなたのアカウントから任意のメールアドレスの関連付けを削除したい場合は、フォームの送信時に、新しいメールアドレスを空白のままにします。",
     	"changeemail-passwordrequired": "この変更を確認するためにパスワードを入力する必要があります。",
     	"changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
    @@ -673,6 +684,7 @@
     	"minoredit": "細部の編集",
     	"watchthis": "このページをウォッチ",
     	"savearticle": "ページを保存",
    +	"savechanges": "変更を保存",
     	"publishpage": "ページを公開",
     	"preview": "プレビュー",
     	"showpreview": "プレビューを表示",
    @@ -1233,6 +1245,7 @@
     	"right-managechangetags": "[[Special:Tags|タグ]]の作成、有効化および無効化",
     	"right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
     	"right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
    +	"right-deletechangetags": "データベースから[[Special:Tags|タグ]]を削除します",
     	"grant-group-email": "メールの送信",
     	"grant-group-customization": "カスタマイズと個人設定",
     	"grant-group-other": "その他の活動",
    @@ -1263,8 +1276,8 @@
     	"rightslogtext": "以下は利用者権限の変更記録です。",
     	"action-read": "このページの閲覧",
     	"action-edit": "このページの編集",
    -	"action-createpage": "ページの作成",
    -	"action-createtalk": "議論ページの作成",
    +	"action-createpage": "このページの作成",
    +	"action-createtalk": "この議論ページの作成",
     	"action-createaccount": "この利用者アカウントの作成",
     	"action-autocreateaccount": "この外部利用者アカウントを自動的に作成",
     	"action-history": "このページの履歴の閲覧",
    @@ -1307,6 +1320,7 @@
     	"action-managechangetags": "タグの作成、有効化および無効化",
     	"action-applychangetags": "自分の編集にタグを適用する",
     	"action-changetags": "個々の版および記録項目への任意のタグの追加と除去",
    +	"action-deletechangetags": "データベースからタグの削除",
     	"nchanges": "$1 {{PLURAL:$1|回の変更}}",
     	"enhancedrc-since-last-visit": "最終閲覧以降 $1 {{PLURAL:$1|件}}",
     	"enhancedrc-history": "履歴",
    @@ -1482,6 +1496,9 @@
     	"upload-too-many-redirects": "そのURLに含まれるリダイレクトが多すぎます",
     	"upload-http-error": "HTTP エラー発生: $1",
     	"upload-copy-upload-invalid-domain": "このドメインからのアップロードは許可されていません。",
    +	"upload-foreign-cant-upload": "このウィキでは、要求された外部ファイルリポジトリにファイルをアップロードできるように設定されていません。",
    +	"upload-foreign-cant-load-config": "外部ファイルリポジトリへのファイルアップロードに使用される設定の読み込みに失敗しました。",
    +	"upload-dialog-disabled": "このウィキでは、このダイアログを使用するファイルのアップロードが無効にされています。",
     	"upload-dialog-title": "ファイルをアップロード",
     	"upload-dialog-button-cancel": "中止",
     	"upload-dialog-button-done": "完了",
    @@ -1551,6 +1568,7 @@
     	"uploadstash-badtoken": "操作を実行できませんでした。編集するための認証の期限切れが原因である可能性があります。再度試してください。",
     	"uploadstash-errclear": "ファイルの消去に失敗しました。",
     	"uploadstash-refresh": "ファイルの一覧を更新",
    +	"uploadstash-thumbnail": "サムネイルを表示",
     	"invalid-chunk-offset": "無効なチャンクオフセット",
     	"img-auth-accessdenied": "アクセスが拒否されました",
     	"img-auth-nopathinfo": "PATH_INFO が見つかりません。\nサーバーが、この情報を渡すように構成されていません。\nCGI ベースであるため、img_auth に対応できない可能性もあります。\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization をご覧ください。",
    @@ -1820,6 +1838,7 @@
     	"apisandbox-dynamic-parameters-add-placeholder": "引数名",
     	"apisandbox-dynamic-error-exists": "引数名 \"$1\" は既に存在しています。",
     	"apisandbox-deprecated-parameters": "廃止予定の引数",
    +	"apisandbox-fetch-token": "トークンを自動入力します",
     	"apisandbox-submit-invalid-fields-title": "いくつかの欄が不正です。",
     	"apisandbox-submit-invalid-fields-message": "印が付いている欄を訂正し、再試行してください。",
     	"apisandbox-results": "結果",
    @@ -1921,6 +1940,8 @@
     	"trackingcategories-msg": "追跡用カテゴリ",
     	"trackingcategories-name": "メッセージ名",
     	"trackingcategories-desc": "カテゴリに入る基準",
    +	"restricted-displaytitle-ignored": "ページ名の表示が無視されているページ",
    +	"restricted-displaytitle-ignored-desc": "実際のページ名と等価でないために <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> が無視されているページ。",
     	"noindex-category-desc": "このページは <code><nowiki>__NOINDEX__</nowiki></code> というマジックワードを含んでおり、その印が有効になっている名前空間にあるため、ロボットによる収集の対象になりません。",
     	"index-category-desc": "このページは <code><nowiki>__INDEX__</nowiki></code> というマジックワードを含んでおり、その印が有効になっている名前空間にあるため、通常と異なり、ロボットによる収集の対象になります。",
     	"post-expand-template-inclusion-category-desc": "テンプレートを展開したあとのページ サイズが <code>$wgMaxArticleSize</code> よりも大きいため、一部のテンプレートが展開されなかった",
    @@ -2062,10 +2083,12 @@
     	"changecontentmodel-submit": "変更",
     	"changecontentmodel-success-title": "コンテンツ・モデルは変更されました",
     	"changecontentmodel-success-text": "[[:$1]]のコンテンツ・タイプは変更されました。",
    -	"changecontentmodel-cannot-convert": "[[:$1]]上のコンテントは$2の型には変換できません。",
    +	"changecontentmodel-cannot-convert": "[[:$1]]のコンテンツは$2の型には変換できません。",
     	"changecontentmodel-nodirectediting": "$1 コンテンツ・モデルは、ダイレクト編集をサポートしていません。",
    +	"changecontentmodel-emptymodels-text": "[[:$1]]のコンテンツはどの型にも変換できません。",
     	"log-name-contentmodel": "コンテンツ・モデル変更記録",
     	"log-description-contentmodel": "ページのコンテンツ・モデルに関連する出来事",
    +	"logentry-contentmodel-new": "$1 が ページ $3 を既定でないコンテンツ・モデル「$5」で{{GENDER:$2|作成しました}}。",
     	"logentry-contentmodel-change": "$1 がページ $3 のコンテンツ・モデルを \"$4\" から \"$5\" に{{GENDER:$2|変更しました}}",
     	"logentry-contentmodel-change-revertlink": "差し戻し",
     	"logentry-contentmodel-change-revert": "差し戻し",
    @@ -2197,6 +2220,7 @@
     	"sp-contributions-username": "IPアドレスまたは利用者名:",
     	"sp-contributions-toponly": "最新版の編集のみを表示",
     	"sp-contributions-newonly": "ページ作成を伴う編集のみを表示",
    +	"sp-contributions-hideminor": "細部の編集を表示しない",
     	"sp-contributions-submit": "検索",
     	"whatlinkshere": "リンク元",
     	"whatlinkshere-title": "「$1」へリンクしているページ",
    @@ -2953,7 +2977,12 @@
     	"exif-compression-6": "JPEG (旧式)",
     	"exif-copyrighted-true": "著作権あり",
     	"exif-copyrighted-false": "著作権情報未設定",
    +	"exif-photometricinterpretation-0": "黒と白 (白が0)",
     	"exif-photometricinterpretation-1": "黒と白(黒が0)",
    +	"exif-photometricinterpretation-9": "CIE L*a*b* (ICC エンコード)",
    +	"exif-photometricinterpretation-10": "CIE L*a*b* (ITU エンコード)",
    +	"exif-photometricinterpretation-32803": "カラーフィルター配列",
    +	"exif-photometricinterpretation-34892": "リニア RAW",
     	"exif-unknowndate": "不明な日付",
     	"exif-orientation-1": "通常",
     	"exif-orientation-2": "左右反転",
    @@ -2965,6 +2994,8 @@
     	"exif-orientation-8": "時計回りに90°回転",
     	"exif-planarconfiguration-1": "点順次フォーマット",
     	"exif-planarconfiguration-2": "面順次フォーマット",
    +	"exif-xyresolution-i": "$1dpi",
    +	"exif-xyresolution-c": "$1dpc",
     	"exif-colorspace-65535": "その他",
     	"exif-componentsconfiguration-0": "存在しない",
     	"exif-exposureprogram-0": "未定義",
    @@ -3130,7 +3161,10 @@
     	"confirmemail_body_set": "誰か (おそらくあなた) が IP アドレス $1 から\n{{SITENAME}} のアカウント「$2」のメールアドレスをこのアドレスに設定しました。\n\nこのアカウントが本当にあなたのものであれば、以下のリンクをブラウザーで開いて、\n{{SITENAME}} のメール機能を有効にしてください。\n\n$3\n\nあなたのアカウントではない場合は、\n以下のリンクをブラウザーで開いて、メールアドレスの確認をキャンセルしてください:\n\n$5\n\nこの確認コードは $4 に期限切れになります。",
     	"confirmemail_invalidated": "メールアドレスの確認が中止されました",
     	"invalidateemail": "メールアドレスの確認中止",
    +	"notificationemail_subject_changed": "{{SITENAME}} に登録されたメールアドレスが変更されました",
    +	"notificationemail_subject_removed": "{{SITENAME}} に登録されたメールアドレスが除去されました",
     	"notificationemail_body_changed": "誰か (おそらくあなた) が、IP アドレス $1 から、\n{{SITENAME}} のアカウント「$2」のメールアドレスを \"$3\" に変更しました。\n\n変更した覚えがない場合、サイトの管理者に直ちに連絡してください。",
    +	"notificationemail_body_removed": "誰か (おそらくあなた) が、IP アドレス $1 から、\n{{SITENAME}} のアカウント「$2」のメールアドレスを除去しました。\n\n変更した覚えがない場合、サイトの管理者に直ちに連絡してください。",
     	"scarytranscludedisabled": "[ウィキ間の参照読み込みは無効になっています]",
     	"scarytranscludefailed": "[$1に対してテンプレートの取得に失敗しました]",
     	"scarytranscludefailed-httpstatus": "[$1に対してテンプレートの取得に失敗しました: HTTP $2]",
    @@ -3139,6 +3173,7 @@
     	"confirmrecreate": "あなたが編集を開始した後、[[User:$1|$1]] ([[User talk:$1|トーク]]) がこのページを以下の理由で{{GENDER:$1|削除しました}}:\n: <em>$2</em>\nこのままこのページを本当に再作成していいか確認してください。",
     	"confirmrecreate-noreason": "あなたが編集を開始した後、[[User:$1|$1]] ([[User talk:$1|トーク]]) がこのページを{{GENDER:$1|削除しました}}。このページを本当に再作成していいかご確認ください。",
     	"recreate": "再作成する",
    +	"unit-pixel": "ピクセル",
     	"confirm_purge_button": "OK",
     	"confirm-purge-top": "このページのキャッシュを破棄しますか?",
     	"confirm-purge-bottom": "ページをパージすると、キャッシュが破棄され、強制的に最新版が表示されます。",
    @@ -3177,7 +3212,7 @@
     	"autoredircomment": "[[$1]]への転送ページ",
     	"autosumm-new": "ページの作成:「$1」",
     	"autosumm-newblank": "空白のページを作成しました",
    -	"size-bytes": "$1バイト",
    +	"size-bytes": "$1{{PLURAL:$1|バイト}}",
     	"size-kilobytes": "$1キロバイト",
     	"size-megabytes": "$1メガバイト",
     	"size-gigabytes": "$1ギガバイト",
    @@ -3186,6 +3221,24 @@
     	"size-exabytes": "$1 EB",
     	"size-zetabytes": "$1 ZB",
     	"size-yottabytes": "$1 YB",
    +	"size-pixel": "$1{{PLURAL:$1|ピクセル}}",
    +	"size-kilopixel": "$1キロピクセル",
    +	"size-megapixel": "$1メガピクセル",
    +	"size-gigapixel": "$1ギガピクセル",
    +	"size-terapixel": "$1テラピクセル",
    +	"size-petapixel": "$1ペタピクセル",
    +	"size-exapixel": "$1エクサピクセル",
    +	"size-zetapixel": "$1ゼタピクセル",
    +	"size-yottapixel": "$1ヨタピクセル",
    +	"bitrate-bits": "$1bps",
    +	"bitrate-kilobits": "$1kbps",
    +	"bitrate-megabits": "$1Mbps",
    +	"bitrate-gigabits": "$1Gbps",
    +	"bitrate-terabits": "$1Tbps",
    +	"bitrate-petabits": "$1Pbps",
    +	"bitrate-exabits": "$1Ebps",
    +	"bitrate-zetabits": "$1Zbps",
    +	"bitrate-yottabits": "$1Ybps",
     	"lag-warn-normal": "この一覧には $1 {{PLURAL:$1|秒}}前以降の変更内容が表示されていないおそれがあります。",
     	"lag-warn-high": "データベースサーバーの大幅な遅延のため、この一覧には $1 {{PLURAL:$1|秒}}前以降の変更内容が表示されていないおそれがあります。",
     	"watchlistedit-normal-title": "ウォッチリストの編集",
    @@ -3269,6 +3322,7 @@
     	"timezone-local": "ローカル",
     	"duplicate-defaultsort": "<strong>警告:</strong> 既定のソートキー「$2」が、その前に書かれている既定のソートキー「$1」を上書きしています。",
     	"duplicate-displaytitle": "<strong>警告:</strong> DISPLAYTITLE「$2」が、その前に書かれているDISPLAYTITLE「$1」を上書きしています。",
    +	"restricted-displaytitle": "<strong>警告:</strong> 実際のページ名と同じではないため、「$1」の表示名は無視されました。",
     	"invalid-indicator-name": "<strong>エラー:</strong> ページ・ステータス・インディケーターの <code>name</code> 属性は空であってはいけません。",
     	"version": "バージョン情報",
     	"version-extensions": "インストール済み拡張機能",
    @@ -3415,9 +3469,11 @@
     	"tags-deactivate-not-allowed": "タグ「$1」は無効化できません。",
     	"tags-deactivate-submit": "無効化",
     	"tags-apply-no-permission": "あなたには変更と同時に変更タグを適応する権限がありません。",
    +	"tags-apply-blocked": "ブロックされているため、変更タグの変更を適用できません。",
     	"tags-apply-not-allowed-one": "タグ \"$1\" の手動適用は認められていません。",
     	"tags-apply-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動適用が認められていません: $1",
     	"tags-update-no-permission": "あなたには個々の版または記録項目のタグの追加または除去を行う権限がありません。",
    +	"tags-update-blocked": "ブロックされているため、変更タグを追加または除去できません。",
     	"tags-update-add-not-allowed-one": "タグ \"$1\" の手動追加は認められていません。",
     	"tags-update-add-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動追加が認められていません: $1",
     	"tags-update-remove-not-allowed-one": "タグ \"$1\" の除去は認められていません。",
    @@ -3518,7 +3574,7 @@
     	"logentry-move-move_redir-noredirect": "$1 がページ「$3」をリダイレクトの「$4」に、リダイレクトを残さずに{{GENDER:$2|移動しました}}",
     	"logentry-patrol-patrol": "$1 がページ「$3」の版 $4 を巡回済みと{{GENDER:$2|しました}}",
     	"logentry-patrol-patrol-auto": "$1 が自動的にページ「$3」の版 $4 を巡回済みと{{GENDER:$2|しました}}",
    -	"logentry-newusers-newusers": "利用者アカウント $1 が{{GENDER:$2|作成されました}}",
    +	"logentry-newusers-newusers": "$1 によって利用者アカウントが{{GENDER:$2|作成されました}}",
     	"logentry-newusers-create": "利用者アカウント $1 が{{GENDER:$2|作成されました}}",
     	"logentry-newusers-create2": "利用者アカウント $3 が $1 により{{GENDER:$2|作成されました}}",
     	"logentry-newusers-byemail": "利用者アカウント $3 が $1 によって{{GENDER:$2|作成され}}、そのパスワードがメールで送信されました",
    @@ -3576,8 +3632,10 @@
     	"feedback-useragent": "ユーザーエージェント:",
     	"searchsuggest-search": "検索",
     	"searchsuggest-containing": "この語句を全文検索",
    +	"api-error-autoblocked": "あなたの IP アドレスは、過去にブロックされた利用者によって使用されていたため、自動的にブロックされました。",
     	"api-error-badaccess-groups": "このウィキへのファイルのアップロードが許可されていません。",
     	"api-error-badtoken": "内部エラー: トークンが正しくありません。",
    +	"api-error-blocked": "あなたは編集ブロックされています。",
     	"api-error-copyuploaddisabled": "URLによるアップロードはこのサーバーでは無効になっています。",
     	"api-error-duplicate": "当ウェブサイト上には、既に同じ内容の{{PLURAL:$1|他のファイルが|他のファイルがいくつか}}存在しています。",
     	"api-error-duplicate-archive": "サイト上に同じ内容の{{PLURAL:$1|別のファイルが|他のファイルがいくつか}}既にありましたが、{{PLURAL:$1|それは|それらは}}削除されました。",
    @@ -3604,6 +3662,7 @@
     	"api-error-nomodule": "内部エラー: アップロードを処理するモジュールが設定されていません。",
     	"api-error-ok-but-empty": "内部エラー: サーバーからの応答がありません。",
     	"api-error-overwrite": "既存のファイルへの上書きは許可されていません。",
    +	"api-error-ratelimited": "あなたは短時間の間に、このウィキで許容されている数より多くのファイルをアップロードしようとしています。\n数分後にもう一度お試しください。",
     	"api-error-stashfailed": "内部エラー: サーバーは一時ファイルを格納できませんでした。",
     	"api-error-publishfailed": "内部エラー: サーバーは一時ファイルを発行できませんでした。",
     	"api-error-stasherror": "ファイルを未公開アップロードする際にエラーが発生しました。",
    @@ -3622,6 +3681,7 @@
     	"api-error-unknownerror": "不明なエラー:「$1」",
     	"api-error-uploaddisabled": "このウィキではアップロードは無効になっています。",
     	"api-error-verification-error": "このファイルは壊れているか、間違った拡張子になっています。",
    +	"api-error-was-deleted": "この名前のファイルは、以前にアップロードされており、その後削除されています。",
     	"duration-seconds": "$1 {{PLURAL:$1|秒}}",
     	"duration-minutes": "$1 {{PLURAL:$1|分}}",
     	"duration-hours": "$1 {{PLURAL:$1|時間}}",
    @@ -3733,8 +3793,10 @@
     	"mw-widgets-dateinput-no-date": "選択されたデータ無し",
     	"mw-widgets-titleinput-description-new-page": "ページは存在しません",
     	"mw-widgets-titleinput-description-redirect": "$1 へのリダイレクト",
    -	"api-error-blacklisted": "他の、説明的なタイトルをお選びください。",
    +	"sessionmanager-tie": "複数の要求の認証方法を組み合わせることはできません: $1。",
     	"sessionprovider-generic": "$1 セッション",
    +	"sessionprovider-mediawiki-session-cookiesessionprovider": "クッキーベースのセッション",
    +	"sessionprovider-nocookies": "クッキーが無効になっている可能性があります。クッキーが有効になっていることを確認し、もう一度お試しください。",
     	"randomrootpage": "おまかせルートページ",
     	"log-action-filter-block": "ブロックの種類",
     	"log-action-filter-delete": "削除の種類:",
    @@ -3744,6 +3806,7 @@
     	"log-action-filter-newusers": "アカウント作成の種類:",
     	"log-action-filter-patrol": "巡回の種類:",
     	"log-action-filter-protect": "保護の種類:",
    +	"log-action-filter-suppress": "秘匿の種類:",
     	"log-action-filter-upload": "アップロードの種類",
     	"log-action-filter-all": "すべて",
     	"log-action-filter-block-block": "ブロック",
    @@ -3775,9 +3838,76 @@
     	"log-action-filter-suppress-delete": "ページの秘匿",
     	"log-action-filter-upload-upload": "新規アップロード",
     	"log-action-filter-upload-overwrite": "再アップロード",
    +	"authmanager-authn-not-in-progress": "認証が行われていない、またはセッションデータが失われました。最初からやり直してください。",
    +	"authmanager-authn-no-primary": "指定された証明情報を認証できませんでした。",
    +	"authmanager-authn-no-local-user": "指定された証明情報は、このウィキのどの利用者にも関連付けられていません。",
    +	"authmanager-authn-no-local-user-link": "指定された証明情報は有効ですが、このウィキのどの利用者にも関連付けられていません。別の方法でログインするか、新しくアカウントを作成し、オプションからそのアカウントに以前の証明情報を関連付けることができます。",
     	"authmanager-authn-autocreate-failed": "ローカルアカウントの自動作成が失敗しました: $1",
    +	"authmanager-change-not-supported": "一切利用されないであろう情報のため、指定された証明情報を変更することはできません。",
    +	"authmanager-create-disabled": "アカウントの作成は禁止されています。",
    +	"authmanager-create-from-login": "アカウントを作成するには、以下の入力欄に記入してください。",
    +	"authmanager-create-not-in-progress": "アカウントの作成が行われていない、またはセッションデータが失われました。最初からやり直してください。",
    +	"authmanager-create-no-primary": "指定された証明情報は、アカウントの作成に使用できませんでした。",
    +	"authmanager-link-no-primary": "指定された証明情報は、アカウントの関連付けに使用できませんでした。",
    +	"authmanager-link-not-in-progress": "アカウントの関連付けが行われていない、またはセッションデータが失われました。最初からやり直してください。",
    +	"authmanager-authplugin-setpass-failed-title": "パスワードの変更に失敗しました",
    +	"authmanager-authplugin-setpass-failed-message": "パスワードの変更は、認証プラグインによって拒否されました。",
    +	"authmanager-authplugin-create-fail": "アカウントの作成は、認証プラグインによって拒否されました。",
    +	"authmanager-authplugin-setpass-denied": "パスワードの変更は、認証プラグインによって許可されていません。",
     	"authmanager-authplugin-setpass-bad-domain": "無効なドメインです。",
    +	"authmanager-autocreate-noperm": "自動アカウント作成は許可されていません。",
    +	"authmanager-autocreate-exception": "自動アカウント作成は、以前のエラーにより一時的に無効になっています。",
     	"authmanager-userdoesnotexist": "利用者アカウント「$1」は登録されていません。",
    +	"authmanager-userlogin-remembermypassword-help": "パスワードはセッションの長さよりも長いため、忘れないようにしてください。",
    +	"authmanager-username-help": "認証用の利用者名。",
    +	"authmanager-password-help": "認証用のパスワード。",
    +	"authmanager-domain-help": "外部認証用のドメイン。",
    +	"authmanager-retype-help": "パスワードの再確認。",
     	"authmanager-email-label": "メールアドレス",
    -	"authmanager-email-help": "メールアドレス"
    +	"authmanager-email-help": "メールアドレス",
    +	"authmanager-realname-label": "本名",
    +	"authmanager-realname-help": "利用者の本名",
    +	"authmanager-provider-password": "パスワードベースの認証",
    +	"authmanager-provider-password-domain": "パスワードおよびドメインベースの認証",
    +	"authmanager-provider-temporarypassword": "仮パスワード",
    +	"authprovider-confirmlink-message": "最近のログイン試行に基づいて、以下のアカウントはあなたのウィキのアカウントに関連付けできます。関連付けることで、各々のアカウントを経由してログインすることを可能にします。関連付けるアカウントを選択してください。",
    +	"authprovider-confirmlink-request-label": "関連付けるアカウント",
    +	"authprovider-confirmlink-success-line": "$1: 関連付けが完了しました。",
    +	"authprovider-confirmlink-failed": "アカウントの関連付けは完了されませんでした: $1",
    +	"authprovider-confirmlink-ok-help": "関連付けのエラーメッセージが表示された後に続行します。",
    +	"authprovider-resetpass-skip-label": "スキップ",
    +	"authprovider-resetpass-skip-help": "パスワードのリセットをスキップします。",
    +	"authform-nosession-login": "認証に成功しましたが、お使いのブラウザでログイン情報を記憶することはできません。\n\n$1",
    +	"authform-nosession-signup": "アカウントは作成されましたが、お使いのブラウザでログイン情報を記憶することはできません。\n\n$1",
    +	"authform-newtoken": "トークンがありません。$1",
    +	"authform-notoken": "トークンがありません",
    +	"authform-wrongtoken": "不正なトークンです",
    +	"specialpage-securitylevel-not-allowed-title": "許可されていません",
    +	"specialpage-securitylevel-not-allowed": "申し訳ありませんが、あなたが同一人であるか確認できないため、このページを使用することはできません。",
    +	"authpage-cannot-login": "ログインを開始できません。",
    +	"authpage-cannot-login-continue": "ログインを続行できません。セッションがタイムアウトした可能性が高いです。",
    +	"authpage-cannot-create": "アカウントの作成を開始できません。",
    +	"authpage-cannot-create-continue": "アカウントの作成を続行できません。セッションがタイムアウトした可能性が高いです。",
    +	"authpage-cannot-link": "アカウントの関連付けを開始できません。",
    +	"authpage-cannot-link-continue": "アカウントの関連付けを続行できません。セッションがタイムアウトした可能性が高いです。",
    +	"cannotauth-not-allowed-title": "アクセスが拒否されました",
    +	"cannotauth-not-allowed": "あなたはこのページの使用を許可されていません",
    +	"changecredentials": "証明情報の変更",
    +	"changecredentials-submit": "証明情報の変更",
    +	"changecredentials-invalidsubpage": "「$1」は証明方法として有効なものではありません。",
    +	"changecredentials-success": "証明情報が変更されました。",
    +	"removecredentials": "証明情報の除去",
    +	"removecredentials-submit": "証明情報を除去",
    +	"removecredentials-invalidsubpage": "「$1」は証明方法として有効なものではありません。",
    +	"removecredentials-success": "証明情報が除去されました。",
    +	"credentialsform-provider": "証明方法:",
    +	"credentialsform-account": "アカウント名:",
    +	"cannotlink-no-provider-title": "関連付け可能なアカウントがありません",
    +	"cannotlink-no-provider": "関連付け可能なアカウントがありません。",
    +	"linkaccounts": "アカウントの関連付け",
    +	"linkaccounts-success-text": "アカウントが関連付けられました。",
    +	"linkaccounts-submit": "アカウントを関連付ける",
    +	"unlinkaccounts": "アカウントの関連付け解除",
    +	"unlinkaccounts-success": "アカウントの関連付けが解除されました。",
    +	"authenticationdatachange-ignored": "認証データの変更は処理されませんでした。プロバイダーが設定されていない可能性があります。"
     }
    diff --git a/languages/i18n/jam.json b/languages/i18n/jam.json
    index 11238d7097..38a261f8a4 100644
    --- a/languages/i18n/jam.json
    +++ b/languages/i18n/jam.json
    @@ -834,7 +834,7 @@
     	"watchlisttools-view": "Vyuu rilivant chienjdem",
     	"watchlisttools-edit": "Vyuu ahn edit wachlis",
     	"watchlisttools-raw": "Edit raa wachlis",
    -	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskoshan]])‎",
    +	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|taak]])‎",
     	"specialpages": "Peshal piej",
     	"tag-filter": "[[Special:Tags|Tag]] filta:",
     	"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
    diff --git a/languages/i18n/jv.json b/languages/i18n/jv.json
    index d400dbbc92..94f050f1b7 100644
    --- a/languages/i18n/jv.json
    +++ b/languages/i18n/jv.json
    @@ -170,7 +170,7 @@
     	"faq": "Pitakon Kerep",
     	"faqpage": "Project:Pitakon Kerep",
     	"actions": "Tumindak",
    -	"namespaces": "Lowah aran",
    +	"namespaces": "Jagat aran",
     	"variants": "Parian",
     	"navigation-heading": "Menu napigasi",
     	"errorpagetitle": "Cacad",
    @@ -277,8 +277,8 @@
     	"toc": "Isi",
     	"showtoc": "tuduhaké",
     	"hidetoc": "dhelikaké",
    -	"collapsible-collapse": "Neb",
    -	"collapsible-expand": "Wenga",
    +	"collapsible-collapse": "tutup",
    +	"collapsible-expand": "bukak",
     	"confirmable-confirm": "{{GENDER:$1|Sampéyan}} yakin?",
     	"confirmable-yes": "Iya",
     	"confirmable-no": "Ora",
    @@ -319,7 +319,7 @@
     	"databaseerror-error": "Cacad: $1",
     	"laggedslavemode": "Pènget: Kaca iki mbokmenawa isiné dudu pangowahan pungkasan.",
     	"readonly": "Umpak data kagembok",
    -	"enterlockreason": "Lebokna alesan panguncèn, kalebu uga prakiran kapan kunci bakal dibuka",
    +	"enterlockreason": "Isi alesan ngreksa, kalebu rencana kapan pareksané bakal dibukak",
     	"readonlytext": "Juru administrasi sistem sing ngunci iku medhar mangkéné: $1",
     	"missing-article": "Basis data ora bisa nemokaké tèks kaca sing kuduné ana, yaiku \"$1\" $2.\nBab iki bisasané disebabaké déning pranala daluwarsa menyang revisi sadurungé kaca sing wis dibusak.\nYèn dudu iki panyebabé, panjenengan manawa bisa nemokaké kasalahan (''bug'') jroning piranti alus (''software''). Mangga dilapuraké bab iki menyang [[Special:ListUsers/sysop|administrator]], kanthi nyebutaké alamat URL sing dituju",
     	"missingarticle-rev": "(owahan#: $1)",
    @@ -426,6 +426,8 @@
     	"createacct-reason-ph": "Kenapa sampeyan nggawe akun liyane",
     	"createacct-submit": "Gawé akun sampéyan",
     	"createacct-another-submit": "Gawé akun",
    +	"createacct-continue-submit": "Banjuraké gawé akun",
    +	"createacct-another-continue-submit": "Banjuraké gawé akun",
     	"createacct-benefit-heading": "{{SITENAME}} digawé déning wong-wong kaya déné sampéyan.",
     	"createacct-benefit-body1": "{{PLURAL:$1|besutan}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
    @@ -439,6 +441,7 @@
     	"nocookiesnew": "Rékening utawa akun panganggo panjenengan wis digawé, nanging panjenengan durung mlebu log. {{SITENAME}} nggunakaké ''cookies'' kanggo  log panganggo. ''Cookies'' ing panjlajah wèb panjengengan dipatèni. Mangga diaktifaké lan mlebu log manèh mawa jeneng panganggo lan tembung sandhi panjenengan.",
     	"nocookieslogin": "{{SITENAME}} nggunakaké ''cookies'' kanggo log panganggoné. ''Cookies'' ing panjlajah wèb panjenengan dipatèni. Mangga ngaktifaké manèh lan coba manèh.",
     	"nocookiesfornew": "Akun panganggo ora digawé amarga sumberé ora bisa dipesthèkaké.\nPesthèkaké sampéyan wis ngurubaké kuki, banjur balèni ngamot kaca iki lan njajal manèh.",
    +	"createacct-loginerror": "Akuné wis kasil digawe nanging sampéyan ora bisa mlebu otomatis. Mangga [[Special:UserLogin|mlebua manual]].",
     	"noname": "Asma panganggo sing panjenengan pilih ora sah.",
     	"loginsuccesstitle": "Kasil mlebu",
     	"loginsuccess": "'''Panjenengan saiki mlebu ing {{SITENAME}} kanthi asma \"$1\".'''",
    @@ -482,6 +485,7 @@
     	"createacct-another-realname-tip": "Jeneng asli ora kudu dilebokake.\n\nYen sampeyan milih nglebokake jeneng asli, jeneng kuwi bakal dinggo ngwenehi atribusi kanggo karya-karyane.",
     	"pt-login": "Mlebu",
     	"pt-login-button": "Mlebu",
    +	"pt-login-continue-button": "Banjuraké mlebu",
     	"pt-createaccount": "Gawé akun",
     	"pt-userlogout": "Metu",
     	"php-mail-error-unknown": "Kasalahan ora dingertèni nèng piguna mail() PHP.",
    @@ -572,7 +576,7 @@
     	"anoneditwarning": "<strong>Penget:</strong> Panjenengan boten mlebet log. Alamat IP Panjenengan badhe katingal dening publik manawi Panjenengan ngayahi ewah-ewahan. Manawi Panjenengan  <strong>[$1 mlebet log]</strong> utawai <strong>[$2 damel akun]</strong>, suntingan Panjenengan badhe kaatribusekaken dhumateng  nama pangangge Panjenengan, lan rupi-rupi  kauntungan sanesipun.",
     	"anonpreviewwarning": "''Sampéyan durung mlebu log. Nyimpen bakal nyathet alamat IP Sampéyan nèng riwayat sunting kaca iki.''",
     	"missingsummary": "'''Pènget:''' Panjenengan ora nglebokaké ringkesan panyuntingan. Menawa panjenengan mencèt tombol Simpen manèh, suntingan panjenengan bakal kasimpen tanpa ringkesan panyuntingan.",
    -	"missingcommenttext": "Tulung lebokna komentar ing ngisor iki.",
    +	"missingcommenttext": "Mangga isi tanggapan ing ngisor iki.",
     	"missingcommentheader": "'''Pangéling:''' Sampéyan durung nyadhiyakaké judhul/jejer kanggo tanggepan iki.\nYèn Sampéyan klik \"{{int:savearticle}}\" manèh, suntingan Sampéyan bakal kasimpen tanpa kuwi.",
     	"summary-preview": "Pratuduh tingkesan:",
     	"subject-preview": "Prawuryaning jejer:",
    @@ -818,6 +822,8 @@
     	"notextmatches": "Ora ana tèks kaca sing cocog",
     	"prevn": "{{PLURAL:$1|$1}} sadurungé",
     	"nextn": "{{PLURAL:$1|$1}} sabanjuré",
    +	"prev-page": "kaca sadurungé",
    +	"next-page": "kaca sabanjuré",
     	"prevn-title": "$1 {{PLURAL:$1|asil|asil}} sadurungé",
     	"nextn-title": "$1 {{PLURAL:$1|asil|asil}} sabanjuré",
     	"shown-title": "Tuduhaké $1 {{PLURAL:$1|kasil|kasil}} saben kaca",
    @@ -831,14 +837,17 @@
     	"searchprofile-articles-tooltip": "Golèkan ing $1",
     	"searchprofile-images-tooltip": "Golèk barkas",
     	"searchprofile-everything-tooltip": "Golèk kabèh isi (kalebu kaca guneman)",
    -	"searchprofile-advanced-tooltip": "Golèk ing lowah jeneng tinamtu",
    +	"searchprofile-advanced-tooltip": "Golèk ing jagat aran tinamtu",
     	"search-result-size": "$1 ({{PLURAL:$2|1 tembung|$2 tembung}})",
     	"search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
     	"search-redirect": "(pangalihan $1)",
     	"search-section": "(pérangan $1)",
    +	"search-category": "(kategori $1)",
    +	"search-file-match": "(cocog karo isi barkas)",
     	"search-suggest": "Apa karepé sampéyan: $1",
    +	"search-rewritten": "Tuduhaké kasilé $1, nanging golèkaké $2.",
     	"search-interwiki-caption": "Proyèk-proyèk sababon",
    -	"search-interwiki-default": "Pituwas $1:",
    +	"search-interwiki-default": "Wohing panggolèk $1:",
     	"search-interwiki-more": "(luwih akèh)",
     	"search-relatedarticle": "Magepokan",
     	"searchrelated": "magepokan",
    @@ -966,7 +975,7 @@
     	"prefs-tabs-navigation-hint": "Tip: Sampeyan isa nganggo dapat menggunakan tombol panah kiwa lan tengen kanggo navigasi tab-tab ing daftar tab.",
     	"userrights": "Manajemen hak panganggo",
     	"userrights-lookup-user": "Ngatur kelompok panganggo",
    -	"userrights-user-editname": "Lebokna jeneng panganggo:",
    +	"userrights-user-editname": "Isi jeneng panganggo:",
     	"editusergroup": "Besut golongan {{GENDER:$1|panganggo}}",
     	"editinguser": "Ngganti hak panganggo '''[[User:$1|$1]]''' $2",
     	"userrights-editusergroup": "Besut golongan panganggo",
    @@ -1070,6 +1079,10 @@
     	"right-override-export-depth": "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
     	"right-sendemail": "Ngirim layang listrik (e-mail) menyang panganggo liya",
     	"right-passwordreset": "Delok layang èlèktronik panyetèlulangan tembung sandhi",
    +	"grant-group-email": "Kirim layang élèktronik",
    +	"grant-createaccount": "Gawé akun",
    +	"grant-createeditmovepage": "Gawé, besut, lan lih kaca",
    +	"grant-delete": "Busak kaca, owahan, lan isian cathetan",
     	"newuserlogpage": "Cathetan panganggo anyar",
     	"newuserlogpagetext": "Ing ngisor iki kapacak log pandaftaran panganggo anyar.",
     	"rightslog": "Log pangowahan hak aksès",
    @@ -1129,6 +1142,7 @@
     	"recentchanges-legend-heading": "<strong>Legendha:</strong>",
     	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga deleng [[Special:NewPages|pratélaning kaca-kaca anyar]])",
     	"recentchanges-legend-plusminus": "(''±123'')",
    +	"recentchanges-submit": "Tuduhaké",
     	"rcnotefrom": "Ing ngisor iki owah-owahan wiwit <strong>$2</strong> (kapacak nganti <strong>$1</strong> owah-owahan).",
     	"rclistfrom": "Tuduhaké owah-owahan anyar kawit $2, $3",
     	"rcshowhideminor": "$1 besutan cilik",
    @@ -1138,14 +1152,19 @@
     	"rcshowhidebots-show": "Tuduhaké",
     	"rcshowhidebots-hide": "Dhelikaké",
     	"rcshowhideliu": "$1 panganggo karégister",
    +	"rcshowhideliu-show": "Tuduhaké",
     	"rcshowhideliu-hide": "Dhelikaké",
     	"rcshowhideanons": "$1 panganggo anonim",
     	"rcshowhideanons-show": "Tuduhaké",
     	"rcshowhideanons-hide": "Dhelikaké",
     	"rcshowhidepatr": "$1 besutan awasan",
    +	"rcshowhidepatr-show": "Tuduhaké",
    +	"rcshowhidepatr-hide": "Dhelikaké",
     	"rcshowhidemine": "$1 besutanku",
     	"rcshowhidemine-show": "Tuduhaké",
     	"rcshowhidemine-hide": "Dhelikaké",
    +	"rcshowhidecategorization-show": "Tuduhaké",
    +	"rcshowhidecategorization-hide": "Dhelikaké",
     	"rclinks": "Tuduhaké $1 owahan kawit $2 dina kapungkur.<br />$3",
     	"diff": "béd",
     	"hist": "saj",
    @@ -1256,6 +1275,17 @@
     	"upload-too-many-redirects": "URL ngandhut kakèhan pengalihan",
     	"upload-http-error": "Ana kasalahan HTTP: $1",
     	"upload-copy-upload-invalid-domain": "Unggahan salinan ora sumadhiya nèng domain iki.",
    +	"upload-dialog-title": "Unggah barkas",
    +	"upload-dialog-button-cancel": "Wurung",
    +	"upload-dialog-button-done": "Rampung",
    +	"upload-dialog-button-save": "Simpen",
    +	"upload-dialog-button-upload": "Unggah",
    +	"upload-form-label-infoform-title": "Rerincèn",
    +	"upload-form-label-infoform-name": "Jeneng",
    +	"upload-form-label-usage-filename": "Jeneng barkas",
    +	"upload-form-label-own-work": "Iki karyaku dhéwé",
    +	"upload-form-label-infoform-categories": "Kategori",
    +	"upload-form-label-infoform-date": "Tanggal",
     	"backend-fail-stream": "Ora bisa milikaké berkas \"$1\".",
     	"backend-fail-backup": "Ora bisa nyadangaké berkas \"$1\".",
     	"backend-fail-notexists": "Berkas $1 ora ana.",
    @@ -1490,6 +1520,7 @@
     	"mostrevisions": "Kaca mawa pangowahan sing akèh dhéwé",
     	"prefixindex": "Kabèh kaca mawa ater-ater",
     	"prefixindex-namespace": "Kabèh kaca mawa ater-ater (bilik jeneng $1)",
    +	"prefixindex-submit": "Tuduhaké",
     	"prefixindex-strip": "Busak ater-ater saka pratélan",
     	"shortpages": "Kaca cendhak",
     	"longpages": "Kaca dawa",
    @@ -1500,6 +1531,9 @@
     	"protectedpages-cascade": "Amung kaca rineksan kang runtut",
     	"protectedpages-noredirect": "Dhelikna alihan",
     	"protectedpagesempty": "Saat ini tidak ada halaman yang sedang dilindungi.",
    +	"protectedpages-page": "Kaca",
    +	"protectedpages-expiry": "Kadaluwarsa",
    +	"protectedpages-reason": "Alesan",
     	"protectedtitles": "Irah-irahan sing direksa",
     	"protectedtitlesempty": "Ora ana irah-irahan utawa judhul sing direksa karo paramèter-paramèter iki.",
     	"listusers": "Daftar panganggo",
    @@ -1801,10 +1835,10 @@
     	"undelete-error-long": "Ana kaluputan nalika mbatalaké pambusakan berkas:\n\n$1",
     	"undelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi berkas \"<nowiki>$1</nowiki>\" sing wis kabusak ing $2 jam $3?",
     	"undelete-show-file-submit": "Ya",
    -	"namespace": "Lowah aran:",
    +	"namespace": "Jagat aran:",
     	"invert": "Balèkaké pilihan",
     	"tooltip-invert": "Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca nèng njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)",
    -	"namespace_association": "Lowah aran magepokan",
    +	"namespace_association": "Jagat aran magepokan",
     	"tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk sing kakait karo bilik jeneng kapilih",
     	"blanknamespace": "(Pokok)",
     	"contributions": "Sumbangan {{GENDER:$1|panganggo}}",
    @@ -1981,8 +2015,8 @@
     	"newtitle": "Sesirah anyar:",
     	"move-watch": "Awasna kaca iki",
     	"movepagebtn": "Ngalih kaca",
    -	"pagemovedsub": "Kasil dipindhahaké",
    -	"movepage-moved": "'''\"$1\" dipindhahaké menyang \"$2\".'''",
    +	"pagemovedsub": "Kasil dilih",
    +	"movepage-moved": "<strong>\"$1\" wis dilih nyang \"$2\"</strong>",
     	"movepage-moved-redirect": "Kaca pengalihan wis kacipta.",
     	"movepage-moved-noredirect": "Kanggo gawé pengalihan wis ditahan.",
     	"articleexists": "Satunggalipun kaca kanthi asma punika sampun wonten, utawi asma ingkang panjenengan pendhet mboten leres. Sumangga nyobi asma sanèsipun.",
    @@ -2008,7 +2042,7 @@
     	"immobile-source-namespace": "Ora bisa mindhahaké kaca jroning bilik jeneng \"$1\"",
     	"immobile-target-namespace": "Ora bisa mindhahaké kaca menyang bilik jeneng \"$1\"",
     	"immobile-target-namespace-iw": "Pranala interwiki dudu target sing sah kanggo pamindhahan kaca.",
    -	"immobile-source-page": "Kaca iki ora bisa dipindhahaké.",
    +	"immobile-source-page": "Kaca iki ora bisa dilih-lih.",
     	"immobile-target-page": "Ora bisa mindhahaké menyang irah-irahan tujuan kasebut.",
     	"bad-target-model": "Halaman yang dituju menggunakan model isi yang berbeda. Tidak dapat mengonversi $1 ke $2.",
     	"imagenocrossnamespace": "Ora bisa mindhahaké gambar menyang bilik nama non-gambar",
    @@ -2221,7 +2255,7 @@
     	"pageinfo-recent-edits": "Cacahé suntingan saiki (ing $1 kapungkur)",
     	"pageinfo-recent-authors": "Cacahé panganggit sing bédha-bédha saiki",
     	"pageinfo-magic-words": "{{PLURAL:$1|Tembung|Tembung}} mujarab ($1)",
    -	"pageinfo-hidden-categories": "{{PLURAL:$1|Katégori|Katégori}} kadhelikaké ($1)",
    +	"pageinfo-hidden-categories": "{{PLURAL:$1|Kategori}} ndhelik ($1)",
     	"pageinfo-templates": "{{PLURAL:$1|Templat|Templat}} yang ditransklusi ($1)",
     	"pageinfo-transclusions": "{{PLURAL:$1|Kaca|Kaca}} sing ditransklusi ing ($1)",
     	"pageinfo-toolboxlink": "Katerangan kaca",
    diff --git a/languages/i18n/ka.json b/languages/i18n/ka.json
    index 1b648e4252..8ec2e3666f 100644
    --- a/languages/i18n/ka.json
    +++ b/languages/i18n/ka.json
    @@ -652,7 +652,9 @@
     	"minoredit": "მცირე რედაქტირება",
     	"watchthis": "უთვალთვალე ამ გვერდს",
     	"savearticle": "გვერდის შენახვა",
    +	"savechanges": "ცვლილებების შენახვა",
     	"publishpage": "გვერდის გამოქვეყნება",
    +	"publishchanges": "ცვლილებების გამოქვეყნება",
     	"preview": "წინასწარი გადახედვა",
     	"showpreview": "წინასწარი გადახედვის ჩვენება",
     	"showdiff": "ცვლილებების ჩვენება",
    @@ -1331,7 +1333,7 @@
     	"rcshowhidemine": "ჩემი რედაქტირების $1",
     	"rcshowhidemine-show": "ჩვენება",
     	"rcshowhidemine-hide": "დამალვა",
    -	"rcshowhidecategorization": "$1 გვერდის კატეგორიზაცია",
    +	"rcshowhidecategorization": "გვერდის კატეგორიზაციის $1",
     	"rcshowhidecategorization-show": "ჩვენება",
     	"rcshowhidecategorization-hide": "დამალვა",
     	"rclinks": "ბოლო $1 ცვლილების ჩვენება უკანასკნელი $2 დღის მანძილზე<br />$3",
    @@ -2039,7 +2041,7 @@
     	"editcomment": "რედაქტირება განმარტებული იყო როგორც: <em>$1</em>.",
     	"revertpage": "[[Special:Contributions/$2|$2]]-ის რედაქტირება გაუქმდა; აღდგა ბოლოს [[User:$1|$1]]-ის მიერ რედაქტირებული ვერსია",
     	"revertpage-nouser": "მომხმარებლის (მომხმარებლის სახელი დამალულია) ცვლილებები დაბრუნებულია ვერსიაზე {{GENDER:$1|[[User:$1|$1]]}}",
    -	"rollback-success": "გაუქმდა რედაქტირება $1; დაბრუნება ვერსიაზე $2.",
    +	"rollback-success": "გაუქმდა რედაქტირება $1; დაბრუნდა ვერსიაზე $2.",
     	"sessionfailure-title": "სეანსის შეცდომა",
     	"sessionfailure": "ჩანს, რომ პრობლემაა თქვენი რეგისტრაციის სესიისათვის;\nეს მოქმედება შეჩერდა თქვენი სესიაში შემოჭრის თავიდან ასაცილებლად.\nგთხოვთ, დააწკაპუნოთ ღილაკს „უკან“ და თავიდან ჩართოთ გვერდი, რომლიდანაც შემოხვედით და სცადოთ განმეორებით.",
     	"changecontentmodel": "გვერდის კონტენტური მოდელის შეცვლა",
    @@ -3677,7 +3679,6 @@
     	"mw-widgets-dateinput-placeholder-month": "წწწწ-თთ",
     	"mw-widgets-titleinput-description-new-page": "გვერდი ჯერ არ არსებობს",
     	"mw-widgets-titleinput-description-redirect": "გადამისამართება $1-ზე",
    -	"api-error-blacklisted": "გთხოვთ, აირჩიეთ სხვა, აღწერილობითი სათაური.",
     	"sessionmanager-tie": "შეუძლებელია მრავალი მოთხოვნის ავთენთიფიკაციის ტიპების გაერთიანება: $1.",
     	"sessionprovider-generic": "$1 სესიები",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-სთან დაკავშირებული სესიები",
    diff --git a/languages/i18n/kk-cyrl.json b/languages/i18n/kk-cyrl.json
    index 505d417afc..d80554da2e 100644
    --- a/languages/i18n/kk-cyrl.json
    +++ b/languages/i18n/kk-cyrl.json
    @@ -1783,7 +1783,7 @@
     	"usermessage-summary": "Жүйе хабарламасы қалдырылуда.",
     	"usermessage-editor": "Жүйе мессенжері",
     	"watchlist": "Бақылау тізімі",
    -	"mywatchlist": "Бақылау тізімі",
    +	"mywatchlist": "Бақылау тізімім",
     	"watchlistfor2": "$1 ($2) бақылау тізімі",
     	"nowatchlist": "Бақылау тізіміңізде еш дана жоқ",
     	"watchlistanontext": "Бақылау тізіміңіздегі даналарды қарау не өңдеу үшін кіріңіз.",
    diff --git a/languages/i18n/ko.json b/languages/i18n/ko.json
    index 51a3e81d4e..d81fb26033 100644
    --- a/languages/i18n/ko.json
    +++ b/languages/i18n/ko.json
    @@ -77,9 +77,9 @@
     	"tog-editondblclick": "더블 클릭으로 문서 편집하기",
     	"tog-editsectiononrightclick": "제목을 오른쪽 클릭해서 문단 편집하기 활성화",
     	"tog-watchcreations": "내가 만든 문서와 내가 올린 파일을 주시문서 목록에 추가",
    -	"tog-watchdefault": "내가 편집하는 문서와 파일을 주시문서 목록에 추가",
    -	"tog-watchmoves": "내가 이동하는 문서와 파일을 주시문서 목록에 추가",
    -	"tog-watchdeletion": "내가 삭제하는 문서와 파일을 주시문서 목록에 추가",
    +	"tog-watchdefault": "내가 편집한 문서와 파일을 주시문서 목록에 추가",
    +	"tog-watchmoves": "내가 이동한 문서와 파일을 주시문서 목록에 추가",
    +	"tog-watchdeletion": "내가 삭제한 문서와 파일을 주시문서 목록에 추가",
     	"tog-watchuploads": "내가 올린 파일을 주시문서 목록에 추가",
     	"tog-watchrollback": "내가 되돌리기 기능을 사용한 문서를 주시문서 목록에 추가",
     	"tog-minordefault": "모든 편집에 기본적으로 사소한 편집을 표시",
    @@ -184,7 +184,7 @@
     	"category_header": "\"$1\" 분류에 속하는 문서",
     	"subcategories": "하위 분류",
     	"category-media-header": "\"$1\" 분류에 속하는 미디어",
    -	"category-empty": "이 분류에 속하는 문서나 자료가 없습니다.",
    +	"category-empty": "<em>이 분류에는 문서나 자료가 하나도 없습니다.</em>",
     	"hidden-categories": "{{PLURAL:$1|숨은 분류|숨은 분류}}",
     	"hidden-category-category": "숨은 분류",
     	"category-subcat-count": "{{PLURAL:$2|이 분류에는 하위 분류 1개만이 속해 있습니다.|다음은 이 분류에 속하는 {{PLURAL:$1|하위 분류}} $2개 가운데 $1개입니다.}}",
    @@ -364,7 +364,7 @@
     	"databaseerror-query": "쿼리: $1",
     	"databaseerror-function": "함수: $1",
     	"databaseerror-error": "오류: $1",
    -	"transaction-duration-limit-exceeded": "쓰기 시간($1)이 $2 초 제한을 초과하였으므로 이 트랜잭션은 중단되었습니다. 이는 높은 수준의 반복 지연을 피하기 위해서입니다.\n한번에 수많은 항목을 변경하려면, 작업을 여러 작은 단위로 나누어 시도하십시오.",
    +	"transaction-duration-limit-exceeded": "쓰기 시간($1)이 $2 초 제한을 초과하였으므로 이 트랜잭션은 중단되었습니다. 이는 높은 수준의 반복 지연을 피하기 위해서입니다.\n한 번에 수많은 항목을 변경하려면, 작업을 여러 작은 단위로 나누어 시도하십시오.",
     	"laggedslavemode": "<strong>경고:</strong> 문서가 최근에 바뀐 내용을 포함하지 않을 수도 있습니다.",
     	"readonly": "데이터베이스 잠김",
     	"enterlockreason": "데이터베이스를 잠그는 이유와 예상되는 기간을 적어 주세요.",
    @@ -678,7 +678,9 @@
     	"minoredit": "사소한 편집입니다",
     	"watchthis": "이 문서 주시하기",
     	"savearticle": "문서 저장",
    +	"savechanges": "변경 사항 저장",
     	"publishpage": "문서 게시",
    +	"publishchanges": "변경 사항 게시",
     	"preview": "미리 보기",
     	"showpreview": "미리 보기",
     	"showdiff": "차이 보기",
    @@ -714,7 +716,7 @@
     	"userpage-userdoesnotexist": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.\n이 문서를 만들거나 편집하기 전에 계정이 존재하는지 확인해주세요.",
     	"userpage-userdoesnotexist-view": "\"$1\" 사용자 계정은 등록되어 있지 않습니다.",
     	"blocked-notice-logextract": "이 사용자는 현재 차단되어 있습니다.\n해당 사용자의 최근 차단 기록을 참조하십시오:",
    -	"clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>파이어폭스 / 사파리</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em> 을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>구글 크롬</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>인터넷 익스플로러</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>오페라:</strong> <em>메뉴 → 설정</em>(맥의 경우 <em>오페라 → 환경 설정</em>)으로 이동한 다음 <em>개인 정보 보호 및 보안 → 검색 데이터 지우기 → 캐시한 이미지 및 파일</em>을 누름.",
    +	"clearyourcache": "<strong>참고:</strong> 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.\n* <strong>파이어폭스 / 사파리</strong>: <em>Shift</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em> 또는 <em>Ctrl-R</em>을 입력 (Mac에서는 <em>⌘-R</em>)\n* <strong>구글 크롬</strong>: <em>Ctrl-Shift-R</em>키를 입력 (Mac에서는 <em>⌘-Shift-R</em>)\n* <strong>인터넷 익스플로러</strong>: <em>Ctrl</em> 키를 누르면서 새로 고침을 클릭하거나, <em>Ctrl-F5</em>를 입력.\n* <strong>오페라:</strong> <em>메뉴 → 설정</em>(맥의 경우 <em>오페라 → 환경 설정</em>)으로 이동한 다음 <em>개인 정보 보호 및 보안 → 검색 데이터 지우기 → 캐시한 이미지 및 파일</em>을 누름.",
     	"usercssyoucanpreview": "'''안내''': CSS 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
     	"userjsyoucanpreview": "'''안내''': 자바스크립트 문서를 저장하기 전에 \"{{int:showpreview}}\" 기능을 통해 작동을 확인해주세요.",
     	"usercsspreview": "'''사용자 CSS의 미리 보기입니다.'''\n'''아직 저장하지 않았습니다!'''",
    @@ -835,7 +837,7 @@
     	"last": "이전",
     	"page_first": "처음",
     	"page_last": "마지막",
    -	"histlegend": "비교하려는 판을 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />\n설명: <strong>({{int:cur}})</strong> = 최신 판과 비교, <strong>({{int:last}})</strong> = 이전 판과 비교, <strong>{{int:minoreditletter}}</strong>= 사소한 편집",
    +	"histlegend": "차이 선택: 비교하려는 판의 라디오 상자를 선택한 다음 엔터나 아래의 버튼을 누르세요.<br />\n설명: <strong>({{int:cur}})</strong> = 최신 판과 비교, <strong>({{int:last}})</strong> = 이전 판과 비교, <strong>{{int:minoreditletter}}</strong>= 사소한 편집",
     	"history-fieldset-title": "역사 찾아보기",
     	"history-show-deleted": "삭제된 것만",
     	"histfirst": "오래됨",
    @@ -1098,7 +1100,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": "이메일 주소가 필요합니다.",
    @@ -1271,8 +1273,8 @@
     	"rightslogtext": "사용자 권한 조정 기록입니다.",
     	"action-read": "이 문서를 읽기",
     	"action-edit": "문서 편집",
    -	"action-createpage": "문서 만들기",
    -	"action-createtalk": "토론 문서 만들기",
    +	"action-createpage": "이 문서 만들기",
    +	"action-createtalk": "이 토론 문서 만들기",
     	"action-createaccount": "새 계정 만들기",
     	"action-autocreateaccount": "자동으로 이 외부 사용자 계정 생성하기",
     	"action-history": "이 문서의 역사 보기",
    @@ -1333,7 +1335,7 @@
     	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|새 문서 목록]]도 보세요)",
     	"recentchanges-legend-plusminus": "(<em>±123</em>)",
     	"recentchanges-submit": "보기",
    -	"rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 보여집니다)",
    +	"rcnotefrom": "아래는 <strong>$3, $4</strong>부터 시작하는 {{PLURAL:$5|바뀜이 있습니다}}. (최대 <strong>$1</strong>개가 표시됨)",
     	"rclistfrom": "$3 $2부터 시작하는 새로 바뀐 문서 보기",
     	"rcshowhideminor": "사소한 편집 $1",
     	"rcshowhideminor-show": "보이기",
    @@ -1451,9 +1453,9 @@
     	"uploaddisabledtext": "파일 올리기 기능이 비활성화되어 있습니다.",
     	"php-uploaddisabledtext": "PHP 파일 올리기가 비활성화되었습니다. 파일 올리기 설정을 확인하십시오.",
     	"uploadscripted": "이 파일에는 HTML이나 다른 스크립트 코드가 포함되어 있어, 웹 브라우저에서 오류를 일으킬 수 있습니다.",
    -	"upload-scripted-pi-callback": "XML 스타일시트 프로세싱 명령을 포함하는 파일은 업로드 할 수 없습니다.",
    -	"uploaded-script-svg": "업로드 된 SVG 파일에서 스크립트로 만들 수 있는 \"$1\" 요소를 발견했습니다.",
    -	"uploaded-hostile-svg": "업로드 된 SVG 파일의 스타일 요소에 안전하지 못한 CSS가 있습니다.",
    +	"upload-scripted-pi-callback": "XML 스타일시트 처리 명령을 포함하는 파일은 업로드할 수 없습니다.",
    +	"uploaded-script-svg": "업로드된 SVG 파일에서 스크립트로 만들 수 있는 \"$1\" 요소를 발견했습니다.",
    +	"uploaded-hostile-svg": "업로드된 SVG 파일의 스타일 요소에 안전하지 않은 CSS가 있습니다.",
     	"uploaded-event-handler-on-svg": "이벤트 핸들러 속성 <code>$1=\"$2\"</code> 설정은 SVG 파일에서 사용할 수 없습니다.",
     	"uploaded-href-attribute-svg": "SVG 파일의 href 속성은 http:// 또는 https:// 대상의 링크만 허용되지만 <code>&lt;$1 $2=\"$3\"&gt;</code>를 발견했습니다.",
     	"uploaded-href-unsafe-target-svg": "안전하지 않은 데이터를 가리키는 href를 발견했습니다: 업로드된 SVG 파일의 URI 대상 <code>&lt;$1 $2=\"$3\"&gt;</code>",
    @@ -1490,6 +1492,8 @@
     	"upload-http-error": "HTTP 오류 발생: $1",
     	"upload-copy-upload-invalid-domain": "이 도메인에 속하지 않는 웹사이트의 파일을 올릴 수 없습니다.",
     	"upload-foreign-cant-upload": "이 위키는 요청된 외부 파일 저장소에 파일을 업로드할 수 있도록 구성되어 있지 않습니다.",
    +	"upload-foreign-cant-load-config": "외부 파일 저장소의 파일 업로드 구성을 불러오는데 실패했습니다.",
    +	"upload-dialog-disabled": "이 대화창을 이용한 파일 올리기는 이 위키에서 비활성화되어 있습니다.",
     	"upload-dialog-title": "파일 올리기",
     	"upload-dialog-button-cancel": "취소",
     	"upload-dialog-button-done": "완료",
    @@ -1562,7 +1566,7 @@
     	"uploadstash-thumbnail": "섬네일 보기",
     	"invalid-chunk-offset": "청크 오프셋이 잘못되었습니다.",
     	"img-auth-accessdenied": "접근이 거부됨",
    -	"img-auth-nopathinfo": "PATH_INFO를 잃었습니다.\n서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.\n이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 을 참조하십시오.",
    +	"img-auth-nopathinfo": "PATH_INFO를 잃었습니다.\n서버가 이 정보를 받을 수 있도록 설정되어 있지 않습니다.\n이러한 경우는 서버가 CGI 기반이고 img_auth를 지원하지 않을 때 나타날 수 있습니다.\nhttps://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization을 참조하십시오.",
     	"img-auth-notindir": "요청한 경로가 설정한 올리기 디렉터리에 없습니다.",
     	"img-auth-badtitle": "\"$1\"에서 올바른 제목을 만들 수 없습니다.",
     	"img-auth-nologinnWL": "로그인하지 않았으며 \"$1\" 파일은 화이트리스트에 존재하지 않습니다.",
    @@ -1742,7 +1746,7 @@
     	"unusedimages": "사용하지 않는 파일 목록",
     	"wantedcategories": "필요한 분류 목록",
     	"wantedpages": "필요한 문서 목록",
    -	"wantedpages-summary": "다른 문서들에 링크는 걸려 있지만 존재하지 않는 문서들 중, 넘겨주기 문서를 제외한 목록입니다.\n존재하지 않는 문서로 넘겨주는 문서 목록을 보려면 [[{{#special:BrokenRedirects}}|the list of broken redirects]]를 참조하세요.",
    +	"wantedpages-summary": "다른 문서들에 링크는 걸려 있지만 존재하지 않는 문서들 중, 넘겨주기 문서를 제외한 목록입니다. 존재하지 않는 문서로 넘겨주는 문서 목록을 보려면 [[{{#special:BrokenRedirects}}|끊긴 넘겨주기 목록]]을 참조하세요.",
     	"wantedpages-badtitle": "문서 제목이 잘못되었습니다: $1",
     	"wantedfiles": "필요한 파일 목록",
     	"wantedfiletext-cat": "다음 파일은 쓰이고는 있지만 없는 파일입니다. 바깥 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다. 또한 없는 파일을 포함하고 있는 문서는 [[:$1]]에 올라 있습니다.",
    @@ -1805,7 +1809,7 @@
     	"pager-newer-n": "{{PLURAL:$1|다음 1개|다음 $1개}}",
     	"pager-older-n": "{{PLURAL:$1|이전 1개|이전 $1개}}",
     	"suppress": "기록보호자",
    -	"querypage-disabled": "이 특수 문서는 성능상의 이유로 비활성화되었습니다.",
    +	"querypage-disabled": "이 특수 문서는 성능 상의 이유로 비활성화되었습니다.",
     	"apihelp": "API 도움말",
     	"apihelp-no-such-module": "\"$1\" 모듈을 찾을 수 없습니다.",
     	"apisandbox": "API 실험실",
    @@ -1889,7 +1893,7 @@
     	"linksearch-ns": "이름공간:",
     	"linksearch-ok": "검색",
     	"linksearch-text": "\"*.wikipedia.org\"와 같이 와일드 카드를 사용할 수 있습니다.\n적어도 \"*.org\"와 같이 최상위 도메인을 입력해야 합니다.<br />\n지원하는 {{PLURAL:$2|프로토콜}}: $1 (프로토콜을 지정하지 않을 때 기본값은 http://)",
    -	"linksearch-line": "$2에서 $1 을 링크하고 있습니다.",
    +	"linksearch-line": "$1가 $2에서 링크됩니다.",
     	"linksearch-error": "와일드카드는 주소의 처음 부분에만 사용될 수 있습니다.",
     	"listusersfrom": "다음으로 시작하는 사용자 보기:",
     	"listusers-submit": "보기",
    @@ -1938,7 +1942,7 @@
     	"post-expand-template-argument-category-desc": "틀 변수 (<code>{{{Foo}}}</code>와 같은, 중괄호가 세 개 있는 무언가)를 확장하고 나서 문서는 <code>$wgMaxArticleSize</code>보다 커집니다.",
     	"expensive-parserfunction-category-desc": "문서에 (<code>#ifexist</code>와 같은) 느린 파서 함수가 너무 많이 쓰이고 있습니다. [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit]를 보세요.",
     	"broken-file-category-desc": "문서에 깨진 파일 링크 (파일이 존재하지 않을 때 포함되는 링크)를 포함합니다.",
    -	"hidden-category-category-desc": "기본적으로 문서에 분류 링크 상자가 보여지는 것에서 막기 위한, 분류의 문서 내용에 <code><nowiki>__HIDDENCAT__</nowiki></code>를 포함합니다.",
    +	"hidden-category-category-desc": "분류의 본문에 <code><nowiki>__HIDDENCAT__</nowiki></code>를 포함하고 있으며, 기본적으로 문서의 분류 링크 상자에서 보이지 않게 합니다.",
     	"trackingcategories-nodesc": "사용할 수 있는 설명이 없습니다.",
     	"trackingcategories-disabled": "분류가 비활성화되어 있습니다",
     	"mailnologin": "보낼 이메일 주소가 없음",
    @@ -2020,10 +2024,10 @@
     	"enotif_body_intro_moved": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|이동하였으며}} 현재 판은 $3 에서 볼 수 있습니다.",
     	"enotif_body_intro_restored": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|되살렸으며}} 현재 판은 $3 에서 볼 수 있습니다.",
     	"enotif_body_intro_changed": "{{SITENAME}} $1 문서를 $PAGEEDITDATE에 $2 사용자가 {{GENDER:$2|바꾸었으며}} 현재 판은 $3 에서 볼 수 있습니다.",
    -	"enotif_lastvisited": "마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1 을 보세요.",
    -	"enotif_lastdiff": "이 바뀜을 보려면 $1 을 보세요.",
    +	"enotif_lastvisited": "마지막으로 방문한 뒤 생긴 모든 바뀜을 보려면 $1을 보세요.",
    +	"enotif_lastdiff": "이 바뀜을 보려면 $1을 보세요.",
     	"enotif_anon_editor": "익명 사용자 $1",
    -	"enotif_body": "$WATCHINGUSERNAME님,\n\n$PAGEINTRO $NEWPAGE\n\n편집 요약: $PAGESUMMARY $PAGEMINOREDIT\n\n다음을 통해 편집자와 대화를 할 수 있습니다:\n이메일: $PAGEEDITOR_EMAIL\n위키: $PAGEEDITOR_WIKI\n\n로그인한 상태에서 이 문서를 열기 전에는 다른 알림 이메일을 더 이상 보내지 않습니다. 모든 주시 문서의 알림 딱지를 초기화할 수도 있습니다.\n\n{{SITENAME}} 알림 시스템\n\n--\n이메일 알림 설정을 바꾸시려면 이곳을 방문해주세요:\n{{canonicalurl:{{#special:Preferences}}}}\n\n주시문서 설정을 바꾸려면 다음을 사용하세요:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n주시문서에서 이 문서를 지우려면 이곳을 방문해주세요:\n$UNWATCHURL\n\n도움을 얻거나 피드백 하기:\n$HELPPAGE",
    +	"enotif_body": "$WATCHINGUSERNAME님,\n\n$PAGEINTRO $NEWPAGE\n\n편집 요약: $PAGESUMMARY $PAGEMINOREDIT\n\n다음을 통해 편집자와 대화를 할 수 있습니다:\n이메일: $PAGEEDITOR_EMAIL\n위키: $PAGEEDITOR_WIKI\n\n로그인한 상태에서 이 문서를 열기 전에는 다른 알림 이메일을 더 이상 보내지 않습니다. 모든 주시 문서의 알림 딱지를 초기화할 수도 있습니다.\n\n{{SITENAME}} 알림 시스템\n\n--\n이메일 알림 설정을 바꾸시려면 이곳을 방문해주세요:\n{{canonicalurl:{{#special:Preferences}}}}\n\n주시문서 설정을 바꾸려면 다음을 사용하세요:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\n주시문서에서 이 문서를 지우려면 이곳을 방문해주세요:\n$UNWATCHURL\n\n피드백 및 추가 도움 얻기:\n$HELPPAGE",
     	"created": "만들었",
     	"changed": "바꾸었",
     	"deletepage": "문서 삭제",
    @@ -2212,6 +2216,7 @@
     	"sp-contributions-username": "IP 주소 또는 사용자 이름:",
     	"sp-contributions-toponly": "최신판만 보기",
     	"sp-contributions-newonly": "새 글인 기여만 보기",
    +	"sp-contributions-hideminor": "사소한 편집 숨기기",
     	"sp-contributions-submit": "검색",
     	"sp-contributions-explain": "",
     	"whatlinkshere": "여기를 가리키는 문서",
    @@ -2341,8 +2346,8 @@
     	"ipbnounblockself": "자기 스스로를 차단 해제할 수 없습니다.",
     	"lockdb": "데이터베이스 잠그기",
     	"unlockdb": "데이터베이스 잠금 해제",
    -	"lockdbtext": "데이터베이스를 잠그면 모든 사용자의 편집, 환경 설정 바꾸기, 주시문서 편집 등 데이터베이스를 요구하는 모든 기능이 정지됩니다.\n정말로 잠가야 하는지를 다시 한번 확인해주세요. 관리 작업이 끝난 뒤에는 데이터베이스 잠금을 풀어야 합니다.",
    -	"unlockdbtext": "데이터베이스를 잠금 해제하면 모든 사용자의 편집, 환경 설정 바꾸기, 주시문서 편집 등 데이터베이스를 요구하는 모든 기능이 복구됩니다.\n정말로 잠금을 해제하려는지를 다시 한번 확인해주세요.",
    +	"lockdbtext": "데이터베이스를 잠그면 모든 사용자의 편집, 환경 설정 바꾸기, 주시문서 편집 등 데이터베이스에서 변경을 요구하는 모든 기능이 정지됩니다.\n정말로 잠가야 하는지 확인해 주세요. 관리 작업이 끝난 뒤에는 데이터베이스 잠금을 풀어야 합니다.",
    +	"unlockdbtext": "데이터베이스를 잠금 해제하면 모든 사용자의 편집, 환경 설정 바꾸기, 주시문서 편집 등 데이터베이스에서 변경을 요구하는 모든 기능이 복구됩니다.\n정말로 잠금을 해제해야 하는지 확인해주세요.",
     	"lockconfirm": "네, 데이터베이스를 잠급니다.",
     	"unlockconfirm": "네, 데이터베이스를 잠금 해제합니다.",
     	"lockbtn": "데이터베이스 잠그기",
    @@ -3186,7 +3191,7 @@
     	"watchlistedit-clear-submit": "주시목록 문서 지우기 (이는 영구적입니다!)",
     	"watchlistedit-clear-done": "주시문서 목록을 지웠습니다.",
     	"watchlistedit-clear-removed": "{{PLURAL:$1|문서 1개|문서 $1개}}를 제거했습니다:",
    -	"watchlistedit-too-many": "여기에 보여질 문서가 너무 많습니다.",
    +	"watchlistedit-too-many": "여기에 표시할 문서가 너무 많습니다.",
     	"watchlisttools-clear": "주시문서 목록 비우기",
     	"watchlisttools-view": "주시문서 최근 바뀜",
     	"watchlisttools-edit": "주시문서 목록 보기/편집하기",
    @@ -3221,7 +3226,7 @@
     	"version-ext-colheader-license": "라이선스",
     	"version-ext-colheader-description": "설명",
     	"version-ext-colheader-credits": "저자",
    -	"version-license-title": "$1용 라이센스",
    +	"version-license-title": "$1용 라이선스",
     	"version-license-not-found": "이 확장 기능에 대한 자세한 라이선스 정보가 없습니다.",
     	"version-credits-title": "$1의 작성자",
     	"version-credits-not-found": "이 확장 기능에 대한 자세한 제작진 정보가 없습니다.",
    @@ -3281,7 +3286,7 @@
     	"specialpages-group-developer": "개발자 도구",
     	"blankpage": "빈 문서",
     	"intentionallyblankpage": "일부러 비워 둔 문서입니다.",
    -	"external_image_whitelist": " #이 줄은 그대로 두십시오<pre>\n#정규 표현식(// 사이에 있는 부분)을 아래에 입력하세요.\n#이 목록은 바깥 그림의 URL과 대조할 것입니다.\n#이 목록과 일치하는 것은 그림이 직접 보여지지만, 그렇지 않은 경우 그림을 가리키는 링크만 보이게 될 것입니다.\n#\"#\" 문자에서 줄의 끝까지는 주석입니다\n#이 목록은 대소문자를 구별하지 않습니다\n\n#모든 정규 표현식은 이 줄 위에 넣어 주십시오. 그리고 이 줄은 그대로 두십시오.</pre>",
    +	"external_image_whitelist": " #이 줄은 그대로 두십시오<pre>\n#정규 표현식(// 사이에 있는 부분)을 아래에 입력하세요.\n#이 목록은 바깥 그림의 URL과 대조할 것입니다.\n#이 목록과 일치하는 것은 그림으로 표시되지만, 그렇지 않은 경우 그림을 가리키는 링크만 보이게 될 것입니다.\n#\"#\" 문자에서 줄의 끝까지는 주석입니다\n#이 목록은 대소문자를 구별하지 않습니다\n\n#모든 정규 표현식은 이 줄 위에 넣어 주십시오. 그리고 이 줄은 그대로 두십시오.</pre>",
     	"tags": "올바른 편집 태그",
     	"tag-filter": "[[Special:Tags|태그]] 필터:",
     	"tag-filter-submit": "필터",
    @@ -3538,7 +3543,7 @@
     	"api-error-ratelimited": "짧은 시간 안에 위키가 허용하는 것 보다 더 많은 파일을 업로드하려고 합니다.\n몇 분 뒤에 다시 시도해 주십시오.",
     	"api-error-stashfailed": "내부 오류: 서버가 임시 파일을 저장하지 못했습니다.",
     	"api-error-publishfailed": "내부 오류: 서버가 임시 파일을 게시하지 못했습니다.",
    -	"api-error-stasherror": "파일을 안전한 곳으로 업로드 하는 동안 오류가 발생했습니다.",
    +	"api-error-stasherror": "파일을 미공개 위치로 업로드하는 동안 오류가 발생했습니다.",
     	"api-error-stashedfilenotfound": "임시 저장된 파일이 임시 저장소에서 올리려고 했을 때 찾을 수 없었습니다.",
     	"api-error-stashpathinvalid": "임시 저장된 파일이 존재해야 할 경로에 유효한 파일이 없습니다.",
     	"api-error-stashfilestorage": "파일을 임시 저장하는 동안 오류가 발생했습니다.",
    @@ -3579,7 +3584,7 @@
     	"limitreport-expansiondepth": "최대 전개 깊이",
     	"limitreport-expensivefunctioncount": "부하 높은 파서 함수 수",
     	"expandtemplates": "틀 전개",
    -	"expand_templates_intro": "이 특수 문서는 글의 모든 틀을 끝까지 풀어 줍니다.\n<code><nowiki>{{</nowiki>#language:…}}</code> 같은 파서 함수나\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> 같은 변수를 풀어줍니다.\n사실 두개의 중괄호 사이에 있는 것은 거의 모두 풀어줍니다.",
    +	"expand_templates_intro": "이 특수 문서는 글의 모든 틀을 끝까지 풀어 줍니다.\n<code><nowiki>{{</nowiki>#language:…}}</code> 같은 파서 함수나\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> 같은 변수를 풀어줍니다.\n사실 두 개의 중괄호 사이에 있는 것은 거의 모두 풀어줍니다.",
     	"expand_templates_title": "문서 이름 ({{FULLPAGENAME}} 등):",
     	"expand_templates_input": "전개할 내용:",
     	"expand_templates_output": "ê²°ê³¼",
    @@ -3605,8 +3610,8 @@
     	"log-name-pagelang": "언어 바꾸기 기록",
     	"log-description-pagelang": "문서 언어를 바꾼 기록입니다.",
     	"logentry-pagelang-pagelang": "$1님이 $3의 언어를 $4에서 $5로 {{GENDER:$2|바꾸었습니다}}",
    -	"default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 {{PLURAL:$4|스킨}}이 포함된 것으로 보입니다. 스킨을 활성화{{PLURAL:$4||하고 기본값으로 선택}}하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 {{PLURAL:$5|스킨|모든 스킨}}을 활성화하려면 <code>LocalSettings.php</code> 안에 다음 {{PLURAL:$5|줄}}을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
    -	"default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
    +	"default-skin-not-found": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치에는 다음 {{PLURAL:$4|스킨}}이 포함된 것으로 보입니다. 스킨을 활성화{{PLURAL:$4||하고 기본값으로 선택}}하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.\n\n$2\n\n; 미디어위키를 설치했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안 됩니다.\n\n; 미디어위키를 업그레이드했다면:\n: 미디어위키 1.24와 새 버전은 더 이상 설치된 스킨을 자동으로 활성화하지 않습니다 ([https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: 스킨 자동발견]을 보세요). 현재 설치된 {{PLURAL:$5|스킨|모든 스킨}}을 활성화하려면 <code>LocalSettings.php</code> 안에 다음 {{PLURAL:$5|줄}}을 붙여 넣을 수 있습니다:\n\n<pre dir=\"ltr\">$3</pre>\n\n; <code>LocalSettings.php</code>를 수정했다면:\n: 스킨 이름에 오타가 났는지 다시 확인하세요.",
    +	"default-skin-not-found-no-skins": "이런! 당신의 위키에 <code dir=\"ltr\">$wgDefaultSkin</code>에 <code>$1</code>(으)로 지정한 기본 스킨은 사용할 수 없습니다.\n\n설치된 스킨은 없습니다.\n\n; 미디어위키를 설치했거나 업그레이드했다면:\n: 아마 git에서 설치했거나, 어떤 다른 방법을 사용하여 직접 설치했을 수 있을 것으로 봅니다. 미디어위키 1.24와 새 버전은 주 저장소에 어떠한 스킨도 포함되어 있지 않습니다. [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org의 스킨 디렉터리]에서 어떤 스킨을 설치해보세요:\n:* 여러 스킨과 확장 기능이 들어 있는 [https://www.mediawiki.org/wiki/Download tarball 설치 관리자]를 다운로드하세요. 거기서 <code>skins/</code> 디렉터리를 복사하여 붙여 넣을 수 있습니다.\n:* [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org]에서 개별 스킨 tarball을 다운로드하세요.\n:* 미디어위키 설치의 <code dir=\"ltr\">skins/</code> 디렉터리 안에 git를 통해 <code>mediawiki/skins/*</code> 저장소 중 하나를 복제하세요.\n: 당신이 미디어위키 개발자이면 당신의 git 저장소를 방해하면 안 됩니다. 스킨을 활성화하고 기본값으로 선택하는 방법에 대한 정보에 대해서는 [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: 스킨 설정]을 보세요.",
     	"default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (활성화)",
     	"default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>비활성화</strong>)",
     	"mediastatistics": "미디어 통계",
    @@ -3723,9 +3728,10 @@
     	"log-action-filter-upload-overwrite": "다시 업로드",
     	"authmanager-authn-not-in-progress": "인증이 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
     	"authmanager-authn-no-primary": "제공된 자격 증명으로 인증할 수 없습니다.",
    -	"authmanager-authn-no-local-user": "자격 증명으로 이 위키의 어느 사용자로도 로그인 할 수 없습니다.",
    +	"authmanager-authn-no-local-user": "자격 증명으로 이 위키의 어느 사용자로도 로그인할 수 없습니다.",
     	"authmanager-authn-no-local-user-link": "제공된 자격 증명은 유효하지만 이 위키의 어느 사용자와도 연결되어 있지 않습니다. 다른 방식으로 로그인하거나, 새로운 사용자를 생성하면 자격 증명을 계정에 추가할 수 있게 됩니다.",
     	"authmanager-authn-autocreate-failed": "로컬 계정 자동 생성 실패: $1",
    +	"authmanager-change-not-supported": "지정된 자격 증명을 사용하고 있는 곳이 없어서 변경할 수 없습니다.",
     	"authmanager-create-disabled": "계정 만들기가 금지되어 있습니다.",
     	"authmanager-create-from-login": "계정을 만드려면, 아래의 칸들을 채워 주십시오.",
     	"authmanager-create-not-in-progress": "계정 만들기가 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
    @@ -3780,7 +3786,7 @@
     	"changecredentials-success": "자격 증명이 변경되었습니다.",
     	"removecredentials": "자격 증명 제거",
     	"removecredentials-submit": "자격 증명 제거",
    -	"removecredentials-invalidsubpage": "$1 은(는) 유효한 자격 증명이 아닙니다.",
    +	"removecredentials-invalidsubpage": "$1은(는) 유효한 자격 증명이 아닙니다.",
     	"removecredentials-success": "자격 증명이 제거되었습니다.",
     	"credentialsform-provider": "자격 증명:",
     	"credentialsform-account": "계정 이름:",
    @@ -3790,5 +3796,6 @@
     	"linkaccounts-success-text": "계정이 연결되었습니다.",
     	"linkaccounts-submit": "계정 연결",
     	"unlinkaccounts": "계정 연결 해제",
    -	"unlinkaccounts-success": "계정의 연결이 해제되었습니다."
    +	"unlinkaccounts-success": "계정의 연결이 해제되었습니다.",
    +	"authenticationdatachange-ignored": "인증 데이터 변경을 처리하지 못했습니다. 제공자를 설정하지 않으셨습니까?"
     }
    diff --git a/languages/i18n/krl.json b/languages/i18n/krl.json
    index eea6d36d60..17f733d8bf 100644
    --- a/languages/i18n/krl.json
    +++ b/languages/i18n/krl.json
    @@ -31,7 +31,7 @@
     	"sat": "Å uo",
     	"january": "Pakkaiskuu",
     	"february": "Tuiskukuu",
    -	"march": "kevätkuu",
    +	"march": "Kevätkuu",
     	"april": "Å ulakuu",
     	"may_long": "Oraškuu",
     	"june": "Kešäkuu",
    @@ -77,7 +77,7 @@
     	"october-date": "$1. Å¡ajekuuta",
     	"november-date": "$1. pimiekuuta",
     	"december-date": "$1. talvikuuta",
    -	"pagecategories": "{{PLURAL:$1|Kategorija|Kategorijat}}",
    +	"pagecategories": "{{PLURAL:$1|Luokka|Luokat}}",
     	"category_header": "Šivut, kumpaset ollah luokašša $1",
     	"subcategories": "Alaluokat",
     	"category-media-header": "Medijafailit luokašša «$1»",
    @@ -85,6 +85,7 @@
     	"hidden-category-category": "Peitetyt luokat",
     	"category-subcat-count": "{{PLURAL:$2|Täššä luokašša on vain tämä alaluokka.|Täššä luokašša on nämä {{PLURAL:$1|subcategory|$1 alaluokkua}}, kaikkieštah $2.}}",
     	"category-article-count": "{{PLURAL:$2|Täššä luokašša on vain tämä šivu.|{{PLURAL:$1|Tämä šivu on|$1 Nämä šivut ollah}} täššä luokašša, $2 kaikkieštah.}}",
    +	"category-file-count": "{{PLURAL:$2|Täššä luokašša on vain tämä šivu.|{{PLURAL:$1|Tämä šivu on|$1 Nämä šivut ollah}} täššä luokašša, $2 kaikkieštah.}}",
     	"listingcontinuesabbrev": "jatkuu",
     	"about": "Tietuo",
     	"article": "Å ivu",
    @@ -93,7 +94,7 @@
     	"moredotdotdot": "Lisyä...",
     	"mypage": "Å ivu",
     	"mytalk": "Pakinat",
    -	"navigation": "Valikko",
    +	"navigation": "Navigacija",
     	"and": "&#32;ta",
     	"qbfind": "Eči",
     	"qbedit": "Kohenna",
    @@ -104,7 +105,7 @@
     	"navigation-heading": "Navigacija",
     	"errorpagetitle": "Hairahuš",
     	"returnto": "Myöššy šivulla $1.",
    -	"tagline": "{{SITENAME}}päin",
    +	"tagline": "Lähteh {{SITENAME}}",
     	"help": "Kyšy apuo",
     	"search": "Eči",
     	"searchbutton": "Eči",
    @@ -134,22 +135,22 @@
     	"redirectto": "Ohjauš šivulla:",
     	"lastmodifiedat": "Viimesekši tätä šivuo on kohenneltu $1, $2 aikah.",
     	"jumpto": "Å iirry:",
    -	"jumptonavigation": "valličenduun",
    -	"jumptosearch": "ečintä",
    +	"jumptonavigation": "navigacija",
    +	"jumptosearch": "eči",
     	"aboutsite": "Tietuo {{SITENAME}}",
     	"aboutpage": "Project:Tietoja",
     	"copyrightpage": "{{ns:project}}:Tekijänoikeuvet",
     	"currentevents": "Ajankohtaset tapahtumat",
     	"currentevents-url": "Project:Ajankohtaset tapahukšet",
     	"disclaimers": "Vaštuuvapauš",
    -	"disclaimerpage": "Project:Vastuuvälly",
    +	"disclaimerpage": "Project:Vaštuuvapauš",
     	"edithelp": "Apu kohentelomiseh",
     	"mainpage": "Piäšivu",
     	"mainpage-description": "Piäšivu",
    -	"portal": "Kahvihuoneh",
    -	"portal-url": "Project:Kahvihuoneh",
    +	"portal": "Ryhmän portali",
    +	"portal-url": "Project:Ryhmän portali",
     	"privacy": "Tietošuojakäytäntö",
    -	"privacypage": "Project:Tiedošuojuskäytändö",
    +	"privacypage": "Project:Tietošuojakäytäntö",
     	"ok": "OK",
     	"retrievedfrom": "Lähte - \"$1\"",
     	"youhavenewmessages": "{{PLURAL:$3|Å iula on}} $1 ($2).",
    @@ -157,7 +158,7 @@
     	"editold": "kohenna",
     	"viewsourceold": "näytä wikiteksti",
     	"editlink": "kohentele",
    -	"viewsourcelink": "näytä lähtekoodi",
    +	"viewsourcelink": "näytä lähtehkoodi",
     	"editsectionhint": "Korjua ošua: $1",
     	"toc": "Šisällyšluvettelo",
     	"showtoc": "näytä",
    @@ -182,6 +183,7 @@
     	"databaseerror-query": "Kyšely: $1",
     	"databaseerror-error": "Hairahuš: $1",
     	"badtitle": "Å ivun nimi ei kelpua",
    +	"badtitletext": "Šiun annetti šivunimi oli virheellini, tyhjä tahi viärin linkitetty kielienvälini tahi wikienvälini nimi.\nSiinä suattau olla yksi tahi usiempi sellani merkki, kumpasta ei voi käyttyä šivujen nimissä.",
     	"viewsource": "näytä lähtehkoodi",
     	"yourname": "Käyttäjänimi:",
     	"userlogin-yourname": "Käyttäjänimi",
    @@ -215,7 +217,7 @@
     	"createacct-benefit-body2": "$1 {{PLURAL:$1|Å¡ivu|Å¡ivuo}}",
     	"createacct-benefit-body3": "{{PLURAL:$1|Jälkimmäini käyttäjä|Jälkimmäistä käyttäjyä}}",
     	"loginlanguagelabel": "Kieli: $1",
    -	"pt-login": "Kirjauvu",
    +	"pt-login": "Kirjuttauvu",
     	"pt-login-button": "Kirjauvu šiämeh",
     	"pt-createaccount": "Luo tunnuš",
     	"pt-userlogout": "Kirjauvu pois",
    @@ -250,6 +252,7 @@
     	"blockednoreason": "ei šyytä annettu",
     	"loginreqlink": "kirjauvu šiämeh",
     	"newarticle": "(Uuši)",
    +	"newarticletext": "Olet piätynyn šivulla, kumpasta ei ole. Ku luatie šivu, rupie kirjuttamah alla olijah juaššiekkah (kačo [$1 ohjavošivulta] lisätietuo).\nKu ollet piätynyn tänne petties, käytä livaimen <strong>mennä järilleh</strong>-toimintuo.",
     	"noarticletext": "Tällä šivulla ei ole juuri nyt tekstie.\nVoit [[Special:Search/{{PAGENAME}}|eččie šivun nimellä]] muilta šivuilta,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie šitä koškijua logie],\ntahi [{{fullurl:{{FULLPAGENAME}}|action=edit}} luuvva tämän šivun]</span>.",
     	"noarticletext-nopermission": "Tällä šivulla ei ole juuri nyt tekstie.\nVoit [[Special:Search/{{PAGENAME}}|eččie šivun nimellä]] muilta šivuilta, tahi <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} eččie šivuo koškijua logie]</span>, ka šiula ei ole oikeutta luuvva tätä šivuo.",
     	"editing": "Kohennellah sivuu $1",
    @@ -258,7 +261,10 @@
     	"templatesused": "Tällä šivulla {{PLURAL:$1|käytetty malli|käytetyt mallit}}:",
     	"template-protected": "(Å¡uojattu)",
     	"template-semiprotected": "(ošittain šuojattu)",
    +	"hiddencategories": "Tämä šivu kuuluu {{PLURAL:$1|1 peitettyh kategorijah|$1 peitettylöih kategorijoih}}:",
     	"permissionserrorstext-withaction": "Šiula ei ole oikeutta {{lcfirst:$2}} {{PLURAL:$1|šeuruavašta šyyštä|šeuruavista šyistä}}:",
    +	"moveddeleted-notice": "Tämä šivu on otettu iäre. Šivun iäreotanta- ta siirtoistorija ollah annettu alla viittavuksena.",
    +	"viewpagelogs": "Näytä tämän šivun lokit",
     	"currentrev-asof": "Nykyni versija $1",
     	"revisionasof": "Versija $1",
     	"revision-info": "Versija $1 {{GENDER:$6|$2}}$7",
    @@ -273,6 +279,7 @@
     	"difference-title": "Ero šivun ”$1” versijien välillä",
     	"lineno": "Rivi $1:",
     	"editundo": "lakauttua",
    +	"diff-multi-sameuser": "({{PLURAL:$1|Yksi keskitason versija |$1 keskitason versijua}} samalta käyttäjältä ei näytetty)",
     	"searchresults": "Eččimisen tulokšet",
     	"searchresults-title": "Eči \"$1\"",
     	"prevn": "iellini {{PLURAL:$1|$1}}",
    @@ -280,6 +287,7 @@
     	"nextn-title": "Šeuruava $1 {{PLURAL:$1|tuloš|tulokšet}}",
     	"shown-title": "Näytä $1 {{PLURAL:$1|tuloš|tulošta}} šivulla",
     	"viewprevnext": "Näytä ($1 {{int:pipe-separator}} $2) ($3)",
    +	"searchmenu-new": "<strong>Luaji šivu \"[[:$1]]\" täh wikih!</strong> {{PLURAL:$2|0=|Kačo niise šiun eččolla löyvetyt šivut.|Kačo niise löyvetyt ečon tulokšet.}}",
     	"searchprofile-articles": "Šisältöšivut",
     	"searchprofile-images": "Multimedija",
     	"searchprofile-everything": "Kaikki",
    @@ -303,9 +311,9 @@
     	"recentchanges": "Uuvvet muutokšet",
     	"recentchanges-legend": "Verekšien kohennukšien ašetukšet",
     	"recentchanges-summary": "Tällä šivulla voit šeurata verekšie täh wikih luajittuja muutokšie.",
    -	"recentchanges-label-newpage": "Tämä muutoš loi uuvven šivun",
    -	"recentchanges-label-minor": "Tämä on pieni muutoš",
    -	"recentchanges-label-bot": "Tämän muutokšen šuoritti botti",
    +	"recentchanges-label-newpage": "Tämä kohennuš on johtan uuvven šivun luatimiseh",
    +	"recentchanges-label-minor": "Tämä on pieni kohennuš",
    +	"recentchanges-label-bot": "Tämän kohennukšen šuoritti botti",
     	"recentchanges-label-unpatrolled": "Tätä kohennušta ei ole vielä tarkissettu",
     	"recentchanges-label-plusminus": "Šivu on kašvan [] baitilla",
     	"recentchanges-legend-heading": "<strong>Šelityš:</strong>",
    @@ -333,11 +341,11 @@
     	"minoreditletter": "p",
     	"newpageletter": "U",
     	"boteditletter": "b",
    -	"rc-change-size-new": "$1 {{PLURAL:$1|tavu|tavuo}} muutokšien jälkeh",
    +	"rc-change-size-new": "$1 {{PLURAL:$1|baitti|baittie}} muutokšien jälkeh",
     	"recentchangeslinked": "Toini toišeh liittyjät kohennukšet",
     	"recentchangeslinked-toolbox": "Toini toiseh liittyjät kohennukšet",
     	"recentchangeslinked-title": "Šivuo \"$1\" koškijat muutokšet",
    -	"recentchangeslinked-summary": "Tämä on niijen šivujen korjaukšien luvettelo, kumpasih viittuau tämä šivu (tahi šiih luokkah kuulujat). Šivut, kumpaset kuulutah [[Special:Watchlist|teijän valvontaluvettelo]], ollah  <strong>bold</strong>.",
    +	"recentchangeslinked-summary": "Tämä on niijen šivujen korjaukšien luvettelo, kumpasih viittuau tämä šivu (tahi šiih luokkah kuulujat). Šivut, kumpaset kuulutah [[Special:Watchlist|teijän valvontaluvetteloh]], ollah kirjutettu <strong>lihavalla</strong>.",
     	"recentchangeslinked-page": "Å ivun nimi:",
     	"recentchangeslinked-to": "Näytä šen šijah muutokšet šivuloih, kumpasista on linkki täh šivuh",
     	"upload": "Tallenna faili",
    @@ -347,7 +355,7 @@
     	"file-anchor-link": "Faili",
     	"filehist": "Failin istorija",
     	"filehist-help": "Klikkua päivämiäryä/aikua, jotta kaččuo, mimmoni faili oli šilloin",
    -	"filehist-current": "nykyni",
    +	"filehist-current": "nykyhini",
     	"filehist-datetime": "Päiväyš",
     	"filehist-thumb": "Pieni kuva",
     	"filehist-thumbtext": "Pieni kuva versijah $1",
    @@ -361,7 +369,7 @@
     	"upload-disallowed-here": "Et voi tallentua uutta tiijoštuo tämän tilalla.",
     	"randompage": "Sattumanvarani Å¡ivu",
     	"brokenredirects-edit": "kohentele",
    -	"nbytes": "$1 {{PLURAL:$1|tavu|tavuo}}",
    +	"nbytes": "$1 {{PLURAL:$1|baitti|baittie}}",
     	"nmembers": "$1 {{PLURAL:$1|käyttäjä|käyttäjyä}}",
     	"newpages": "Uuvvet Å¡ivut",
     	"move": "siirdyä",
    @@ -377,8 +385,10 @@
     	"watchlist": "Kaččuolistu",
     	"mywatchlist": "Valvontaluvettelo",
     	"watch": "Valvo",
    +	"dellogpage": "Iäreotantaistorija",
     	"rollbacklink": "Tuo entini versija",
     	"rollbacklinkcount": "palauta $1 {{PLURAL:$1|muutoš|muutošta}}",
    +	"protectlogpage": "Å uojavusistorija",
     	"protectcomment": "Å yy",
     	"restriction-edit": "Kohennuš",
     	"undelete-search-submit": "Ečindy",
    @@ -387,9 +397,9 @@
     	"tooltip-invert": "Valiče tämä kohta, još haluot peittyä tämän šivun muutokšet valitullla nimitilalla",
     	"namespace_association": "Liittyjät nimitilat",
     	"tooltip-namespace_association": "Valiče tämä kohta, još haluot lisätä niise valittuh nimitilah liittyjät pakina- tahi aihenimitilat",
    -	"blanknamespace": "(lehytyt)",
    +	"blanknamespace": "(Piä)",
     	"contributions": "{{GENDER:$1|Käyttäjän}} panoš",
    -	"mycontris": "Omat kohendukset",
    +	"mycontris": "Omat kohennukšet",
     	"anoncontribs": "Omat kohennukšet",
     	"month": "Täššä kuušša (tahi aijempi)",
     	"year": "Vuosi",
    @@ -411,6 +421,7 @@
     	"ipblocklist-submit": "Ečindy",
     	"blocklink": "Lukiče",
     	"contribslink": "kohennukšet",
    +	"movelogpage": "Šiirrä loki",
     	"movereason": "Å yy",
     	"export": "Vie Å¡ivuja",
     	"allmessagesname": "Nimi",
    @@ -421,7 +432,7 @@
     	"tooltip-pt-preferences": "{{GENDER:|Omat ašetukset}}",
     	"tooltip-pt-watchlist": "Lista šivuista, kumpasien muutokšie valvot",
     	"tooltip-pt-mycontris": "Luvettelo {{GENDER:|šiun}} kirjutukšista",
    -	"tooltip-pt-login": "Kirjauvu šiämeh ta luo tunnuš",
    +	"tooltip-pt-login": "Täššä voit kirjuttautuo, ka še ei ole välttämätöintä",
     	"tooltip-pt-logout": "Kirjauvu pois",
     	"tooltip-pt-createaccount": "Voit luuvva käyttäjätunnuš ta kirjuttautuo järještelmäh. Še ei kuiteinkana ole pakollista.",
     	"tooltip-ca-talk": "Pakaja piäšivušta",
    @@ -430,26 +441,26 @@
     	"tooltip-ca-viewsource": "Tämä šivu on šuojattu.\nVoit kaččuo šen lähtehkoodin",
     	"tooltip-ca-history": "Tämän šivun jälkimmäiset versijat",
     	"tooltip-ca-move": "Šiirrä tämä šivu",
    -	"tooltip-ca-watch": "Lišiä tämä šivu omah valvontaluvetteloh",
    +	"tooltip-ca-watch": "Lisyä tämä šivu omah valvontaluvetteloh",
     	"tooltip-search": "Eči {{SITENAME}}",
     	"tooltip-search-go": "Mäne šivulla, kumpasella on šama nimi",
     	"tooltip-search-fulltext": "Eči šivuja, kumpasissa on tätä tekstie",
     	"tooltip-p-logo": "Šiirry piäšivulla",
     	"tooltip-n-mainpage": "Mäne piäšivulla",
    -	"tooltip-n-mainpage-description": "Šiirry piäšivulla",
    +	"tooltip-n-mainpage-description": "Mäne piäšivulla",
     	"tooltip-n-portal": "Tietuo täšta projektista, mitä voit ruatua, missä mitä on",
     	"tooltip-n-currentevents": "Lisätietuo tämänhetkisistä tapahtumista",
     	"tooltip-n-recentchanges": "Luvettelo vaštaluajituista muutokšista",
     	"tooltip-n-randompage": "Kačo šattumanvarani šivu",
     	"tooltip-n-help": "Täštä voit kyšyö apuo",
    -	"tooltip-t-whatlinkshere": "Kaikkien šivuloin luvettelo, kumpasišta on linkki täh sivuh",
    +	"tooltip-t-whatlinkshere": "Kaikkien šivujen luvettelo, kumpasista on linkki täh šivuh",
     	"tooltip-t-recentchangeslinked": "Viimesimmät muokkaukšet šivuloilla, kumpasih viitatah tältä šivulta",
     	"tooltip-feed-atom": "Atom-šyöte tällä sivulla",
     	"tooltip-t-contributions": "Lista tämän käyttäjän kirjutukšista {{GENDER:$1|this user}}",
     	"tooltip-t-upload": "Tallenna failija",
    -	"tooltip-t-specialpages": "Näytä toimintosivut",
    +	"tooltip-t-specialpages": "Kaikkien erikoisien Å¡ivujen luvettelo",
     	"tooltip-t-print": "Šivun tuloštettava versija",
    -	"tooltip-t-permalink": "Ikilinkki šivun täh versijah",
    +	"tooltip-t-permalink": "Vakituini linkki šivun täh versijah",
     	"tooltip-ca-nstab-main": "Näytä šisältöšivu",
     	"tooltip-ca-nstab-user": "Näytä käyttäjäšivu",
     	"tooltip-ca-nstab-special": "Tämä on erikoini šivu, šitä ei voi kohennella",
    @@ -461,6 +472,7 @@
     	"tooltip-preview": "Esikačo muutokšet. Ole hyvä, luaji šitä aina ennen tallennušta.",
     	"tooltip-diff": "Näytä luajitut muutokšet",
     	"tooltip-rollback": "Pyyhi pois viimesen kohentelijan luatimat muutokšet yhellä kertua",
    +	"tooltip-undo": "Kumoamini palauttau tämän muutokšen ta avuau artikkelin esikaččelussa. Yhtehvetokenttäh voi kirjuttua palautukšen šyyn.",
     	"tooltip-summary": "Kirjuta lyhyt kuvauš",
     	"simpleantispam-label": "Anti-spam-tarkissuš. \n<strong>älä</strong> täytä tätä!",
     	"pageinfo-toolboxlink": "Å ivun tiijot",
    @@ -471,10 +483,10 @@
     	"svg-long-desc": "SVG-faili, oletuštarkkuš $1 × $2 pikselie, failin koko: $3",
     	"show-big-image": "Alkuperäni faili",
     	"show-big-image-preview": "Tämän failin koko: $1.",
    -	"show-big-image-other": "Toini {{PLURAL:$2|resolution|resolutions}}: $1.",
    +	"show-big-image-other": "{{PLURAL:$2|Toini resolutija|Toiset resolutijat}}: $1.",
     	"show-big-image-size": "$1 × $2 kuvapistehtä",
     	"ilsubmit": "Ečintä",
    -	"metadata": "Metatiijostot",
    +	"metadata": "Metatiijoštot",
     	"metadata-help": "Failih kuulutah lisätiijot, kumpasie tavan mukah lisätäh digikameralla tahi skannerilla. Još kuvua on muokattu šen alkuperäsen luonnan jälkeh, niin eryähät parametrit voijah erota nykyseštä kuvašta.",
     	"metadata-fields": "Šeuruavat metatietojen kentät ruvetah näkymäh kuvašivulla, konša metatietojen taulukko ei ole näkyvissä.\nMuut kentät ollah automattisešti piilotettuja.\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-orientation": "Å uunta",
    @@ -495,7 +507,7 @@
     	"version": "Versijo",
     	"version-specialpages": "Toimintošivut",
     	"fileduplicatesearch-submit": "Ečindy",
    -	"specialpages": "Erityinen lehytyt",
    +	"specialpages": "Erikoiset Å¡ivut",
     	"tag-filter": "[[Special:Tags|Tag]] filtri:",
     	"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Merkki|Merkit}}]]: $2)",
     	"logentry-delete-delete": "$1 {{GENDER:$2|iäreotettu}} šivu $3",
    diff --git a/languages/i18n/ksh.json b/languages/i18n/ksh.json
    index 92895f30b2..fb4c899651 100644
    --- a/languages/i18n/ksh.json
    +++ b/languages/i18n/ksh.json
    @@ -28,6 +28,7 @@
     	"tog-watchdefault": "Donn Sigge beim Ändere automattesch för ming Oppaßlėß vörschlonn",
     	"tog-watchmoves": "Donn Sigge beim Ömnänne automattesch för ming Oppaßlėß vörschlonn",
     	"tog-watchdeletion": "Donn Sigge beim Fottschmiiße automattesch för ming Oppaßlėß vörschlonn",
    +	"tog-watchuploads": "Donn neu huhjelahde Datteije en ming Oppassleß.",
     	"tog-watchrollback": "Donn Sigge beim schtantepee retuur Nämme vun Änderonge automattesch för ming Oppaßlėß vörschlonn",
     	"tog-minordefault": "Dun all ming Änderonge jehdes Mohl als klein Mini-Änderonge vörschlonn",
     	"tog-previewontop": "Zeisch de Vör-Aanseesch övver däm Fäld för der Täx enzejävve aan.",
    @@ -427,6 +428,7 @@
     	"userlogin-resetpassword-link": "Paßwoot verjäße?",
     	"userlogin-helplink2": "Hölp mem Enlogge",
     	"userlogin-loggedin": "Do bes ald als {{GENDER:$1|dä Metmaacher|de Metmaacherėn|dä Metmaacher|de Metmaacherėn|dä Metmaacher}} [[User:$1|$1]] enjelogg. Met heh dämm Fommolaa kanns De jäz ävver onger enem andere Nahme enlogge.",
    +	"userlogin-reauth": "Do moß desch norr_ens enlogge, öm nohzewiise, dat De verhaftesch {{GENDER:$1|dä|dat|dä Metmaacher|de|dat}} $1 bes.",
     	"userlogin-createanother": "Donn ene zohsäzlejje Zohjang aanlääje",
     	"createacct-emailrequired": "Ding Addräß för de <i lang=\"en\">e-mail</i>",
     	"createacct-emailoptional": "Ding Addräß för de <i lang=\"en\">e-mail</i>, kann fott bliive",
    @@ -611,7 +613,9 @@
     	"minoredit": "Dat es en klein Änderong (mini)",
     	"watchthis": "Op di Sigg heh oppaßße",
     	"savearticle": "De Sigg Avspeichere",
    +	"savechanges": "Afschpeijschere",
     	"publishpage": "Veröffentlesche",
    +	"publishchanges": "Veröffentlesche",
     	"preview": "Vör-Ansich",
     	"showpreview": "Vöraff belohre",
     	"showdiff": "Veränderonge zeije",
    @@ -627,7 +631,7 @@
     	"previewerrortext": "Ene Fähler es beim Versohch opjetrodde, de Sigg met de Änderonge aanzezeije.",
     	"blockedtitle": "Dä Metmaacher es jesperrt",
     	"blockedtext": "'''Dinge Metmaacher-Nahme oder IP Adress es vun „$1“ jesperrt woode.'''\n\nAls Jrund es enjedrage: „''$2''“\n\nDo kanns heh em Wiki immer noch lässe. Do sühß ävver di Sigg heh, wann De op rude Links klicks, neu Sigge aanlääje, udder Sigge ändere wells, denn doför bes De jäz jeschperrt.\n\nDo kanns met $1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] övver dat Schpärre schwaade, wann De wells.\nDo kanns ävver nor dann „''E-Mail aan dä Metmaacher''“ aanwände, wann De ald en E-Mail Adress en Dinge [[Special:Preferences|Enstellunge]] enjedrage un freijejovve häs un wann et E-mail schecke nit metjesperrt es.\n\nDun en Ding Aanfroge nenne:\n* Dä Wikki-Köhbeß, dä jeschpächt hät: $1\n* Der Jrond för et Schpärre: $2\n* Da wood jesperrt: $8\n* De Sperr soll loufe bes: $6\n* De Nommer vun dä Schpärr: #$5\n* Ding IP-Adress is jetz: $3\n* Di Sperr es wäje odde jäje: $7\n\nDo kanns och noch en et <span class=\"plainlinks\">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 Logbohch met de Schpärre]</span> loore.",
    -	"autoblockedtext": "'''Ding IP Adress es automattesch jesperrt woode.'''\n<br />\n'''Se wor vun enem Metmaacher jebruch woode, dä vun „$1“ jesperrt woode es.'''\n<br />\nAls Jrund es enjedrage: „''$2''“\n\nDo kanns heh em Wiki immer noch lesse. Do sühß ävver di Sigg heh, wann De op rude Links klicks, neu Sigge aanlääje, odder Sigge ändere wells, denn doför bes De jetz jesperrt.\n\nDo kanns met $1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] övver dat Schpärre schwaade, wann De wells.\nDo kanns ävver nor dann „''e-mail aan dä Metmaacher''“ aanwende, wann De ald en e-mail Adress en Dinge [[Special:Preferences|Enstellunge]] enjedrage un freijejovve häs un wann et e-mail schecke nit metjeschperrt es.\n\nDun en Dinge Aanfrore nänne:\n* Dä Wiki-Köbeß, dä jesperrt hät: $1\n* Der Jrond för et Sperre: $2\n* Da wood jesperrt: $8\n* De Sperr soll loufe bes: $6\n* De Nommer vun dä Sperr: #$5\n* Ding IP-Adress is jetz: $3\n* Di Sperr es wäje odde jäje: $7\n\nDo kanns och noch en et <span class=\"plainlinks\">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 {{int:ipblocklist}}]</span> loore.",
    +	"autoblockedtext": "'''Ding IP Adress es automattesch jeschpächt woode.'''\n<br />\n'''Se wohr vun enem Metmaacher jebruch woode, dä vun „$1“ jeschpächt woode es.'''\n<br />\nAls Jrond es enjedrage: „''$2''“\n\nDo kanns heh em Wikki emmer noch lesse. Do sühß ävver di Sigg heh, wann De op ene rude Lengk klrks, neu Sigge aanlääje, udder Sigge änndere wells, denn doför bes De jäz jeschpächt.\n\nDo kanns met $1 oder enem andere [[{{MediaWiki:Grouppage-sysop}}|Wiki-Köbes]] övver dat Schpärre schwaade, wann De wells.\nDo kanns ävver nor dann „''e-mail aan dä Metmaacher''“ aanwende, wann De ald en e-mail Adress en Dinge [[Special:Preferences|Enstellunge]] enjedrage un freijejovve häs un wann et e-mail schecke nit metjeschperrt es.\n\nDun en Dinge Aanfrore nänne:\n* Dä Wiki-Köbeß, dä jesperrt hät: $1\n* Der Jrond för et Sperre: $2\n* Da wood jesperrt: $8\n* De Sperr soll loufe bes: $6\n* De Nommer vun dä Sperr: #$5\n* Ding IP-Adress is jetz: $3\n* Di Sperr es wäje odde jäje: $7\n\nDo kanns och noch en et <span class=\"plainlinks\">[{{fullurl:Special:IPBlockList|&action=search&limit=&ip=%23}}$5 {{int:ipblocklist}}]</span> loore.",
     	"blockednoreason": "Keine Aanlass aanjejovve",
     	"whitelistedittext": "Do mööts ald $1, öm heh em Wiki Sigge ändere ze dürfe.",
     	"confirmedittext": "Do muss Ding E-Mail Adress ald bestätich han, ih dat De heh Sigge ändere darfs.\nDrag Ding E-Mail Adress en Ding [[Special:Preferences|ming Ennschtällong]] en, un dun „Dun Ding <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>-Adräß bestätije looße“ klicke.",
    @@ -769,7 +773,7 @@
     	"last": "met dovör",
     	"page_first": "Aanfang",
     	"page_last": "Engk",
    -	"histlegend": "Heh kanns De Versione för et Verjliiche ußsöke: Dun met dä Knöpp di zweij markiere,\nzwesche dänne De de Ungerscheid jezeich krije wells, dann dröck „<b style=\"padding:2px; background-color:#ddd;\ncolor:black\">{{int:compareselectedversions}}</b>“ udder „<b style=\"padding:2px; background-color:#ddd;\ncolor:black\">{{int:visualcomparison}}</b>“ udder „<b style=\"padding:2px; background-color:#ddd;\ncolor:black\">{{int:wikicodecomparison}}</b>“ met Dinge Taste, oder klick op ein vun dä Knöpp övver oder unger de Liss.<br />\nVerklierung:\n({{int:cur}}) = donn met de neuste Väsjohn verjliche,\n({{int:last}}) = donn met de Väsjohn ein doför verjliche,\n<b>M</b> = en klein <b>M</b>ini-Änderong,\nDattum+Uhrzigg = don de Version fun dämm Daach un dä Zigg aanzeije.",
    +	"histlegend": "Heh kanns De Väsiohne för et Verjliische ußsöhke: Dun met dä Knöpp di zweij makehre, zwesche dänne De de Ungerscheid jezeich krije wells, dann dröck „<b style=\"padding:2px; background-color:#ddd; color:black\">{{int:compareselectedversions}}</b>“ udder klek op ein vun dä Knöpp övver udder onger dä Less.<br />\nVerklierung:\n({{int:cur}}) = donn met de neuste Väsjohn verjliische,\n({{int:last}}) = donn met de Väsjohn ein doför verjliische,\n<b>{{int:minoreditletter}}</b> = en klein <strong>M</strong>ini-Änderong,\nDattum+Uhrzigg = don de Väsjohn fun dämm Daach un dä Zigg aanzeije.",
     	"history-fieldset-title": "Wat uß de Verjangeheit ußwähle?",
     	"history-show-deleted": "blohß fottjeschmeße Versione",
     	"histfirst": "de Ählste",
    @@ -855,7 +859,7 @@
     	"mergehistory-from": "Ursprongssigg:",
     	"mergehistory-into": "Zielsigg:",
     	"mergehistory-list": "Versione, di zosamme jelaat wäde künne",
    -	"mergehistory-merge": "De Versione onge künne fun „[[:$1]]“ noh „[[:$2]]“ övverdraare wäde.\nDonn de Version makeere bes wohen (inklusive) dat övverdraare wäde sull. Donn drop aachjevve, dat de Ußwahl fott es, wann De op eine fun dä Links klicks.",
    +	"mergehistory-merge": "De Versione onge künne fun „[[:$1]]“ noh „[[:$2]]“ övverdrahre wäde.\nDonn de Väsjon makehre bes wohen (inklusive) dat övverdrahre wähde sull. Donn drobb aachjevve, dat de Ußwahl fott es, wann De op eine fun dä Lengk kleks.",
     	"mergehistory-go": "Don Versione zeije, di mer zosamme läje künne",
     	"mergehistory-submit": "Versione zosamme läje",
     	"mergehistory-empty": "Mer han kei Versione för zesammezeläje",
    @@ -884,7 +888,7 @@
     	"difference-title-multipage": "Ongerscheide zwesche dä Sigge „$1“ un „$2“",
     	"difference-multipage": "(Ongerscheide zwesche Sigge)",
     	"lineno": "Reih $1:",
    -	"compareselectedversions": "Dun de markehte Väsjohn verjliiche",
    +	"compareselectedversions": "Dun de markehte Väsjohne verjliiche",
     	"showhideselectedversions": "De ußjewählte Versione aanzeije udder vershteiche",
     	"editundo": "De läzde Änderong zeröck nämme",
     	"diff-empty": "(Keine Ongerscheid)",
    @@ -1207,7 +1211,7 @@
     	"action-read": "di Sigg ze lesse",
     	"action-edit": "di Sigg ze ändere",
     	"action-createpage": "di Sigg aanzeläje",
    -	"action-createtalk": "Klaafsigge aanzeläje",
    +	"action-createtalk": "he di Klaafsigg aanzeläje",
     	"action-createaccount": "hee dä neue Metmaacher aanzemelde",
     	"action-autocreateaccount": "automattesch heh dä Metmaacher vun Ußerhallf aanzelähje",
     	"action-history": "de Leß met de fröhjere Väsohne vun heh dä Sigg ze belohre",
    @@ -1290,7 +1294,7 @@
     	"rcshowhidemine-hide": "verschteihsche",
     	"rcshowhidecategorization": "De Sigge ier Ennohdenong $1",
     	"rcshowhidecategorization-show": "Aanzeije!",
    -	"rcshowhidecategorization-hide": "Verschteische!",
    +	"rcshowhidecategorization-hide": "verschteihsche",
     	"rclinks": "Zeisch de läzde {{int:pipe-separator}}$1{{int:pipe-separator}} Änderonge us de läzde {{int:pipe-separator}}$2{{int:pipe-separator}} Däch, un dun {{int:pipe-separator}} $3.",
     	"diff": "Ongerscheid",
     	"hist": "Väsjohne",
    @@ -1657,7 +1661,7 @@
     	"nbytes": "$1 Byte{{PLURAL:$1||s|}}",
     	"ncategories": "{{PLURAL:$1| ein Saachjropp | $1 Saachjroppe | keij Saachjroppe }}",
     	"ninterwikis": "{{PLURAL:$1|Eine Engerwikilengk|$1 Engerwikilengks|Keine Engerwikilengk}}",
    -	"nlinks": "{{PLURAL:$1|eine Link|$1 Links}}",
    +	"nlinks": "{{PLURAL:$1|eine Lengk|$1 Lengks|Keijne Lengk}}",
     	"nmembers": "met {{PLURAL:$1|ein Sigg|$1 Sigge}} dren",
     	"nmemberschanged": "met&nbsp;$1&nbsp;→&nbsp;{{PLURAL:$2|eine Sigg|$2&nbsp;Sigge|keine Sigg}}",
     	"nrevisions": "{{PLURAL:$1|Ein Änderong|$1 Änderonge|Keij Änderong}}",
    @@ -1759,6 +1763,8 @@
     	"apisandbox-results": "Erus jekumme:",
     	"apisandbox-request-url-label": "Dä <i lang=\"en\">URL</i> vun dä Aanfrooch:",
     	"apisandbox-request-time": "De Zigg vum Afroof: $1",
    +	"apisandbox-alert-page": "Heh op dä Sigg sin onjölltejje Aanjahbe.",
    +	"apisandbox-alert-field": "Dä Wääd en dämm Fäld heh es onjölltesch.",
     	"booksources": "Böcher",
     	"booksources-search-legend": "Söök noh Bezochsquelle för Bööcher",
     	"booksources-isbn": "ISBN:",
    @@ -1768,6 +1774,7 @@
     	"specialloguserlabel": "Dä Metmaacher, dä et jedonn hät:",
     	"speciallogtitlelabel": "Betroffe wohr: (dä Tittel vun ener Sigg udder enem Metmaacher singe Nahme)",
     	"log": "Logböcher ehr Opzeichnunge (all)",
    +	"logeventslist-submit": "Lohß jonn!",
     	"all-logs-page": "All de öffentlich Logböcher",
     	"alllogstext": "Dat heh es en jesampte Less us all dä Logböhscher {{GRAMMAR:en|{{SITENAME}}}}.\nDä Logböhscher ehre Enhald kam_mer all noh de Aat, de Metmaacher,\noder de Sigge ehr Name, un esu, einzel zoteht aanluhre.\nBei dä Name moß mer op Jruß- un Kleinschreff aachjävve.",
     	"logempty": "Mer han kein zopaß Endrähsch en däm Logbooch.",
    @@ -1793,6 +1800,7 @@
     	"cachedspecial-viewing-cached-ts": "Dat heh küdd ussem Zewescheschpeischer un nünnt nidd om neuste Schtand sin.",
     	"cachedspecial-refresh-now": "De neuste Väsjohn.",
     	"categories": "Saachjroppe",
    +	"categories-submit": "Lohß jonn!",
     	"categoriespagetext": "Heh {{PLURAL:$1|es nur en Saachjropp|sin nur Saachjroppe|es kein Saachjropp}} jeleß, woh jät dren {{PLURAL:$1|es|es|wöhr}}. Mer han_er eije Leßte för de\n[[Special:UnusedCategories|Saachjropp met nix dren]], un de\n[[Special:WantedCategories|jewönschte un nit aanjelaate Saachjroppe]].",
     	"categoriesfrom": "Zeijsch Saachjroppe vun heh af:",
     	"deletedcontributions": "Fottjeschmeße Väsjohne",
    @@ -1816,6 +1824,7 @@
     	"activeusers-hidebots": "De Bots fott lohße",
     	"activeusers-hidesysops": "De Wiki_Köbesse fott lohße",
     	"activeusers-noresult": "Kein Metmaacher jefonge.",
    +	"activeusers-submit": "Lohß jonn!",
     	"listgrouprights": "Metmaacher_Jroppe-Rääschte",
     	"listgrouprights-summary": "Hee kütt de Leß met dä Jroppe vun Metmaacher, di dat Wikki heh kennt, un dänne ier Rääschde.\nMih övver de einzel Rääschde fenkd_Er op de [[{{MediaWiki:Listgrouprights-helppage}}|Hölp-Sigg övver de Metmaacher ier Rääschde]].",
     	"listgrouprights-key": "Lejend:\n* E <span class=\"listgrouprights-granted\">jejovve Rääsch</span>\n* E <span class=\"listgrouprights-revoked\">fottjenumme Rääsch</span>",
    @@ -1926,7 +1935,7 @@
     	"enotif_body_intro_changed": "{{GENDER:$2|Dä Metmaacher|Et|Dä Metmaacher|De Metmaacherėn|Dä Metmaacher}} $2 hät di Sigg $1 {{GRAMMAR:en 3|{{ucfirst:{{SITENAME}}}}}} aam $PAGEEDITDATE verändert. Op $3 fengks De der aktoälle Schtand vun dä Sigg.",
     	"enotif_lastvisited": "Lohr onger „$1“ - doh fengks de all di Ännderonge zigg Dingem läzde Besohch heh.",
     	"enotif_lastdiff": "Loor op $1 för heh di Änderong aan_ze_lohre.",
    -	"enotif_anon_editor": "Dä namelose Metmaacher $1",
    +	"enotif_anon_editor": "Dä nahmelohse Metmaacher $1",
     	"enotif_body": "Leeven $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\n{{int:summary}} „$PAGESUMMARY“ $PAGEMINOREDIT\n\nDo kanns dä Metmaacher „$PAGEEDITOR“ aanschpräsche:\n* Övver e-mail: $PAGEEDITOR_EMAIL\n* Em Wiki: $PAGEEDITOR_WIKI\n\nDo kreß vun jetz aan kein e-mail mih, bes dat Do\nDer di Sigg aanjeluurt häs wann De enjelogg bes,\noch wann se norr_ens verändert weed. Do kanns ävver\noch all di Märker för e-mail för di Sigge en Dinger\nOppaßleß op eimohl ändere.\n\nEne schöne Jrohß {{GRAMMAR:vun|{{SITENAME}}}}.\n\n-- \nÖm de Enschtällonge för Nohreeschte aan Desch ze ändere,\njangk op:\n{{canonicalurl:{{#special:Preferences}}}}\n\nDo kanns heh Ding Oppaßleß ändere:\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nÖm di Sigg vun Dinger Oppaßleß ze schmiiße:\n$UNWATCHURL\n\nDo kanns heh noh Hölp luhre:\n$HELPPAGE",
     	"created": "neu aanjelaht",
     	"changed": "jeändert",
    @@ -2105,6 +2114,7 @@
     	"sp-contributions-username": "Metmaachername odder IP-Address:",
     	"sp-contributions-toponly": "Bloß neuste Versione zeije",
     	"sp-contributions-newonly": "Blohß neu aanjelaate Sigge zeije.",
    +	"sp-contributions-hideminor": "Donn kein Minni-Ännderonge ußblände.",
     	"sp-contributions-submit": "Söhke",
     	"whatlinkshere": "Wat noh heh link",
     	"whatlinkshere-title": "Sigge, woh Lengks op „$1“ dren sen",
    @@ -2117,7 +2127,7 @@
     	"isimage": "weed aanjezeisch",
     	"whatlinkshere-prev": "de vörijje {{PLURAL:$1||$1|noll}} zeije",
     	"whatlinkshere-next": "de nächste {{PLURAL:$1||$1|noll}} zeije",
    -	"whatlinkshere-links": "← Links",
    +	"whatlinkshere-links": "← Lengks",
     	"whatlinkshere-hideredirs": "de Ömleijdonge $1",
     	"whatlinkshere-hidetrans": "de Oproofe $1",
     	"whatlinkshere-hidelinks": "de nommahle Lengks $1",
    @@ -2183,7 +2193,7 @@
     	"ipblocklist-otherblocks": "Ander {{PLURAL:$1|Sperr|Sperre|-nix-}}",
     	"infiniteblock": "för iwich",
     	"expiringblock": "bes aam $1 öm $2 Uhr",
    -	"anononlyblock": "nor namelose",
    +	"anononlyblock": "nor Nahmelohse",
     	"noautoblockblock": "automattesch Schpärre avjeschalt",
     	"createaccountblock": "neu Aanmelde verbodde",
     	"emailblock": "<i lang=\"en\">e-Mail</i> Schecke verbodde",
    @@ -2835,7 +2845,7 @@
     	"exif-orientation-1": "Nommahl",
     	"exif-orientation-2": "Op der Kopp jespeejelt",
     	"exif-orientation-3": "Op der Kopp jedrieht",
    -	"exif-orientation-4": "Links-Räähß jespehjelt",
    +	"exif-orientation-4": "Lingks-Rääschß jeschpehjelt",
     	"exif-orientation-5": "En Vehdelsdriehjong mem Uhrzeijer un dann lengks-rähß jespehjelt",
     	"exif-orientation-6": "En Veedelsdriejong mem Uhrzeijer",
     	"exif-orientation-7": "En Veedelsdriejong jääje der Uhrzeijer un dann lengks-rähß jespehjelt",
    @@ -3204,7 +3214,7 @@
     	"specialpages-group-login": "Enlogge udder Aanmälde",
     	"specialpages-group-changes": "Läzde Änderonge un Logböhscher",
     	"specialpages-group-media": "Dateije — Huhlahde un Opleßte",
    -	"specialpages-group-users": "Metmaacher un denne ier Rääschte",
    +	"specialpages-group-users": "Metmaacher un dänne ier Rääschde",
     	"specialpages-group-highuse": "Öff jebruch…",
     	"specialpages-group-pages": "Siggeleste",
     	"specialpages-group-pagetools": "Werrekzüch för Sigge",
    @@ -3218,7 +3228,7 @@
     	"tags": "De jöltijje Makkehronge för Änderonge",
     	"tag-filter": "[[Special:Tags|Makkehronge]] ußsöhke:",
     	"tag-filter-submit": "Beschränke!",
    -	"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Ein|$1|Kein}} Kännzeijsche]]: $2)",
    +	"tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1||$1|Keij}} Kännzeijsche]]: $2)",
     	"tags-title": "Makeeronge",
     	"tags-intro": "Heh sin alle de Makeerunge opjeliß, di et Wikki för Änderunge verjävve kann, un wat se bedügge.",
     	"tags-tag": "Dä Makkehrong iere Nahme",
    @@ -3591,17 +3601,27 @@
     	"mw-widgets-titleinput-description-redirect": "ömleijde op „$1“",
     	"api-error-blacklisted": "Söhk Der ene anndere Nahme uß, dä mih drövver säht.",
     	"randomrootpage": "Zofällige Aanfangs-Sigg",
    +	"log-action-filter-all": "Alle",
    +	"log-action-filter-block-block": "Schpärre",
    +	"log-action-filter-block-unblock": "Sperr ophävve",
     	"log-action-filter-delete-delete": "En Sigg wohd fott jeschmeße",
    +	"authmanager-create-disabled": "Neu Aanmelde es afjeschalldt",
    +	"authmanager-create-from-login": "Öm Der ene Zohjang aanzelähje, bes esu johd, un föll heh di Fällder us:",
     	"authmanager-authplugin-setpass-failed-title": "Dat Paßwoot ze änndere hät nit jeflupp",
     	"authmanager-userdoesnotexist": "Ene Metmaacher mem Nahme „$1“ es nit ennjedrahre.",
     	"authmanager-domain-help": "De Domäijn för de Zohjangsdaht vun ußerhallef beschtähtech ze krijje.",
    +	"authmanager-retype-help": "Norr_ens dat Paßwoot zom beschähtejje",
     	"authmanager-email-label": "<i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
     	"authmanager-email-help": "De Addräß för de <i lang=\"en\">e-mail</i>",
     	"authmanager-realname-label": "Der „reeschteje“ Nahme",
     	"authmanager-provider-temporarypassword": "Zweschepasswood:",
    +	"authprovider-confirmlink-failed": "Et Zohjang-Verlengke hät nit kumplätt jeflupp: $1",
     	"authprovider-resetpass-skip-label": "Övverjonn",
    +	"authform-newtoken": "Keij CSRF Makkehrong:FUZZY!!$1",
    +	"authform-notoken": "Keij CSRF Makkehrong!FUZZY!!",
     	"specialpage-securitylevel-not-allowed-title": "Nit zohjelohße",
     	"cannotauth-not-allowed-title": "Zohjang verbodde.",
    +	"cannotauth-not-allowed": "Do häs nit dat Rääsch, he di Sigg ze bruche.",
     	"changecredentials-submit": "Ändere",
     	"removecredentials-submit": "Fott nämme"
     }
    diff --git a/languages/i18n/ku-latn.json b/languages/i18n/ku-latn.json
    index dc2f043c7b..93a003926e 100644
    --- a/languages/i18n/ku-latn.json
    +++ b/languages/i18n/ku-latn.json
    @@ -459,6 +459,7 @@
     	"botpasswords-label-cancel": "Betal bike",
     	"botpasswords-label-delete": "Jê bibe",
     	"botpasswords-bad-appid": "Navê bot \"$1\" ne derbasdar e.",
    +	"botpasswords-deleted-title": "Şîfreya robot hate jêbirin",
     	"resetpass_forbidden": "Şîfre nikarin werin guhertin",
     	"resetpass-submit-loggedin": "Şîfreyê biguherîne",
     	"resetpass-submit-cancel": "Betal bike",
    @@ -479,6 +480,7 @@
     	"changeemail-oldemail": "Navnîşana e-nameya niha:",
     	"changeemail-newemail": "Navnîşana e-nameya nû:",
     	"changeemail-none": "(nîne)",
    +	"changeemail-password": "Şîfreya te ya {{SITENAME}}ê:",
     	"changeemail-submit": "Enameyê biguherîne",
     	"resettokens": "Mifteya jê bibe",
     	"bold_sample": "Nivîsa stûr",
    @@ -504,6 +506,9 @@
     	"minoredit": "Ev guhertineke biçûk e",
     	"watchthis": "Vê gotarê bişopîne",
     	"savearticle": "Rûpelê tomar bike",
    +	"savechanges": "Guherandinan tomar bike",
    +	"publishpage": "Rûpelê biweşîne",
    +	"publishchanges": "Guherandinan biweşîne",
     	"preview": "Pêşdîtin",
     	"showpreview": "Pêşdîtinê nîşan bide",
     	"showdiff": "Guherandinan nîşan bide",
    @@ -837,6 +842,7 @@
     	"right-sendemail": "Ji bikarhênerên di re ename bişîne",
     	"grant-editpage": "Rûpelên ku hene biguherîne",
     	"grant-editprotected": "Rûpelên parastî bigûherîne",
    +	"grant-uploadfile": "Dosyeyên nû bar bike",
     	"grant-basic": "Mafên bingehîn",
     	"newuserlogpage": "Çêkirina hesabê nû",
     	"newuserlogpagetext": "Ev têketina hesabên bikarhêneriyê ye ên ku nû hatine afirandin.",
    @@ -844,8 +850,8 @@
     	"rightslogtext": "Ev guhertineke ji bo mafên bikarhêneriyê ye.",
     	"action-read": "vê rûpelê bixwîne",
     	"action-edit": "vê rûpelê biguherîne",
    -	"action-createpage": "rûpelan çêke",
    -	"action-createtalk": "rûpelên gotûbêjan çêke",
    +	"action-createpage": "vê rûpelê çêke",
    +	"action-createtalk": "vê rûpela gotûbêjê çêke",
     	"action-createaccount": "vê hesabê bikarhênerîyê çêke",
     	"action-minoredit": "vê weke guhertineke biçûk nîşan bide",
     	"action-move": "vê rûpelê bigerîne",
    @@ -876,6 +882,7 @@
     	"recentchanges-label-plusminus": "Qebareya vê rûpelê bi ev qas biteyan hate guherandin",
     	"recentchanges-legend-heading": "<strong>Ravekirina kurtenavan:</strong>",
     	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (here [[Special:NewPages|lîsteya rûpelên nû]])",
    +	"recentchanges-submit": "Nîşan bide",
     	"rclistfrom": "Guherandinên ji $3 $2 şûnde nîşan bide",
     	"rcshowhideminor": "Guherandinên biçûk $1",
     	"rcshowhideminor-show": "nîşan bide",
    @@ -1580,6 +1587,7 @@
     	"tooltip-ca-nstab-category": "Li rûpelê kategorîyê seke",
     	"tooltip-minoredit": "Vê guherandinê weka biçûk îşaret bike",
     	"tooltip-save": "Guherandinên xwe tomarbike",
    +	"tooltip-publish": "Guherandinên xwe biweşîne",
     	"tooltip-preview": "Guherandinên xwe bibîne, berî ku tu wî qeyd bikî!",
     	"tooltip-diff": "Guherandinên ku te di nivîsê de kirîyî nîşan bide",
     	"tooltip-compareselectedversions": "Cudatiyên guhertoyên hilbijartî yên vê rûpelê bibîne.",
    @@ -1631,7 +1639,7 @@
     	"imagemaxsize": "Sînorê mezinahiya wêneyî:<br /><em>(bo rûpelên danasîna wêneyan)</em>",
     	"thumbsize": "Mezinahiya wêne:",
     	"widthheight": "$1 x $2",
    -	"widthheightpage": "$1 × $2, $3 rûpel",
    +	"widthheightpage": "$1 × $2, $3 {{PLURAL:$3|rûpel}}",
     	"file-info": "mezinbûna daneyê: $1, MIME type: $2",
     	"file-info-size": "$1 × $2 pixel, mezinbûnê data: $3, MIME-typ: $4",
     	"file-nohires": "Versyonekî jê mezintir tune.",
    @@ -1847,6 +1855,7 @@
     	"searchsuggest-search": "Lêgerîn",
     	"searchsuggest-containing": "dihundirîne...",
     	"api-error-filename-tooshort": "Navê dosyeyê pir kurt e.",
    +	"api-error-unclassified": "Çewtiyeke nenas pêk hat.",
     	"api-error-unknown-code": "Çewtiya nenas: \"$1\".",
     	"api-error-unknownerror": "Çewtiya nenas: \"$1\".",
     	"duration-years": "$1 {{PLURAL:$1|sal}}",
    @@ -1884,6 +1893,7 @@
     	"mw-widgets-titleinput-description-redirect": "beralî bike ber bi $1 ve",
     	"log-action-filter-all": "Hemû",
     	"log-action-filter-block-block": "Asteng bike",
    +	"log-action-filter-upload-upload": "Barkirina nû",
     	"authmanager-email-label": "E-name",
     	"authmanager-email-help": "Navnîşana e-nameyê"
     }
    diff --git a/languages/i18n/lad.json b/languages/i18n/lad.json
    index 293c1c61a8..4f3f53ac12 100644
    --- a/languages/i18n/lad.json
    +++ b/languages/i18n/lad.json
    @@ -283,6 +283,7 @@
     	"nstab-template": "Şablón",
     	"nstab-help": "Ayudo",
     	"nstab-category": "Kategoría",
    +	"mainpage-nstab": "La Primera Hoja",
     	"nosuchaction": "No egziste esa aksyon",
     	"nosuchactiontext": "La aksyon espesefikada por el URL es invalido.\nEs posivle ke el URL fue eskrito mal, o ke segite un enlase inkorrecto.\nTambiem puede indikar un yerro en la programa uzado por {{SITENAME}}.",
     	"nosuchspecialpage": "No ay tala hoja especial",
    @@ -384,6 +385,8 @@
     	"accountcreated": "Cuento creado",
     	"accountcreatedtext": "El kuento de usuario para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) fue kreado.",
     	"loginlanguagelabel": "Lingua: $1",
    +	"pt-login": "Entrar",
    +	"pt-createaccount": "Criar un cuento",
     	"changepassword": "Trocar el kóddiche",
     	"resetpass_header": "Kambiar kontrasenya del kuento",
     	"oldpassword": "Kóddiche viejo:",
    diff --git a/languages/i18n/lb.json b/languages/i18n/lb.json
    index 8fb22f34e6..45bf74ab86 100644
    --- a/languages/i18n/lb.json
    +++ b/languages/i18n/lb.json
    @@ -364,7 +364,7 @@
     	"protectedpagetext": "Dës Säit ass fir Ännerungen an aner Aktioune gespaart.",
     	"viewsourcetext": "Dir kënnt de Quelltext vun dëser Säit kucken a kopéieren.",
     	"viewyourtext": "Dir kënnt de Quelltext vun <strong>Ären Ännerungen</strong> op dëser Säit kucken a kopéieren.",
    -	"protectedinterface": "Op dëser Säit fannt Dir Text fir de Sprooch-Interface vun der Software op dëser Wiki an dofir ass si gespaart fir Mëssbrauch ze verhënneren.\n\nFir Iwwersetzungen fir all Wikien bäizesetzen oder z'änneren gitt w.e.g. op [https://translatewiki.net/ translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
    +	"protectedinterface": "Op dëser Säit fannt Dir Text fir de Sprooch-Interface vun der Software op dëser Wiki an dofir ass si gespaart fir Mëssbrauch ze verhënneren.\n\nFir Iwwersetzunge fir all Wikien bäizesetzen oder z'änneren gitt w.e.g. op [https://translatewiki.net/ translatewiki.net], de MediaWiki-Lokalisatiouns-Projet.",
     	"editinginterface": "<strong>Opgepasst:</strong> Dir sidd am Gaang, eng Säit z'änneren, déi do ass, fir Interface-Text fir d'Software ze liwweren. \nÄnnerungen op dëser Säit änneren den Interface-Text, jee no Kontext, op allen oder verschiddene Säiten, déi vun alle Benotzer op dëser Wiki gesi ginn.",
     	"translateinterface": "Fir Iwwersetzunge fir all Wikien z'änneren oder dobäizesetze benotzt w.e.g.  [https://translatewiki.net/ translatewiki.net], de Projet fir d'Lokalisatioun vu MediaWiki.",
     	"cascadeprotected": "Dës Säit gouf fir Ännerunge gespaart, well se duerch Cascadeprotectioun vun {{PLURAL:$1|dëser Säit|dëse Säite}} gespaart ass mat der Cascadenoptioun:\n$2",
    @@ -605,7 +605,9 @@
     	"minoredit": "Dëst ass eng kleng Ännerung",
     	"watchthis": "Dës Säit iwwerwaachen",
     	"savearticle": "Säit späicheren",
    +	"savechanges": "Ännerunge späicheren",
     	"publishpage": "Säit publizéieren",
    +	"publishchanges": "Ännerunge publizéieren",
     	"preview": "Kucken ouni ofzespäicheren",
     	"showpreview": "Kucken ouni ofzespäicheren",
     	"showdiff": "Ännerunge weisen",
    @@ -634,14 +636,14 @@
     	"accmailtext": "En zoufälleg generéiert Passwuert fir [[User talk:$1|$1]] gouf op $2 geschéckt.\n\nEt kann op der ''[[Special:ChangePassword|Passwuert ännere]]'' Säit beim Alogge geännert ginn.",
     	"newarticle": "(Nei)",
     	"newarticletext": "Dir hutt op e Link vun enger Säit geklickt, déi et nach net gëtt. Fir déi Säit unzeleeën, gitt w.e.g. Ären Text an déi Këscht hei drënner an (kuckt d'[$1 Hëllef Säit] fir méi Informatiounen). Wann Dir duerch een Iertum heihi komm sidd, da klickt einfach op de Knäppchen '''Zréck''' vun Ärem Browser.",
    -	"anontalkpagetext": "---- ''Dëst ass d'Diskussiounssäit fir en anonyme Benotzer deen nach kee Kont opgemaach huet oder en net benotzt. Dowéinst musse mir d'IP Adress benotzen, fir de Benotzer z'identifizéieren.\nSou eng IP Adress ka vun e puer Benotzer gedeelt ginn.\nWann Dir en anonyme Benotzer sidd an Dir irrelevant Bemierkunge krut, [[Special:CreateAccount|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat aneren anonyme Benotzer ze verhënneren.''",
    +	"anontalkpagetext": "---- <em>Dëst ass d'Diskussiounssäit fir en anonyme Benotzer deen nach kee Kont opgemaach huet oder en net benotzt. Dowéinst musse mir d'IP Adress benotzen, fir de Benotzer z'identifizéieren.\nSou eng IP Adress ka vun e puer Benotzer gedeelt ginn.\nWann Dir en anonyme Benotzer sidd an Dir net-relevant Bemierkunge krut, [[Special:CreateAccount|maacht w.e.g. e Kont op]] oder [[Special:UserLogin|loggt Iech an]], fir weider Verwiesselunge mat aneren anonyme Benotzer ze verhënneren.</em>",
     	"noarticletext": "Dës Säit huet elo keen Text.\nDir kënnt op anere Säiten no [[Special:Search/{{PAGENAME}}|dësem Säitentitel sichen]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an den entspriechende Logbicher nokucken] oder [{{fullurl:{{FULLPAGENAME}}|action=edit}} dës Säit uleeën]</span>.",
     	"noarticletext-nopermission": "Elo ass keen Text op dëser Säit.\nDir kënnt op anere Säiten [[Special:Search/{{PAGENAME}}|no dësem Säitentitel sichen]], oder <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} an de Logbicher sichen]</span>, mä Dir hutt net déi néideg Rechter fir dës Säit unzeleeën.",
     	"missing-revision": "D'Versioun #$1 vun der Säit mam Numm \"{{FULLPAGENAME}}\" gëtt et net.\n\nDat geschitt normalerweis wann Dir op e vereelste Link vun enger Versioun vun enger Säit klickt déi geläscht ginn ass.\nDetailer fannt Dir am [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} Logbuch vum Läschen].",
     	"userpage-userdoesnotexist": "De Benotzerkont \"<nowiki>$1</nowiki>\" ass net registréiert.\nIwwerpréift w.e.g. op Dir dës Säit uleeën/ännere wëllt.",
     	"userpage-userdoesnotexist-view": "De Benotzerkont \"$1\" ass net registréiert.",
     	"blocked-notice-logextract": "Dëse Benotzer ass elo gespaart.\nDéi lescht Entrée am Logbuch vun de Späre steet als Referenz hei drënner:",
    -	"clearyourcache": "'''Opgepasst - Nom Späichere muss der Ärem Browser seng Cache eidel maachen, fir d'Ännerungen ze gesinn.'''\n* '''Firefox / Safari:''' Halt ''Shift'' während Dir ''Reload'' klickt oder dréckt entweder ''Ctrl-F5'' oder ''Ctrl-R'' (''⌘-R'' op engem Mac);\n* '''Google Chrome:''' Dréckt ''Ctrl-Shift-R'' (''⌘-Shift-R'' op engem Mac)\n* '''Internet Explorer:''' dréckt ''Ctrl'' während Dir op ''Refresh'' klickt oder dréckt ''Ctrl-F5.''\n* '''Opera:''' maacht de Cache eidel an ''Tools → Preferences;''",
    +	"clearyourcache": "<strong>Opgepasst - Nom Späichere muss der Ärem Browser seng Cache eidel maachen, fir d'Ännerungen ze gesinn.</strong>\n* <strong>Firefox / Safari:</strong> Halt <em>Shift</em> während Dir <em>Reload</em> klickt oder dréckt entweder <em>Ctrl-F5</em> oder <em>Ctrl-R</em> (<em>⌘-R</em> op engem Mac);\n* <strong>Google Chrome:</strong> Dréckt <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> op engem Mac)\n* <strong>Internet Explorer:</strong> dréckt <em>Ctrl</em> während Dir op <em>Refresh</em> klickt oder dréckt <em>Ctrl-F5.</em>\n* <strong>Opera:</strong> Gitt op de <em>Menu → Settings</em> (<em>Opera → Preferences</em> op engem  Mac) an dann op <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
     	"usercssyoucanpreview": "'''Tipp:''' Benotzt de \"{{int:showpreview}}\"-Knäppchen, fir Ären neien CSS virum Späicheren ze testen.",
     	"userjsyoucanpreview": "'''Tipp:''' Benotzt de ''{{int:showpreview}}''-Knäppchen, fir Ären neie JavaScript virum Späicheren ze testen.",
     	"usercsspreview": "'''Bedenkt: Dir kuckt just är Benotzer CSS.\nSi gouf nach net gespäichert!'''",
    @@ -1172,8 +1174,8 @@
     	"rightslogtext": "Dëst ass d'Lëscht vun den Ännerunge vu Benotzerrechter.",
     	"action-read": "dës Säit ze liesen",
     	"action-edit": "dës Säit z'änneren",
    -	"action-createpage": "Säiten unzelleeën",
    -	"action-createtalk": "Diskussiounssäiten unzeleeën",
    +	"action-createpage": "dës Säit uleeën",
    +	"action-createtalk": "dës Diskussiounssäit uleeën",
     	"action-createaccount": "dëse Benotzerkont unzeleeën",
     	"action-history": "d'Versioune vun dëser Säit weisen",
     	"action-minoredit": "dës Ännerung als kleng Ännerung ze markéieren",
    @@ -2040,6 +2042,7 @@
     	"sp-contributions-username": "IP-Adress oder Benotzernumm:",
     	"sp-contributions-toponly": "Nëmmen Ännerunge weisen déi déi lescht Versioun sinn",
     	"sp-contributions-newonly": "Nëmmen Ännerunge weisen déi Säiten uleeën",
    +	"sp-contributions-hideminor": "Kleng Ännerunge verstoppen",
     	"sp-contributions-submit": "Sichen",
     	"whatlinkshere": "Linken op dës Säit",
     	"whatlinkshere-title": "Säiten, déi mat \"$1\" verlinkt sinn",
    @@ -2183,8 +2186,8 @@
     	"lockedbyandtime": "(vum $1 de(n) $2 ëm $3 Auer)",
     	"move-page": "Réckel $1",
     	"move-page-legend": "Säit réckelen",
    -	"movepagetext": "Wann Dir dëse Formulaire benotzt gitt Dir enger Säit en aneren Numm a réckelt se mat hirem Historique op den neien Numm.\nDen alen Titel gëtt eng Viruleedung op déi nei Säit.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nWann Dir dat net maacht, da vergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weiderhin dohinner pointéieren, wou se hi sollen.\n\nBeuecht w.e.g. datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt Dir eng Säit zréck op hiren ursprénglechen Numm ëmbenenne kënnt wann Dir Iech geiert hat an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit bedeiten;\nverstitt w.e.g. d'Konsequenze vun Ärer Handlung ier Dir dëst maacht.",
    -	"movepagetext-noredirectfixer": "Wann Dir dëse Formulaire benotzt, réckelt Dir eng komplett Säit mat hirem Historique op en neien Numm.\nDen alen Titel gëtt eng Viruleedung op den neien Titel.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nVergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weider dohi pointéieren, wou se hi sollen.\n\nDenkt w.e.g. drun datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenne kënnt wann Dir e Feeler maacht an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n'''OPGEPASST!'''\nDëst kann en drastesche Changement fir eng populär Säit sinn;\nverstitt w.e.g. d'Konsequenze vun ärer Handlung ier Dir dëst maacht.",
    +	"movepagetext": "Wann Dir dëse Formulaire benotzt gitt Dir enger Säit en aneren Numm a réckelt se mat hirem Historique op den neien Numm.\nDen alen Titel gëtt eng Viruleedung op déi nei Säit.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nWann Dir dat net maacht, da vergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weiderhin dohinner pointéieren, wou se hi sollen.\n\nBeuecht w.e.g. datt d'Säit '''net''' geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt Dir eng Säit zréck op hiren ursprénglechen Numm ëmbenenne kënnt wann Dir Iech geiert hat an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n<strong>Notiz:</strong>\nDëst kann en drastesche Changement fir eng populär Säit bedeiten;\nverstitt w.e.g. d'Konsequenze vun Ärer Handlung ier Dir dëst maacht.",
    +	"movepagetext-noredirectfixer": "Wann Dir dëse Formulaire benotzt, réckelt Dir eng komplett Säit mat hirem Historique op en neien Numm.\nDen alen Titel gëtt eng Viruleedung op den neien Titel.\nDir kënnt Viruleedungen déi op déi al Säit ginn automatesch aktualiséieren.\nVergewëssert Iech datt keng [[Special:DoubleRedirects|duebel]] oder [[Special:BrokenRedirects|futtis Viruleedungen]] am Spill sinn.\nDir sidd responsabel datt d'Linke weider dohi pointéieren, wou se hi sollen.\n\nDenkt w.e.g. drun datt d'Säit <strong>net</strong> geréckelt gëtt, wann et schonn eng Säit mat deem Titel gëtt, ausser déi ass eidel, ass eng Viruleedung oder huet keen Historique.\nDëst bedeit datt dir eng Säit zréck op deen Numm dee se virdrun hat ëmbenenne kënnt wann Dir e Feeler maacht an datt Dir keng Säit iwwerschreiwe kënnt, déi et scho gëtt.\n\n<strong>Notiz:</strong>\nDëst kann en drastesche Changement fir eng populär Säit sinn;\nverstitt w.e.g. d'Konsequenze vun ärer Handlung ier Dir dëst maacht.",
     	"movepagetalktext": "Wann Dir dës Këscht uklickt da gëtt déi associéiert Diskussiounssäit, am Fall wou  eng do ass, automatesch op deen neien Numm matgeréckelt, '''ausser:''' Et gëtt schonn eng Diskussiounssäit mat dësem Numm déi net eidel ass.\n\nAn deem Fäll musst Dir d'Diskussiounssäit manuell réckelen oder fusionéieren.",
     	"moveuserpage-warning": "'''Opgepasst:''' Dir sidd am gaang eng Benotzersäit ze réckelen. Denkt w.e.g. dorunn datt just d'Säit geréckelt gëtt an datt de Benotzer ''net'' ëmbenannt gëtt.",
     	"movecategorypage-warning": "<strong>Opgepasst:</strong> Dir sidd am Gaang eng Kategorie-Säit ze réckelen. Denkt drun datt nëmmen déi Säit geréckelt gëtt an all Säiten an der aler Kategorie ginn <em>net</em> an déi nei ëmkategoriséiert.",
    @@ -2236,7 +2239,7 @@
     	"move-leave-redirect": "Viruleedung uleeën",
     	"protectedpagemovewarning": "<strong>OPGEPASST:</strong> Dës Säit gouf gespaart sou datt nëmme Benotzer mat Administreursrechter se réckele kënnen.\nDéi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
     	"semiprotectedpagemovewarning": "'''OPGEPASST:''' Dës Säit gouf gespaart sou datt nëmme confirméiert Benotzer se réckele kënnen. Déi lescht Zeil aus de Logbicher fannt Dir zu Ärer Informatioun hei ënnendrënner.",
    -	"move-over-sharedrepo": "== De Fichier gëtt et ==\n[[:$1]] gëtt et op engem gedeelte Repertoire. Wann dir e Fichier op dësen Titel réckelt dann ass dee gedeelte Fichier net méi accessibel.",
    +	"move-over-sharedrepo": "== De Fichier gëtt et ==\n[[:$1]] gëtt et op engem gedeelte Repertoire. Wann Dir e Fichier op dësen Titel réckelt da gëtt dee gedeelte Fichier verstoppt.",
     	"file-exists-sharedrepo": "Den Numm vum Fichier deen Dir erausgesicht hutt gëtt schonn op engem gemeinsame Repertoire benotzt.\nSicht Iech w.e.g. en aneren Numm.",
     	"export": "Säiten exportéieren",
     	"exporttext": "Dir kënnt den Text an den Historique vun enger bestëmmter Säit, oder engem Set vu Säiten, an XML agepakt, exportéieren, déi dann an eng aner Wiki mat MediaWiki Software importéiert gi mat Hëllef vun der [[Special:Import|Import-Säit]].\n\nFir eng Säit z'exportéieren, gitt den Titel an d'Textkëscht heidrënner an, een Titel pro Linn, a wielt aus op Dir nëmmen déi aktuell Versioun oder all Versioune mam ganzen Historique exportéiere wëllt.\n\nWann nëmmen déi aktuell Versioun exportéiert soll ginn, kënnt Dir och e Link benotze wéi z. B. [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fir d'\"[[{{MediaWiki:Mainpage}}]]\".",
    @@ -2315,7 +2318,7 @@
     	"import-nonewrevisions": "Et goufe keng Versiounen importéiert (se waren al entweder scho virdrun importéiert ginn oder se goufen iwwersprong well Feeler dra waren).",
     	"xml-error-string": "$1 an der Zeil $2, Spalt $3, (Byte $4): $5",
     	"import-upload": "XML-Daten importéieren",
    -	"import-token-mismatch": "D'Date vun ärer Sessioun si verluer gaang. Versicht et w.e.g. nach eemol.",
    +	"import-token-mismatch": "D'Date vun ärer Sessioun si verluer gaang.\n\nDir sidd eventuell ausgeloggt ginn. <strong>Kuckt w.e.g. no ob Dir nach ageloggt sidd a probéiert nach eng Kéier</strong>.\nWann et dann nach net geet, probéiert [[Special:UserLogout|Iech auszeloggen]] an duerno nees anzeloggen a kuckt no ob Äre Browser Cookië vun dësem Site akzeptéiert.",
     	"import-invalid-interwiki": "Aus der Wiki déi Dir uginn hutt kann näischt importéiert ginn.",
     	"import-error-edit": "D'Säit \"$1\" gouf net importéiert well Dir se net änneren däerft.",
     	"import-error-create": "D'Säit \"$1\" gouf net importéiert well Dir se net uleeën däerft.",
    @@ -3395,9 +3398,9 @@
     	"specialpage-securitylevel-not-allowed": "Leider däerft Dir dës Säit net benotze well Är Identitéit net konnt iwwerpréift ginn.",
     	"cannotauth-not-allowed-title": "Erlaabnes refuséiert",
     	"cannotauth-not-allowed": "Dir däerft dës Säit net benotzen",
    -	"changecredentials-submit": "Änneren",
    +	"changecredentials-submit": "Idendifikatiounsinformatiounen änneren",
     	"changecredentials-success": "Är Idendifikatiounsinformatioune goufe geännert.",
    -	"removecredentials-submit": "Ewechhuelen",
    +	"removecredentials-submit": "Idendifikatiounsinformatiounen ewechhuelen",
     	"credentialsform-account": "Numm vum Kont:",
     	"cannotlink-no-provider-title": "Et gëtt keng Benotzerkonte fir ze verlinken",
     	"linkaccounts": "Benotzerkonte verbannen",
    diff --git a/languages/i18n/lki.json b/languages/i18n/lki.json
    index 18ccf64ac3..39466e060c 100644
    --- a/languages/i18n/lki.json
    +++ b/languages/i18n/lki.json
    @@ -6,7 +6,8 @@
     			"Lakzon",
     			"Mjbmr",
     			"Macofe",
    -			"Huji"
    +			"Huji",
    +			"Miladrahimi"
     		]
     	},
     	"tog-underline": "کڕ(خط)کیشائن ژێر پیوندەل:",
    @@ -121,6 +122,8 @@
     	"october-date": "$1 اکتبر",
     	"november-date": "$1 نوامبر",
     	"december-date": "$1 دسامبر",
    +	"period-am": "صو",
    +	"period-pm": "ظور",
     	"pagecategories": "{{PLURAL:$1|ڕِزگ|ڕِزگەل}}",
     	"category_header": "\"وەڵگەل ڕزگ(رده) \"$1",
     	"subcategories": "ژێر ڕزگەل",
    @@ -376,6 +379,8 @@
     	"virus-scanfailed": "  )$1 پویش ناموفق (کد",
     	"virus-unknownscanner": ":ضدویروس ناشناخته",
     	"logouttext": "'''ایسة دةر چئن هؤمة ثبت بیة.'''\nتوجه داشته باشید که تا حافظهٔ نهان مرورگرتان را پاک نکنید، بعضی از صفحات ممکن است همچنان به گونه‌ای نمایش یابند که انگار وارد شده‌اید.",
    +	"cannotlogoutnow-title": "نمه‌تونین ایسه بچینه‌در",
    +	"cannotlogoutnow-text": "ئه‌دررچین نماو هنی $1",
     	"welcomeuser": "خؤةش هةتینة/هاتینة $1!",
     	"welcomecreation-msg": "حساوو کاربری هۆمە دؤرس بی.\nویرتان نەچوو(فراموش نشە) گإ [[Special:Preferences|تمارزووەل(ترجیحات) {{SITENAME}}]] ووِژت بگؤەڕنین( تغییر دهی).",
     	"yourname": ":نۆم کاربەری",
    @@ -392,10 +397,12 @@
     	"remembermypassword": "رمزعبورت وة ئئ رایانة ئةویرت/یادت بو(تابیشترإژ$1{{PLURAL:$1|رووژةل|رووژ}})",
     	"userlogin-remembermypassword": "مإ وارد  بی بیل",
     	"userlogin-signwithsecure": "إژ ورود امن استفاده کةن",
    +	"cannotloginnow-title": "ایسه نمه‌تونین باینه نوم",
     	"yourdomainname": ":دامنهٔ شما",
     	"password-change-forbidden": ".شما نمی‌توانید گذرواژه‌ها را در این ویکی تغییر دهید",
     	"externaldberror": "خطایی در ارتباط با پایگاه داده رخ داده است یا اینکه شما اجازهٔ به‌روزرسانی حساب خارجی خود را ندارید.",
     	"login": "إ نۆم هەتن سیستم",
    +	"login-security": "وژت معرفی‌که",
     	"nav-login-createaccount": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
     	"userlogin": " إ نؤم هةتن سیستم/ حساوو کاربةری سازین",
     	"userloginnocreate": "نؤم هۀتن سیستم",
    @@ -3390,6 +3397,5 @@
     	"special-characters-title-minus": "علامت منفی",
     	"mw-widgets-dateinput-no-date": "هیچ داده‌ای انتخاب نشده",
     	"mw-widgets-titleinput-description-new-page": "اێ وەڵگە هەنی(هالی)وجود نِئرێ",
    -	"mw-widgets-titleinput-description-redirect": "گؤەڕانن/تغییر مسیر به $1",
    -	"api-error-blacklisted": "لطفاً یک عنوان توصیفی متفاوت انتخاب کنید."
    +	"mw-widgets-titleinput-description-redirect": "گؤەڕانن/تغییر مسیر به $1"
     }
    diff --git a/languages/i18n/lv.json b/languages/i18n/lv.json
    index 3301f8a871..7ea2ab69ea 100644
    --- a/languages/i18n/lv.json
    +++ b/languages/i18n/lv.json
    @@ -426,6 +426,8 @@
     	"createacct-reason-ph": "Kāpēc jūs veidojat citu kontu",
     	"createacct-submit": "Izveidot savu kontu",
     	"createacct-another-submit": "Izveidot citu dalībnieka kontu",
    +	"createacct-continue-submit": "Turpināt konta izveidi",
    +	"createacct-another-continue-submit": "Turpināt konta izveidi",
     	"createacct-benefit-heading": "{{SITENAME}} darbojas ar tādu cilvēku kā Tu ieguldījumu.",
     	"createacct-benefit-body1": "{{PLURAL:$1|labojumi|labojums|labojumi}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|lapas|lapa|lapas}}",
    @@ -486,8 +488,9 @@
     	"newpassword": "Jaunā parole",
     	"retypenew": "Atkārto jauno paroli",
     	"resetpass_submit": "Uzstādīt paroli un ieiet",
    -	"changepassword-success": "Jūsu parole tika nomainīta veiksmīgi!",
    +	"changepassword-success": "Tava parole tika nomainīta!",
     	"botpasswords": "Botu paroles",
    +	"botpasswords-existing": "Esošās botu paroles",
     	"botpasswords-createnew": "Izveidot jaunu bota paroli",
     	"botpasswords-editexisting": "Rediģētu esošu bota paroli",
     	"botpasswords-label-appid": "Bota nosaukums:",
    @@ -519,6 +522,8 @@
     	"passwordreset-emailsentemail": "Paroles atiestatīšanas e-pasts ir nosūtīts.",
     	"passwordreset-emailsent-capture": "Atgādinājuma e-pasta ziņojums ir nosūtīts, tas parādīts zemāk.",
     	"passwordreset-emailerror-capture": "Atgādinājuma e-pasta ziņojums tika izveidots, tas parādīts zemāk, bet nosūtīšana lietotājam neizdevās: $1",
    +	"passwordreset-nosuchcaller": "Izsaucējs nepastāv: $1",
    +	"passwordreset-invalideamil": "Nederīga e-pasta adrese",
     	"changeemail": "Mainīt e-pasta adresi",
     	"changeemail-header": "Mainīt konta e-pasta adresi",
     	"changeemail-oldemail": "Pašreizējā e-pasta adrese:",
    @@ -552,6 +557,7 @@
     	"watchthis": "Uzraudzīt šo lapu",
     	"savearticle": "Saglabāt lapu",
     	"publishpage": "Saglabāt lapu",
    +	"publishchanges": "Publicēt izmaiņas",
     	"preview": "Pirmskats",
     	"showpreview": "Rādīt pirmskatu",
     	"showdiff": "Rādīt izmaiņas",
    @@ -688,7 +694,7 @@
     	"history-feed-empty": "Pieprasītā lapa nepastāv.\nIespējams, tā ir izdzēsta vai pārdēvēta.\nMēģiniet [[Special:Search|meklēt]], lai atrastu saistītas lapas!",
     	"rev-deleted-comment": "(labojuma kopsavilkums dzēsts)",
     	"rev-deleted-user": "(lietotāja vārds nodzēsts)",
    -	"rev-deleted-event": "(reģistra ieraksts nodzēsts)",
    +	"rev-deleted-event": "(reģistra detaļas noņemtas)",
     	"rev-deleted-user-contribs": "[lietotājvārds vai IP adrese ir dzēsta — izmaiņa slēpta no devuma]",
     	"rev-deleted-text-permission": "Šī lapas versija ir '''dzēsta'''.\nSīkāku informāciju var atrast [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dzēšanas reģistrā].",
     	"rev-deleted-text-view": "Šī lapas versija ir '''dzēsta'''.\nTo varat apskatīt, jo esat administrators. Sīkāku informāciju var atrast [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} dzēšanas reģistrā].",
    @@ -1013,7 +1019,7 @@
     	"rightslogtext": "Šis ir dalībnieku tiesību izmaiņu reģistrs.",
     	"action-read": "lasīt šo lapu",
     	"action-edit": "labot Å¡o lapu",
    -	"action-createpage": "izveidot lapas",
    +	"action-createpage": "izveidot Å¡o lapu",
     	"action-createtalk": "izveidot diskusiju lapas",
     	"action-createaccount": "izveidot šo dalībnieka kontu",
     	"action-history": "apskatīt šīs lapas vēsturi",
    @@ -1093,7 +1099,7 @@
     	"boteditletter": "b",
     	"number_of_watching_users_pageview": "[šo lapu uzrauga $1 {{PLURAL:$1|dalībnieki|dalībnieks|dalībnieki}}]",
     	"rc_categories": "Ierobežot uz kategorijām (atdalīt ar \"|\"):",
    -	"rc_categories_any": "Jebkas",
    +	"rc_categories_any": "Jebkas no izvēlētā",
     	"rc-change-size-new": "$1 {{PLURAL:$1|baiti|baits|baiti}} pēc izmaiņām",
     	"newsectionsummary": "/* $1 */ jauna sadaļa",
     	"rc-enhanced-expand": "Skatīt detaļas",
    @@ -1106,6 +1112,7 @@
     	"recentchangeslinked-summary": "Šiet ir nesen izdarītās izmaiņas lapās, uz kurām ir saites no norādītās lapas (vai norādītajā kategorijā ietilpstošās lapas).\nLapas, kas ir tavā [[Special:Watchlist|uzraugāmo rakstu sarakstā]] ir '''treknas'''.",
     	"recentchangeslinked-page": "Lapas nosaukums:",
     	"recentchangeslinked-to": "Rādīt izmaiņas lapās, kurās ir saites uz šo lapu (nevis lapās uz kurām ir saites no šīs lapas)",
    +	"autochange-username": "MediaWiki automātiskā izmaiņa",
     	"upload": "Augšupielādēt failu",
     	"uploadbtn": "Augšupielādēt",
     	"reuploaddesc": "Atcelt augšupielādi un atgriezties pie augšupielādes veidnes.",
    @@ -1117,9 +1124,9 @@
     	"uploaderror": "Augšupielādes kļūda",
     	"upload-recreate-warning": "<strong>Brīdinājums: Fails ar šādu nosaukumu ir dzēsts vai pārvietots.</strong>\n\nDzēšanas un pārvietošanas reģistri šai lapai ir pieejami šeit:",
     	"uploadtext": "Pirms tu kaut ko augšupielādē, noteikti izlasi un ievēro [[Project:Attēlu izmantošanas noteikumi|attēlu izmantošanas noteikumus]].\n\nLai aplūkotu vai meklētu agrāk augšupielādētus attēlus,\ndodies uz [[Special:FileList|augšupielādēto attēlu sarakstu]].\nAugšupielādes un dzēšanas tiek reģistrētas [[Special:Log/upload|augšupielādes reģistrā]] un [[Special:Log/delete|dzēšanas reģistrā]].\n\nIzmanto šo veidni, lai augšupielādētu jaunus attēlu failus, ar kuriem ilustrēt tevis izmainītās lapas.\nGandrīz visos pārlūkos tev vajadzētu redzēt pogu '''\"Choose...\",''' kuru spiežot parādīsies faila atvēršanas dialogs.\nIzvēloties kādu failu, tā adrese parādīsies ailītē blakus šai pogai.\nTev ir arī jāatzīmē ailīte, kas apstiprina, ka tu nepārkāp nekādas autortiesības, augšupielādējot šo failu.\nSpied pogu '''Augšupielādēt''', lai pabeigtu augšupielādi.\nTas var ieilgt, ja tavs interneta pieslēgums ir lēns.\n\nIeteicamie formāti ir:\n* JPEG - ja tā ir fotogrāfija,\n* PNG - ja tas ir zīmējums vai kāda ikona, un\n* OGG - ja tas ir skaņas fails.\n\nLūdzu, pārliecinies, ka faila nosaukums ir pietiekami aprakstošs, lai izvairītos no neskaidrībām. Lai attēlu pēc tam ievietotu kādā lapā, izmanto šādi noformētu linkus:\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fails.jpg|paskaidrojošs teksts]]</nowiki>'''\n* '''<nowiki>[[</nowiki>{{ns:file}}<nowiki>:Fails.png|paskaidrojošs teksts]]</nowiki>'''\nvai skaņām\n* '''<nowiki>[[</nowiki>{{ns:media}}<nowiki>:Fails.ogg]]</nowiki>'''\n\nLūdzu, ņem vērā, ka tāpat kā citas wiki lapas arī tevis augšupielādētos failus citi var mainīt vai dzēst, ja uzskata, ka tas nāktu par labu šim projektam, kā arī atceries, ka tev var tikt liegta augšupielādes iespēja, ja tu šo sistēmu.",
    -	"upload-permitted": "Atļautie failu tipi: $1.",
    -	"upload-preferred": "Ieteicamie failu tipi: $1.",
    -	"upload-prohibited": "Aizliegtie failu tipi: $1.",
    +	"upload-permitted": "Atļautie failu {{PLURAL:$2|tipi|tips|tipi}}: $1.",
    +	"upload-preferred": "Ieteicamie failu {{PLURAL:$2|tipi|tips|tipi}}: $1.",
    +	"upload-prohibited": "Aizliegtie failu {{PLURAL:$2|tipi|tips|tipi}}: $1.",
     	"uploadlogpage": "Augšupielādes reģistrs",
     	"uploadlogpagetext": "Zemāk ir redzams jaunāko augšuplādēto failu saraksts.\nPārskatāmāka versija ir pieejama [[Special:NewFiles|jauno attēlu galerijā]].",
     	"filename": "Faila nosaukums",
    @@ -1240,7 +1247,7 @@
     	"listfiles_thumb": "Sīktēls",
     	"listfiles_date": "Datums",
     	"listfiles_name": "Nosaukums",
    -	"listfiles_user": "Lietotājs",
    +	"listfiles_user": "Dalībnieks",
     	"listfiles_size": "Izmērs",
     	"listfiles_description": "Apraksts",
     	"listfiles_count": "Versijas",
    @@ -1259,7 +1266,7 @@
     	"filehist-thumb": "Attēls",
     	"filehist-thumbtext": "$1 versijas sīktēls",
     	"filehist-nothumb": "Nav sīktēla",
    -	"filehist-user": "Lietotājs",
    +	"filehist-user": "Dalībnieks",
     	"filehist-dimensions": "Izmēri",
     	"filehist-filesize": "Faila izmērs",
     	"filehist-comment": "Komentārs",
    @@ -1368,7 +1375,7 @@
     	"wantedtemplates": "Vajadzīgās veidnes",
     	"mostlinked": "Lapas, uz kurām ir visvairāk norāžu",
     	"mostlinkedcategories": "Kategorijas, uz kurām ir visvairāk saišu",
    -	"mostlinkedtemplates": "Visvairāk izmantotās veidnes",
    +	"mostlinkedtemplates": "Visvairāk iekļautās lapas",
     	"mostcategories": "Raksti ar visvairāk kategorijām",
     	"mostimages": "Attēli, uz kuriem ir visvairāk saišu",
     	"mostinterwikis": "Lapas ar visvairāk starpviki saitēm",
    @@ -1383,6 +1390,7 @@
     	"protectedpages-indef": "Tikai bezgalīgas aizsardzības",
     	"protectedpages-cascade": "Tikai kaskādes aizsardzības",
     	"protectedpages-noredirect": "Paslēpt pāradresācijas",
    +	"protectedpages-timestamp": "Laika zīmogs",
     	"protectedpages-page": "Lapa",
     	"protectedpages-reason": "Iemesls",
     	"protectedpages-unknown-timestamp": "Nav zināms",
    @@ -1396,7 +1404,7 @@
     	"usercreated": "{{GENDER:$3|Izveidoja}} $1 plkst. $2",
     	"newpages": "Jaunas lapas",
     	"newpages-submit": "Rādīt",
    -	"newpages-username": "Lietotājs:",
    +	"newpages-username": "Dalībnieks:",
     	"ancientpages": "Vecākās lapas",
     	"move": "Pārvietot",
     	"movethispage": "Pārvietot šo lapu",
    @@ -1413,10 +1421,15 @@
     	"apisandbox-api-disabled": "API ir atspējots šajā tīmekļa vietnē.",
     	"apisandbox-reset": "Notīrīt",
     	"apisandbox-retry": "Mēģināt vēlreiz",
    +	"apisandbox-no-parameters": "Å o API modulim nav parametru.",
    +	"apisandbox-helpurls": "Palīdzības saites",
     	"apisandbox-examples": "Piemēri",
    +	"apisandbox-dynamic-parameters": "Papildu parametri",
    +	"apisandbox-dynamic-parameters-add-label": "Pievienot parametru:",
    +	"apisandbox-dynamic-parameters-add-placeholder": "Parametra nosaukums",
     	"apisandbox-results": "Rezultāti",
     	"apisandbox-request-url-label": "Pieprasījuma URL:",
    -	"apisandbox-request-time": "Pieprasījuma izpildes laiks: $1",
    +	"apisandbox-request-time": "Pieprasījuma izpildes laiks: {{PLURAL:$1|$1 ms}}",
     	"booksources": "Grāmatu avoti",
     	"booksources-search-legend": "Meklēt grāmatu avotus",
     	"booksources-search": "Meklēt",
    @@ -1479,6 +1492,7 @@
     	"listgrouprights-removegroup-self-all": "Noņemt visas grupas no sava konta",
     	"listgrouprights-namespaceprotection-header": "Vārdtelpas ierobežojumi",
     	"listgrouprights-namespaceprotection-namespace": "Vārdtelpa",
    +	"listgrants-rights": "Tiesības",
     	"trackingcategories-nodesc": "Apraksts nav pieejams.",
     	"trackingcategories-disabled": "Kategorija ir atslēgta",
     	"mailnologin": "Nav adreses, uz kuru sūtīt",
    @@ -1529,6 +1543,12 @@
     	"wlheader-enotif": "E-pasta paziņojumi ir ieslēgti.",
     	"wlheader-showupdated": "Lapas, kuras ir tikušas izmainītas, kopš tu tās pēdējoreiz apskatījies, te rādās ar '''pustrekniem''' burtiem",
     	"wlshowlast": "Parādīt izmaiņas pēdējo $1 stundu laikā vai $2 dienu laikā, vai arī .",
    +	"wlshowhidebots": "boti",
    +	"wlshowhideliu": "reģistrēti lietotāji",
    +	"wlshowhideanons": "anonīmi lietotāji",
    +	"wlshowhidepatr": "pārbaudīti labojumi",
    +	"wlshowhidemine": "mani labojumi",
    +	"wlshowhidecategorization": "lapu kategorizēšana",
     	"watchlist-options": "Uzraugāmo rakstu saraksta opcijas",
     	"watching": "Uzrauga...",
     	"unwatching": "Neuzrauga...",
    @@ -1668,7 +1688,7 @@
     	"contributions-title": "Dalībnieka $1 devums",
     	"mycontris": "Devums",
     	"anoncontribs": "Devums",
    -	"contribsub2": "Lietotājs: $1 ($2)",
    +	"contribsub2": "{{GENDER:$3|Dalībnieks|Dalībniece}}: $1 ($2)",
     	"nocontribs": "Netika atrastas izmaiņas, kas atbilstu šiem kritērijiem.",
     	"uctop": "(pēdējā izmaiņa)",
     	"month": "No mēneša (un senāki):",
    @@ -1700,7 +1720,7 @@
     	"whatlinkshere-next": "{{PLURAL:$1|nākamos $1|nākamo|nākamos $1}}",
     	"whatlinkshere-links": "← saites",
     	"whatlinkshere-hideredirs": "$1 pāradresācijas",
    -	"whatlinkshere-hidetrans": "$1 lapas, kurās šī lapa izmantota kā veidne",
    +	"whatlinkshere-hidetrans": "$1 iekļāvumi",
     	"whatlinkshere-hidelinks": "$1 saites",
     	"whatlinkshere-hideimages": "$1 failu saites",
     	"whatlinkshere-filters": "Filtri",
    @@ -2644,7 +2664,6 @@
     	"special-characters-group-gujarati": "Gudžarati",
     	"mw-widgets-dateinput-no-date": "Nav izvēlēts datums",
     	"mw-widgets-titleinput-description-new-page": "lapa vēl nepastāv",
    -	"api-error-blacklisted": "Lūdzu, izvēlieties citu, aprakstošu nosaukumu!",
     	"authmanager-email-label": "E-pasts",
     	"authmanager-email-help": "E-pasta adrese",
     	"authmanager-realname-label": "Tavs īstais vārds",
    diff --git a/languages/i18n/mai.json b/languages/i18n/mai.json
    index 796d77393c..f7332f9c4f 100644
    --- a/languages/i18n/mai.json
    +++ b/languages/i18n/mai.json
    @@ -62,7 +62,7 @@
     	"tog-ccmeonemails": "हमरद्वारा दोसर प्रयोक्ताक पठाओल ई-पत्रक कपी पठाबी",
     	"tog-diffonly": "फाइल-अन्तर प्रणालीक नीचाँ पन्नाक सामिग्री नै देखाबी",
     	"tog-showhiddencats": "नुकाएल श्रेणी देखाबी",
    -	"tog-norollbackdiff": "प्रत्यावर्तनक बाद फाइल-अन्तर प्रणालीक बिसरी",
    +	"tog-norollbackdiff": "सम्पादन वापस ल लेला बाद अन्तर नै देखाबी",
     	"tog-useeditwarning": "जब हम कोनो सम्पादन पृष्ठके बिना सुरक्षित केनै बदलाव संग छोडि दि त हमरा सूचित करी ।",
     	"tog-prefershttps": "सम्प्रवेशित करलाक बाद सदैव सुरक्षित कनेक्शनके प्रयोग करी",
     	"underline-always": "सदिखन",
    @@ -84,7 +84,7 @@
     	"mon": "सोम",
     	"tue": "मंगल",
     	"wed": "बुध",
    -	"thu": "बृह.",
    +	"thu": "बृह",
     	"fri": "शुक्र",
     	"sat": "शनि",
     	"january": "जनवरी",
    @@ -151,13 +151,13 @@
     	"category-file-count": "{{PLURAL:$2|ई श्रेणीमे मात्र निम्नलिखित फाइल अछि।|ई श्रेणीमे निम्नलिखित {{PLURAL:$1|फाइल|$1 फाइलसभ}} अछि, कुल फाइलसभ $2}}",
     	"category-file-count-limited": "ई श्रेणीमे निम्नलिखित {{PLURAL:$1|फाइल अछि।|फाइलसभ अछि।}}",
     	"listingcontinuesabbrev": "शेष आगाँ।",
    -	"index-category": "क्रम कएल पन्ना सभ",
    +	"index-category": "क्रम कएल पन्नासभ",
     	"noindex-category": "क्रम नै कएल पन्नासभ",
     	"broken-file-category": "पन्नासभ जाइमे फाइल लिङ्कसभ टूटल हुअए",
     	"about": "क विषयमे",
     	"article": "सामग्री लेख",
     	"newwindow": "(नव खिडकीसँ खुजैछ)",
    -	"cancel": "समाप्त",
    +	"cancel": "रद्द करी",
     	"moredotdotdot": "आर...",
     	"morenotlisted": "ई पुरा सूची नै छी।",
     	"mypage": "पन्ना",
    @@ -176,7 +176,7 @@
     	"namespaces": "चेन्हासी समूहसभ",
     	"variants": "प्रकारसभ",
     	"navigation-heading": "दिक्चालन सूची",
    -	"errorpagetitle": "गलती",
    +	"errorpagetitle": "त्रुटि",
     	"returnto": "$1 पर आबी।",
     	"tagline": "मैथिली {{SITENAME}}सँ",
     	"help": "मदति",
    @@ -184,7 +184,7 @@
     	"searchbutton": "ताकी",
     	"go": "जाए",
     	"searcharticle": "जाए",
    -	"history": "पन्नाक इतिहास",
    +	"history": "पृष्ठ इतिहास",
     	"history_short": "इतिहास",
     	"updatedmarker": "हमर अन्तिम आगमनसँ पहिने अद्यतन कएल",
     	"printableversion": "प्रिन्ट करबा योग्य",
    @@ -290,7 +290,7 @@
     	"confirmable-no": "नै",
     	"thisisdeleted": "$1 देखी वा फेरसँ आनी?",
     	"viewdeleted": "$1 के देखाबी?",
    -	"restorelink": "{{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादन सभ}}",
    +	"restorelink": "{{PLURAL:$1|एकटा मेटाएल सम्पादन|$1 मेटाएल सम्पादनसभ}}",
     	"feedlinks": "सूचक:",
     	"feed-invalid": "अमान्य सूचक प्रकार मासुल",
     	"feed-unavailable": "अधिकृत सूचक उपलब्ध नै अछि",
    @@ -315,7 +315,7 @@
     	"nstab-category": "श्रेणी",
     	"mainpage-nstab": "सम्मुख पन्ना",
     	"nosuchaction": "एहेन कोनो क्रिया नै अछि",
    -	"nosuchactiontext": "ऐ सार्वत्रिक विभव संकेत द्वारा निर्दिष्ट क्रिया अमान्य अछि।\nअहाँ सार्वत्रिक विभव संकेतक गलत टंकण केने हएब, वा कोनो गलत लिंकक पाछाँ गेल हएब।\nई {{अन्तर्जाल}} प्रयोक्ता द्वारा प्रयुक्त तंत्रांशमे स्थित कोनो दोषक संकेत सेहो कऽ सकैए।",
    +	"nosuchactiontext": "ई सार्वत्रिक विभव सङ्केतद्वारा निर्दिष्ट क्रिया अमान्य अछि।\nअहाँ सार्वत्रिक विभव सङ्केतक गलत टङ्कण केने हएब, वा कोनो गलत लिङ्कक पाछाँ गेल हएब।\nई {{SITENAME}} प्रयोक्ताद्वारा प्रयुक्त तन्त्रांशमे स्थित कोनो दोषक सङ्केत सेहो कऽ सकैए।",
     	"nosuchspecialpage": "एहेन कोनो विशेष पृष्ठ नै अछि",
     	"nospecialpagetext": "<strong> अहाँ एकटा अमान्य पन्नाक आग्रह केने छी। </strong>\nमान्य विशेष पन्नाक सूची एतए अछि [[Special:SpecialPages|{{int:specialpages}}]]।",
     	"error": "भ्रम",
    @@ -327,9 +327,9 @@
     	"databaseerror-error": "त्रुटि: $1",
     	"laggedslavemode": "'''चेतौनी:''' पन्नापर सम्भव जे अद्यतन परिवर्तन नै हुअए।",
     	"readonly": "दत्तनिधि प्रतिबन्धित",
    -	"enterlockreason": "प्रतिबन्ध लेल कारण बताउ, संगमे एकटा अंदाज सेहो बताउ जे कखन ई प्रतिबन्ध हटाएल जाएत।",
    +	"enterlockreason": "प्रतिबन्ध लेल कारण बताबी, संगे एकटा अन्दाज सेहो बताबी जे कखन ई प्रतिबन्ध हटाएल जाएत।",
     	"readonlytext": "अखन दत्तांशनिधि नव प्रविष्टि आ आन संशोधन लेल प्रतिबन्धित अछि, सम्भवतः सामान्त दत्तांशनिधि देखभाल लेल, तकर बाद ई सामान्य भऽ जाएत।\n\nसञ्चालक जे एकरा प्रतिबन्धित कएने छथि ई कारण दै छथि:$1",
    -	"missing-article": "दत्तनिधि पृष्ठक वांछित पाठ्य नै ताकि सकल, माने \"$1\" $2\nएकर कारण कोनो पुरान फाइल चेन्हासी वा ऐतिहासिक लिंकक पाछाँ जाएब अछि, जे मेटा देल गेल छै।\nजौं ई तकर कारण नै अछि,  तखन अहाँकेँ तंत्रांशमे कोनो दोष भेटल अछि।\nएकर खबरि पहुँचाउ [[Special:ListUsers/sysop|administrator]], केँ, अपन सार्वत्रिक विभव संकेत सूचित करैत।",
    +	"missing-article": "दत्तनिधि पृष्ठक वान्छित पाठ्य नै ताकि सकल, माने \"$1\" $2\nएकर कारण कोनो पुरान फाइल चेन्हासी वा ऐतिहासिक लिङ्कक पाछाँ जाएब अछि, जे मेटा देल गेल छै।\nजौं ई तकर कारण नै अछि, तखन अहाँ तन्त्रांशमे कोनो दोष भेटल अछि।\nएकर खबरि पहुँचाबी [[Special:ListUsers/sysop|प्रबन्धक]]केँ, अपन सार्वत्रिक विभव सङ्केत सूचित करैत।",
     	"missingarticle-rev": "(संशोधन#: $1)",
     	"missingarticle-diff": "(फाइल-अन्तर प्रणाली: $1, $2)",
     	"readonly_lag": "दत्तांशनिधि स्वचालित रूपसँ प्रतिबन्धित कएल गेल अछि जा परजीवी दतांशनिधि वितरक मूलक समक्ष नै आबि जाए।",
    @@ -347,7 +347,7 @@
     	"unexpected": "आसक विपरीत परिणाम: \"$1\"=\"$2\"",
     	"formerror": "त्रुटि: फर्म अनुरोध नै कएल जा सकल",
     	"badarticleerror": "ई क्रिया ऐ पन्नापर नै कएल जा सकैए।",
    -	"cannotdelete": "पन्ना व संचिका \"$1\" मेटाएल नै जा सकल।",
    +	"cannotdelete": "पन्ना व सञ्चिका \"$1\" मेटाएल नै जा सकल।",
     	"cannotdelete-title": "पन्ना \"$1\" नै मेटा सकल",
     	"delete-hook-aborted": "सम्पादन नोकसीसँ खतम भेल।\nई कोनो कारण नै देलक।",
     	"no-null-revision": "\"$1\" पृष्ठक लेल बिना परिवर्तन नब अवतरण बनाबैमे असफल।",
    @@ -373,12 +373,12 @@
     	"viewsourcetext": "अहाँ ई पृष्ठक जडिक देख आ अनुकृत कऽ सकै छी:",
     	"viewyourtext": "अहाँ ई पृष्ठमे '''अपन सम्पादन'''क देख आ एतए उतारि सकै छी:",
     	"protectedinterface": "ई पन्ना तंत्रांश लेल मध्यस्थ पाठक व्यवस्था करैत अछि, आ अपशब्द रोकबाक ब्योंत करैत अछि।",
    -	"editinginterface": "'''चेतौनी''' अहाँ एकटा एहेन पन्नाक सम्पादन कऽ रहल छी जे तंत्रांशक मध्यस्थ पन्नाकेँ पाठ देबा लेल प्रयोग भऽ रहल अछि।\nऐ पन्नामे परिवर्तन दोसर प्रयोक्ता लेल प्रयोक्ता मध्यस्थक रूपमे परिवर्तन करत।\nअनुवाद लेल [https://translatewiki.net/wiki/Main_Page?setlang=en translatewiki.net] जाउ, मीडियाविकी स्थानीयकरण परियोजना पर।",
    -	"translateinterface": "सभ विकिसब के लेल अनुवाद जोडइ या बदलई के लेल मीडियाविकि क्षेत्रीयकरण परियोजना [https://translatewiki.net/ translatewiki.net] कें प्रयोग करु।",
    +	"editinginterface": "<strong>चेतौनी:</strong> अहाँ एकटा एहेन पन्नाक सम्पादन कऽ रहल छी जे सफ्टवेयरक मध्यस्थ पन्नाक पाठ देबा लेल प्रयोग भऽ रहल अछि।\nई पन्नामे परिवर्तन दोसर प्रयोक्ता लेल प्रयोक्ता मध्यस्थक रूपमे परिवर्तन करत।\nअनुवाद लेल मिडियाविकी स्थानीयकरण परियोजना [https://translatewiki.net/wiki/Main_Page?setlang=en ट्रान्सलेटविकी.नेट] पर जाए।",
    +	"translateinterface": "सभ विकिसभक लेल अनुवाद जोडए या बदलैक लेल मिडियाविकि क्षेत्रीयकरण परियोजना [https://translatewiki.net/ ट्रान्सलेटविकी.नेट]क प्रयोग करी।",
     	"cascadeprotected": "ई पन्नाक सम्पादन सम्भव नै अछि, कारण अहिमे सम्मिलित अछि, {{PLURAL:$1|पृष्ठ|पृष्ठसभ}} सुरक्षित अछि \"तराउपडी\" विकल्प खोललाक बाद:\n$2",
    -	"namespaceprotected": "अहाँकेँ '''$1''' नाम-पेटारमे सम्पादनक अनुमति नै अछि।",
    -	"customcssprotected": "अहांकें ऐ सी.एस.एस.पन्नाकें सम्पादित करबाक अधिकार नै अछि, कारण ऐमे दोसर प्रयोक्ताक व्यक्तिगत विकल्प छै।",
    -	"customjsprotected": "अहांकें ऐ जावास्क्रिप्ट पन्नाकें सम्पादित करबाक अधिकार नै अछि, कारण ऐमे दोसर प्रयोक्ताक व्यक्तिगत विकल्प छै।",
    +	"namespaceprotected": "अहाँकेँ <strong>$1</strong> नाम-पेटारमे सम्पादनक अनुमति नै अछि।",
    +	"customcssprotected": "अहाँक सियसयस पन्नाकें सम्पादित करबाक अधिकार नै अछि, कारण एहिमे दोसर प्रयोक्ताक व्यक्तिगत विकल्प अछि।",
    +	"customjsprotected": "अहाँके ई जावास्क्रिप्ट पन्नाकें सम्पादित करबाक अधिकार नै अछि, कारण एहिमे दोसर प्रयोक्ताक व्यक्तिगत विकल्प अछि।",
     	"mycustomcssprotected": "अहाके लेल ई सीएसएस पन्नाके सम्पादित करवाक अधिकार नै अछि।",
     	"mycustomjsprotected": "अहके लेल इ जावास्क्रिप्ट पन्नाके सम्पादित करवाक अधिकार नै अछि।",
     	"myprivateinfoprotected": "अहाके अपन व्यक्तिगत जानकारी बदलैक अनुमति नै अछि।",
    @@ -436,6 +436,7 @@
     	"userlogin-resetpassword-link": "अपन कूटशब्द बिसरि गेलौ?",
     	"userlogin-helplink2": "सम्प्रवेशित करवाकलेल मदत",
     	"userlogin-loggedin": "अहाँ {{GENDER:$1|$1}}क रूपमे पहिनेसँ सम्प्रवेशित छी।\nकोनो दोसर सदस्यक रुपमे सम्प्रवेशित करवाक लेल देल गेल फारमके प्रयोग करी।",
    +	"userlogin-reauth": "अहाँ {{GENDER:$1|$1}} छी, एहि लेल अहाँक एक बेर आर खातामे प्रवेश करै पडत।",
     	"userlogin-createanother": "दोसर खाता बनाबी",
     	"createacct-emailrequired": "ई-मेल पता",
     	"createacct-emailoptional": "ई-मेल पता (वैकल्पिक)",
    @@ -463,7 +464,7 @@
     	"nocookiesfornew": "प्रयोक्ता खाजा नै खुजल, कारण हम ओकर जडि पूर्ण रूपेँ नै ताकि सकलौ।\nई दृढ करी जे ज्ञापक सक्रिय अछि, ई पन्नाक फेरसँ भारित करी आ फेरसँ प्रयास करी।",
     	"noname": "अहाँ वैध प्रयोक्तानाम नै देने छी।",
     	"loginsuccesstitle": "सम्प्रवेश भएल",
    -	"loginsuccess": "'''अहाँ सम्प्रवेश केलहुँ {{SITENAME}} \"$1\".'''क रूपमे।",
    +	"loginsuccess": "<strong>अहाँ सम्प्रवेश केलहुँ {{SITENAME}} \"$1\"'''क रूपमे। </strong>",
     	"nosuchuser": "\"$1\" नामसँ कोनो प्रयोक्ता नै अछि।\nप्रयोक्तानाम ब्रह्मक्षर-लघ्वक्षर भेद युक्त अछि।\nअपन ह्रिजै जाँची, वा [[Special:CreateAccount|नव खाता बनाबी]] ।",
     	"nosuchusershort": "\"$1\" नामक कोनो प्रयोक्ता नै अछि।\nअपन हिजए सुधारी।",
     	"nouserspecified": "अहाँक एकटा प्रयोक्तानाम देबऽ पडत।",
    @@ -471,7 +472,7 @@
     	"wrongpassword": "गलत कूटशब्द देल गेल।\nफेरसँ प्रयास करी।",
     	"wrongpasswordempty": "रिक्त कूटशब्द देल गेल।\nफेरसँ प्रयास करी।",
     	"passwordtooshort": "कूटशब्द कमसँ कम {{PLURAL:$1|1 वर्ण|$1 वर्णक}} हुअए।",
    -	"passwordtoolong": "कुटशब्द kuttsabda {{PLURAL:$1|1 वर्ण|$1 वर्णों}} से बेसी नम्हर भ्या सकएत अछि।",
    +	"passwordtoolong": "कुटशब्द {{PLURAL:$1|1 वर्ण|$1 वर्णसभ}}सँ बेसी नम्हर नै भ सकएत अछि।",
     	"passwordtoopopular": "आम पासवर्ड अहाँ नै चुनि सकएत अछि। कृपया अनोखा पासवर्ड चुनी।",
     	"password-name-match": "अहाँक कूटशब्द अहाँक प्रयोक्तानामसँ भिन्न हेबाक चाही।",
     	"password-login-forbidden": "ऐ प्रयोक्तानाम आ कूटशब्दक प्रयोग प्रतिबन्धित अछि।",
    @@ -496,7 +497,7 @@
     	"accountcreated": "खाता खुजि गेल",
     	"accountcreatedtext": "[[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|वार्ता]]) के लेल खाता खोलल गेल अछि।",
     	"createaccount-title": "{{SITENAME}}क लेल खाता बनाबी",
    -	"createaccount-text": "कियो अहाँक ई-पत्र संकेत लेल एकटा खाता {{अन्तर्जाल}} पर खोललन्हि ($4) नाम भेल \"$2\", कूटशब्द भेल \"$3\"।\nअहाँ सम्प्रवेश करू आ अपन कूटशब्द बदलू।\n\nअहाँ ऐ संदेशकेँ बिसरि सकै छी, जँ ई खाता भ्रमवश बनल हुअए।",
    +	"createaccount-text": "कियो अहाँक ई-पत्र सङ्केत लेल एकटा खाता {{SITENAME}} पर खोललन्हि ($4) नाम भेल \"$2\", कूटशब्द भेल \"$3\"।\nअहाँ सम्प्रवेश करी आ अपन कूटशब्द बदली।\n\nअहाँ ई सन्देशके बिसरि सकै छी, जँ ई खाता भ्रमवश बनल हुअए।",
     	"login-throttled": "अहाँ ढ़ेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास करबासँ पहिने कने काल थम्हू।",
     	"login-abort-generic": "अहाँक सम्प्रवेश सफल नै भेल- रोकल गएल",
     	"login-migrated-generic": "अहाँके खाता माइग्रेट कएल गेल अछि, आर अहाँके प्रयोक्ता नाम आब ई विकिमे नै अछि।",
    @@ -514,10 +515,10 @@
     	"resetpass_announce": "सम्प्रवेश सम्पूर्ण करबा लेल, अहाँ एकटा नव कूटशब्द एतए निर्धारित करी।",
     	"resetpass_text": "<!-- पाठ एतऽ लिखू -->",
     	"resetpass_header": "खाता कूटशब्द बदली",
    -	"oldpassword": "पुरान कूटशब्द",
    -	"newpassword": "नव कूटशब्द",
    -	"retypenew": "नव कूटशब्द फेरसँ टंकित करी",
    -	"resetpass_submit": "कूटशब्द बनाउ आ सम्प्रवेश करी",
    +	"oldpassword": "पुरान कूटशब्द:",
    +	"newpassword": "नव कूटशब्द:",
    +	"retypenew": "नव कूटशब्द फेरसँ लिखी:",
    +	"resetpass_submit": "कूटशब्द बनाबी आ सम्प्रवेश करी",
     	"changepassword-success": "अहाँक कूटशब्द सफलतासँ बदलि देल गेल!",
     	"changepassword-throttled": "अहाँ ढेर रास सम्प्रवेश प्रयास केलहुँ।\nफेर प्रयास $1 करबासँ पहिने कने काल थम्हू।",
     	"botpasswords": "बोट पासवर्ड",
    @@ -533,29 +534,31 @@
     	"botpasswords-label-delete": "मेटाबी",
     	"botpasswords-label-resetpassword": "पासवर्ड पुनः तय करी",
     	"botpasswords-label-grants": "अनुदान आवेदन:",
    +	"botpasswords-label-grants-column": "प्रदान कएल",
    +	"botpasswords-bad-appid": "बोट नाम \"$1\" मान्य नै अछि।",
     	"resetpass_forbidden": "कूटशब्द नै बदलल जा सकैए।",
     	"resetpass-no-info": "अहाँकेँ ऐ पन्नाकेँ सोझे प्रयोग करबालेल सम्प्रवेशित हुअए पड़त।",
     	"resetpass-submit-loggedin": "कूटशब्द बदली",
     	"resetpass-submit-cancel": "रद्द करी",
     	"resetpass-wrong-oldpass": "अमान्य अस्थायी वा अखुनका कूटशब्द।\nअहाँ पहिनहिये सफलतासँ कूटशब्द बदलि लेने छी वा एकटा नव अस्थायी कूटशब्द लेल आग्रह केने छी।",
    -	"resetpass-recycled": "रीसेट करएके लेल नयाँ कूटशब्दमे कृपया अपन वर्तमान कूटशब्द नै द के नयाँ कूटशब्द देल जाउ।",
    +	"resetpass-recycled": "रिसेट करैक लेल नयाँ कूटशब्दमे कृपया अपन वर्तमान कूटशब्द नै द नयाँ कूटशब्द देल जाए।",
     	"resetpass-temp-emailed": "अहाँ अखन एकटा अस्थायी ई-पत्र कोड सँ सम्प्रवेशित केनए छी। सम्प्रवेश पूर्ण करए के लेल अहाँ के एतए नयाँ कूटशब्द राखए पडत:",
     	"resetpass-temp-password": "तात्कालिक कूटशब्द:",
     	"resetpass-abort-generic": "कूटशब्दमे बदलाव कोनो एक्सटेंशनद्वारा रोकल गएल अछि।",
     	"resetpass-expired": "अहाँके कूटशब्दक वैधता अवधि खत्तम भऽ गेल अछि । कृपया सम्प्रवेशित करवाक लेल नयाँ कूटशब्द राखु।",
    -	"resetpass-expired-soft": "अहाँके कूटशब्दकऽ वैधता अवधि समाप्त भऽ गेल आर कूटशब्द परिवार्तान करवाक आवश्यकता अछि। कृपया एगो नव कूटशब्द राखु, वा पाछु रिसेट करवाक लेल \"{{int:authprovider-resetpass-skip-label}}\" क्लिक करु।",
    -	"resetpass-validity-soft": "अहाँके कूटशब्द मान्य नै अछि: $1 \n\nकृपया आब एगो नव कूटशब्द चुनु, वा पाछु पुनर्स्थापित करए के लेल \"{{int:authprovider-resetpass-skip-label}}\" में क्लिक करू।",
    +	"resetpass-expired-soft": "अहाँक कूटशब्द कऽ वैधता अवधि समाप्त भऽ गेल आर कूटशब्द परिवार्तन करवाक आवश्यकता अछि। कृपया एगो नव कूटशब्द राखी, वा पाछा रिसेट करवाक लेल \"{{int:authprovider-resetpass-skip-label}}\" क्लिक करी।",
    +	"resetpass-validity-soft": "अहाँके कूटशब्द मान्य नै अछि: $1 \n\nकृपया आब एगो नव कूटशब्द चुनी, वा पाछ पुनर्स्थापित करएक लेल \"{{int:authprovider-resetpass-skip-label}}\" क्लिक करी।",
     	"passwordreset": "कूटशब्द फेरसँ बनाबी",
     	"passwordreset-text-one": "अपन कूटशब्द रीसेट करवाक लेल इ फारम भरी।",
     	"passwordreset-text-many": "{{PLURAL:$1|ई-पत्रके माध्यमसऽ एकटा अस्थायी कूटशब्द पावैलेल कोनो एकटा डिब्बा भरी।}}",
     	"passwordreset-disabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
     	"passwordreset-emaildisabled": "कूटशब्द फेरसँ बनाएब ऐ विकीपर अक्षम कएल अछि।",
    -	"passwordreset-username": "प्रयोक्तानाम",
    +	"passwordreset-username": "प्रयोक्तानाम:",
     	"passwordreset-domain": "क्षेत्र:",
    -	"passwordreset-capture": "परिणाम ई-पत्र देखू?",
    -	"passwordreset-capture-help": "जँ अहाँ ऐ बक्शाकेँ देखै छी, ई-पत्र (तात्कालिक कूटशब्दक संग) अहाँकेँ देखाएल जाएत आ संगे प्रयोक्ताकेँ पठाएल जाएत।",
    -	"passwordreset-email": "ई-पत्र संकेत",
    -	"passwordreset-emailtitle": "{{SITENAME}} पर लेखा विवरण",
    +	"passwordreset-capture": "परिणाम ई-पत्र देखी?",
    +	"passwordreset-capture-help": "जँ अहाँ ई बक्शाकेँ देखै छी, ई-पत्र (तात्कालिक कूटशब्दकसंग) अहाँकेँ देखाएल जाएत आ संगे प्रयोक्ताकेँ पठाएल जाएत।",
    +	"passwordreset-email": "ई-पत्र सङ्केत:",
    +	"passwordreset-emailtitle": "{{SITENAME}} पर खाता विवरण",
     	"passwordreset-emailtext-ip": "कियो (सम्भवतः अहाँ, अन्तर्जाल सेवा कल्पक $1 सँ) अपन लेखा विवरणक पुनःस्मरणक लेल अनुरोध केलहुँ ऐ लेल {{SITENAME}} ($4). ई प्रयोक्ता {{PLURAL:$3|लेखा अछि|लेखा सभ अछि}}\nऐ ई-पत्र संकेतसँ सम्बन्धित:\n\n$2\n\n{{PLURAL:$3|ई अल्पकालक कूटशब्द| ई सभ अल्पकालक कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 पाँच दिन}}.\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द चुनू।. जौं कियो आन ई आग्रह केने अछि, वा अहाँकेँ अपन पुरान कूटशब्द मोन पड़ि गेल अछि , आ आब एकरा बदलबाक इच्छा नै राखै छी तँ अहाँ ऐ संदेशकेँ बिसरि जाउ आ अपन पुरान कूटशब्दक प्रयोग करैत रहू।",
     	"passwordreset-emailtext-user": "प्रयोक्ता $1 {{अन्तर्जाल}} पर अहाँक खाता विवरणक {{SITENAME}} लेल फेरसँ ($4) आग्रह केने छथि। ई प्रयोक्ता {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ऐ ई-पत्र संकेतसँ जुड़ल: $2\n{{PLURAL:$3| ई अस्थायी कूटशब्द|ई सभ अस्थायी कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द आब चुनू। जँ कियो दोसर ई आग्रह केने छथि, वा जँ अहाँकेँ अपन मूल कूटशब्द मोन पड़ि गेल अछि, आ अहाँ आब ओइ कूटशब्दकेँ नै बदलऽ चाहै छी, अहाँ ऐ संदेशकेँ बिसरि सकै छी आ अपन पुरान कूटशब्दक प्रयोग जारी राखि सकै छी।",
     	"passwordreset-emailelement": "प्रयोक्ता: \n$1\n\nअस्थायी कूटशब्द: \n$2",
    @@ -564,9 +567,9 @@
     	"passwordreset-emailerror-capture": "एकटा स्मरण ई-पत्र बनाएल गेल अछि, जे नीचाँ देखाएल अछि, मुदा प्र्योक्ताकेँ एकरा पठेबाक प्रयास विफल भेल: $1",
     	"changeemail": "ई-मेल पता परिवर्तित करी",
     	"changeemail-header": "अपन ईमेल पता परिवर्तन हेतु एकरा पुरा करी। यदि अहाँ अपन वर्तमान ईमेल पता हटाबैलेल चाहैत छी, तँ एकरा खाली छोडि दी आ एकरा भेजी।",
    -	"changeemail-no-info": "अहाँकेँ ऐ पन्नाकेँ सोझे देखबाले सम्प्रवेशित हुअए पड़त।",
    -	"changeemail-oldemail": "अखुनका ई-पत्र संकेत:",
    -	"changeemail-newemail": "नव ई-पत्र संकेत:",
    +	"changeemail-no-info": "अहाँक ई पन्नाक सोझे प्रयोग करबालेल सम्प्रवेशित हुअए पडत।",
    +	"changeemail-oldemail": "वर्तमान ई-मेल पता:",
    +	"changeemail-newemail": "नव ई-मेल पता:",
     	"changeemail-none": "(कोनो नै)",
     	"changeemail-password": "अहाँक {{SITENAME}} कूटशब्द:",
     	"changeemail-submit": "ई-मेल बदली",
    @@ -582,7 +585,7 @@
     	"bold_sample": "मोट पाठ",
     	"bold_tip": "मोट पाठ",
     	"italic_sample": "कटि लेखन",
    -	"italic_tip": "क़टि लेखन",
    +	"italic_tip": "कटि लेखन",
     	"link_sample": "लिङ्क शीर्षक",
     	"link_tip": "आन्तरिक लिङ्क",
     	"extlink_sample": "http://www.example.com लिङ्क शीर्षक",
    @@ -594,8 +597,8 @@
     	"image_sample": "उदाहरण.jpg",
     	"image_tip": "समाहित चित्र",
     	"media_sample": "उदाहरण.ogg",
    -	"media_tip": "मीडिया फाइल लिंक",
    -	"sig_tip": "अहाँक हस्ताक्षर समयक मोहरक संग",
    +	"media_tip": "मिडिया फाइल लिङ्क",
    +	"sig_tip": "अहाँक हस्ताक्षर समयक मोहरकसंग",
     	"hr_tip": "अक्षांशीय पंक्ति (अल्प उपयोग)",
     	"summary": "सारांश:",
     	"subject": "विषय:",
    @@ -606,21 +609,21 @@
     	"showpreview": "पूर्वप्रदर्शन",
     	"showdiff": "परिवर्तन देखाबी",
     	"blankarticle": "<strong>चेतावनी:</strong> अहाँ एक रिक्त पन्ना के निर्माण करि रहल छी।\nयदि अहाँ \"{{int:savearticle}}\" क पुनः दाबबै त पन्नाक बिना कोनो सामग्रीक निर्मित भ जाएत।",
    -	"anoneditwarning": "'''चेतौनी:''' अहाँ सम्प्रवेशित नै छी।\nअहाँक अनिकेत ई पन्नाक सम्पादन इतिहासमे दर्ज कएल जाएत।",
    +	"anoneditwarning": "<strong>चेतौनी:</strong> अहाँ सम्प्रवेश नै केनए छी । यदि अहाँ सम्पादन करबै तहन ई पृष्ठक सम्पादन इतिहासमे अहाँक आइपी ठेगान दर्ज कएल जाएत। यदि अहाँ <strong>[$1 सम्प्रवेश]</strong> करैत छी अथवा <strong>[$2 खाता बनाबैत छी]</strong> तहन अन्य सुविधासभ संगे अहाँक सम्पादनसभक श्रेय अहाँक प्रयोगकर्तानाम पर दएल जाएत।",
     	"anonpreviewwarning": "<em>अहाँ सम्प्रवेशित नै छी। अखन रक्षण केलासँ अहाँक अनिकेत पता ई पन्नाक सम्पादन इतिहासमे दर्ज भऽ जाएत।</em>",
     	"missingsummary": "<strong>स्मारक:</strong> अहाँ सम्पादन सार नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"{{int:savearticle}}\", अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
     	"selfredirect": "<strong>चेतावनी:</strong> आहाँ स्वेम के ई पन्ना पुनः निर्देशीत कएर रहल छी।\nआहाँ अनुप्रेषित के लेल गलत लक्ष्य निर्दिष्ट भ्या सकएत अछि, या आहाँ गलत पन्ना कें संपादन कैर सकएत छी।\nआहाँ फेरो से \"{{int:savearticle}}\" क्लिक करएत छी, रीडायरेक्ट ओनाहो भी बनाबल जेल अछि।",
    -	"missingcommenttext": "कृपा कऽ अपन विचार नीचाँ प्रविष्ट करू।",
    +	"missingcommenttext": "कृपा कऽ अपन विचार नीचाँ प्रविष्ट करी।",
     	"missingcommentheader": "'''स्मरण:''' अहाँ कोनो विषय/ शीर्षक ऐ टिप्पणीक लेल नै देने छी।\nजँ अहाँ फेरसँ क्लिक करब \"{{int:savearticle}}\" , अहाँक सम्पादन बिना एकर संरक्षित भऽ जाएत।",
     	"summary-preview": "सारांश पूर्वावलोकन",
     	"subject-preview": "विषयक झलक:",
    -	"previewerrortext": "आहाँकें परिवर्तन के पूर्वावलोकन करई कें समय एक त्रुटि एल ।",
    +	"previewerrortext": "अहाँक परिवर्तनके पूर्वावलोकन करहिक समय एक त्रुटि आएल।",
     	"blockedtitle": "प्रयोक्ता प्रतिबन्धित अछि।",
    -	"blockedtext": "''' अहाँक प्रयोक्तानाम वा अनिकेत प्रतिबन्धित कऽ देल गेल अछि।'''\n\nई प्रतिबन्ध $1 द्वारा कएल गेल।\nएकर कारण अछि ''$2'' ।\n\n* प्रतिबन्धक प्रारम्भ: $8\n* प्रतिबन्धक समाप्ति: $6\n* आसन्न प्रतिबन्धसँ प्रभावित: $7\n\nअहाँ $1 सँ सम्पर्क कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|संचालक]] सँ प्रतिबन्धक विषयमे सम्पर्क कऽ सकै छी।\nअहाँ ’ऐ प्रयोक्ताकेँ ई-पत्र दिअ’ सुविधाक प्रयोग नै कऽ सकै छी यावत एकटा मान्य ई-पत्र संकेतक विवरण अहाँक  [[Special:Preferences|खाता विकल्प]] मे नै देल अछि आ अहाँकेँ एकर प्रयोग करबासँ रोकि नै देल गेल हो।\nअहाँक वर्तमान अनिकेत अछि $3, आ प्रतिबन्ध संख्या अछि # $5 ।\nऐ सभ विवरणक उल्लेख अहाँ अपन कोनो कएल जाइबला प्रश्नमे करू।",
    -	"autoblockedtext": "अहाँक अनिकेत स्वचालित रूपेँ प्रतिबन्धित कऽ देल गेल अछि कारण एकर प्रयोग कोनो दोसर प्रयोक्ता द्वारा भऽ रहल छल, जे $1 द्वारा प्रतिबन्धतित कएल गेल।\nएकर कारण अछि:\n: ''$2'' ।\n\n* प्रतिबन्धक प्रारम्भ: $8\n* प्रतिबन्धक समाप्ति: $6\n* आसन्न प्रतिबन्धसँ प्रभावित: $७\n\nअहाँ $1 सँ सम्पर्क कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|संचालक]] सँ प्रतिबन्धक विषयमे सम्पर्क कऽ सकै छी।\nअहाँ मोन राखू जे अहाँ ’ऐ प्रयोक्ताकेँ ई-पत्र दिअ’ सुविधाक प्रयोग नै कऽ सकै छी यावत एकटा मान्य ई-पत्र संकेतक पंजीकरण अहाँक  [[Special:Preferences|प्रयोक्ता विकल्प]] मे नै देल अछि आ अहाँकेँ एकर प्रयोग करबासँ रोकि नै देल गेल हो।\nअहाँक वर्तमान अनिकेत अछि $3, आ प्रतिबन्ध संख्या अछि # $5 ।\nऐ सभ विवरणक उल्लेख अहाँ अपन कोनो कएल जाइबला प्रश्नमे करू।",
    +	"blockedtext": "<strong>अहाँक प्रयोक्तानाम वा अनिकेत प्रतिबन्धित कऽ देल गेल अछि।</strong>\n\nई प्रतिबन्ध $1 द्वारा कएल गेल।\nएकर कारण अछि ''$2'' ।\n\n* प्रतिबन्धक प्रारम्भ: $8\n* प्रतिबन्धक समाप्ति: $6\n* आसन्न प्रतिबन्धसँ प्रभावित: $7\n\nअहाँ $1 सँ सम्पर्क कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]]सँ प्रतिबन्धक विषयमे सम्पर्क कऽ सकै छी।\nअहाँ ’ऐ प्रयोक्ताकेँ ई-पत्र दिअ’ सुविधाक प्रयोग नै कऽ सकै छी यावत एकटा मान्य ई-पत्र संकेतक विवरण अहाँक  [[Special:Preferences|खाता विकल्प]]मे नै देल अछि आ अहाँकेँ एकर प्रयोग करबासँ रोकि नै देल गेल हो।\nअहाँक वर्तमान अनिकेत अछि $3, आ प्रतिबन्ध क्रमाङ्क अछि # $5 ।\nई सभ विवरणक उल्लेख अहाँ अपन कोनो कएल जाएबला प्रश्नमे करी।",
    +	"autoblockedtext": "अहाँक अनिकेत स्वचालित रूपेँ प्रतिबन्धित कऽ देल गेल अछि कारण एकर प्रयोग कोनो दोसर प्रयोक्ता द्वारा भऽ रहल छल, जे $1 द्वारा प्रतिबन्धतित कएल गेल।\nएकर कारण अछि:\n:<em>$2</em>।\n\n* प्रतिबन्धक प्रारम्भ: $8\n* प्रतिबन्धक समाप्ति: $6\n* आसन्न प्रतिबन्धसँ प्रभावित: $७\n\nअहाँ $1 सँ सम्पर्क कऽ सकै छी वा दोसर [[{{MediaWiki:Grouppage-sysop}}|प्रबन्धक]] सँ प्रतिबन्धक विषयमे सम्पर्क कऽ सकै छी।\nअहाँ मोन राखू जे अहाँ ’ऐ प्रयोक्ताकेँ ई-पत्र दिअ’ सुविधाक प्रयोग नै कऽ सकै छी यावत एकटा मान्य ई-पत्र संकेतक पंजीकरण अहाँक  [[Special:Preferences|प्रयोक्ता विकल्प]] मे नै देल अछि आ अहाँकेँ एकर प्रयोग करबासँ रोकि नै देल गेल हो।\nअहाँक वर्तमान अनिकेत अछि $3, आ प्रतिबन्ध क्रमाङ्क अछि # $5 ।\nई सभ विवरणक उल्लेख अहाँ अपन कोनो कएल जाएबला प्रश्नमे करी।",
     	"blockednoreason": "कोनो कारण देल नै अछि।",
     	"whitelistedittext": "अहाँकेँ $1पन्ना सम्पादन करबा लेल",
    -	"confirmedittext": "पन्ना सभक सम्पादन केलासँ पूर्व अहाँ अपन ई-पत्र संकेतकेँ सत्यापित करू।\nकृपा कऽ अपन ई-पत्र पता दर्ज करू आ सत्यापित करू ऐ सँ [[Special:Preferences|प्रयोक्ताक पसिन्न सभ]]",
    +	"confirmedittext": "पन्ना सम्पादन करैसँ पूर्व अहाँ अपन ई-मेल ठेगान सत्यापित करी।\nकृपा कऽ [[Special:Preferences|प्रयोक्ताक मोनपसन्द]]मे जा अपन ई-मेल ठेगान दर्ज करी आ सत्यापित करी।",
     	"nosuchsectiontitle": "एहन कोनो अनुभाग शीर्षक नै अछि",
     	"nosuchsectiontext": "अहाँ एहन अनुभागक सम्पादित करबाक प्रयास केलहुँ जे अछि नै।\nअहाँ जखन ई पन्ना देख रहल छलहुँ तखन ई मेटा देल गेल हएत वा दोसर ठाम हटा देल गेल हएत।",
     	"loginreqtitle": "सम्प्रवेश आवश्यक",
    @@ -629,37 +632,37 @@
     	"accmailtitle": "कूटशब्द पठा देल गेल।",
     	"accmailtext": "एकटा बिना क्रमबला निर्माण पद्धतिसँ कूटशब्दक निर्माण [[User talk:$1|$1]] लेल $2 केँ पठाएल गेल अछि।\n\nऐ खाताक कूटशब्द बदलल जा सकैए ''[[Special:ChangePassword|कूटशब्द बदलू]]'' पन्नापर सम्प्रवेश केलाक बाद।",
     	"newarticle": "(नव)",
    -	"newarticletext": "अहाँ एहेन पन्नाक लिंकक अनुसरण कऽ आएल छी जे पन्ना अखन बनले नै अछि।\nपन्ना बनेबाक लेल नीचाँक बक्शामे टाइप केनाइ शुरू करू (देखू [$1  सहायता पन्ना] विषेष जानकारी लेल)।",
    +	"newarticletext": "अहाँ एहेन पन्नाक लिङ्कक अनुसरण कऽ आएल छी जे पन्ना अखन बनले नै अछि।\nपन्ना बनेबाक लेल नीचाँक बक्सामे टाइप केनाए शुरू करी (देखी [$1  सहायता पन्ना] विषेष जानकारी लेल)।",
     	"anontalkpagetext": "----'' ई एकटा अनाम प्रयोक्ताक लेल वार्ता पन्ना छी जे अखन धरि अपन खाता नै खोलने छथि, वा जे एकर प्रयोग नै करै छथि।\nहमरा सभकेँ तइ लेल अंकीय अनिकेतक प्रयोग हुनका देखार करबा लेल करऽ पडि रहल अछि।\nऐ तरहक अनिकेत अनेक प्रयोक्ता द्वारा साझी कएल जा सकैत अछि।\nजँ अहाँ अनाम प्रयोक्ता छी आ बुझै छी जे बिना मतलबक टिप्पणी अहाँ दिस देल जा रहल अछि, तँ कृपा कऽ [[Special:CreateAccount|एकटा खाता खोली]] वा [[Special:UserLogin|सम्प्रवेश]] जइसँ भविष्यमे आन अनाम प्रयोक्तासँ अहाँक दिक्कत नै हो।''",
     	"noarticletext": "अखन ई पन्नापर कोनो पाठ नै अछि।\nअहाँ [[Special:Search/{{PAGENAME}}|ई पन्नाक शीर्षक ताकी]] आन पन्नापर,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} सम्बन्धी वृत्तलेख ताकी],\nआकि [{{fullurl:{{FULLPAGENAME}}|action=edit}} ई पन्नाक निर्माण करी]</span>।",
     	"noarticletext-nopermission": "अखन ऐ पन्नापर कोनो पाठ नै अछि।\nअहाँ [[Special:Search/{{PAGENAME}}|ऐ पन्ना शीर्षक लेल ताकू]]",
    -	"missing-revision": "\"{{FULLPAGENAME}}\" पन्ना के अवतरण #$1 मौजूद नई अछि ।\n\nओन त ई एक हट्याल गेल पन्ना के पुराना कडी पे क्लिक करबाक कारण से होएत अछि।\nअधिक जानकारी के लेल आहाँ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाबै के लॉग] देख सकै अछि।",
    -	"userpage-userdoesnotexist": "प्रयोक्ता खाता \"<nowiki>$1</nowiki>\" पंजीकृत नै अछि।\nनिश्चय करू जे की अहाँ ई पन्ना बनेबाक/ सम्पादित करबाक इच्छुक छी।",
    -	"userpage-userdoesnotexist-view": "प्रयोक्ता खाता \"$1\" पंजीकृत नै अछि।",
    +	"missing-revision": "\"{{FULLPAGENAME}}\" पन्नाक अवतरण #$1 मौजूद नै अछि ।\n\nओन त ई एक मेटाएल पन्नाक पुराना कडीपर क्लिक करबाक कारण सँ होएत अछि।\nअधिक जानकारीक लेल अहाँ [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटाबैक लग] देख सकै छी।",
    +	"userpage-userdoesnotexist": "प्रयोक्ता खाता \"$1\" पञ्जीकृत नै अछि।\nनिश्चय करी जे की अहाँ ई पन्ना बनेबाक/ सम्पादित करबाक इच्छुक छी।",
    +	"userpage-userdoesnotexist-view": "प्रयोक्ता खाता \"$1\" पञ्जीकृत नै अछि।",
     	"blocked-notice-logextract": "ई प्रयोक्ता अखन प्रतिबन्धित अछि।\nअद्यतन प्रतिबन्धित  वृत्तलेख लेखा सन्दर्भ लेल नीचाँ देल अछि:",
     	"clearyourcache": "'''टिप्पणी:''' संरक्षणक बाद, अहाँकेँ परिवर्तन देखबा लेल अपन गवेषकक उपस्मृतिकेँ हटबए पड़त।\n''' मोजिल्ला/ फायरफॉक्स/ सफारी:''' दाबि कऽ राखू ''शिफ्ट'' केँ ''पुनर्भारित'' क्लिक करबाक समए, वा दाबू चाहे ''Ctrl-F5'' वा ''Ctrl-R'' (''Command-R'' मैकिनटोशपर);\n'''कन्करर: ''' क्लिक करू ''पुनर्भारित करू'' वा दाबू''F5'';\n'''ओपेरा:''' उपस्मृति खतम करू ''Tools → Preferences'';\n'''इन्टरनेट एक्सप्लोरर:''' दाबि कऽ राखू ''Ctrl'' क्लिक करबा काल ''नवीकरण,'' वा दाबू ''Ctrl-F5'' ।",
    -	"usercssyoucanpreview": "''' संकेत:'''  प्रयोग करू \"{{int:पूर्वदृश्य देखाउ}}\" बटन अपन नव सी.एस.एस. संरक्षण जँचबाक लेल।",
    -	"userjsyoucanpreview": "''' संकेत:'''  प्रयोग करू \"{{int:पूर्वदृश्य देखाउ}}\" बटन अपन नव जावास्क्रिप्ट संरक्षण जँचबाक लेल।",
    +	"usercssyoucanpreview": "<strong>सङ्केत:</strong> सङ्ग्रह करैसँ पहिने अहाँ अपन नव सियसयसक जाँच लेल \"{{int:पूर्वदृश्य देखाउ}}\" बटनक प्रयोग करी।",
    +	"userjsyoucanpreview": "<strong>टिप</strong>  प्रयोग करी \"{{int:showpreview}}\" बटन अपन नव जावास्क्रिप्ट संरक्षण जँचबाक लेल।",
     	"usercsspreview": "''' मोन राखू जे अहाँ मात्र अपन प्रयोक्ता  सी.एस.एस. क पूर्वदृश्य देख रहल छी।'''\n''' ई अखन धरि संरक्षित नै भऽ सकल!'''",
     	"userjspreview": "''' मोन राखू जे अहाँ मात्र अपन प्रयोक्ता  जावास्क्रिप्टक पूर्वदृश्य देख रहल छी।'''\n''' ई अखन धरि संरक्षित नै भऽ सकल!'''",
     	"sitecsspreview": "''' मोन राखू जे अहाँ मात्र ऐ  सी.एस.एस. क पूर्वदृश्य देख रहल छी।'''\n''' ई अखन धरि संरक्षित नै भऽ सकल!'''",
     	"sitejspreview": "''' मोन राखू जे अहाँ मात्र ऐ  जावास्क्रिप्टक पूर्वदृश्य देख रहल छी।'''\n''' ई अखन धरि संरक्षित नै भऽ सकल!'''",
     	"userinvalidcssjstitle": "'''चेतौनी:''' ऐ मे कोनो आवरण \"$1\" नै अछि।\nबनाएल .css आ .js पन्ना लघ्वक्षरक शीर्षकक प्रयोग करैत अछि, जेना {{ns:user}}:Foo/vector.css एकर विरुद्ध {{ns:user}}:Foo/Vector.css ।",
     	"updated": "(अद्यतन  कएल)",
    -	"note": "'''टिप्पणी:'''",
    +	"note": "<strong>टिप्पणी:</strong>",
     	"previewnote": "'''मोन राखू ई मातर पूर्वावलोकन छी।'''\nअहाँक परिवर्तन अखन धरि सँचिआएल नै गेल अछि!",
     	"continue-editing": "सम्पादन क्षेत्र जाए",
     	"previewconflict": "ई पूर्वदृश्य देखबैए उपरका सम्पादन क्षेत्रक पाठ, ई आएत जखन अहाँ संरक्षित करब।",
     	"session_fail_preview": "''' दुखी छी! अहाँक सत्रक दत्तांश खतम भऽ गेल तै कारणसँ अहाँक सम्पादनक निपटारा नै भऽ सकल।'''\nफेरसँ प्रयास करू।\nजँ ई फेरसँ काज नै करैए, प्रयोग करू [[Special:UserLogout|निष्क्रमण]] आ फेर सम्प्रवेश करू।",
     	"session_fail_preview_html": "''' दुखी छी! हम अहाँक सम्पादनक निष्पादन नै कऽ सकलहुँ कारण सत्रक दत्तांश खतम भऽ गेल।'''\n''कारण {{अन्तर्जाल}} लग काँच एच.टी.एम.एल. दत्तांश सक्रिय छै, पूर्वदृश्य जावास्क्रिप्ट आक्रमणक डरसँ नुकाएल राखल गेल अछि।''\n'''जँ ई वैध सम्पादन प्रयास अछि, कृपा कऽ पुनः प्रयास करू।'''\nजँ ई अखनो काज नै कऽ रहल अछि, प्रयास करू [[Special:UserLogout|निष्क्रमण कऽ रहल छी]] आ फेरसँ सम्प्रवेश।",
     	"token_suffix_mismatch": "'''अहाँक सम्पादन अस्वीकार कऽ देल गेल अछि कारण अहाँक ग्राहक प्रेष्यमान अंक विधानक विराम चेन्ह सभकेँ नष्ट कऽ देलन्हि।'''\nई सम्पादन पन्नाक पाठकेँ दूषित होएबासँ बचेबा लेल अमान्य कऽ देल गेल।\nई कखनो काल होइए जखन अहाँ जाल आधारित अनाम दोसरा लेल चल सेवा प्रयुक्त करै छी।",
    -	"edit_form_incomplete": "'''सम्पादन आवेदनक किछु भाग वितरक धरि नै पहुँचल; एक बेर फेर देखू जे अहाँक सम्पादन दुरुस्त अछि आ फेरसँ प्रयास करू।'''",
    +	"edit_form_incomplete": "<strong>सम्पादन आवेदनक किछु भाग वितरक धरि नै पहुँचल; एक बेर फेर देखी जे अहाँक सम्पादन दुरुस्त अछि आ फेरसँ प्रयास करी।</strong>",
     	"editing": "सम्पादन होइए $1",
     	"creating": "$1 बनाबी",
     	"editingsection": "सम्पादन कऽ रहल छी $1 (खण्ड)",
     	"editingcomment": "सम्पादन कऽ रहल छी $1 (नव खण्ड)",
    -	"editconflict": "सम्पादन अन्तर: $1",
    -	"explainconflict": "जखन अहाँ एकर सम्पादन आरम्भ केने रही तखनसँ कियो आन ऐ पन्नाकेँ बदलि देलक।\nउपरका पाठ क्षेत्र अखन उपस्थित पन्नाक पाठ देखबैत अछि।\nअहाँक परिवर्तन निचुलका पाठ क्षेत्रमे देखाएल अछि।\nअहाँकेँ अपन परिवर्तन वर्तमान पाठमे मिलाबऽ पड़त।\n'''मात्र''' \"{{int:savearticle}}\" दबलापर उपरका पाठ क्षेत्रक पाठ संरक्षित हएत।",
    +	"editconflict": "सम्पादन अन्तर्विरोध: $1",
    +	"explainconflict": "जखन अहाँ एकर सम्पादन आरम्भ केने रही तखनसँ कियो आन ऐ पन्नाकेँ बदलि देलक।\nउपरका पाठ क्षेत्र अखन उपस्थित पन्नाक पाठ देखबैत अछि।\nअहाँक परिवर्तन निचुलका पाठ क्षेत्रमे देखाएल अछि।\nअहाँकेँ अपन परिवर्तन वर्तमान पाठमे मिलाबऽ पडत।\n<strong>मात्र</strong> \"{{int:savearticle}}\" दबलापर उपरका पाठ क्षेत्रक पाठ संरक्षित हएत।",
     	"yourtext": "अहाँक पाठ",
     	"storedversion": "पेटारमे राखल संशोधन",
     	"nonunicodebrowser": "'''चेतौनी: अहाँक गवेषक सार्वत्रिकाक्षरकूट सहयोगी नै अछि।'''\nएकटा अस्थायी-परोक्ष तंत्रांश अहाँकेँ सुरक्षित रूपेँ पन्नाक सम्पादनमे मदति करत: गएर-अस्की अक्षर सभ षोडशमान पद्धतिमे सम्पादन बक्सामे आएत।",
    @@ -672,28 +675,28 @@
     	"protectedpagewarning": "''' चेतौनी: ई पन्ना संरक्षित अछि से खाली संचालन अधिकारयुक्त प्रयोक्ता एकरा सम्पादित कऽ सकै छथि।'''\nअद्यतन वृतलेख उल्लेख नीचाँ सन्दर्भ लेल देल जा रहल अछि:",
     	"semiprotectedpagewarning": "'''चेतौनी:''' ई पन्ना संरक्षित अछि से खाली पंजीकृत प्रयोक्ता एकरा सम्पादित कऽ सकै छथि।\nअद्यतन वृतलेख उल्लेख नीचाँ सन्दर्भ लेल देल जा रहल अछि:",
     	"cascadeprotectedwarning": "'''चेतौनी:''' ई पन्ना संरक्षित अछि से खाली संचालन अधिकारयुक्त प्रयोक्ता एकरा सम्पादित कऽ सकै छथि, कारण ई तराउपड़ी संरक्षित {{PLURAL:$1|पन्ना|पन्ना}}  मे शामिल अछि।",
    -	"titleprotectedwarning": "'''चेतौनी: ई पन्ना संरक्षित अछि से एकरा बनेबा लेल [[Special:ListGroupRights|specific rights]] आवश्यक अछि।'''\nनीचाँ ऐ लेल अद्यतन वृत्तलेख उल्लेख देल जा रहल अछि:",
    -	"templatesused": "{{PLURAL:$1|नमूना|नमूना सभ}} ऐ पन्नापर प्रयुक्त:",
    -	"templatesusedpreview": "{{PLURAL:$1|मास्टरफाइल|सभटा मास्टरफाइल}} used in this preview:ऐ पूर्वप्रदर्शनमे प्रयुक्त :",
    -	"templatesusedsection": "{{PLURAL:$1|नमूना|नमूना सभ}} ऐ संवर्गमे प्रयुक्त:",
    +	"titleprotectedwarning": "'''चेतौनी: ई पन्ना संरक्षित अछि आ एकरा बनेबा लेल [[Special:ListGroupRights|विशेष अधिकारक]] आवश्यक अछि।'''\nनीचाँ ऐ लेल अद्यतन वृत्तलेख उल्लेख देल जा रहल अछि:",
    +	"templatesused": "ई पन्नापर प्रयुक्त {{PLURAL:$1|आकृति|आकृतिसभ}}:",
    +	"templatesusedpreview": "ई पूर्वप्रदर्शनमे प्रयुक्त {{PLURAL:$1|आकृति|आकृतिसभ}}:",
    +	"templatesusedsection": "{{PLURAL:$1|आकृति|आकृतिसभ}} ई पूर्वप्रदर्शनमे प्रयुक्त:",
     	"template-protected": "(संरक्षित)",
     	"template-semiprotected": "(अर्ध-संरक्षित)",
    -	"hiddencategories": "ई पन्ना सदस्य अछि {{PLURAL:$1|1 नुकाएल संवर्ग|$1 नुकाएल संवर्ग सभ}}:",
    +	"hiddencategories": "ई पृष्ठ निम्नलिखित $1 नुकाएल गेल {{PLURAL:$1|श्रेणी|श्रेणीसभ}}मे श्रेणीबद्ध अछि:",
     	"edittools": "<!-- एतए देल गेल पाठ सम्पादन आर अपलोड फारम के निचा देखाओल जाएत। -->",
     	"edittools-upload": "-",
    -	"nocreatetext": "{{अन्तर्जाल}} नव पन्ना निर्माणक क्षमताकेँ सीमित कऽ देने अछि।\nअहाँ आपस जा सकै छी आ कोनो पन्नाकेँ सम्पादित कऽ सकै छी, वा [[Special:UserLogin|log in or create an account]]",
    +	"nocreatetext": "{{SITENAME}} नव पन्ना निर्माणक क्षमताकेँ सीमित कऽ देने अछि।\nअहाँ आपस जा सकै छी आ कोनो पन्नाकेँ सम्पादित कऽ सकै छी, वा [[Special:UserLogin|नयाँ खाता खोली/ प्रवेश करी]]",
     	"nocreate-loggedin": "अहाँक नव पन्ना बनेबाक अधिकार नै अछि।",
     	"sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नै अछि",
     	"sectioneditnotsupported-text": "ई पृष्ठ पर अनुभाग सम्पादन समर्थित नै अछि",
     	"permissionserrors": "आज्ञा गल्ती",
    -	"permissionserrorstext": "अहाँके ऐ लेल अनुमति नै अछि, ऐ ले {{PLURAL:$1|कारण|कारण सभ}}:",
    -	"permissionserrorstext-withaction": "अहाँके अनुमति नै अछि $2 लेल, ऐ लेल {{PLURAL:$1|कारण|कारण सभ}}:",
    +	"permissionserrorstext": "अहाँके ऐ लेल अनुमति नै अछि, ऐ ले {{PLURAL:$1|कारण|कारणसभ}}:",
    +	"permissionserrorstext-withaction": "अहाँके अनुमति नै अछि $2 लेल, ऐ लेल {{PLURAL:$1|कारण|कारणसभ}}सँ:",
     	"recreate-moveddeleted-warn": "'''चेतौनी''': अहाँ फेरसँ ओ पन्ना बना रहल छी जे पहिने मेटा देल गेल छै।'''\n\nअहाँ विचारू जे की ई सम्पादन केनाइ उचित अछि।\nऐ पन्नाक मेटाएल बला आ हटाएल वृत्तलेख एतए सुविधा लेल देल जा रहल अछि:",
     	"moveddeleted-notice": "ई पन्ना मेटा देल गेल अछि।\nऐ पन्ना लेल मेटाएल आ हटाएल बला वृत्तलेख सन्दर्भ लेल नीचाँ देल गेल अछि।",
     	"log-fulllog": "सभटा वृत्तलेख देखी",
     	"edit-hook-aborted": "सम्पादन नोकसीसँ खतम भेल।\nई कोनो कारण नै देलक।",
     	"edit-gone-missing": "पन्ना अद्यतन नै भऽ सकल।\nलगैए जे ई मेटा देल गेल अछि।",
    -	"edit-conflict": "सम्पादन अन्तर",
    +	"edit-conflict": "सम्पादन अन्तर्विरोध",
     	"edit-no-change": "अहाँक सम्पादनपर ध्यान नै देल गेल, कारण ऐ सँ पाठमे कोनो परिवर्तन नै आएल।",
     	"postedit-confirmation-created": "पन्ना निर्माण करल गेल अछि ।",
     	"postedit-confirmation-restored": "पन्नाके पुराण स्थितिमे लौने गेल अछि ।",
    @@ -713,13 +716,13 @@
     	"content-json-empty-object": "रिक्त सामग्री",
     	"content-json-empty-array": "रिक्त ऐरे",
     	"duplicate-args-category": "आकृति कल में डुप्लिकेट तर्कक उपयोग करैत पन्नासभ",
    -	"duplicate-args-category-desc": "पन्ना जेना तर्कों कें डुप्लिकेट के उपयोग करई वाल टेम्पलेट कॉल, जेना <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> आर <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
    +	"duplicate-args-category-desc": "पन्ना जेना तर्कसभके डुप्लिकेटक उपयोग करैवाला आकृति कल, जेना <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> आर <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
     	"expensive-parserfunction-warning": "'''चेतौनी:''' ई पन्ना बड्ड बेसी महग विभाजक प्रकार्य आह्वान करैत अछि।\n एकरा $2 सँ कम {{PLURAL:$2|call|calls}}, ओतऽ {{PLURAL:$1|ई अछि $1 call|ई सभ अछि $1 calls}}",
     	"expensive-parserfunction-category": "बड बेसी महग विभाजक आह्वानबला पन्ना सभ",
     	"post-expand-template-inclusion-warning": "'''चेतौनी:''' नमूना लेबाक आकार बड्ड पैघ अछि।\nकिछु नमूना नै लेल जा सकत।",
     	"post-expand-template-inclusion-category": "पन्ना सभ जतए नमूना लेबाक आकार बढ़ि गेल",
     	"post-expand-template-argument-warning": "'''चेतौनी''' ऐ पन्नामे नै बेशी तँ एकटा एहेन नमूना निरुपक अछि जकर बड्ड पैघ विस्तार आकार छै।\nई निरूपक सभ हटा देल गेल अछि।",
    -	"post-expand-template-argument-category": "छोड़ल नमूना निरूपक बला पन्ना सभ",
    +	"post-expand-template-argument-category": "छोडल नमूना निरूपक बला पन्नासभ",
     	"parser-template-loop-warning": "नमूना परिक्रम भेटल: [[$1]]",
     	"parser-template-recursion-depth-warning": "नमूना प्रत्यावर्तन गहीर सीमा पार केलक ($1)",
     	"language-converter-depth-warning": "भाषान्तर गहीर सीमा पार केलक ($1)",
    @@ -736,12 +739,12 @@
     	"undo-failure": "मध्यवर्ती विरोधी सम्पादनक कारण ऐ सम्पादनकेँ खतम नै कएल जा सकैए।",
     	"undo-norev": "ई सम्पादन खतम नै कएला जा सकैए कारण ई अछि नै वा मेटा देल गेल अछि।",
     	"undo-nochange": "ऐना लगया की ई सम्पादन कें पहील से पूर्ववत करई देन अछि।",
    -	"undo-summary": "$1 संशोधन खतम करू [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
    +	"undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|वार्ता]])द्वारा कएल अन्तर $1 के पूर्ववत कएलक",
     	"undo-summary-username-hidden": "नुकाएल गेल प्रयोक्ताद्वारा केल गेल परिवर्तन $1 के पूर्ववत केल गेल",
     	"cantcreateaccounttitle": "खाता नै बना सकल",
    -	"cantcreateaccount-text": "('''$1''') अनिकेत पतासँ खाता निर्माण प्रतिबन्धित कएल गेल [[User:$3|$3]]।\n$3 द्वारा देल कारण अछि ''$2''",
    +	"cantcreateaccount-text": "(<strong>$1</strong>) अनिकेत पतासँ खाता निर्माण प्रतिबन्धित कएल गेल [[User:$3|$3]]।\n$3 द्वारा देल कारण अछि ''$2''",
     	"cantcreateaccount-range-text": "<strong>$1</strong> के श्रेणी में आबई वाला आई॰पी पता सऽ, जएमें आहाँ कें आई॰पी पता (<strong>$4</strong>) शामिल अछि, नया खाता के रचना [[User:$3|$3]] द्वारा अवरोधित केल गेल अछि। \n\n$3 द्वारा देल गेल कारण अछि: \"$2\"",
    -	"viewpagelogs": "ऐ पन्नाक वृत्तलेख सभ देखू",
    +	"viewpagelogs": "ई पन्नाक वृत्तलेखसभ देखी",
     	"nohistory": "ऐ पन्ना लेल कोनो सम्पादन इतिहास नै अछि।",
     	"currentrev": "नूतन संशोधन",
     	"currentrev-asof": "$1 क समकालिक तखुनका संशोधन",
    @@ -756,21 +759,21 @@
     	"page_first": "पहिल",
     	"page_last": "अन्तिम",
     	"histlegend": "फाइल तुलना तंत्रांशक चयन: संशोधन तुलनाक रेडियो बक्शाकेँ चिन्हित करू आ एन्टर बटन क्लिक करू वा सभसँ नीचाँक बटन क्लिक करू। <br />\nकहबी: '''({{int:cur}})''' = अद्यतन संशोधनसँ अन्तर, '''({{int:last}})''' = अद्यतनसँ पहिलुका संशोधनसँ अन्तर, '''{{int:minoreditletter}}''' = मामूली सम्पादन।",
    -	"history-fieldset-title": "इतिहास खंघारू",
    +	"history-fieldset-title": "इतिहास विचरण करी",
     	"history-show-deleted": "खाली मेटाएल",
     	"histfirst": "सभसँ पुरान",
     	"histlast": "आइ-काल्हिक",
     	"historysize": "({{PLURAL:$1|1 अष्टक|$1 अष्टक}})",
     	"historyempty": "(रिक्त)",
     	"history-feed-title": "संशोधन इतिहास",
    -	"history-feed-description": "ऐ पन्नाक विकीपर सम्पादन इतिहास",
    +	"history-feed-description": "ई पन्नाक विकीपर सम्पादन इतिहास",
     	"history-feed-item-nocomment": "$2 पर $1",
     	"history-feed-empty": "आग्रह कएल पन्ना नै अछि।\nई विकीसँ चाहे मेटा देल गेल अछि, वा एकर नाम बदलि देल गेल अछि।\nप्रयास करू [[Special:Search|searching on the wiki]] सम्बन्धित नव पन्ना सभ लेल।",
     	"history-edit-tags": "चुनल गेल अवतरणसभ के ट्याग सम्पादित करी।",
     	"rev-deleted-comment": "(सम्पादन इतिहास हटाएल गेल)",
     	"rev-deleted-user": "(प्रयोक्तानाम हटाएल गेल)",
     	"rev-deleted-event": "(वृतलेख कार्य हटावोल गेल)",
    -	"rev-deleted-user-contribs": "[प्रयोक्तानाम वा अनिकेत हटाएल गेल- योगदानमे नुकाएल सम्पादित करू]",
    +	"rev-deleted-user-contribs": "[प्रयोक्तानाम वा अनिकेत हटाएल गेल- योगदानमे नुकाएल सम्पादित करी]",
     	"rev-deleted-text-permission": "ऐ पन्नाक संशोधन '''मेटा देल गेल'''।\nवर्णन देखि सकै छी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।",
     	"rev-suppressed-text-permission": "ए पृष्ठक अवतरण '''नुकाएल गेल अछि'''।\nअहाँ एकरा देख सकैत छी; विवरण [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} नुकाएल लग] में भेट सकैत अछि।",
     	"rev-deleted-text-unhide": "ऐ पन्नाक सम्पादन '''मेटाएल''' गेल।\nवर्णन ताकि सकै छी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log] मे।\nअहाँ अखनो [$1 ई संशोधन देखू] जँ अहाँ आगाँ बढ़ऽ चाहै छी।",
    @@ -793,34 +796,34 @@
     	"revdelete-show-file-submit": "हँ",
     	"revdelete-selected-text": "[[:$2]] {{PLURAL:$1|क|के}} चयनित अवतरण:",
     	"revdelete-selected-file": "[[:$2]] {{PLURAL:$1|क|के}} चयनित फाइल अवतरण:",
    -	"logdelete-selected": "{{PLURAL:$1|चुनल वृत्तलेख घटना|चुनल वृत्तलेख घटना सभ}}:",
    +	"logdelete-selected": "{{PLURAL:$1|चुनल वृत्तलेख घटना|चुनल वृत्तलेख घटनासभ}}:",
     	"revdelete-text-text": "हटाएल गेल अवतरण पृष्ठ इतिहासमें देखाएल जाएत मुदा वोकर सामग्री सार्वजनिक रूपसँ नै देखाएल जा सकएत अछि।",
     	"revdelete-text-file": "हटाएल गेल अवतरण पृष्ठ इतिहासमें देखाएल जाएत मुदा वोकर सामग्री सार्वजनिक रूपसँ नै देखाएल जा सकएत अछि।",
     	"logdelete-text": "हटाए गेल प्रवेश घटनासभ अखैनो भी लॉग में दिखाबल ज्यात, लेकिन ओकर सामग्री के कुछ भाग के सार्वजनीक करबाक के लेल दुर्गम भ्या जेत।",
    -	"revdelete-confirm": "कृपा कऽ आश्वस्त भऽ जाउ जे अहाँ ई करऽ चाहै छी, अहाँकेँ एकर परिणामक जनतब अछि, आ अहाँ एकरा [[{{MediaWiki:Policy-url}}|निअम]] क अनुसार कऽ रहल छी।",
    +	"revdelete-confirm": "कृपा कऽ आश्वस्त भऽ जाउ जे अहाँ ई करऽ चाहै छी, अहाँकेँ एकर परिणामक जनतब अछि, आ अहाँ एकरा [[{{MediaWiki:Policy-url}}|नियम]] क अनुसार कऽ रहल छी।",
     	"revdelete-suppress-text": "दबाबैबला काज '''मात्र''' ऐ सभ स्थितिमे प्रयोग करू:\n* मानहानिक सम्भावनाबला सूचना\n* भ्रमयुक्त व्यक्तिगत सूचना\n*: ''घरक पता आ टेलीफोन नम्बर, सामाजिक सुरक्षा संख्या, आदि।''",
    -	"revdelete-legend": "दृश्यतापर प्रतिबन्धक सीमा लगाउ",
    +	"revdelete-legend": "दृश्यतापर प्रतिबन्धक सीमा लगाबी",
     	"revdelete-hide-text": "संशोधन पाठ नुकाउ",
    -	"revdelete-hide-image": "संचिकाक पाठ नुकाउ",
    +	"revdelete-hide-image": "सञ्चिकाक पाठ नुकाबी",
     	"revdelete-hide-name": "क्रिया आ लक्ष्य नुकाउ",
     	"revdelete-hide-comment": "सम्पादन सार नुकाउ",
     	"revdelete-hide-user": "सम्पादकक प्रयोक्तानाम/ अनिकेत नुकाउ",
    -	"revdelete-hide-restricted": "संचालक आ दोसरासँ दत्तांश दबाउ",
    -	"revdelete-radio-same": "(नै बदलू)",
    +	"revdelete-hide-restricted": "प्रबन्धक आ दोसरासँ दत्तांश नुकाबी",
    +	"revdelete-radio-same": "(नै बदली)",
     	"revdelete-radio-set": "हँ",
     	"revdelete-radio-unset": "नै",
    -	"revdelete-suppress": "संचालक आ दोसरा लेल दत्तांश दबाउ",
    -	"revdelete-unsuppress": "पुनर्स्थापित संशोधल लेल प्रतिबन्ध हटाउ",
    +	"revdelete-suppress": "प्रबन्धक आ दोसरा लेल दत्तांश नुकाबी",
    +	"revdelete-unsuppress": "पुनर्स्थापित संशोधन लेल प्रतिबन्ध हटाबी",
     	"revdelete-log": "कारण:",
    -	"revdelete-submit": "किछु चुनलपर लागू करू{{PLURAL:$1|संशोधन|संशोधन सभ}}",
    +	"revdelete-submit": "चयनित {{PLURAL:$1|संसोधन|संसोधनसभ}} पर लागू करी",
     	"revdelete-success": "'''संशोधन दृश्यता सफलतापूर्वक अद्यतन कएल गेल।'''",
    -	"revdelete-failure": "$1'''संशोधन दृश्यता अद्यतन नै कएल जा सकल:'''",
    +	"revdelete-failure": "संशोधन दृश्यता अद्यतन नै कएल जा सकल: $1",
     	"logdelete-success": "'''वृत्तलेख दृश्यता सफलतासँ निर्धारित भेल।'''",
     	"logdelete-failure": "'''वृत्तलेख दृश्यता निर्धारित नै भऽ सकल।'''$1",
     	"revdel-restore": "दृष्टिकुशलता बदली",
     	"pagehist": "पन्नाक इतिहास",
     	"deletedhist": "मेटाएल इतिहास",
    -	"revdelete-hide-current": "तिथि $2, $1 क अनुक्रमकेँ नुकेबा काल भ्रम: ई वर्तमान संशोधन छी।\nई नुकाएल नै जा सकैए।",
    +	"revdelete-hide-current": "तिथि $2 के $1 बजे अनुक्रम नुकेबा काल भ्रम: ई वर्तमान संशोधन छी।\nई नुकाएल नै जा सकैए।",
     	"revdelete-show-no-access": "तिथि $2, $1क बौस्तुक देखेबामे भ्रम: ई बौस्तु \"प्रतिबन्धित\" चिन्हित कएल गेल अछि।",
     	"revdelete-modify-no-access": "तिथि $2, $1क बौस्तुक संशोधनमे भ्रम: ई बौस्तु \"प्रतिबन्धित\" चिन्हित कएल गेल अछि।\nअहाँकेँ एकरा लग लागि नै अछि।",
     	"revdelete-modify-missing": "बौस्तुक चेन्ह-संकेत  $1 मे संशोधन भ्रम: ई दत्तनिधिमे नै अछि।",
    @@ -830,7 +833,7 @@
     	"revdelete-reason-dropdown": "*सामान्य मेटेबाक कारण सभ\n** सर्वाधिकारक उल्लंघन\n** अनुचित व्यक्तिगत सूचना\n** सम्भावित मानहानिक सूचना",
     	"revdelete-otherreason": "दोसर/ अतिरिक्त कारण:",
     	"revdelete-reasonotherlist": "दोसर कारण",
    -	"revdelete-edit-reasonlist": "मेटेबाक कारणक सम्पादन करू",
    +	"revdelete-edit-reasonlist": "मेटेबाक कारण बदली",
     	"revdelete-offender": "संशोधन केनिहार:",
     	"suppressionlog": "दबाएलगेल वृत्तलेख",
     	"suppressionlogtext": "नीचाँ मेटाएल आ प्रतिबन्धक उल्लेख अछि जे संचालकसँ नुकाएल सामिग्री अछि।\nअखन स्थित प्रभावी प्रतिबन्ध आ अवरोध लेल देखू [[Special:BlockList|IP block list]] ।",
    @@ -879,19 +882,19 @@
     	"nextn": "आगाँ {{PLURAL:$1|$1}}",
     	"prev-page": "पहिलुका पृष्ठ",
     	"next-page": "अगला पृष्ठ",
    -	"prevn-title": "पहिलुका $1 {{PLURAL:$1|परिणाम|परिणाम सभ}}",
    -	"nextn-title": "आगाँ $1 {{PLURAL:$1|परिणाम|परिणाम सभ}}",
    +	"prevn-title": "पहिलुका $1 {{PLURAL:$1|परिणाम|परिणामसभ}}",
    +	"nextn-title": "आगाँ $1 {{PLURAL:$1|परिणाम|परिणामसभ}}",
     	"shown-title": "प्रति पन्ना $1 {{PLURAL:$1|परिणाम|परिणामसभ}} देखाउ",
    -	"viewprevnext": "देखू  ($1 {{int:pipe-separator}} $2) ($3)",
    -	"searchmenu-exists": "'''ऐ विकीपर एकटा पन्ना अछि \"[[:$1]]\" नामसँ।'''",
    +	"viewprevnext": "देखी ($1 {{int:pipe-separator}} $2) ($3)",
    +	"searchmenu-exists": "<strong>ऐ विकीपर एकटा पन्ना अछि \"[[:$1]]\" नामसँ।<strong>{{PLURAL:$2|0=|अन्य भेटल परिणामसभ सेहो देखी}}",
     	"searchmenu-new": "''' पन्ना निर्माण \"[[:$1]]\" ऐ विकीपर !'''",
    -	"searchprofile-articles": "अनुक्रम पन्ना सभ",
    +	"searchprofile-articles": "सामग्री पृष्ठ",
     	"searchprofile-images": "दृश्य-श्रव्य",
     	"searchprofile-everything": "सभटा",
     	"searchprofile-advanced": "विशिष्ट",
     	"searchprofile-articles-tooltip": "$1 मे ताकी",
     	"searchprofile-images-tooltip": "सञ्चिकासभ लेल ताकी",
    -	"searchprofile-everything-tooltip": "सभटा सामिग्रीमे ताकू (चर्चा पन्ना सहित)",
    +	"searchprofile-everything-tooltip": "सभटा सामिग्रीमे ताकी (चर्चा पन्ना सहित)",
     	"searchprofile-advanced-tooltip": "बनाएल नामस्थान सभमे ताकी",
     	"search-result-size": "$1 ({{PLURAL:$2|1 शब्द|$2 शब्दसभ}})",
     	"search-result-category-size": "{{PLURAL:$1|1 सदस्य|$1 सदस्य}} ({{PLURAL:$2|1 उपसंवर्ग|$2 उपसंवर्ग}}, {{PLURAL:$3|1 संचिका|$3 संचिका}})",
    @@ -912,12 +915,12 @@
     	"search-nonefound": "अभ्यर्थनासँ मेल खाइत कोनो परिणाम नै भेटल।",
     	"powersearch-legend": "विशेष खोज",
     	"powersearch-ns": "निर्धारकमे खोज",
    -	"powersearch-togglelabel": "जाँचू:",
    +	"powersearch-togglelabel": "जाँची:",
     	"powersearch-toggleall": "सभटा",
     	"powersearch-togglenone": "कोनो नै",
     	"powersearch-remember": "याद राखु भविष्यकऽ खोजीके लेल",
     	"search-external": "बाह्य खोज",
    -	"searchdisabled": "{{अन्तर्जाल}} खोज बन्न अछि।\nअहाँक गूगलक माध्यमसँ ऐ बीच ताकि सकै छी।\nमोन राखू जे तकर विवरणी {{अन्तर्जाल}} सामिग्री समयातीत भऽ सकैए।",
    +	"searchdisabled": "{{SITENAME}} खोज बन्द अछि।\nता अहाँ गूगलक माध्यमसँ ताकि सकै छी।\nमोन राखी जे तकर विवरणी {{SITENAME}} समिग्री समयातीत भऽ सकैए।",
     	"search-error": "खोजवाके समय निम्न त्रुटि उत्पन्न भेल: $1",
     	"preferences": "विकल्प",
     	"mypreferences": "खासमखास",
    @@ -925,11 +928,11 @@
     	"prefsnologintext2": "अपन वरीयतासभके बदलैक लेल कृपया सम्प्रवेश करी।",
     	"prefs-skin": "रूप",
     	"skin-preview": "पूर्वावलोकन",
    -	"datedefault": "कोनो मोनपसंद नै",
    -	"prefs-labs": "प्रायोगिक गुण सभ",
    +	"datedefault": "कोनो पसन्द नै",
    +	"prefs-labs": "प्रायोगिक गुणसभ",
     	"prefs-user-pages": "उपयोगकर्ताक पृष्ठ",
     	"prefs-personal": "प्रयोक्ता परिचय",
    -	"prefs-rc": "हालक परिवर्तन",
    +	"prefs-rc": "लगक परिवर्तन",
     	"prefs-watchlist": "साकांक्ष-सूची",
     	"prefs-editwatchlist": "साकांक्षसूची बदली",
     	"prefs-editwatchlist-label": "अपन साकांक्षसूचीक प्रविष्टिसभ सम्पादित करी:",
    @@ -944,14 +947,14 @@
     	"prefs-misc": "आर",
     	"prefs-resetpass": "कूटशब्द बदली",
     	"prefs-changeemail": "ई-पत्र संकेत बदलू",
    -	"prefs-setemail": "ई-पत्र संकेत निर्धारित करी",
    +	"prefs-setemail": "ई-पत्र ठेगान निर्धारित करी",
     	"prefs-email": "ई-पत्र विकल्पसभ",
     	"prefs-rendering": "मुँहकान",
    -	"saveprefs": "सुरक्षित करू",
    +	"saveprefs": "सङ्ग्रह करी",
     	"restoreprefs": "सभटा पूर्वनिर्धारित चयनकेँ फेरसँ आनू",
     	"prefs-editing": "सम्पादन कऽ रहल छी",
    -	"rows": "पाँती सभ",
    -	"columns": "स्तम्भ सभ",
    +	"rows": "पाँतीसभ",
    +	"columns": "स्तम्भसभ",
     	"searchresultshead": "ताकी",
     	"stub-threshold": "सीमा <a href=\"#\" class=\"stub\">काटल लागि</a> सँचियाएल (अष्टक):",
     	"stub-threshold-sample-link": "उदाहरण",
    @@ -983,8 +986,8 @@
     	"prefs-searchoptions": "ताकी",
     	"prefs-namespaces": "नामस्थानसभ",
     	"default": "पूर्वनिर्धारित",
    -	"prefs-files": "संचिका सभ",
    -	"prefs-custom-css": "खास सी.एस.एस.",
    +	"prefs-files": "सञ्चिकासभ",
    +	"prefs-custom-css": "खास सियसयस",
     	"prefs-custom-js": "खास जावास्क्रिप्ट",
     	"prefs-common-css-js": "सभ रूप लेल साझी सी.एस.एस./ जावास्क्रिप्ट:",
     	"prefs-reset-intro": "अहाँ ऐ पन्नाक प्रयोग अपन विकल्पकेँ पूर्वनिविष्ट रूपेँ जाल पुनर्निधारित करबा लेल कऽ सकै छी।\nई बदलल नै जा सकैए।",
    @@ -1028,7 +1031,7 @@
     	"prefs-displayrc": "दृश्य विकल्पसभ",
     	"prefs-displaywatchlist": "दृश्य विकल्पसभ",
     	"prefs-tokenwatchlist": "टोकन",
    -	"prefs-diffs": "अन्तर निर्धारक सभ",
    +	"prefs-diffs": "अन्तर",
     	"prefs-help-prefershttps": "इ प्राथमिकता अहाँके फेर स सम्प्रवेश करलाक बाद प्रभाव पडत।",
     	"prefs-tabs-navigation-hint": "सुझाव: अहाँ टैब्स सूचीमे टैब्सके बीच आवागमन करवाक लेल बाम आर दाहिना बागलके कुंजिसभके उपयोग कइर सकैत छी।",
     	"userrights": "प्रयोक्ता अधिकारक प्रबन्धन",
    @@ -1036,7 +1039,7 @@
     	"userrights-user-editname": "एकटा प्रयोक्तानाम लिखी:",
     	"editusergroup": "{{GENDER:$1|सदस्य}} समूहसभक सम्पादन करी",
     	"editinguser": "सदस्य '''[[User:$1|$1]]''' $2 क अधिकार बदलि\n{{GENDER:$1|सदस्य}}क सदस्य अधिकार बदलल जा रहल अछि <strong>[[User:$1|$1]]</strong> $2",
    -	"userrights-editusergroup": "प्रयोक्ता संवर्ग सभक सम्पादन करू",
    +	"userrights-editusergroup": "प्रयोगकर्ता समूह सम्पादित करी",
     	"saveusergroups": "{{GENDER:$1|सदस्य}} समूह सङ्ग्रह करी",
     	"userrights-groupsmember": "क सदस्य:",
     	"userrights-groupsmember-auto": "क जानल सदस्य:",
    @@ -1053,7 +1056,7 @@
     	"userrights-removed-self": "अहाँ सफलतापूर्वक अपन अधिकार हटा देने छी। अतः अहाँ आब ई पृष्ठ नै देख सकैत छी।",
     	"group": "समूह:",
     	"group-user": "प्रयोक्तासभ",
    -	"group-autoconfirmed": "स्वतःअनुमोदित प्रयोक्ता सभ",
    +	"group-autoconfirmed": "स्वतःअनुमोदित प्रयोक्ता",
     	"group-bot": "स्वचालक",
     	"group-sysop": "प्रबन्धक",
     	"group-bureaucrat": "अधिकारी",
    @@ -1066,10 +1069,10 @@
     	"group-bureaucrat-member": "{{GENDER:$1|प्रशासक}}",
     	"group-suppress-member": "{{GENDER:$1|नुकाए वाला}}",
     	"grouppage-user": "{{ns:project}}:प्रयोगकर्तासभ",
    -	"grouppage-autoconfirmed": "{{ns:project}}:स्वतःअनुमोदित प्रयोक्तासभ",
    -	"grouppage-bot": "{{ns:project}}:स्वचालकसभ",
    +	"grouppage-autoconfirmed": "{{ns:project}}:स्वतःअनुमोदित प्रयोक्ता",
    +	"grouppage-bot": "{{ns:project}}:स्वचालक",
     	"grouppage-sysop": "{{ns:project}}:प्रबन्धक",
    -	"grouppage-bureaucrat": "{{ns:project}}:अधिकारीसभ",
    +	"grouppage-bureaucrat": "{{ns:project}}:अधिकारी",
     	"grouppage-suppress": "{{ns:project}}:नुकाबी",
     	"right-read": "पन्ना सभ पढ़ू",
     	"right-edit": "पन्नासभ सम्पादन करी",
    @@ -1077,7 +1080,7 @@
     	"right-createtalk": "वार्ता पन्नासभ बनाबी",
     	"right-createaccount": "नव प्रयोक्ता खातासभ बनाबी",
     	"right-autocreateaccount": "बाहरी खातासँ स्वतः प्रवेश",
    -	"right-minoredit": "सम्पादन सभकेँ मामूली चिन्हित करू",
    +	"right-minoredit": "सम्पादन सभकेँ मामूली चिन्हित करी",
     	"right-move": "पन्ना घसकाबी",
     	"right-move-subpages": "पृष्ठ उपपृष्ठसभ सहित घसकाबी",
     	"right-move-rootuserpages": "मूल प्रयोक्ता पन्ना घसकाबी",
    @@ -1087,27 +1090,27 @@
     	"right-upload": "सञ्चिकासभ उपारोपित करी",
     	"right-reupload": "वर्तमान सञ्चिकासभक पुनर्लेखन करी",
     	"right-reupload-own": "अपन उपारोपित पन्नासभक पुनर्लेखन करी",
    -	"right-reupload-shared": "श्रव्य-दृश्य साझी बखारीक फाइलक पुनर्लेखन स्थानीय रूपेँ करू।",
    -	"right-upload_by_url": "सार्वत्रिक विभव संकेतसँ संचिका उपारोपित करू",
    +	"right-reupload-shared": "श्रव्य-दृश्य साझी बखारीक फाइलक पुनर्लेखन स्थानीय रूपेँ करी।",
    +	"right-upload_by_url": "सार्वत्रिक विभव संकेतसँ संचिका उपारोपित करी",
     	"right-purge": "जालक उपस्मृतिकेँ बिना स्वीकृतिक पन्नाक लेल खतम करू",
     	"right-autoconfirmed": "अर्द्ध-संरक्षित पन्ना सभक सम्पादन करू",
     	"right-bot": "स्वचालित प्रक्रियाक रूपमे देखल जाए",
     	"right-nominornewtalk": "वार्ता पन्नापर मामूली सम्पादन नव संदेश संसूचक नै आनैए",
     	"right-apihighlimits": "ए.पी.आइ. अभ्यर्थनामे पैघ सीमाक प्रयोग करू",
     	"right-writeapi": "लेख्य ए.पी.आइ.क प्रयोग",
    -	"right-delete": "पन्ना सभकेँ मेटाउ",
    -	"right-bigdelete": "बेशी इतिहास बला पन्ना सभकेँ मेटाउ",
    +	"right-delete": "पन्ना मेटाबी",
    +	"right-bigdelete": "बेसी इतिहास भएल पन्ना सभ मेटाबी",
     	"right-deletelogentry": "विशिष्ट लग प्रविष्टिसभके नुकाउ आ देखाउ",
     	"right-deleterevision": "निर्धारित संशोधित पन्ना मेटाउ आ फेरसँ आनू",
     	"right-deletedhistory": "मेटाएल इतिहास प्रविष्टि देखू, बिना लागिक पाठक",
    -	"right-deletedtext": "मेटाएल पाठ आ दूटा मेटाएल संशोधनक बीचक परिवर्तन देखू",
    +	"right-deletedtext": "मेटाएल पाठ आ दूटा मेटाएल संशोधनक बीचक परिवर्तन देखी",
     	"right-browsearchive": "मेटाएल पन्ना ताकी",
     	"right-undelete": "पन्ना फेरसँ आनी",
    -	"right-suppressrevision": "संचालकसँ नुकाएल संशोधनकेँ पुनरीक्षित करू आ फेरसँ आनू",
    +	"right-suppressrevision": "संचालकसँ नुकाएल संशोधनकेँ पुनरीक्षित करी आ फेरसँ आनी",
     	"right-viewsuppressed": "कोनो प्रयोक्ताके नुकाएल संसोधन देखु",
    -	"right-suppressionlog": "व्यक्तिगत वृत्तलेख देखू",
    -	"right-block": "दोसर प्रयोक्ताकेँ सम्पादनसँ रोकू",
    -	"right-blockemail": "प्रयोक्ताकेँ ई-पत्र पठेबासँ रोकू",
    +	"right-suppressionlog": "व्यक्तिगत वृत्तलेख देखी",
    +	"right-block": "दोसर प्रयोक्ताकेँ सम्पादनसँ रोकी",
    +	"right-blockemail": "प्रयोक्ताकेँ ई-पत्र पठेबासँ रोकी",
     	"right-hideuser": "एकटा प्रयोक्तानामकेँ प्रतिबन्धित करू, लोकसँ एकरा नुका कऽ",
     	"right-ipblock-exempt": "अनिकेत प्रतिबन्ध, स्वचालित प्रतिबन्ध आ परिक्षेत्र प्रतिबन्धकेँ नै मानू",
     	"right-unblockself": "स्वयंकेँ प्रतिबन्धसँ हटाउ",
    @@ -1137,7 +1140,7 @@
     	"right-unwatchedpages": "बिना संचालित पन्ना सभक सूचीकेँ देखू",
     	"right-mergehistory": "पन्नाक इतिहास सभकेँ मिज्झर करू",
     	"right-userrights": "सभटा प्रयोक्ता अधिकारकेँ सम्पादित करू",
    -	"right-userrights-interwiki": "दोसर विकीपर प्रयोक्ताक प्रयोक्ता अधिकारक सम्पादन करू",
    +	"right-userrights-interwiki": "दोसर विकीपर प्रयोक्ताक प्रयोक्ता अधिकारक सम्पादन करी",
     	"right-siteadmin": "दत्तनिधिकेँ प्रतिबन्धित करू आ फेर प्रतिबन्ध हटाउ",
     	"right-override-export-depth": "५ परत धरि जा  पन्ना सभ निर्यात, जइमे लागिबला पन्ना सभ शामिल अछि, करू।",
     	"right-sendemail": "ई-पत्र दोसर प्रयोक्ता लोकनिकेँ पठाउ",
    @@ -1152,9 +1155,9 @@
     	"newuserlogpagetext": "ई प्रयोक्ता निर्माणक वृत्तलेख अछि।",
     	"rightslog": "प्रयोक्ता अधिकार वृत्तलेख",
     	"rightslogtext": "ई प्रयोक्ता अधिकार परिवर्तन सभक वृतलेख छी।",
    -	"action-read": "ई पन्ना पढ़ू",
    +	"action-read": "ई पन्ना पढी",
     	"action-edit": "ई पन्नाक सम्पादित करी",
    -	"action-createpage": "पन्ना सभ बनाउ",
    +	"action-createpage": "पृष्ठ बनाबी",
     	"action-createtalk": "वार्ता पन्ना बनाबी",
     	"action-createaccount": "ई प्रयोक्ता खाता बनाबी",
     	"action-history": "पन्नाक इतिहास मिज्झर करी",
    @@ -1168,11 +1171,11 @@
     	"action-reupload": "ई संचिकाक पुनर्लेखन करू",
     	"action-reupload-shared": "ई संचिकाकेँ साझी बखारीमे नजरि नै दिअ",
     	"action-upload_by_url": "ई संचिकाकेँ सार्वत्रिक विभव संकेतसँ उपारोपित करू",
    -	"action-writeapi": "लेख्य ए.पी.आइ.क प्रयोग करू",
    -	"action-delete": "ई पन्ना मेटाउ",
    -	"action-deleterevision": "ई संशोधन मेटाउ",
    -	"action-deletedhistory": "ऐ पन्नाक मेटाएलबला इतिहास देखू",
    -	"action-browsearchive": "मेटाएल पन्ना सभकेँ ताकू",
    +	"action-writeapi": "लेख्य एपिआई प्रयोग करी",
    +	"action-delete": "ई पन्ना मेटाबी",
    +	"action-deleterevision": "ई संशोधन मेटाबी",
    +	"action-deletedhistory": "ई पन्नाक मेटाएल इतिहास देखी",
    +	"action-browsearchive": "मेटाएल पन्ना ताकी",
     	"action-undelete": "ई पन्नाकेँ फेरसँ आनू",
     	"action-suppressrevision": "ई नुकाएल संशोधनकेँ पुनरीक्षित आ पुनर्स्थापित करू",
     	"action-suppressionlog": "ई व्यक्तिगत वृत्तलेखकेँ देखू",
    @@ -1188,7 +1191,7 @@
     	"action-userrights": "सभटा प्रयोक्ता अधिकारकेँ सम्पादित करू",
     	"action-userrights-interwiki": "दोसर विकीपर प्रयोक्ताक प्रयोक्ता अधिकारक सम्पादन करू",
     	"action-siteadmin": "दत्तनिधिकेँ प्रतिबन्धित करू आ फेर प्रतिबन्ध हटाउ",
    -	"action-sendemail": "ई-पत्र पठाउ",
    +	"action-sendemail": "ई-पत्र पठाबी",
     	"action-editmywatchlist": "काँच साकांक्षसूची संपादित करू",
     	"action-viewmywatchlist": "अपन काँच साकांक्षसूची देखु",
     	"action-viewmyprivateinfo": "अपन व्यक्तिगत जानकारी देखु",
    @@ -1201,10 +1204,10 @@
     	"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम बेर देखला के बाद स}}",
     	"enhancedrc-history": "इतिहास",
     	"recentchanges": "लगक परिवर्तनसभ",
    -	"recentchanges-legend": "नव परिवर्तन सभक विकल्प सभ",
    +	"recentchanges-legend": "नव परिवर्तन सम्बन्धी विकल्प",
     	"recentchanges-summary": "ई पन्नापर विकीमे भेल सभसँ अद्यतन परिवर्तनपर नजरि राखू।",
     	"recentchanges-noresult": "इ अवधिके दौरान इ मापदंडके पूर्ण करेत समय कोनो परिवर्तन नै केएल गेल अछि।",
    -	"recentchanges-feed-description": "ऐ सूचना-तंत्रांशमे विकीमे भेल सभसँ लगक परिवर्तन ताकू",
    +	"recentchanges-feed-description": "ई सूचना-तंत्रांशमे विकीमे भेल सभसँ लगक परिवर्तन ताकी।",
     	"recentchanges-label-newpage": "ई सम्पादन एकटा नव पन्नाक निर्माण केलक।",
     	"recentchanges-label-minor": "ई एकटा लघु सम्पादन छी",
     	"recentchanges-label-bot": "ई सम्पादन यान्त्रिक छल।",
    @@ -1213,7 +1216,7 @@
     	"recentchanges-legend-heading": "<strong>कुञ्जी:</strong>",
     	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} ([[Special:NewPages|नव पन्नसभक सूची]] सेहो देखी)",
     	"rcnotefrom": "नीचाँमे '''$2''' सँ भेल परिवर्तन अछि ('''$1''' धरि देखाएल)।",
    -	"rclistfrom": "$3 $2 सँ शुरू भेल नव परिवर्तन देखू",
    +	"rclistfrom": "$3 $2 सँ शुरू भेल नव परिवर्तन देखी",
     	"rcshowhideminor": "$1 अल्प सम्पादन",
     	"rcshowhideminor-show": "देखाबी",
     	"rcshowhideminor-hide": "नुकाबी",
    @@ -1234,7 +1237,7 @@
     	"rcshowhidemine-hide": "नुकाबी",
     	"rcshowhidecategorization-show": "देखाबी",
     	"rcshowhidecategorization-hide": "नुकाबी",
    -	"rclinks": "देखाऊ अंतिम $1 परिवर्त्तन अंतिम $2 दिनमे<br />$3",
    +	"rclinks": "पिछला $2 दिनमे भएल $1 परिवर्तन देखाबी<br />$3",
     	"diff": "अन्तर",
     	"hist": "इति.",
     	"hide": "नुकाबी",
    @@ -1243,25 +1246,25 @@
     	"newpageletter": "न",
     	"boteditletter": "ब",
     	"unpatrolledletter": "!",
    -	"number_of_watching_users_pageview": "[$1 देखै अछि {{PLURAL:$1|प्रयोक्ता|प्रयोक्ता सभ}}]",
    +	"number_of_watching_users_pageview": "[$1 ध्यान राखैवाला {{PLURAL:$1|प्रयोक्ता|प्रयोक्तासभ}}]",
     	"rc_categories": "संवर्ग सीमित (\"|\" सँ हटाउ)",
     	"rc_categories_any": "कोनो",
     	"rc-change-size": "$1",
     	"rc-change-size-new": "बदललाक बाद $1 {{PLURAL:$1|बाइट}}",
    -	"newsectionsummary": "/* $1 */ नव संवर्ग",
    +	"newsectionsummary": "/* $1 */ नव अनुभाग",
     	"rc-enhanced-expand": "वर्णन देखाउ (जावास्क्रिप्ट चाही)",
    -	"rc-enhanced-hide": "वर्णन नुकाउ",
    +	"rc-enhanced-hide": "विस्तृत जानकारी नुकाबी",
     	"rc-old-title": "मूल रूप स \"$1\" नाम स बनाएल गेल रह",
     	"recentchangeslinked": "सम्बन्धित परिवर्तन",
     	"recentchangeslinked-feed": "सम्बन्धित परिवर्तन",
     	"recentchangeslinked-toolbox": "सम्बन्धित परिवर्तन",
     	"recentchangeslinked-title": "\"$1\" मे भेल परिवर्तन",
     	"recentchangeslinked-summary": "ई विशेष पन्नासँ सम्बद्ध पन्ना सभमे (आकि कोनो विशेष वर्गक समूहमे) भेल परिवर्तनक सूची छी ।\n[[Special:Watchlist|your watchlist]]  पर पन्नासभ '''गाढ़''' अछि।",
    -	"recentchangeslinked-page": "पन्नाक नाम",
    -	"recentchangeslinked-to": "देल पन्नाक सम्बन्धी पन्नामे परिवर्तन देखाउ",
    +	"recentchangeslinked-page": "पन्नाक नाम:",
    +	"recentchangeslinked-to": "देल पन्नाक सम्बन्धी पन्नामे परिवर्तन देखाबी",
     	"upload": "फाइल अपलोड करी",
     	"uploadbtn": "फाइल अपलोड",
    -	"reuploaddesc": "उपारोपण रद्द करू आ उपारोपण आवेदन-पत्रपर घुरू।",
    +	"reuploaddesc": "उपारोपण रद्द करी आ उपारोपण आवेदन-पत्रपर जाए।",
     	"upload-tryagain": "संशोधित संचिका वर्णन दिअ",
     	"uploadnologin": "सम्प्रवेशित नै",
     	"uploadnologintext": "अहाँ [[Special:UserLogin|सम्प्रवेशित]] संचिका उपारोपित करबा लेल।",
    @@ -1274,16 +1277,16 @@
     	"upload-preferred": "मोनपसिन्न संचिका प्रकार:$1 ।",
     	"upload-prohibited": "प्रतिबन्धित संचिका प्रकार:$1 ।",
     	"uploadlogpage": "उपारोपण वृत्तलेख",
    -	"uploadlogpagetext": "नीचाँ अद्यतन संचिका उपारोपणक वर्णन अछि।\nदेखू [[Special:NewFiles|नव संचिकाक बखारी]] बेसी स्पष्ट समुच्चा दृश्य लेल।",
    -	"filename": "संचिकानाम",
    +	"uploadlogpagetext": "नीचाँ अद्यतन सञ्चिका उपारोपणक वर्णन अछि।\nदेखी [[Special:NewFiles|नव सञ्चिकाक बखारी]] बेसी स्पष्ट समुच्चा दृश्य लेल।",
    +	"filename": "सञ्चिका नाम",
     	"filedesc": "संक्षेप",
     	"fileuploadsummary": "संक्षेप:",
    -	"filereuploadsummary": "संचिका परिवर्तन:",
    +	"filereuploadsummary": "सञ्चिका परिवर्तन:",
     	"filestatus": "सर्वाधिकारक स्थिति:",
     	"filesource": "मूल:",
     	"ignorewarning": "चेतौनीपर ध्यान नै दिअ आ संचिका कोनो रूपेँ संरक्षित करू",
     	"ignorewarnings": "कोनो चेतौनीपर ध्यान नै दिअ",
    -	"minlength1": "संचिका नाम सभ एक वर्णसँ कम नै हुअए",
    +	"minlength1": "सञ्चिकाक नाम कम एक वर्णसँ कम नै हुअए",
     	"illegalfilename": "\"$1\" संचिकानाममे वर्ण अछि जे पन्ना शीर्षक लेल मान्य नै अछि।\nकृपा कऽ संचिकाक नाम बदलू आ फेरसँ उपारोपित करू।",
     	"filename-toolong": "संचिकानाम 240 बाइटसँ पैघ नै भऽ सकैए।",
     	"badfilename": "संचिकानाम बदलि कऽ \"$1\" कएल गेल।",
    @@ -1484,7 +1487,7 @@
     	"filerevert-legend": "घुराएल संचिका",
     	"filerevert-intro": "अहाँ संचिका घुराबैले छी '''[[Media:$1|$1]]''' केँ [$4 संस्करण $3, $2 केँ] लग।",
     	"filerevert-comment": "कारण:",
    -	"filerevert-defaultcomment": "$2, $1 क संस्करण लग घुरल",
    +	"filerevert-defaultcomment": "$2, $1 ($3)क अवतरण पूर्ववत कएलक",
     	"filerevert-submit": "फेरसँ वएह",
     	"filerevert-success": "'''[[Media:$1|$1]]''' घुराएल गेल [$4 version as of $3, $2] लग।",
     	"filerevert-badversion": "ओइ कालक कोनो पुरान स्थानीय संस्करण ऐ संचिकाक नै अछि।",
    @@ -1523,14 +1526,14 @@
     	"randomredirect": "मिज्झर बदलेनबला लागि",
     	"randomredirect-nopages": "नामस्थान \"$1\" मे कोनो बदलेनबला लागि नै अछि।",
     	"statistics": "सांख्यिकी",
    -	"statistics-header-pages": "पन्नाक सांख्यिकी",
    +	"statistics-header-pages": "पन्नाक तथ्याङ्क",
     	"statistics-header-edits": "सम्पादन तथ्याङ्क",
     	"statistics-header-users": "प्रयोक्ता तथ्याङ्क",
     	"statistics-header-hooks": "दोसर तथ्याङ्क",
    -	"statistics-articles": "अनुक्रम पन्ना सभ",
    -	"statistics-pages": "पन्ना सभ",
    +	"statistics-articles": "सामग्री पृष्ठ",
    +	"statistics-pages": "पन्ना",
     	"statistics-pages-desc": "वार्ता पन्ना, बदलेन इत्यादि सहित सभटा विकि पन्ना सभ।",
    -	"statistics-files": "उपारोपित संचिका सभ",
    +	"statistics-files": "उपारोपित सञ्चिका",
     	"statistics-edits": "{{SITENAME}} अएबासँ लऽ कऽ भेल पन्ना सम्पादन",
     	"statistics-edits-average": "प्रति पन्ना औसत सम्पादन",
     	"statistics-users": "पञ्जीकृत [[Special:ListUsers|प्रयोक्ता]]",
    @@ -1549,7 +1552,7 @@
     	"withoutinterwiki": "बिना भाषा लिङ्कक पन्ना",
     	"withoutinterwiki-summary": "ई पन्ना सभ दोसर भाषाक संस्करण सभ दिस संकेत नै करैए।",
     	"withoutinterwiki-legend": "उपसर्ग",
    -	"withoutinterwiki-submit": "देखाउ",
    +	"withoutinterwiki-submit": "देखाबी",
     	"fewestrevisions": "एकाध संशोधनबला पन्ना",
     	"nbytes": "$1 {{PLURAL:$1|बाइट|बाइट्स}}",
     	"ncategories": "{{PLURAL:$1|श्रेणी|श्रेणीसभ}}",
    @@ -1558,11 +1561,11 @@
     	"nmembers": "$1 {{PLURAL:$1|सदस्य|सदस्यसभ}}",
     	"nmemberschanged": "$1 → $2 {{PLURAL:$2|प्रयोक्ता|प्रयोक्तासभ}}",
     	"nrevisions": "$1{{PLURAL:$1|संशोधन|संशोधनसभ}}",
    -	"nimagelinks": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्नासभ}}",
    -	"ntransclusions": "$1पर प्रयुक्त {{PLURAL:$1|पन्ना|पन्नासभ}}",
    +	"nimagelinks": "$1 {{PLURAL:$1|पन्ना|पन्नासभ}} पर प्रयुक्त",
    +	"ntransclusions": "$1 {{PLURAL:$1|पन्ना|पन्नासभ}} पर प्रयुक्त",
     	"specialpage-empty": "ऐ पन्ना लेल कोनो परिणाम नै अछि।",
     	"lonelypages": "अनाथ पन्नासभ",
    -	"lonelypagestext": "ई पन्ना सभ ने कोनो {{अन्तर्जाल}} सँ जुडल अछि आ नहिये अन्तर्बाह्य रूपसँ दोसर पन्नमे अछि।",
    +	"lonelypagestext": "ई पन्नासभ नै कोनो {{SITENAME}} सँ जुडल अछि आ नहि त अन्तर्बाह्य रूपसँ दोसर पन्नमे अछि।",
     	"uncategorizedpages": "अवर्गीकृत पन्नासभ",
     	"uncategorizedcategories": "अवर्गीकृत श्रेणीसभ",
     	"uncategorizedimages": "अवर्गीकृत सञ्चिकासभ",
    @@ -1580,15 +1583,15 @@
     	"mostcategories": "सभसँ बेसी श्रेणीबला पन्नासभ",
     	"mostimages": "सभसँ बेसी लागिबला सञ्चिकासभ",
     	"mostinterwikis": "सर्वाधिक अन्तरविकी जडीभेल पृष्ठसभ",
    -	"mostrevisions": "सभसँ बेसी संशोधनबला पन्ना सभ",
    +	"mostrevisions": "सभसँ बेसी संशोधनबला पन्ना",
     	"prefixindex": "उपसर्गक संग सभटा पृष्ठ",
     	"prefixindex-namespace": "उपसर्ग भएल सभ पृष्ठ ($1 नामस्थान)",
     	"prefixindex-strip": "सूची में उपसर्ग नुकाउ",
     	"shortpages": "पन्ना सभ छाँटू",
     	"longpages": "नमगर पन्ना सभ",
     	"deadendpages": "एकदमसँ अन्त भऽ जाएबला पन्ना सभ",
    -	"deadendpagestext": "ई पन्ना सभ {{अन्तर्जाल}} क दोसर पन्नासँ लागिमे नै रहत।",
    -	"protectedpages": "संरक्षित पन्ना सभ",
    +	"deadendpagestext": "ई पन्ना सभ {{SITENAME}} क दोसर पन्नासँ लागिमे नै रहत।",
    +	"protectedpages": "सुरक्षित पृष्ठ",
     	"protectedpages-indef": "अनन्तकालिक सुरक्षा मात्र",
     	"protectedpages-cascade": "तराउपड़ी सुरक्षा मात्र",
     	"protectedpages-noredirect": "बदलेन नुकाऊँ",
    @@ -1608,7 +1611,7 @@
     	"listusers-creationsort": "निर्माण तिथिक हिसाबसँ छाँटी",
     	"listusers-desc": "अवरोही क्रममे क्रमबद्ध करी",
     	"usereditcount": "$1 {{PLURAL:$1|सम्पादन|सम्पादनसभ}}",
    -	"usercreated": "{{GENDER:$3|बनैलक|बनैलकिन्ह}} $1 तिथि पर $2 काले",
    +	"usercreated": "$1 तिथि पर $2 काले {{GENDER:$3|बनैलक}}",
     	"newpages": "नव पन्नासभ",
     	"newpages-username": "प्रयोक्तानाम:",
     	"ancientpages": "सभसँ पुरान पन्नासभ",
    @@ -1622,7 +1625,7 @@
     	"nopagetext": "लक्ष्य पन्ना जे अहाँ निर्दिष्ट केने छी से नै अछि।",
     	"pager-newer-n": "{{PLURAL:$1|नव 1|नव $1}}",
     	"pager-older-n": "{{PLURAL:$1|साबिक 1|साबिक $1}}",
    -	"suppress": "नजरिपर नै आएल",
    +	"suppress": "नुकाबी",
     	"querypage-disabled": "ई विशिष्ट पन्ना कार्य दक्षता लेल अशक्त कएल गेल अछि।",
     	"apihelp": "API मद्दत",
     	"apihelp-no-such-module": "मोड्युल \"$1\" नै भेटल।",
    @@ -1632,7 +1635,7 @@
     	"apisandbox-examples": "उदाहरण",
     	"apisandbox-results": "परिणाम",
     	"apisandbox-request-url-label": "अनुरोध URL:",
    -	"apisandbox-request-time": "अनुरोध समय: $1",
    +	"apisandbox-request-time": "अनुरोध समय: {{PLURAL:$1|$1 मिसे}}",
     	"booksources": "किताबक स्रोत",
     	"booksources-search-legend": "किताबक स्रोत ताकी",
     	"booksources-isbn": "आइ.एस.बी.एन.:",
    @@ -1640,13 +1643,13 @@
     	"booksources-text": "नीचाँ दोसर जालस्थलसँ लागि सभक सूची अछि जे नव आ प्रयोग कएल किताब बेचैए, आ ई पोथी सभक विषयमे ओहो सूचना दऽ सकैए जे अहाँ ताकि रहल छी:",
     	"booksources-invalid-isbn": "देल आइ.एस.बी.एन. संख्या मान्य नै बुझाइत अछि; कृपा कऽ मूल स्रोतसँ द्वितीयक बनेबा काल भेल भ्रमकेँ जाँचू।",
     	"specialloguserlabel": "कर्ता:",
    -	"speciallogtitlelabel": "लक्ष्य (शीर्षक वा प्रयोक्ता):",
    -	"log": "वृत्तलेख सभ",
    +	"speciallogtitlelabel": "प्रयोजन (शीर्षक अथवा {{ns:user}}:प्रयोगकर्तानाम):",
    +	"log": "वृत्तलेख",
     	"all-logs-page": "सभ सार्वजनिक वृत्तलेख",
     	"alllogstext": "{{अन्तर्जाल}} क सभटा उपलब्ध वृत्तलेखक संयुक्त दृश्य।\nअहाँ दृश्यकेँ संकीर्ण करबा लेल वृत्तलेखक एकटा प्रकार चुनि सकै छी, प्रयोक्तानाम (ब्रह्मक्षर-लघ्वक्षर विचारणीय), वा प्रभावित पन्ना (एतौ ब्रह्मक्षर-लघ्वक्षर विचारणीय)।",
     	"logempty": "वृत्तलेखमे कोनो मेल खाइबला बौस्तु नै।",
     	"log-title-wildcard": "खोज शीर्षक सभ ऐ पाठसँ प्रारम्भ",
    -	"showhideselectedlogentries": "देखाउ/ नुकाउ चयनित लग सभ",
    +	"showhideselectedlogentries": "देखाबी/ नुकाबी चयनित लग",
     	"log-edit-tags": "चुनल गेल लग प्रविक्तिसभ एक सम्पादन ट्याग",
     	"allpages": "सभ पन्ना",
     	"nextpage": "अगिला पन्ना ($1)",
    @@ -1656,7 +1659,7 @@
     	"allarticles": "सभटा लेख",
     	"allinnamespace": "सभटा पन्ना ($1 नामगाम)",
     	"allpagessubmit": "जाए",
    -	"allpagesprefix": "उपसर्गक संग दृश्य पन्ना सभ:",
    +	"allpagesprefix": "उपसर्गक संग दृश्य पन्ना:",
     	"allpagesbadtitle": "देल पन्नाक शीर्षक गलत, गलत सम्बन्धित अन्तर-भाषा अन्तर विकी शीर्षक छी। ई एक वा बेशी कलाकार युक्त भऽ सकैए जे शीर्षकमे प्रयुक्त नै कएल जा सकैए।",
     	"allpages-bad-ns": "{{SITENAME}} मे \"$1\" नामगाम नै अछि।",
     	"allpages-hide-redirects": "पुनर्निर्देश नुकाबी",
    @@ -1673,7 +1676,7 @@
     	"linksearch-pat": "खोज तरीका:",
     	"linksearch-ns": "नामस्थान :",
     	"linksearch-ok": "ताकी",
    -	"linksearch-text": "ब्रह्मास्त्र जेना \"*.wikipedia.org\" प्रयोग कएल जा सकैए।\nसहायक संविद:$1 (खोजमे ऐमेसँ कोनो नै जोड़ू)।",
    +	"linksearch-text": "\"*.wikipedia.org\" जोका वाईल्ड-कार्ड्स प्रयोग कएल जा सकएत अछि।\nकम-सँ-कम \".org\" जोक कोनो उच्च स्तरीय डोमेनक आवश्यकता अछि।<br />\nस्वीकार्य {{PLURAL:$2|प्रोटोकल|प्रोटोकलसभ}}: $1 (यदि कोनो प्रोटोकल नै दएल जाए त http:// क प्रयोग कएल जाएत अछि)",
     	"linksearch-line": "$2 सँ $1 क लागि अछि।",
     	"linksearch-error": "निमंत्रकनामक प्रारम्भमे ब्रह्मास्त्र आबि सकैए।",
     	"listusersfrom": "प्रयोक्ता प्रदर्शन प्रारम्भ भेल:",
    @@ -1682,31 +1685,31 @@
     	"listusers-blocked": "(प्रतिबन्धित)",
     	"activeusers": "सक्रिय प्रयोक्ता सभक सूची",
     	"activeusers-intro": "ई ओहेन प्रयोक्ता सभक सूची अछि जे पछिला $1 {{PLURAL:$1|दिन|दिन}} मे किछु सक्रियता देखेने छथि।",
    -	"activeusers-count": "$1 {{PLURAL:$1|सम्पादन|सम्पादन सभ}} paChilaa {{PLURAL:$3|दिन|$3 दिन}}",
    +	"activeusers-count": "$1 {{PLURAL:$1|सम्पादन}} विगत $3 {{PLURAL:$3|दिन|दिन}}मे",
     	"activeusers-from": "प्रयोक्ता प्रदर्शन प्रारम्भ भेल:",
    -	"activeusers-hidebots": "स्वचालन नुकाउ",
    -	"activeusers-hidesysops": "संचालक नुकाउ",
    +	"activeusers-hidebots": "स्वचालक नुकाबी",
    +	"activeusers-hidesysops": "प्रबन्धक नुकाबी",
     	"activeusers-noresult": "कोनो प्रयोक्ता नै भेटल",
    -	"listgrouprights": "प्रयोक्ता संवर्ग अधिकार",
    +	"listgrouprights": "प्रयोगकर्ता समूह अधिकार",
     	"listgrouprights-summary": "ई सभ प्रयोक्ता संवर्गक एकटा सूची अछि जे ऐ विकीपरपरिभाषित अछि ओकर संसर्गित प्रवेश अधिकारक संग।\nएतए [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] व्यक्तिगत अधिकार लेल भऽ सकैए।",
     	"listgrouprights-key": "* <span class=\"listgrouprights-granted\">देल अधिकार</span>\n* <span class=\"listgrouprights-revoked\">निकालल अधिकार</span>",
    -	"listgrouprights-group": "वर्ग",
    +	"listgrouprights-group": "समूह",
     	"listgrouprights-rights": "अधिकार",
     	"listgrouprights-helppage": "Help: वर्ग अधिकार",
     	"listgrouprights-members": "(प्रयोक्ता सूची)",
    -	"listgrouprights-addgroup": "जोड़ू {{PLURAL:$2|वर्ग|वर्ग}}: $1",
    -	"listgrouprights-removegroup": "निकालू {{PLURAL:$2|वर्ग|वर्ग}}: $1",
    -	"listgrouprights-addgroup-all": "सभटा वर्ग जोड़ू",
    -	"listgrouprights-removegroup-all": "सभटा वर्ग निकालू",
    -	"listgrouprights-addgroup-self": "जोड़ू {{PLURAL:$2|वर्ग|वर्ग}} अपन खातामे: $1",
    -	"listgrouprights-removegroup-self": "निकालू {{PLURAL:$2|वर्ग|वर्ग}} अपन खातामे: $1",
    +	"listgrouprights-addgroup": "{{PLURAL:$2|समूह}} जोडी: $1",
    +	"listgrouprights-removegroup": "समूह {{PLURAL:$2|मेटाबी}}: $1",
    +	"listgrouprights-addgroup-all": "सभ समूह जोडी",
    +	"listgrouprights-removegroup-all": "सभ समूह मेटाबी",
    +	"listgrouprights-addgroup-self": "अपन खातामे {{PLURAL:$2|समूह|समूहसभ}} जोडी: $1",
    +	"listgrouprights-removegroup-self": "अपन खातासँ {{PLURAL:$2|समूह|समूहसभ}} हटाबी: $1",
     	"listgrouprights-addgroup-self-all": "सभ वर्गकेँ अपन खातामे जोड़ू",
     	"listgrouprights-removegroup-self-all": "सभ वर्गकेँ अपन खातासँ निकालू",
     	"listgrouprights-namespaceprotection-header": "नामस्थान प्रतिबन्धित",
     	"listgrouprights-namespaceprotection-namespace": "नामस्थान",
     	"listgrouprights-namespaceprotection-restrictedto": "सांच(सभ) के संपादन करए लेल",
     	"trackingcategories": "श्रेणीके ट्रयाक करु",
    -	"trackingcategories-msg": "श्रेणीके ट्रयाक करु",
    +	"trackingcategories-msg": "चिह्नित श्रेणी",
     	"trackingcategories-name": "सन्देश नाम",
     	"trackingcategories-desc": "श्रेणी समावेशीकरण मापदण्ड",
     	"trackingcategories-nodesc": "कोनो वर्णन उपलब्ध नै।",
    @@ -1717,28 +1720,28 @@
     	"emailuser-title-target": "इ {{GENDER:$1|प्रयोक्ता}} के ई-पत्र भेजु।",
     	"emailuser-title-notarget": "ई-पत्र प्रयोक्ता",
     	"emailpagetext": "अहाँक नीचाँक आवेदन-पत्र ऐ प्रयोक्ताकेँ ई-पत्र संदेश पठेबा लेल प्रयोग कऽ सकै छी।\nई-पत्र जे अहाँ [[Special:Preferences|your user preferences]] मे देलहुँ से ई-पत्र\"एतएसँ\" पतासँ देखाएत, से प्राप्तकर्ता सोझे अहाँकेँ उत्तर देबामे समर्थ हेताह।",
    -	"defemailsubject": "{{जालस्थल}} प्रयोक्ता \"$1\" सँ ई-पत्र",
    +	"defemailsubject": "{{SITENAME}} प्रयोक्ता \"$1\" सँ ई-पत्र",
     	"usermaildisabled": "प्रयोक्ता ई-पत्र अशक्त",
     	"usermaildisabledtext": "अहाँ दोसर प्रयोक्ताकेँ ऐ विकीपर ई-पत्र नै पठा सकए छी",
     	"noemailtitle": "कोनो ई-पत्र पता नै",
     	"noemailtext": "ई पर्योक्ता अपन कोनो मान्य ई-पत्र संकेत नै देने अछि।",
     	"nowikiemailtext": "ई प्रयोक्ता दोसर प्रयोक्तासँ ई-पत्र प्राप्त नै करबाक विकल्प चुनने अछि।",
     	"emailnotarget": "अस्तित्वहीन वा अमान्य प्राप्तकर्ताक प्रयोक्तानाम",
    -	"emailtarget": "प्राप्तकर्ताक प्रयोक्तानाम दर्ज करू",
    +	"emailtarget": "प्राप्तकर्ताक प्रयोक्तानाम दर्ज करी",
     	"emailusername": "प्रयोक्तानाम:",
     	"emailusernamesubmit": "दिअ",
    -	"email-legend": "ई-पत्र दोसर {{जालस्थल}} प्रयोक्ताकेँ पठाउ",
    +	"email-legend": "ई-पत्र दोसर {{SITENAME}} प्रयोक्ताके पठाबी",
     	"emailfrom": "एतऽसँ:",
     	"emailto": "ऐलेल:",
     	"emailsubject": "विषय:",
     	"emailmessage": "सन्देश:",
     	"emailsend": "पठाबी",
    -	"emailccme": "हमर संदेशक द्वितीयक हमर ई-पत्रपर पठाउ",
    +	"emailccme": "हमर सन्देशक द्वितीयक हमर ई-पत्रपर पठाबी",
     	"emailccsubject": "अहाँक संदेशक द्वितीयक $1: $2",
     	"emailsent": "ई-पत्र पठेलौं",
    -	"emailsenttext": "अहाँक ई-पत्र संदेश पठाएल गेल।",
    -	"emailuserfooter": "ई ई-पत्र $1 सँ $2 केँ \"ई-पत्र प्रयोक्ता\" केँ पठाओल गेल {{जालसथल}} पर।",
    -	"usermessage-summary": "प्रणाली संदेश देल।",
    +	"emailsenttext": "अहाँक ई-पत्र सन्देश पठाएल गेल।",
    +	"emailuserfooter": "ई ई-मेल $1 {{GENDER:$1|द्वारा}} {{GENDER:$2|$2}}क भेजल गेल छल जेकर लेल \"{{int:emailuser}}\" कार्यके {{SITENAME}} पर प्रयोगमे लाबल गेल छल।",
    +	"usermessage-summary": "प्रणाली सन्देश छोडि रहल अछि।",
     	"usermessage-editor": "प्रणालीक दूत",
     	"usermessage-template": "मीडियाविकी:प्रयोक्ता संदेश",
     	"watchlist": "साकांक्षसूची",
    @@ -1747,16 +1750,16 @@
     	"nowatchlist": "अहाँक साकांक्ष-सूचीमे कोनो पन्ना नै अछि।",
     	"watchlistanontext": "कृपा कऽ $1 अहाँक साकांक्ष-सूचीकेँ देखबा वा सम्पादित करबा लेल।",
     	"watchnologin": "सम्प्रवेशित नै",
    -	"addwatch": "साकांक्ष सूचीमे जोड़ू",
    -	"addedwatchtext": "पन्ना \"[[:$1]]\" अहाँक [[Special:Watchlist|साकांक्ष सूची]] मे जोड़ल गेल।\nऐ पन्नामे भविष्यक परिवर्तन आ एकर सम्बन्धित चौबटिया पन्ना एतए सूचीबद्ध रहत, आ पन्ना [[Special:RecentChanges|हालक परिवर्तन]]मे '''गाढ़''' देखाएत , जइसँ आसानीसँ एकरा चिन्हल जा सकत।",
    +	"addwatch": "साकांक्ष सूचीमे जोडी",
    +	"addedwatchtext": "अहाँक [[Special:Watchlist|ध्यानसूची]]मे \"[[:$1]]\" आ एकर चर्चा पृष्ठ जोडि दएल गेल अछि।",
     	"addedwatchtext-short": "इ पृष्ठ \"$1\" अहाँ के साकांक्ष सूची मे राखल गेल अछि।",
    -	"removewatch": "साकांक्ष सूचीसँ हटाउ",
    -	"removedwatchtext": "पन्ना \"[[:$1]]\" हटाएल गेल [[Special:Watchlist|अहाँक साकांक्षसूची]] सँ।",
    +	"removewatch": "साकांक्ष सूचीसँ हटाबी",
    +	"removedwatchtext": "अहाँक [[Special:Watchlist|ध्यानसूची]]सँ \"[[:$1]]\" आ एकर चर्चा पृष्ठ हटाएल गेल अछि।",
     	"removedwatchtext-short": "इ पृष्ठ \"$1\" अहाँ के साकांक्ष सूची मे राखल गेल अछि।",
     	"watch": "ध्यान राखु",
     	"watchthispage": "ऐ पृष्ठपर ध्यान राखू",
    -	"unwatch": "छोड़ू",
    -	"unwatchthispage": "देखनाइ छोड़ू",
    +	"unwatch": "छोडी",
    +	"unwatchthispage": "देखनाइ छोडी",
     	"notanarticle": "कोनो विषय सूची नै",
     	"notvisiblerev": "कोनो दोसर प्रयोक्ता द्वारा कएल अन्तिम परिवर्तन मेटा देल गेल",
     	"watchlist-details": "{{PLURAL:$1|$1 पन्ना|$1 पन्ना सभ}} अहाँक साकांक्षसूचीमे, चौबटिया पन्ना नै गानल गेल।",
    @@ -1764,11 +1767,11 @@
     	"wlheader-showupdated": "पन्ना सभ जे अहाँक एतए अन्तिम बेर अएलाक बाद बदलल अछि तकर सूची देल अछि '''गाढ़''' मे",
     	"wlnote": "नीचाँ {{PLURAL:$1|is the last change|are the last '''$1''' changes}} अन्तिम {{PLURAL:$2|hour|'''$2''' hours}} $3, $4 जेना।",
     	"wlshowlast": "देखाउ अन्तिम $1 घण्टा $2 दिन",
    -	"watchlist-options": "साकांक्षसूचीक विकल्प सभ",
    +	"watchlist-options": "साकांक्षसूचीक विकल्प",
     	"watching": "ताकिमे...",
    -	"unwatching": "छोड़ल ...",
    +	"unwatching": "छोडल ...",
     	"watcherrortext": "अहाँक साकांक्ष-सूची विकल्प \"$1\" लेल बदलबा काल एकटा भ्रम आएल।",
    -	"enotif_reset": "सभ पन्नाकेँ देखल चिन्हित करू",
    +	"enotif_reset": "सभ पन्नाके देखल चिन्हित करी",
     	"enotif_impersonal_salutation": "{{SITENAME}} प्रयोगकर्ता",
     	"enotif_subject_deleted": "{{SITENAME}} पन्ना $1 के {{gender:$2|$2}} हटेलक",
     	"enotif_subject_created": "{{SITENAME}} पन्ना $1 को {{gender:$2|$2}} बनेलक",
    @@ -1784,8 +1787,8 @@
     	"excontent": "विषय छल:\"$1\"",
     	"excontentauthor": "पाठ छल:\"$1\" (आ एकमात्र योगदान दैबला छल \"[[Special:Contributions/$2|$2]]\")",
     	"exbeforeblank": "खतम होएबाक पहिने पाठ छल:\"$1\"",
    -	"delete-confirm": "$1 केँ मेटाउ",
    -	"delete-legend": "मेटाउ",
    +	"delete-confirm": "$1 के मेटाबी",
    +	"delete-legend": "मेटाबी",
     	"historywarning": "'''चेतौनी:''' जे पन्ना अहाँ मेटबैबला छी तकर इतिहास अछि लगभग $1 {{PLURAL:$1|revision|revisions}}:",
     	"confirmdeletetext": "अहाँ सभटा इतिहासक संग ऐ पन्नाकेँ हटाबऽ जा रहल छी।\nअहाँ ई सुनिश्चित करू जे अहाँ ई करऽ चाहै छी, अहाँकेँ एकर परिणामक अवगति अछि आ अहाँ ई ऐ [[{{MediaWiki:Policy-url}}|नीति]] क अनुसार कऽ रहल छी।",
     	"actioncomplete": "क्रिया पूर्ण",
    @@ -1814,7 +1817,7 @@
     	"editcomment": "सम्पादन सार छल : <em>$1</em>।",
     	"revertpage": "सम्पादन आपस कएल गेल [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) सँ अन्तिम संशोधन धरि एकरा द्वारा [[User:$1|$1]]।",
     	"revertpage-nouser": "(प्रयोक्ताक नाम हटा देल गेल अछि) द्वारा केल गेल संपादनकेँ फेरसँ पुरान स्थितिमे आनि कऽ एकर पहिलुक [[User:$1|$1]] सँ बनल संस्करणकेँ फेरसँ ताजा संस्करण बनाऊ।",
    -	"rollback-success": "$1 केर संपादन हटाऊ. \n$2 केर संपादित आखिरी अवतरण क पुनर्स्थापित करल गेल.",
    +	"rollback-success": "$1 केर सम्पादन हटाबी। \n$2 केर सम्पादित आखिरी अवतरणक पुनर्स्थापित करल गेल।",
     	"sessionfailure-title": "सत्र विफल भ गेल",
     	"sessionfailure": "एहन लागैत अछि जे अहां के लागिन सत्र में कोनो त्रुटि अछि. सत्र अपहरण से बचाबय  सं सावधानीक लेल अहां के अहि क्रियाकलाप क रद्द क देल गेल. अहां पाछां के पृष्ठ पर जौउ आ पृष्ठ के फेर सं लोड क दोबारा कोशिश करू.",
     	"protectlogpage": "सुरक्षा लग",
    @@ -1988,7 +1991,7 @@
     	"blockipsuccesstext": "[[Special:Contributions/$1|$1]] प्रतिबन्धित कएल गेल।<br />\nदेखू [[Special:BlockList|IP block list]] प्रतिबन्धक पुनरीक्षण लेल।",
     	"ipb-blockingself": "अहाँ अपनाकेँ प्रतिबन्धित करैबला छी! अहाँ निश्च्य केने छी जे अहाँ ई करए चाहै छी?",
     	"ipb-confirmhideuser": "अहाँ एकटा प्रयोक्ताकेँ जे \"प्रयोक्ता नुकाउ\" विकल्पक संग अछि, प्रतिबन्धित करैबला छी। ई प्रयोक्ताक नाम सभटा सूची आ वृत्तलेखमे दबा देत। की अहाँ निश्चय केने छी जे अहाँ ई करए चाहै छी?",
    -	"ipb-edit-dropdown": "प्रतिबन्ध कारण  संपादित करू",
    +	"ipb-edit-dropdown": "प्रतिबन्ध कारण सम्पादित करी",
     	"ipb-unblock-addr": "प्रतिबन्ध हटाएल $1",
     	"ipb-unblock": "प्रयोक्ता वा अनिकेतकें अप्रतिबंधित करू",
     	"ipb-blocklist": "अखुनका प्रतिबंधित देखू",
    @@ -2025,7 +2028,7 @@
     	"blocklist-nousertalk": "अपन वार्ता पन्ना सम्पादित नै कऽ सकब",
     	"ipblocklist-empty": "प्रतिबन्धसूची खाली अछि।",
     	"ipblocklist-no-results": "आग्रह कएल अनिकेत वा प्रयोक्तानाम प्रतिबन्धित नै कएल गेल।",
    -	"blocklink": "प्रतिबंधित",
    +	"blocklink": "प्रतिबन्धित",
     	"unblocklink": "नै बारल",
     	"change-blocklink": "खण्ड बदलू",
     	"contribslink": "योगदान",
    @@ -2093,14 +2096,14 @@
     	"cant-move-to-user-page": "अहाँकेँ कोनो पन्नाकेँ प्रयोक्ता पन्ना लग घसकेबाक अधिकार नै अछि (प्रयोक्ता उपपन्ना लग छोड़ि कऽ)।",
     	"newtitle": "नव शीर्षकपर:",
     	"move-watch": "जड़ि पन्ना आ छीप पन्ना देखू",
    -	"movepagebtn": "पन्ना घसकाउ",
    +	"movepagebtn": "पन्ना घसकाबी",
     	"pagemovedsub": "घसकल",
     	"movepage-moved": "'''\"$1\" घसकाएल गेल \"$2\"''' पर",
     	"movepage-moved-redirect": "एकटा पुनर्निर्देशन बनाओल गेल छै.",
     	"movepage-moved-noredirect": "पुनर्निर्देशन नहि बनाओल गेल छै.",
     	"articleexists": "ओइ नामक एकटा पन्ना पहिनहियेसँ अछि, वा जे नाम अहाँ चयन केने छी से वांछित नै अछि। \nकृपा कऽ दोसर नामक चयन करू।",
     	"cantmove-titleprotected": "नब शीर्षक बनाबै  सें रोकहि के कारण, अहां अहि ठाम पर कोनो आन पृष्ठक ठाम बदलि नहि सकब.",
    -	"movetalk": "सम्बन्धित चौबटिया पन्नाकेँ घसकाउ",
    +	"movetalk": "सम्बन्धित वार्ता पृष्ठ सेहो घसकाबी",
     	"move-subpages": "उपपृष्ठ सेहो लेल जाऊ ($1 धरि)",
     	"move-talk-subpages": "वार्ता पृष्ठक उपपृष्ठ लेने जाऊ ($1 धरि)",
     	"movepage-page-exists": "पन्ना $1 पहिनहियेसँ अछि आ स्वचालित रूपेँ मेटाएल नै जा सकैए।",
    @@ -2149,9 +2152,9 @@
     	"export-pagelinks": "लागिबला पन्ना सभकेँ एतेक तह धरि राखू:",
     	"allmessages": "प्रणालीक सन्देश",
     	"allmessagesname": "नाम",
    -	"allmessagesdefault": "पूर्वनिर्धारित संदेश पाठ",
    -	"allmessagescurrent": "अखुनका संदेश पाठ",
    -	"allmessagestext": "ई मीडियाविकी नामस्थानमे उपलब्ध संस्थागत संदेशक सूची छी।\nकृपा कऽ देखू [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] आ [https://translatewiki.net translatewiki.net] जँ अहाँ मीडियाविकीक स्थानिकीकरणक मूलक अनुवादमे योगदान करए चाहै छी।",
    +	"allmessagesdefault": "पूर्वनिर्धारित सन्देश पाठ",
    +	"allmessagescurrent": "अखुनका सन्देश पाठ",
    +	"allmessagestext": "ई मिडियाविकी नामस्थानमे उपलब्ध संस्थागत सन्देशक सूची छी।\nकृपा कऽ देखी [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation MediaWiki Localisation] आ [https://translatewiki.net translatewiki.net] जँ अहाँ मिडियाविकीक स्थानिकीकरणक मूलक अनुवादमे योगदान करए चाहै छी।",
     	"allmessagesnotsupportedDB": "ई पन्ना प्रयोगमे नै आनल जा सकैए कारण '''$wgUseDatabaseMessages''' अशक्त कएल अछि।",
     	"allmessages-filter-legend": "चलनी",
     	"allmessages-filter": "अपन हिसाबे अनुकूलित कऽ छाँटू:",
    @@ -2217,7 +2220,7 @@
     	"import-options-wrong": "गलत {{PLURAL:$2|विकल्प}}: <nowiki>$1</nowiki>",
     	"import-rootpage-invalid": "दयाल गेल उपसर्ग पन्ना शीर्षक अमान्य अछि ।",
     	"import-rootpage-nosubpage": "दयाल गेल उपसर्ग पन्ना \"$1\" के नामस्थान में उप-पन्ना नै बनाबाल जा सकएत अछि ।",
    -	"importlogpage": "लॉगक आयात",
    +	"importlogpage": "आयात सूची",
     	"importlogpagetext": "पन्ना सभक प्रशासनिक आयात दोसर विकीक सम्पादन इतिहासक संग।",
     	"import-logentry-upload-detail": "$1 {{PLURAL:$1|सुधार|सुधार सभ}}",
     	"import-logentry-interwiki-detail": "$1 {{PLURAL:$1|सुधार|सुधार सभ}} $2 सँ",
    @@ -2236,7 +2239,7 @@
     	"tooltip-pt-createaccount": "अहाँक खाता खोलक लेल प्रोत्साहित केल जाएत अछि; मुदा ई अनिवार्य नै छै",
     	"tooltip-ca-talk": "विषयसूचीक पन्नाक सम्बन्धमे वर्त्तालाप",
     	"tooltip-ca-edit": "ई पन्नाक सम्पादित करी",
    -	"tooltip-ca-addsection": "नव खण्ड शुरू करू",
    +	"tooltip-ca-addsection": "नव खण्ड शुरू करी",
     	"tooltip-ca-viewsource": "ऐ पन्नापर वरदहस्त छै।\nअहाँ एकर जड़ि देख सकै छी।",
     	"tooltip-ca-history": "ई पृष्ठक पुरान अवतरण",
     	"tooltip-ca-protect": "ऐ पन्नाकेँ बचाउ",
    @@ -2273,8 +2276,8 @@
     	"tooltip-ca-nstab-media": "मीडिया पृष्ठ देखू",
     	"tooltip-ca-nstab-special": "ई एकटा विशिष्ट पन्ना छी, आ अहाँ एकरा सम्पादित नै कऽ सकै छी",
     	"tooltip-ca-nstab-project": "परियोजना पन्ना देखू",
    -	"tooltip-ca-nstab-image": "पन्नाक पृष्ठ देखू",
    -	"tooltip-ca-nstab-mediawiki": "प्रणालीक संदेश देखू",
    +	"tooltip-ca-nstab-image": "सञ्चिकाक पृष्ठ देखी",
    +	"tooltip-ca-nstab-mediawiki": "प्रणालीक सन्देश देखी",
     	"tooltip-ca-nstab-template": "नमूना देखू",
     	"tooltip-ca-nstab-help": "सहायता पृष्ठ देखू",
     	"tooltip-ca-nstab-category": "संवर्ग पन्ना देखू",
    @@ -2292,14 +2295,14 @@
     	"tooltip-undo": "\"फेरसँ वएह\" सम्पादनकेँ पूर्वस्थितिमे लऽ जाइए आ पूर्वावलोकन अवस्थामे सम्पादन फॉर्म खोलैए। ई सारांशमे कारण जोड़बाक विकल्प दैत अछि।",
     	"tooltip-preferences-save": "मोनपसंद के सुरक्षित करू",
     	"tooltip-summary": "छोट संक्षेप दिअ",
    -	"anonymous": "अज्ञात {{अन्तर्जाल}} क  {{PLURAL:$1|प्रयोक्ता|प्रयोक्ता सभ}}",
    -	"siteuser": "{{अन्तर्जाल}} प्रयोक्ता $1",
    +	"anonymous": "{{SITENAME}}क अज्ञात {{PLURAL:$1|प्रयोक्ता|प्रयोक्तासभ}}",
    +	"siteuser": "{{SITENAME}} प्रयोक्ता $1",
     	"anonuser": "{{SITENAME}} नुकायल प्रयोक्ता $1",
    -	"lastmodifiedatby": "ई पन्ना अंतिम बेर संवर्धित भेल $2, $1 द्वारा $3।",
    +	"lastmodifiedatby": "ई पन्ना अन्तिम बेर संवर्धित भेल $2, $1 द्वारा $3।",
     	"othercontribs": "$1 के काजुक तरहे",
     	"others": "दोसर, आन",
     	"siteusers": "{{SITENAME}} {{PLURAL:$2|{{GENDER:$1|प्रयोगकर्ता}}|प्रयोगकर्ता}} $1",
    -	"anonusers": "{{अन्तर्जाल}} अज्ञात {{PLURAL:$2|प्रयोक्ता|प्रयोक्ता सभ}} $1",
    +	"anonusers": "{{SITENAME}} अज्ञात {{PLURAL:$2|प्रयोक्ता|प्रयोक्तासभ}} $1",
     	"creditspage": "पन्नाक श्रेय",
     	"nocredits": "अहि पन्नाक लेल क्रेडिट ज़ानकारी नहि अछि",
     	"spamprotectiontitle": "अनिष्ट सन्देश सुरक्षा छन्नी",
    @@ -2322,12 +2325,12 @@
     	"pageinfo-article-id": "पन्ना आई॰डी॰",
     	"pageinfo-language": "पन्ना सामग्री भाषा",
     	"pageinfo-content-model": "पन्ना सामग्री के नमूना",
    -	"pageinfo-robot-policy": "बॉट द्वारा अनुक्रमण",
    +	"pageinfo-robot-policy": "बोटद्वारा अनुक्रमण",
     	"pageinfo-robot-index": "मान्य",
     	"pageinfo-robot-noindex": "अमान्य",
     	"pageinfo-watchers": "जानकारक संख्या",
     	"pageinfo-few-watchers": "$1 स कम ध्यान दीए {{PLURAL:$1|वाला}}",
    -	"pageinfo-redirects-name": "इ पन्ना के पुनर्निर्देशसभ के संख्या",
    +	"pageinfo-redirects-name": "ई पन्नाक पुनर्निर्देशसभ सङ्ख्या",
     	"pageinfo-subpages-name": "इ पन्ना के उप-पन्ना",
     	"pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|पुनर्निर्देश}}; $3 {{PLURAL:$3|ग़ैर-पुनर्निर्देश}})",
     	"pageinfo-firstuser": "पन्ना सर्जक",
    @@ -2355,13 +2358,13 @@
     	"pageinfo-category-pages": "पृष्ठ संख्या",
     	"pageinfo-category-subcats": "उपसंवर्ग के संख्या",
     	"pageinfo-category-files": "फाइल सभके संख्या",
    -	"markaspatrolleddiff": "देखि लेल गेल, एहन चिन्ह लगाऊ",
    +	"markaspatrolleddiff": "जाँच सम्पन्न करी",
     	"markaspatrolledtext": "देखि लेल गेल, एहन चिन्ह लगाऊ",
    -	"markedaspatrolled": "देखि लेल गेल, एहन चिन्ह लगाऊ",
    -	"markedaspatrolledtext": "[[:$1]]चुनल गेल अवतरणपर देखहि गेल के चिन्ह लगायल गेल.",
    -	"rcpatroldisabled": "हाल में भेल बदलाव सभ पर नजर राखब बंद क देल गेल अछि.",
    +	"markedaspatrolled": "जाँच सम्पन्न करी",
    +	"markedaspatrolledtext": "[[:$1]]क चयनित अवतरणक जाँच सम्पन्न भेल।",
    +	"rcpatroldisabled": "हालमे भेल परिवर्तनक परीक्षण अक्षम अछि",
     	"rcpatroldisabledtext": "हाल में भेल बदलाव पर नजरि राखि के सुविधा बंद क देल गेल अछि.",
    -	"markedaspatrollederror": "देख लेलिय, एहन चिन्ह नहि लगा सकब.",
    +	"markedaspatrollederror": "जाँच सम्पन्न नै कएल जा सकल",
     	"markedaspatrollederrortext": "अहाँ कोनो संशोधनकेँ संचालित निर्दिष्ट करू।",
     	"markedaspatrollederror-noautopatrol": "अहाँ अपन कएल संशोधनकेँ संचालित नै कहि सकै छी।",
     	"markedaspatrollednotify": "$1 पृष्ठ में कएल गएल ऐ परिवर्तन जाँचल गेल चिन्हासी कएल गेल।",
    @@ -2369,7 +2372,7 @@
     	"patrol-log-page": "संचालन वृत्तलेख",
     	"patrol-log-header": "ई संचालित संशोधन सभक वृत्तलेख छी।",
     	"log-show-hide-patrol": "$1 निरीक्षण वृत्तलेख",
    -	"log-show-hide-tag": "$1 टैग लॉग",
    +	"log-show-hide-tag": "$1 ट्याग लग",
     	"deletedrevision": "पुरान संशोधन $1 हटा देलौं",
     	"filedeleteerror-short": "संचिका मेटेबामे भ्रम : $1",
     	"filedeleteerror-long": "संचिका मेटेबा काल भ्रम संकेत भेटल:\n$1",
    @@ -2377,8 +2380,8 @@
     	"filedelete-old-unregistered": "निर्दिष्ट संचिका संशोधन \"$1\" दत्तांशनिधिमे नै अछि।",
     	"filedelete-current-unregistered": "निर्दिष्ट संचिका \"$1\" दत्तांशनिधिमे नै अछि।",
     	"filedelete-archive-read-only": "पेटार निर्देशिका \"$1\" जालवितरक द्वारा लिखबा योग्य नै अछि।",
    -	"previousdiff": "पुरान सम्पादन",
    -	"nextdiff": "नव सम्पादन",
    +	"previousdiff": "← पुरान सम्पादन",
    +	"nextdiff": "नव सम्पादन →",
     	"mediawarning": "'''चेतौनी''': ई संचिका प्रकार विषाणु कूटशब्द युक्त रहि सकैए।\nएकरा प्रयोग केलापर अहाँक तंत्रकेँ किछु समझौता करऽ पड़ि सकै छै।",
     	"imagemaxsize": "चित्र आकारक सीमा:<br />''(संचिका वर्णन पन्ना लेल)''",
     	"thumbsize": "संकुचितचित्र आकार:",
    @@ -2408,8 +2411,8 @@
     	"newimages-label": "संचिका नाम (वा ओकर अंश):",
     	"newimages-showbots": "बोटद्वारा कएल गेल अपलोड देखाऊ",
     	"noimages": "किछु देखबा योग्य नै |",
    -	"ilsubmit": "ताकू",
    -	"bydate": "तारीख सं",
    +	"ilsubmit": "ताकी",
    +	"bydate": "तिथि अनुसार",
     	"sp-newimages-showfrom": "$2, $1 सं शुरू होइबला नव संचिका देखाउ",
     	"video-dims": "$1, $2 × $3",
     	"seconds-abbrev": "$1s",
    @@ -2475,7 +2478,7 @@
     	"exif-datetime": "संचिका परिवर्तन तिथि आ समए",
     	"exif-imagedescription": "चित्र शीर्षक",
     	"exif-make": "कैमरा निर्माता",
    -	"exif-model": "कैमरा मोडल",
    +	"exif-model": "क्यामरा मोडल",
     	"exif-software": "प्रयुक्त तंत्रांश",
     	"exif-artist": "लिखैबला",
     	"exif-copyright": "सर्वाधिकारी",
    @@ -2803,7 +2806,7 @@
     	"confirmemail_needlogin": "अहाँकेँ करए पड़त $1 अपन ई-पत्र-संकेत सत्यापन लेल।",
     	"confirmemail_success": "अहाँक ई-पत्र संकेत सत्यापित कएल गेल।\nअहाँ आब [[Special:UserLogin|सम्प्रवेश]]आ विकीक प्रयोग करू।",
     	"confirmemail_loggedin": "अहाँक ई-पत्र संकेत आब सत्यापित भऽ गेल।",
    -	"confirmemail_subject": "{{जालस्थल}} ई-पत्र संकेत सत्यापन",
    +	"confirmemail_subject": "{{SITENAME}} ई-पत्र संकेत सत्यापन",
     	"confirmemail_body": "कियो, सम्भवतः अहाँ, अनिकेत $1 सँ,\nखाता \"$2\" पंजीकृत करबेने छथि ऐ ई-पत्र संकेतसँ {{जालस्थल}} पर।\n\nई खाता अहींक छी से सत्यापित करबाक लेल आ अपन ई-पत्र आधारित सेवाक {{जालस्थल}} पर प्रारम्भ लेल, ऐ लागिकेँ अपन गवेषकमे खोलू:\n\n$3\n\nजँ अहाँ ई खाता *नै* पंजीकृत करबेने छी तँ ऐ लागि संगे जाउ\nअपन ई-पत्र सत्यापनकेँ खतम करबा लेल:\n\n$5\n\nई सत्यापन कूटशब्द $4 केँ खतम भऽ जाएत।",
     	"confirmemail_body_changed": "कियो, सम्भवतः अहाँ, अनिकेत $1 सँ,\nखाता \"$2\" क ई-पत्र संकेत बदलनेने छथि ऐ  {{जालस्थल}} पर।\n\nई खाता अहींक छी से सत्यापित करबाक लेल आ अपन ई-पत्र आधारित सेवाक {{जालस्थल}} पर प्रारम्भ लेल, ऐ लागिकेँ अपन गवेषकमे खोलू:\n\n$3\n\nजँ अहाँ ई खाता *नै* पंजीकृत करबेने छी तँ ऐ लागि संगे जाउ\nअपन ई-पत्र सत्यापनकेँ खतम करबा लेल:\n\n$5\n\nई सत्यापन कूटशब्द $4 केँ खतम भऽ जाएत।",
     	"confirmemail_body_set": "कियो, सम्भवतः अहाँ, अनिकेत $1 सँ,\nखाता \"$2\" क ई-पत्र संकेत पठेने छथि ऐ  {{जालस्थल}} पर।\n\nई खाता अहींक छी से सत्यापित करबाक लेल आ अपन ई-पत्र आधारित सेवाक {{जालस्थल}} पर प्रारम्भ लेल, ऐ लागिकेँ अपन गवेषकमे खोलू:\n\n$3\n\nजँ अहाँ ई खाता *नै* पंजीकृत करबेने छी तँ ऐ लागि संगे जाउ\nअपन ई-पत्र सत्यापनकेँ खतम करबा लेल:\n\n$5\n\nई सत्यापन कूटशब्द $4 केँ खतम भऽ जाएत।",
    @@ -2816,7 +2819,7 @@
     	"deletedwhileediting": "'''Warning''': अहां जखन सें संपादन शुरू केने छी, ओकर बाद से ई पृष्ठ के मिटा देल गेल अछि.",
     	"confirmrecreate": "प्रयोगकर्ता [[User:$1|$1]] ([[User talk:$1|वार्ता]]) अहाँक कारण सहित सम्पादनक बाद ई पन्नाके मेटाए देलक:\n: ''$2''\nकृपा कऽ अहाँ सुनिश्चित करी जे अहाँ ई पन्नाक फेरसँ बनबऽ चाहै छी।",
     	"confirmrecreate-noreason": "प्रयोक्ता [[User:$1|$1]] ([[User talk:$1|वार्ता]]) अहाँक सम्पादनक बाद ऐ पन्नाकेँ मेटा देलक| कृपा कऽ अहाँ सुनिश्चित करू जे अहाँ ऐ पन्नाकेँ फेरसँ बनबऽ चाहै छी।",
    -	"recreate": "फेर सें बनाऊ",
    +	"recreate": "फेर सँ बनाबी",
     	"confirm_purge_button": "ठीक अछि",
     	"confirm-purge-top": "ऐ पन्नाक उपस्मृति खतम कऽ दिअ?",
     	"confirm-purge-bottom": "कोनो पन्नाक सफाइ उपस्मृतिकेँ खतम करैए आ अद्यतन संशोधनकेँ अएबाले जोर दैए।",
    @@ -2825,27 +2828,27 @@
     	"confirm-unwatch-button": "ठीक अछि",
     	"confirm-unwatch-top": "ऐ पन्नाकेँ हमर साकांक्ष सूचीसँ हटाउ",
     	"quotation-marks": "\"$1\"",
    -	"imgmultipageprev": "पहिलुका पृष्ठ",
    -	"imgmultipagenext": "अगुलका पृष्ठ",
    -	"imgmultigo": "जाऊ",
    -	"imgmultigoto": "$1 पृष्ठ पर जाऊ",
    +	"imgmultipageprev": "← पहिलुका पृष्ठ",
    +	"imgmultipagenext": "अगुलका पृष्ठ →",
    +	"imgmultigo": "जाए!",
    +	"imgmultigoto": "$1 पृष्ठ पर जाए",
     	"img-lang-default": "(डिफल्ट भाषा)",
     	"img-lang-info": "ई चित्र को $1. $2 में ढालु",
     	"img-lang-go": "जाऊ",
     	"ascending_abbrev": "asc",
    -	"descending_abbrev": "desc",
    +	"descending_abbrev": "जानकारी",
     	"table_pager_next": "अगला पृष्ठ",
     	"table_pager_prev": "पहिलुका पृष्ठ",
    -	"table_pager_first": "पहिलुक पृष्ठ",
    -	"table_pager_last": "अंतिम पृष्ठ",
    -	"table_pager_limit": "एक पृष्ठ पर $1 सामग्री देखाऊ",
    +	"table_pager_first": "पहला पृष्ठ",
    +	"table_pager_last": "अन्तिम पृष्ठ",
    +	"table_pager_limit": "एक पृष्ठ पर $1 सामग्री देखाबी",
     	"table_pager_limit_label": "सामग्री प्रति पृष्ठ",
    -	"table_pager_limit_submit": "जाऊ",
    +	"table_pager_limit_submit": "जाए",
     	"table_pager_empty": "कोनो परिणाम नहि",
     	"autosumm-blank": "पृष्ठ के खाली करल गेल",
     	"autosumm-replace": "\"$1\" सहित पाठ परिवर्तित भेल",
     	"autoredircomment": "[[$1]] के अनुप्रेषित",
    -	"autosumm-new": "'$1'संग नब पृष्ठ बनाओल गेल",
    +	"autosumm-new": "'$1' संग नब पृष्ठ बनाओल गेल",
     	"autosumm-newblank": "खालि पन्ना बनाओल गेल",
     	"lag-warn-normal": "$1 सँ नव बदलल गेल {{PLURAL:$1|सेकेण्ड|सेकेण्ड}} ऐ सूचीमे नै देखाएल गेल।",
     	"lag-warn-high": "उच्च दत्तनिधि वितरक देरीक कारण, $1 सँ नव परिवर्तन {{PLURAL:$1|सेकेण्ड|सेकेण्ड}} ऐ सूचीमे नै देखाएल जा सकल।",
    @@ -2858,7 +2861,7 @@
     	"watchlistedit-raw-legend": "काँच साकांक्षसूची संपादित करू",
     	"watchlistedit-raw-explain": "अहाँक साकांक्ष-सूचीक शीर्षक सभ नीचाँ देल अछि, आ एकरा सूचीमे दऽ कऽ वा निकालि कऽ सम्पादित कएल जा सकैए;\nप्रति पाँती एक शीर्षक।\nजखन समाप्त भऽ जाए, क्लिक करू \"{{int:Watchlistedit-raw-submit}}\"।\nअहाँ [[Special:EditWatchlist|सामान्य सम्पादन-तंत्रांश प्रयोग करू]] ई सेहो कऽ सकै छी।",
     	"watchlistedit-raw-titles": "शीर्षक",
    -	"watchlistedit-raw-submit": "साकांक्षसूची अद्यतन करू",
    +	"watchlistedit-raw-submit": "साकांक्षसूची अद्यतन करी",
     	"watchlistedit-raw-done": "अहाँक साकांक्ष-सूची अद्यतन कएल गेल।",
     	"watchlistedit-raw-added": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} जोड़ल गेल:",
     	"watchlistedit-raw-removed": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} हटाएल गेल:",
    @@ -2871,10 +2874,10 @@
     	"watchlistedit-clear-removed": "{{PLURAL:$1|1 शीर्षक छल|$1शीर्षक सभ रहए}} हटाएल गेल:",
     	"watchlistedit-too-many": "एतेक बहुत रास पन्ना सभ देखावोल जाएत।",
     	"watchlisttools-clear": "साकांक्ष-सूची मेटाउ",
    -	"watchlisttools-view": "सम्बन्धित परिवर्तन सभकेँ देखू",
    -	"watchlisttools-edit": "साकांक्षसूचीकेँ देखू आ सम्पादित करू",
    -	"watchlisttools-raw": "काँच साकांक्षसूची संपादित करू",
    -	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|talk]])",
    +	"watchlisttools-view": "सम्बन्धित परिवर्तन सभकेँ देखी",
    +	"watchlisttools-edit": "साकांक्षसूची देखी आ सम्पादित करी",
    +	"watchlisttools-raw": "काँच साकांक्षसूची सम्पादित करी",
    +	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|वार्ता]])",
     	"duplicate-defaultsort": "'''चेतौनी:''' पूर्वनिर्धारित विन्यास चाभी \"$2\" पहिलुका पूर्वनिर्धारित विन्यास चाभी \"$1\" केँ खतम करैए।",
     	"duplicate-displaytitle": "<strong>चेतना:</strong> शीर्षक दिखाबु \"$2\" पूर्व दिखाएल गेल शीर्षक \"$1\" पे हाबी भऽ रहल अछि।",
     	"invalid-indicator-name": "<strong>त्रुटि:</strong> पन्ना स्थिति सुचीत <code>नाम</code> गुण खाली नै रहना चाही।",
    @@ -2973,11 +2976,11 @@
     	"tags-source-extension": "एक्सटेन्सनद्वारा परिभाषित",
     	"tags-source-manual": "प्रयोक्तासभ आर बोटद्वारा नियमानुसार लागू",
     	"tags-source-none": "आब प्रयोग में नै",
    -	"tags-edit": "सम्पादन करू",
    +	"tags-edit": "सम्पादन करी",
     	"tags-delete": "मेटाउ",
     	"tags-activate": "सक्रिय करी",
     	"tags-deactivate": "निष्क्रिय करी",
    -	"tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तन सभ}}",
    +	"tags-hitcount": "$1 {{PLURAL:$1|परिवर्तन|परिवर्तनसभ}}",
     	"tags-manage-no-permission": "अहाँकेँ पन्ना घसकेबाक अधिकार नै अछि।",
     	"tags-create-heading": "एकटा नयाँ विकि-समूह बनाबु",
     	"tags-create-explanation": "पुनः निर्धारित रूप से, नवनिर्मित टैग प्रयोगकर्तासभ आर बॉट के लेल हाजीर राहत।",
    @@ -3042,7 +3045,7 @@
     	"htmlform-int-toohigh": "जे मान अहाँ देलौं से अधिकतम $1 सँ ऊपर अछि।",
     	"htmlform-required": "ई मान चाही",
     	"htmlform-submit": "दिअ",
    -	"htmlform-reset": "परिवर्तन खतम करू",
    +	"htmlform-reset": "परिवर्तन पुरान स्थिति पर आनी",
     	"htmlform-selectorother-other": "आन",
     	"htmlform-no": "नै",
     	"htmlform-yes": "हँ",
    @@ -3051,7 +3054,7 @@
     	"htmlform-cloner-delete": "हटाउ",
     	"sqlite-has-fts": "$1 पूर्ण-पाठ खोज सहायता युक्त",
     	"sqlite-no-fts": "$1 बिन पूर्ण-पाठ खोज सहायताक",
    -	"logentry-delete-delete": "$1 {{लिंग:$2|deleted}} page $3",
    +	"logentry-delete-delete": "$1 पृष्ठ $3 {{GENDER:$2|मेटौलक}}",
     	"logentry-delete-restore": "$1 {{लिंग:$2|restored}} page $3",
     	"logentry-delete-event": "$1 {{लिंग:$2|changed}} एकर दृश्य{{PLURAL:$5| एकटा वृत्तलेख|$5 वृत्तलेख}}  $3: $4 केँ",
     	"logentry-delete-revision": "$1 {{लिंग:$2|changed}} एकर दृश्य{{PLURAL:$5| एकटा संशोधन|$5 संशोधन}}  पन्ना $3: $4 पर",
    @@ -3080,7 +3083,7 @@
     	"logentry-patrol-patrol": "$1 {{GENDER:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित",
     	"logentry-patrol-patrol-auto": "$1 स्वतः {{GENDER:$2|चिन्हित}} संशोधन $4 $3 पन्नाक निरीक्षित",
     	"logentry-newusers-newusers": "$1 {{लिंग:$2|बनाएल}} एकटा प्रयोक्ता खाता",
    -	"logentry-newusers-create": "$1 {{लिङ्ग:$2|बनाएल}} एकटा प्रयोक्ता खाता",
    +	"logentry-newusers-create": "प्रयोगकर्ता खाता $1 {{GENDER:$2|बनाएल}} गेल",
     	"logentry-newusers-create2": "$1 {{लिंग:$2|बनाएल}} {{लिंग:$4|एकटा प्रयोक्ता खाता}} $3",
     	"logentry-newusers-byemail": "$1 द्वारा प्रयोक्ता खाता $3 {{GENDER:$2|बनाओल}} गेल आ कूटशब्द ई-पत्र द्वारा भेजल गेल",
     	"logentry-newusers-autocreate": "खाता $1 छल {{लिंग:$2|बनाएल}} स्वतः",
    @@ -3098,7 +3101,7 @@
     	"feedback-error1": "त्रुटि: नै पहचानल गेल परिणाम एपीआईसँ",
     	"feedback-error2": "त्रुटि: संपादन विफल भेल",
     	"feedback-error3": "त्रुटि:एपीआईसँग कोनो प्रतिक्रिया नै",
    -	"feedback-message": "संदेश:",
    +	"feedback-message": "सन्देश:",
     	"feedback-subject": "विषय:",
     	"feedback-submit": "दिअ",
     	"feedback-thanks-title": "धन्यवाद!",
    diff --git a/languages/i18n/mk.json b/languages/i18n/mk.json
    index b1ae6f7f7f..19df826aa9 100644
    --- a/languages/i18n/mk.json
    +++ b/languages/i18n/mk.json
    @@ -530,6 +530,9 @@
     	"changepassword-success": "Вашата лозинка е сменета!",
     	"changepassword-throttled": "Имате премногу обиди за најава за кратко време.\nПочекајте $1 пред да се обидете повторно.",
     	"botpasswords": "Ботовски лозинки",
    +	"botpasswords-summary": "<em>Ботовските лозинки</em> даваат пристап до корисничка сметка преку приложникот без да се користат главните најавни податоци на сметката. Корисничките права може да се ограничени кога се најавувате на овој начин.\n\nДоколку не знаете за што ова би ви послужило, подобро не го правете ова. Никој никогаш не треба да ви побара да направите ваква лозинка и да му ја дадете.",
    +	"botpasswords-disabled": "Ботовските лозинки се оневозможени.",
    +	"botpasswords-no-central-id": "За да користите ботовски лозинки, мора да сте најавени со централизирана сметка.",
     	"botpasswords-existing": "Постоечки ботовски лозинки",
     	"botpasswords-createnew": "Направи нова ботовска лозинка",
     	"botpasswords-editexisting": "Измени постоечка ботовска лозинка",
    @@ -540,9 +543,25 @@
     	"botpasswords-label-delete": "Избриши",
     	"botpasswords-label-resetpassword": "Ставете нова лозинка",
     	"botpasswords-label-grants": "Применливи доделувања:",
    +	"botpasswords-help-grants": "Секое доделување дава пристап до список до наведени права што веќе ги има корисничката сметка. Повеќе ќе најдете на [[Special:ListGrants|табелата со доделувања]].",
    +	"botpasswords-label-restrictions": "Ограничувања на употребата:",
     	"botpasswords-label-grants-column": "Доделено",
     	"botpasswords-bad-appid": "Името на ботот „$1“ е неважечко.",
    +	"botpasswords-insert-failed": "Не успеав да го додадам името на ботот „$1“. Да не е веќе додадено?",
    +	"botpasswords-update-failed": "Не успеав да го подновам името на ботот „$1“. Да не е избришано?",
    +	"botpasswords-created-title": "Лозинка на ботот е создадена",
    +	"botpasswords-created-body": "Лозинката на ботот со име „$1“ на корисникот „$2“ е создадена.",
    +	"botpasswords-updated-title": "Лозинката на ботот е изменета",
    +	"botpasswords-updated-body": "Лозинката на ботот со име „$1“ на корисникот „$2“ е изменета.",
    +	"botpasswords-deleted-title": "Лозинка на ботот е избришана",
    +	"botpasswords-deleted-body": "Лозинката на ботот со име „$1“ на корисникот „$2“ е избришана.",
    +	"botpasswords-newpassword": "Новата лозинка за најава <strong>$1</strong> е <strong>$2</strong>. <em>Запишете си ја за во иднина.</em>",
    +	"botpasswords-no-provider": "BotPasswordsSessionProvider  е недостапен.",
    +	"botpasswords-restriction-failed": "Не можете да се најавите поради ограничувањата за лозинки на ботови.",
    +	"botpasswords-invalid-name": "Укажаното корисничко име не го содржи одделувачот ботовска лозинка („$1“).",
    +	"botpasswords-not-exist": "Корисникот „$1“ нема ботовска лозинка „$2“.",
     	"resetpass_forbidden": "Лозинките не може да се менуваат",
    +	"resetpass_forbidden-reason": "Лозинките не може да се менуваат: $1",
     	"resetpass-no-info": "Мора да сте најавени ако сакате да имате директен пристап до оваа страница.",
     	"resetpass-submit-loggedin": "Смени лозинка",
     	"resetpass-submit-cancel": "Откажи",
    @@ -572,6 +591,13 @@
     	"passwordreset-emailsentusername": "Ако има соодветна регистрирана е-пошта поврзана со ова корисничко име, тогаш ќе ви биде испратена порака за промена на лозинката.",
     	"passwordreset-emailsent-capture": "Испратено е писмо за измена на лозинката (прикажано подолу).",
     	"passwordreset-emailerror-capture": "Создадено е писмо за измена на лозинката (прикажано подолу), но не успеав да го испратам на {{GENDER:$2|корисникот}}: $1",
    +	"passwordreset-emailsent-capture2": "{{PLURAL:$1|Е-поштата за задавање на нова лозинка|Е-поштата за задавање на нови лозинки}} е испратена. Подолу е {{PLURAL:$1|е прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
    +	"passwordreset-emailerror-capture2": "Испраќањето е-пошта на {{GENDER:$2|корисникот}} не успеа: $1 Подолу е {{PLURAL:$3|прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
    +	"passwordreset-nocaller": "Мора да се укаже повикувач",
    +	"passwordreset-nosuchcaller": "Повикувачот не постои: $1",
    +	"passwordreset-ignored": "Менувањето на лозинката не успеа. Можеби не е поставен услужник?",
    +	"passwordreset-invalideamil": "Неважечка е-пошта",
    +	"passwordreset-nodata": "Немате укажано ни корисничко име, ни е-пошта.",
     	"changeemail": "Смени или отстрани е-пошта",
     	"changeemail-header": "Пополнете го образецов за да ја смените е-поштата. Ако сакате да ја отстраните адресата од вашата сметка, оставете го празно полето за нова е-пошта.",
     	"changeemail-passwordrequired": "Ќе треба да ја внесете лозинката за да ја потврдите измената.",
    @@ -615,6 +641,9 @@
     	"minoredit": "Ова е ситна промена",
     	"watchthis": "Набљудувај ја страницава",
     	"savearticle": "Зачувај",
    +	"savechanges": "Зачувај промени",
    +	"publishpage": "Објави ја страницата",
    +	"publishchanges": "Објави промени",
     	"preview": "Преглед",
     	"showpreview": "Преглед",
     	"showdiff": "Прикажи промени",
    @@ -643,14 +672,14 @@
     	"accmailtext": "На $2 е спратена е случајно создадена лозинка за [[User talk:$1|$1]] е испратена. Истата може да се смени на страницата ''[[Special:ChangePassword|Менување на лозинка]]'' откако ќе се најавите.",
     	"newarticle": "(нова)",
     	"newarticletext": "Проследивте врска до страница која не постои.\nЗа да ја создадете страницата, напишете текст во полето подолу ([$1 помош]). Ако сте овде по грешка, само систнете на копчето '''назад''' во вашиот прелистувач.",
    -	"anontalkpagetext": "----''Ова е страница за разговор со анонимен корисник кој сè уште не регистрирал корисничка сметка или не ја користи.\nЗатоа мораме да ја користиме неговата бројчена IP-адреса за да го препознаеме.\nЕдна ваква IP-адреса може да ја делат повеќе корисници.\nАко сте анонимен корисник и сметате дека кон вас се упатени нерелевантни коментари, тогаш [[Special:CreateAccount|создајте корисничка сметка]] или [[Special:UserLogin|најавете се]] за да избегнете поистоветување со други анонимни корисници во иднина.''",
    +	"anontalkpagetext": "----\n<em>Ова е страница за разговор со анонимен корисник кој сè уште не регистрирал корисничка сметка или не ја користи.<em>\nЗатоа мораме да ја користиме неговата бројчена IP-адреса за да го препознаеме.\nЕдна ваква IP-адреса може да ја делат повеќе корисници.\nАко сте анонимен корисник и сметате дека кон вас се упатени нерелевантни коментари, тогаш [[Special:CreateAccount|создајте корисничка сметка]] или [[Special:UserLogin|најавете се]] за да избегнете поистоветување со други анонимни корисници во иднина.''",
     	"noarticletext": "Таква страница сè уште не постои.\nМожете да проверите [[Special:Search/{{PAGENAME}}|дали насловот се споменува]] во други статии,\nда ги <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате дневниците],\nили да [{{fullurl:{{FULLPAGENAME}}|action=edit}} ја создадете]</span>.",
     	"noarticletext-nopermission": "Таква страница сè уште не постои.\nМожете да проверите [[Special:Search/{{PAGENAME}}|дали насловот се споменува]] во други статии или пак да <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} пребарате поврзаните дневници]</span>, но немате дозвола да ја создадете страницата.",
     	"missing-revision": "Не ја пронајдов преработката бр. $1 на страницата со наслов „{{FULLPAGENAME}}“.\n\nОва обично се должи на застарена врска за разлики што води кон избришана страница.\nПовеќе подробности ќе најдете во [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневникот на бришења].",
     	"userpage-userdoesnotexist": "Корисничката сметка „<nowiki>$1</nowiki>“ не е регистрирана.\nВе молиме размислете дали навистина сакате да ја создадете/уредите оваа страница.",
     	"userpage-userdoesnotexist-view": "Корисничката сметка „$1“ не е регистрирана.",
     	"blocked-notice-logextract": "Овој корисник е моментално блокиран.\nПодолу е прикажан последниот дневнички запис:",
    -	"clearyourcache": "<strong>Напомена:</strong>  По зачувувањето морате да го исчистите меѓускладот (кеш) на прелистувачот за да можете ги видите промените.\n* <strong>Firefox / Safari:</strong> Држете <em>Shift</em> и стиснете на <em>Превчитај</em> (<em>Reload</em>) или притиснете <em>Ctrl-F5</em> или <em>Ctrl-R</em> (''⌘-R'' на Mac);\n* <strong>Google Chrome:</strong> Притиснете <em>Ctrl-Shift-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Internet Explorer:</strong> Држете <em>Ctrl</em> додека притискате на <em>Refresh</em> или притиснете <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Исчистете го меѓускладот во <em>Tools → Preferences</em>",
    +	"clearyourcache": "<strong>Напомена:</strong>  По зачувувањето морате да го исчистите меѓускладот (кеш) на прелистувачот за да можете ги видите промените.\n* <strong>Firefox / Safari:</strong> Држете <em>Shift</em> и стиснете на <em>Превчитај</em> (<em>Reload</em>) или притиснете <em>Ctrl-F5</em> или <em>Ctrl-R</em> (''⌘-R'' на Mac);\n* <strong>Google Chrome:</strong> Притиснете <em>Ctrl-Shift-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Internet Explorer:</strong> Држете <em>Ctrl</em> додека притискате на <em>Refresh</em> или притиснете <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Појдете на <em>Menu → Settings</em> (<em>Opera → Preferences</em> на Мекинтош), а потоа на <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
     	"usercssyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да го испробате вашиот нов CSS пред да зачувате.",
     	"userjsyoucanpreview": "'''Совет:''' Употребете го копчето „{{int:showpreview}}“ за да ја испробате вашата нова JavaScript  пред да зачувате.",
     	"usercsspreview": "'''Запомнете дека ова е само преглед на вашиот кориснички CSS код, страницата сè уште не е зачувана!'''",
    @@ -663,8 +692,8 @@
     	"previewnote": "'''Имајте предвид дека ова е само преглед.'''\nПромените сè уште не се зачувани!",
     	"continue-editing": "Оди на полето за уредување",
     	"previewconflict": "Овој преглед прикажува како ќе изгледа текстот внесен во горниот дел откако ќе се зачува страницата.",
    -	"session_fail_preview": "'''Жалиме! Не можевме да го обработиме вашето уредување поради загуба на податоци од седницата.'''\nОбидете се повторно.\nАко сè уште не функционира, обидете се да се [[Special:UserLogout|одјавите]] и повторно да се најавите.",
    -	"session_fail_preview_html": "'''Жалиме, но Вашето уредување не можеше да се обработи поради загува на податоците од седницата.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување.",
    +	"session_fail_preview": "За жал, не можев да го обработам уредувањето поради загуба на седнички податоци.\n\nМожеби сте биле одјавени. <strong>Проверете дали сè уште сте најавени и обидете се повторно</strong>.\nАко проблемот продолжи да се јавува, [[Special:UserLogout|одјавете се]] и повторно најавете се, и проверете дали прелистувачот дозволува колачиња од ова мрежно место.",
    +	"session_fail_preview_html": "'''Жалиме, но Вашето уредување не можеше да се обработи поради загува на податоците од седницата.'''\n\n''{{SITENAME}} има овозможено чист HTML, па прегледот е скриен како мерка за заштита од JavaScript-напади.''\n\n'''Ако ова е разумен обид за уредување, тогаш обидете се повторно.'''\nАко и ова не го реши проблемот, обидете се со [[Special:UserLogout|одјавување]] и повторно најавување, и проверете дали прелистувачот дозволува колачиња од ова мрежно место.",
     	"token_suffix_mismatch": "'''Вашето уредување е одбиено затоа што вашиот пребарувач направил проблеми со интерпукциските знаци во шифрата на уредувањето.\nУредувањето не е прифатено за да се спречи несакана промена на текстот на страницата.\nОва понекогаш се случува кога користите неисправна мрежна анонимна застапничка (proxy) служба.'''",
     	"edit_form_incomplete": "'''Некои делови од образецот за уредување не стасаа до опслужувачот. Внимателно проверете дали уреденото не е пореметено и обидете се поввторно.'''",
     	"editing": "Уредување на $1",
    @@ -831,9 +860,9 @@
     	"revdelete-unsuppress": "Отстрани ограничувања на обновени преработки",
     	"revdelete-log": "Причина:",
     	"revdelete-submit": "Примени врз {{PLURAL:$1|одбрана преработка|одбрани преработки}}",
    -	"revdelete-success": "'''Видливоста на преработката е успешно изменета.'''",
    +	"revdelete-success": "Видливоста на преработката е изменета.",
     	"revdelete-failure": "'''Видливоста на преработката не можеше да се измени:'''\n$1",
    -	"logdelete-success": "'''Успешно нагодување на дневник на видливост.'''",
    +	"logdelete-success": "Дневникот на видливост е поставен.",
     	"logdelete-failure": "'''Дневникот на видливост не може да биде нагоден:'''\n$1",
     	"revdel-restore": "Промена на видливост",
     	"pagehist": "Историја на страницата",
    @@ -867,8 +896,10 @@
     	"mergehistory-fail-bad-timestamp": "Временската ознака е неважечка.",
     	"mergehistory-fail-invalid-source": "Изворната страница е неважечка.",
     	"mergehistory-fail-invalid-dest": "Целната страница е неважечка.",
    +	"mergehistory-fail-no-change": "Спојувањето на историјата не спои ниедна преработка. Проверете ја страницата и временските параметри.",
     	"mergehistory-fail-permission": "Немате дозвола за да ја споите историјата.",
     	"mergehistory-fail-self-merge": "Изворната и целната страница се исти.",
    +	"mergehistory-fail-timestamps-overlap": "Изворните преработки се преклопуваат или допаѓаат по целните преработки.",
     	"mergehistory-fail-toobig": "Не можам да извршам спојување на историјата бидејќи така ќе се надмине границата од {{PLURAL:$1|една преработка|$1 преработки}}.",
     	"mergehistory-no-source": "Изворната страница $1 не постои.",
     	"mergehistory-no-destination": "Целната страница $1 не постои.",
    @@ -1059,7 +1090,7 @@
     	"userrights": "Раководење со кориснички права",
     	"userrights-lookup-user": "Раководење со кориснички групи",
     	"userrights-user-editname": "Внесете корисничко име:",
    -	"editusergroup": "Уреди кориснички групи",
    +	"editusergroup": "Уреди {{GENDER:$1|кориснички}} групи",
     	"editinguser": "Менување на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
     	"userrights-editusergroup": "Уреди ги корисничките групи",
     	"saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи",
    @@ -1075,7 +1106,7 @@
     	"userrights-unchangeable-col": "Групи кои не може да ги промените",
     	"userrights-irreversible-marker": "$1*",
     	"userrights-conflict": "Спротиставеност во измените на корисничките права. Прегледајте ги и потврдете ги.",
    -	"userrights-removed-self": "Успешно ги отстранивте вашите права. Затоа, повеќе немате пристап на страницава.",
    +	"userrights-removed-self": "Ги отстранивте вашите права. Затоа, повеќе немате пристап на страницава.",
     	"group": "Група:",
     	"group-user": "Корисници",
     	"group-autoconfirmed": "Автопотврдени корисници",
    @@ -1101,6 +1132,7 @@
     	"right-createpage": "Создавање на страници (кои не се страници за разговор)",
     	"right-createtalk": "Создавање на страници за разговор",
     	"right-createaccount": "Создавање на нови кориснички сметки",
    +	"right-autocreateaccount": "Автоматска најава со надворешна корисничка сметка",
     	"right-minoredit": "Означување на уредувањата како ситни",
     	"right-move": "Преместување страници",
     	"right-move-subpages": "Преместување на страници со нивните потстраници",
    @@ -1166,9 +1198,10 @@
     	"right-override-export-depth": "Извезување на страници вклучувајќи поврзани страници со длабочина до 5",
     	"right-sendemail": "Испраќање на е-пошта до други корисници",
     	"right-passwordreset": "Преглед на пораки по е-пошта за промена на лозинка",
    -	"right-managechangetags": "Создавање3 или бришење на [[Special:Tags|ознаки]] од базата",
    +	"right-managechangetags": "Создавање и (де)активирање на [[Special:Tags|ознаки]]",
     	"right-applychangetags": "Задавање на [[Special:Tags|ознаки]] заедно со направените измени",
     	"right-changetags": "Додавате и отстранување на произволни [[Special:Tags|ознаки]] во поединечни преработки и дневнички записи",
    +	"right-deletechangetags": "Бришење [[Special:Tags|ознаки]] од базата",
     	"grant-generic": "Група права „$1“",
     	"grant-group-page-interaction": "Опходување со страници",
     	"grant-group-file-interaction": "Опходување со слики и снимки",
    @@ -1206,8 +1239,9 @@
     	"action-read": "читање на оваа страница",
     	"action-edit": "уредување на оваа страница",
     	"action-createpage": "создавање страници",
    -	"action-createtalk": "создавање страници за разговор",
    +	"action-createtalk": "создавање на оваа страница за разговор",
     	"action-createaccount": "создај ја оваа корисничка сметка",
    +	"action-autocreateaccount": "автоматско создавање на оваа надворешна корисничка сметка",
     	"action-history": "преглед на историјата на оваа страница",
     	"action-minoredit": "означување на ова уредување како ситно",
     	"action-move": "преместување на оваа страница",
    @@ -1245,9 +1279,10 @@
     	"action-viewmyprivateinfo": "преглед на вашите лични податоци",
     	"action-editmyprivateinfo": "уредување на вашите лични податоци",
     	"action-editcontentmodel": "уредување на содржинскиот модел на страница",
    -	"action-managechangetags": "создавање или бришење на ознаки од базата",
    +	"action-managechangetags": "создавање или (де)активирање на ознаки",
     	"action-applychangetags": "ставање на ознаки заедно со напревените промени",
     	"action-changetags": "додавање и отстранување на произволни ознаки во поединечни преработки и дневнички записи",
    +	"action-deletechangetags": "бришење ознаки од базата",
     	"nchanges": "$1 {{PLURAL:$1|промена|промени}}",
     	"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|од последната посаета}}",
     	"enhancedrc-history": "историја",
    @@ -1313,9 +1348,9 @@
     	"recentchangeslinked-page": "Име на страницата:",
     	"recentchangeslinked-to": "Прикажи ги промените на страниците поврзани со дадената страница",
     	"recentchanges-page-added-to-category": "[[:$1]] ставена во категорија",
    -	"recentchanges-page-added-to-category-bundled": "[[:$1]] и уште [[Special:WhatLinksHere/$1|{{PLURAL:$2|една страница ставена|$2 страници ставеи}}]] во категорија",
    +	"recentchanges-page-added-to-category-bundled": "[[:$1]] ставена во категорија, [[Special:WhatLinksHere/$1|оваа страница е вклучена во рамките на други страници]]",
     	"recentchanges-page-removed-from-category": "[[:$1]] отстранета од категорија",
    -	"recentchanges-page-removed-from-category-bundled": "[[:$1]] и уште {{PLURAL:$2|една страница отстранета|$2 страници отстранети}} од категорија",
    +	"recentchanges-page-removed-from-category-bundled": "[[:$1]] отстранета од категорија, [[Special:WhatLinksHere/$1|оваа страница е вклучена во рамките на други страници]]",
     	"autochange-username": "Автоматски промени на МедијаВики",
     	"upload": "Подигање",
     	"uploadbtn": "Подигни",
    @@ -1388,7 +1423,8 @@
     	"uploaded-script-svg": "Пронајдов скриптен елемент „$1“ во подигнатата SVG-податотека.",
     	"uploaded-hostile-svg": "Пронајдов небезбеден CSS во стилскиот елемент на подигнатата SVG-податотека.",
     	"uploaded-event-handler-on-svg": "Задавањето на атрибути <code>$1=\"$2\"</code> за работа со настани не е дозволено за SVG-податотеки.",
    -	"uploaded-href-unsafe-target-svg": "Пронајдов href кон небезбедна цел <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
    +	"uploaded-href-attribute-svg": "На href-атрибутите во SVG-податотеки им е дозволено да водат само до цели со претставки http:// или https://, кои се наоѓаат на <code>&lt;$1 $2=\"$3\"&gt;</code>.",
    +	"uploaded-href-unsafe-target-svg": "Пронајдов href кон небезбедни податоци: URI-цел <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
     	"uploaded-animate-svg": "Пронајдов ознака „animate“ што може да го менува href, користејќи го атрибутот „from“ <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
     	"uploaded-setting-event-handler-svg": "Задавањето на атрибути за работа со настани е спречено. Пронајдов <code>&lt;$1 $2=\"$3\"&gt;</code> во подигнатата SVG-податотека.",
     	"uploaded-setting-href-svg": "Употребата на ознаката „set“ tag за ставање на атрибутот „href“ во матичен елемент е спречена.",
    @@ -1421,6 +1457,9 @@
     	"upload-too-many-redirects": "Оваа URL содржеше премногу пренасочувања",
     	"upload-http-error": "Се појави грешка во HTTP: $1.",
     	"upload-copy-upload-invalid-domain": "Примероци од подигањата не се достапни на овој домен.",
    +	"upload-foreign-cant-upload": "Ова вики не е поставено за подигање на податотеки на бараното надворешно складиште.",
    +	"upload-foreign-cant-load-config": "Не можев да ја вчитам поставеноста за подигање податотеки на надворешни складишта.",
    +	"upload-dialog-disabled": "Подигањето на податотеки со помош на овој дијалог е оневозможено на ова вики.",
     	"upload-dialog-title": "Подигни податотека",
     	"upload-dialog-button-cancel": "Откажи",
     	"upload-dialog-button-done": "Готово",
    @@ -1460,7 +1499,7 @@
     	"backend-fail-read": "Не можев да ја прочитам податотеката $1",
     	"backend-fail-create": "Не можев да ја запишам податотеката $1.",
     	"backend-fail-maxsize": "Не можев да ја запишам податотеката $1 бидејќи е поголема од {{PLURAL:$2|еден бајт|$2 бајти}}.",
    -	"backend-fail-readonly": "Складишната основа „$1“ моментално не може да се запишува. Наведената причина гласи: „$2“",
    +	"backend-fail-readonly": "Складишната основа „$1“ моментално не може да се запишува. Наведената причина гласи: <em>$2</em>",
     	"backend-fail-synced": "Податотеката „$1“ е во состојба недоследна во рамките на внатрешните складишни основи",
     	"backend-fail-connect": "Не можев да се поврзам со складишната основа „$1“.",
     	"backend-fail-internal": "Се појави непозната грешка во складишната основа „$1“.",
    @@ -1740,19 +1779,39 @@
     	"apihelp": "Помош со извршникот",
     	"apihelp-no-such-module": "Модулот „$1“ не е пронајден.",
     	"apisandbox": "Извршнички песочник",
    +	"apisandbox-jsonly": "Употребата на овој извршнички песочник бара JavaScript.",
     	"apisandbox-api-disabled": "Извршникот е оневозможен на ова мрежно место.",
    -	"apisandbox-intro": "Страницава служи за вршење проби со '''Извршник на МедијаВики'''.\n\nПовеќе за употребата на овој извршник ќе најдете во [https://www.mediawiki.org/wiki/API:Main_page неговата документација].  Пример: [https://www.mediawiki.org/wiki/API#A_simple_example преземање на содржината на главната страница].  Одберете дејство за да видите повеќе примери.\n\nИмајте предвид дека она шо го правите на страницава може да се одрази врз викито, иако ова е песочник.",
    +	"apisandbox-intro": "Страницава служи за вршење проби со <strong>Извршник на МедијаВики</strong>.\n\nПовеќе за употребата на овој извршник ќе најдете во  [[mw:API:Main page|неговата документација]]. Пример: [https://www.mediawiki.org/wiki/API#A_simple_example преземање на содржината на Главната страница].  Одберете дејство за да видите повеќе примери.\n\nИмајте предвид дека она шо го правите на страницава може да се одрази врз викито, иако ова е песочник.",
    +	"apisandbox-fullscreen": "Рашири го полето",
    +	"apisandbox-fullscreen-tooltip": "Рашири го полето на песочникот колку што е голем прозорецот на прелистувачот.",
     	"apisandbox-unfullscreen": "Прикажи страница",
    +	"apisandbox-unfullscreen-tooltip": "Смали го полето на песочникот, за да се покажуваат навигациските врски на МедијаВики.",
     	"apisandbox-submit": "Постави барање",
     	"apisandbox-reset": "Исчисти",
     	"apisandbox-retry": "Пробај пак",
    +	"apisandbox-loading": "Вчитувам информации за извршничкиот модул „$1“...",
    +	"apisandbox-load-error": "Се појави грешка при вчитувањето на информациите за извршничкиот модул „$1“: $2",
    +	"apisandbox-no-parameters": "Извршничкиот модул нема параметри.",
    +	"apisandbox-helpurls": "Врски за помош",
     	"apisandbox-examples": "Примери",
     	"apisandbox-dynamic-parameters": "Дополнителни параметри",
     	"apisandbox-dynamic-parameters-add-label": "Додај параметар:",
     	"apisandbox-dynamic-parameters-add-placeholder": "Назив на параметарот",
    +	"apisandbox-dynamic-error-exists": "Праметарот по име „$1“ веќе постои.",
    +	"apisandbox-deprecated-parameters": "Застарени параметри",
    +	"apisandbox-fetch-token": "Самопополни ја шифрата",
    +	"apisandbox-submit-invalid-fields-title": "Некои полиња се неважечки",
    +	"apisandbox-submit-invalid-fields-message": "Исправете ги обележаните полиња и обидете се повторно.",
     	"apisandbox-results": "Исход",
    +	"apisandbox-sending-request": "Испраќам барање до извршникот...",
    +	"apisandbox-loading-results": "Добивам исход од извршникот...",
    +	"apisandbox-results-error": "Се појави грешка при вчитувањето на одговорот од барањето до извршникот: $1.",
     	"apisandbox-request-url-label": "URL на барањето:",
    -	"apisandbox-request-time": "Време за барањето: $1",
    +	"apisandbox-request-time": "Време за барањето: {{PLURAL:$1|$1 милисекунда|$1 милисекунди}}",
    +	"apisandbox-results-fixtoken": "Исправи ја шифрата и поднеси одново",
    +	"apisandbox-results-fixtoken-fail": "Не успеав да ја добијам шифрата „$1“.",
    +	"apisandbox-alert-page": "Полињата на страницава се неважечки.",
    +	"apisandbox-alert-field": "Вредноста на полево е неважечка.",
     	"booksources": "Печатени извори",
     	"booksources-search-legend": "Пребарување на извори за книга",
     	"booksources-isbn": "ISBN:",
    @@ -1841,6 +1900,8 @@
     	"trackingcategories-msg": "Следечка категорија",
     	"trackingcategories-name": "Назив на пораката",
     	"trackingcategories-desc": "Критериуми за вклучување",
    +	"restricted-displaytitle-ignored": "Страници со занемарени наслови за приказ",
    +	"restricted-displaytitle-ignored-desc": "Страницата има занемарен <code><nowiki>{{DISPLAYTITLE}}</nowiki></code> бидејќи не е истоветен на нејзиниот стварен наслов.",
     	"noindex-category-desc": "Роботите не ја индексираат страницава бидејќи го содржи волшебниот збор <code><nowiki>__NOINDEX__</nowiki></code> и се наоѓа во именски простор кајшто е дозволен.",
     	"index-category-desc": "Страницата содржи <code><nowiki>__INDEX__</nowiki></code> (и се наоѓа во именски простор кајшто ова е дозволено), па затоа се индексира од роботи, што инаку не би било.",
     	"post-expand-template-inclusion-category-desc": "Страницата е поголема од <code>$wgMaxArticleSize</code> по проширувањето на сите шаблони. Затоа, некои шаблони не се проширени.",
    @@ -1966,12 +2027,14 @@
     	"rollbacklinkcount": "отповикај $1 {{PLURAL:$1|уредување|уредувања}}",
     	"rollbacklinkcount-morethan": "отповикај повеќе од $1 {{PLURAL:$1|уредување|уредувања}}",
     	"rollbackfailed": "Отповикувањето не успеа",
    +	"rollback-missingparam": "Недостасуваат задолжителни параметри за барањето.",
     	"cantrollback": "Уредувањето не може да се отповика.\nПоследниот уредник е воедно и единствениот автор на страницата.",
     	"alreadyrolled": "Не може да се отповика последното уредување на страницата „[[:$1]]“ извршено од  [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);\nнекој друг веќе ја изменил или отповикал страницата.\n\nПоследното уредување го изврши [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     	"editcomment": "Коментарот на уредувањето беше: <em>$1</em>.",
     	"revertpage": "Отстрането уредувањето на [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]), вратено на последната верзија на [[User:$1|$1]]",
     	"revertpage-nouser": "Вратени уредувања од скриен корисник на последната преработка на {{GENDER:$1|[[User:$1|$1]]}}",
     	"rollback-success": "Откажани уредувањата на $1; вратено на последната верзија на $2.",
    +	"rollback-success-notify": "Откажани уредувањата на $1;\nвратено на последната преработка на $2. [$3 Пок. промени]",
     	"sessionfailure-title": "Седницата не успеа",
     	"sessionfailure": "Има проблем со вашата седница;\nоваа дејство е откажано како превентива против преземање седници.\nПритиснете го копчето „назад“ и повторно вчитајте ја страницата од која дојдовте и обидете се повторно.",
     	"changecontentmodel": "Промена на содржинскиот модел на страница",
    @@ -2119,6 +2182,7 @@
     	"sp-contributions-username": "IP-адреса или корисничко име:",
     	"sp-contributions-toponly": "Прикажувај само последни преработки",
     	"sp-contributions-newonly": "Прикажувај само новосоздадени страници",
    +	"sp-contributions-hideminor": "Скриј ситни промени",
     	"sp-contributions-submit": "Пребарај",
     	"whatlinkshere": "Што води овде",
     	"whatlinkshere-title": "Страници со врски што водат до „$1“",
    @@ -2398,7 +2462,7 @@
     	"import-nonewrevisions": "Не увезов ниедна преработка (сите се веќе присутни или изоставени поради грешки)",
     	"xml-error-string": "$1 во ред $2, колона $3 (бајт $4): $5",
     	"import-upload": "Подигни XML податоци",
    -	"import-token-mismatch": "Загубени на податоците од седницата. Обидете се повторно.",
    +	"import-token-mismatch": "Загубени седничките податоци.\n\nМоже да сте биле одјавени. <strong>Проверете дали сè уште сте најавени и обидете се повторно</strong>.\nАко проблемот продолжи да се јавува, [[Special:UserLogout|одјавете се]] и повторно најавете се, и проверете дали прелистувачот дозволува колачиња од ова мрежно место.",
     	"import-invalid-interwiki": "Не можам да увезам од наведеното вики.",
     	"import-error-edit": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја уредувате.",
     	"import-error-create": "Страницата „$1“ не е увезена бидејќи не ви е дозволено да ја создадете.",
    @@ -2474,6 +2538,7 @@
     	"tooltip-ca-nstab-category": "Преглед на категоријата",
     	"tooltip-minoredit": "Обележи ја промената како ситна",
     	"tooltip-save": "Зачувајте ги промените",
    +	"tooltip-publish": "Објавете ги вашите промени",
     	"tooltip-preview": "Преглед на промените - ве молиме користете го ова пред зачувување!",
     	"tooltip-diff": "Покажи кои промени ги направи во текстот.",
     	"tooltip-compareselectedversions": "Видете ја разликата помеѓу двете избрани верзии на оваа страница.",
    @@ -3070,13 +3135,17 @@
     	"confirmemail_body_set": "Некој, веројатно Вие, од IP-адресата $1,\nна {{SITENAME}} ја внел оваа е-поштенска адреса на сметката „$2“.\n\nЗа да потврдите дека оваа адреса навистина Ви припаѓа Вам и за да ги вклучите\nможностите за е-пошта на {{SITENAME}}, отворете ја следнава врска во прелистувачот:\n\n$3\n\nАко сметката *не* е Ваша, проследете ја следнава врска\nза да ја откажете потврдата:\n\n$5\n\nОвој потврден код истекува во $4.",
     	"confirmemail_invalidated": "Потврдата на е-поштенската адреса е откажана",
     	"invalidateemail": "Откажување на потврда на е-пошта",
    +	"notificationemail_subject_changed": "Е-поштата регистрирана на {{SITENAME}} е сменета",
    +	"notificationemail_subject_removed": "Е-поштата регистрирана на {{SITENAME}} е отстранета",
    +	"notificationemail_body_changed": "Некој, веројатно вие, од IP-адресата $1,\nја сменил е-поштата на сметката „$2“ на {{SITENAME}} во „$3“.\n\nАко ова не сте вие, веднаш обратете се кај администратор.",
    +	"notificationemail_body_removed": "Некој, веројатно вие, од IP-адресата $1,\nја отстранил е-поштата на сметката „$2“ на {{SITENAME}}.\n\nАко ова не сте вие, веднаш обратете се кај администратор.",
     	"scarytranscludedisabled": "[Превметнувањето помеѓу викијата е оневозможено]",
     	"scarytranscludefailed": "[Преземањето на шаблонот за $1 не успеа]",
     	"scarytranscludefailed-httpstatus": "[Преземањето на шаблонот не успеа за $1: HTTP $2]",
     	"scarytranscludetoolong": "[Премногу долго URL]",
     	"deletedwhileediting": "'''Предупредување''': Оваа страница беше избришана откако почнавте со нејзино уредување!",
    -	"confirmrecreate": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) ја избриша оваа страница откако вие почнавте со уредување заради:\n: ''$2''\nПотврдете дека навистина сакате повторно да ја создадете оваа страница.",
    -	"confirmrecreate-noreason": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) ја избриша страницава откако почнавте да ја уредувате.  Потврдете деак навистина сакате да ја пресоздадете страницата.",
    +	"confirmrecreate": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|ја избриша}} страницава откако вие почнавте со уредување, со причината:\n: ''$2''\nПотврдете дека навистина сакате да ја пресоздадете страницата.",
    +	"confirmrecreate-noreason": "Корисникот [[User:$1|$1]] ([[User talk:$1|разговор]]) {{GENDER:$1|ја избриша}} страницава откако почнавте да ја уредувате.  Потврдете дека навистина сакате да ја пресоздадете страницата.",
     	"recreate": "Пресоздај",
     	"unit-pixel": "п",
     	"confirm_purge_button": "OK",
    @@ -3154,7 +3223,7 @@
     	"watchlistedit-raw-done": "Вашиот список на набљудувања е подновен.",
     	"watchlistedit-raw-added": "{{PLURAL:$1|1 наслов беше|$1 наслови беа}} додадени:",
     	"watchlistedit-raw-removed": "{{PLURAL:$1|Избришан е еден наслов|Избришани се $1 наслови}}:",
    -	"watchlistedit-clear-title": "Исчистени набљудуваните",
    +	"watchlistedit-clear-title": "Исчисти набљудувани",
     	"watchlistedit-clear-legend": "Исчисти набљудувани",
     	"watchlistedit-clear-explain": "Сите наслови ќе бидат отстранети од набљудуваните",
     	"watchlistedit-clear-titles": "Наслови:",
    @@ -3222,6 +3291,7 @@
     	"timezone-local": "Месно",
     	"duplicate-defaultsort": "Предупредување: Основниот клуч за подредување „$2“ го поништува претходниот основен клуч за подредување „$1“.",
     	"duplicate-displaytitle": "<strong>Предупредување:</strong> Приказниот наслов „$2“ го заменува претходнито приказен наслов „$1“.",
    +	"restricted-displaytitle": "<strong>Предупредување:</strong> Насловот за приказ „$1“ е занемарен бидејќи не е истоветен на стварниот наслов на страницата.",
     	"invalid-indicator-name": "<strong>Грешка:</strong> Атрибутот <code>name</code> што го покажува статусот на страницата не може да биде празен.",
     	"version": "Верзија",
     	"version-extensions": "Воспоставени додатоци",
    @@ -3271,8 +3341,8 @@
     	"version-libraries-license": "Лиценца",
     	"version-libraries-description": "Опис",
     	"version-libraries-authors": "Автори",
    -	"redirect": "Пренасочување по податотеки, корисник или назнака на преработка",
    -	"redirect-summary": "Оваа службена страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата) или корисничка странца (се задава бројчената назнака на корисникот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]] или [[{{#Special:Redirect}}/user/101]].",
    +	"redirect": "Пренасочување по податотека, страница, преработка или назнака во дневникот",
    +	"redirect-summary": "Оваа службена страница пренасочува кон податотека (се задава името), страница (се задава назнаката на преработката или страницата), корисничка странца (се задава бројчената назнака на корисникот) или дневнички запис (се дава назнака на записот). Употреба: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/revision/328429]],  [[{{#Special:Redirect}}/user/101]] или [[{{#Special:Redirect}}/logid/186]].",
     	"redirect-submit": "Дај",
     	"redirect-lookup": "Пребарај:",
     	"redirect-value": "Вредност:",
    @@ -3355,7 +3425,8 @@
     	"tags-delete-not-allowed": "Ознаките зададени од додаток не можат да се бришат освен ако тоа не е изрично дозволено од додатокот.",
     	"tags-delete-not-found": "Ознаката „$1“ не постои.",
     	"tags-delete-too-many-uses": "Ознаката „$1“ се применува во повеќе од {{PLURAL:$2|една преработка|$2 преработки}}, што значи дека не може да се избрише.",
    -	"tags-delete-warnings-after-delete": "Ознаката „$1“ е успешно избришана, но наидов на {{PLURAL:$2|следново предупредување|следниве предупредувања}}:",
    +	"tags-delete-warnings-after-delete": "Ознаката „$1“ е избришана, но наидов на {{PLURAL:$2|следново предупредување|следниве предупредувања}}:",
    +	"tags-delete-no-permission": "Немате дозвола за бришење на ознаки за промени.",
     	"tags-activate-title": "Активирај ознака",
     	"tags-activate-question": "На пат сте да ја активирате ознаката „$1“.",
     	"tags-activate-reason": "Причина:",
    @@ -3531,8 +3602,10 @@
     	"feedback-useragent": "Кориснички вршител:",
     	"searchsuggest-search": "Пребарување",
     	"searchsuggest-containing": "содржи...",
    +	"api-error-autoblocked": "Вашата IP-адреса е автоматски блокирана бидејќи ја има користено блокиран корисник.",
     	"api-error-badaccess-groups": "Не ви е дозволено да подигате податотеки на ова вики.",
     	"api-error-badtoken": "Внатрешна грешка: неисправна шифра.",
    +	"api-error-blocked": "Блокирани сте од уредување.",
     	"api-error-copyuploaddisabled": "Подигањата со URL се оневозможени на овој опслужувач.",
     	"api-error-duplicate": "Веќе {{PLURAL:$1|постои друга податотека|постојат други податотеки}} со истата содржина.",
     	"api-error-duplicate-archive": "На мрежното место веќе {{PLURAL:$1|постоела друга податотека|постоеле други податотеки}} со истата содржина, но во меѓувреме {{PLURAL:$1|била избришана|биле избришани}}.",
    @@ -3559,6 +3632,7 @@
     	"api-error-nomodule": "Внатрешна грешка: нема зададено модул за подигање.",
     	"api-error-ok-but-empty": "Внатрешна грешка: опслужувачот не одговара.",
     	"api-error-overwrite": "Презапишувањето врз постоечки податотеки не е дозволено.",
    +	"api-error-ratelimited": "Се обидувате да подигнете повеќе податотеки отколку што викито допушта за дадено време.\nОбидете се повторно за неколку минути.",
     	"api-error-stashfailed": "Внатрешна грешка: Опслужувачот не успеа да ја складира привремената податотека.",
     	"api-error-publishfailed": "Внатрешна грешка: Опслужувачот не успеа да ја објави привремената податотека.",
     	"api-error-stasherror": "Се јави грешка при подигањето на податотеката во складот.",
    @@ -3577,6 +3651,7 @@
     	"api-error-unknownerror": "Непозната грешка: „$1“.",
     	"api-error-uploaddisabled": "Подигањето е оневозможено на ова вики.",
     	"api-error-verification-error": "Податотеката е оштетена или има погрешна наставка.",
    +	"api-error-was-deleted": "Податотека со ова име веќе е подигана и потоа избришана.",
     	"duration-seconds": "{{PLURAL:$1|една секунда|$1 секунди}}",
     	"duration-minutes": "{{PLURAL:$1|една минута|$1 минути}}",
     	"duration-hours": "{{PLURAL:$1|еден час|$1 часа}}",
    @@ -3613,7 +3688,7 @@
     	"expand_templates_generate_xml": "Прикажи XML-дрво на расчленувањето",
     	"expand_templates_generate_rawhtml": "Прикажувај сиров HTML",
     	"expand_templates_preview": "Преглед",
    -	"expand_templates_preview_fail_html": "<em>Бидејќи {{SITENAME}} има овозможено сиров HTML и се јави губиток на седнички податоци, прегледот е скриен како мерка на претпазливост против напади со JavaScript.</em>\n\n<strong>Ако ова е е легитимен обид за преглед, тогаш обидете се повторно.</strong>\nАко не работи и тогаш, [[Special:UserLogout|одјавете се]] и повторно најавете се.",
    +	"expand_templates_preview_fail_html": "<em>Бидејќи {{SITENAME}} има овозможено сиров HTML и се јави губиток на седнички податоци, прегледот е скриен како мерка на претпазливост против напади со JavaScript.</em>\n\n<strong>Ако ова е е легитимен обид за преглед, тогаш обидете се повторно.</strong>\nАко не работи и тогаш, [[Special:UserLogout|одјавете се]] и повторно најавете се и проверете дали прелистувачот дозволува колачиња од ова мрежно место.",
     	"expand_templates_preview_fail_html_anon": "<em>Бидејќи {{SITENAME}} има овозможено сиров HTML, а вие не сте најавени, прегледот е скриен како мерка на претпазливост против напади со JavaScript.</em>\n\n<strong>Ако ова е е легитимен обид за преглед, тогаш обидете се повторно.</strong>\nАко не работи и тогаш, [[Special:UserLogout|одјавете се]] и повторно најавете се.",
     	"expand_templates_input_missing": "Треба да внесете некаков текст.",
     	"pagelanguage": "Менување јазик на страница",
    @@ -3691,8 +3766,10 @@
     	"mw-widgets-titleinput-description-new-page": "страницата сè уште не постои",
     	"mw-widgets-titleinput-description-redirect": "пренасочување кон $1",
     	"api-error-blacklisted": "Одберете поинаков, описен наслов.",
    +	"sessionmanager-tie": "Не можете истовремено да користите повеќе типови барања за заверка: $1.",
     	"sessionprovider-generic": "$1 седници",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "седници со колачиња",
    +	"sessionprovider-nocookies": "Колачињата може да се оневозможени. Ако е така, овозможете ги, и почнете одново.",
     	"randomrootpage": "Случајна основна страница",
     	"log-action-filter-block": "Тип на блок:",
     	"log-action-filter-contentmodel": "Тип на змена на содржинскиот модел:",
    @@ -3723,6 +3800,42 @@
     	"log-action-filter-managetags-activate": "Активирање на ознаки",
     	"log-action-filter-managetags-deactivate": "Деактивирање на ознаки",
     	"log-action-filter-move-move": "Преместување без запис врз пренасочувања",
    +	"log-action-filter-move-move_redir": "Преместување со запис врз пренасочувања",
    +	"log-action-filter-newusers-create": "Создавање од анонимен корисник",
    +	"log-action-filter-newusers-create2": "Создавање од анонимен корисник",
    +	"log-action-filter-newusers-autocreate": "Автоматско создавање",
    +	"log-action-filter-newusers-byemail": "Создавање со лозинка испратена по е-пошта",
    +	"log-action-filter-patrol-patrol": "Рачна патрола",
    +	"log-action-filter-patrol-autopatrol": "Автоматска патрола",
    +	"log-action-filter-protect-protect": "Заштита",
    +	"log-action-filter-protect-modify": "Измена на заштитата",
    +	"log-action-filter-protect-unprotect": "Одзаштита",
    +	"log-action-filter-protect-move_prot": "Преместување на заштита",
    +	"log-action-filter-rights-rights": "Рачна промена",
    +	"log-action-filter-rights-autopromote": "Автоматска промена",
    +	"log-action-filter-suppress-event": "Притајување дневник",
    +	"log-action-filter-suppress-revision": "Притајување преработка",
    +	"log-action-filter-suppress-delete": "Притајување страница",
    +	"log-action-filter-suppress-block": "Притајување на корисникот преку блокирање",
    +	"log-action-filter-suppress-reblock": "Притајување на корисникот преку преблокирање",
    +	"log-action-filter-upload-upload": "Ново подигање",
    +	"log-action-filter-upload-overwrite": "Преподигање",
    +	"authmanager-authn-not-in-progress": "Заверката не е во тек, или има губиток на седничките податоци. Почнете одново.",
    +	"authmanager-authn-no-primary": "Укажаните најавни податоци не можат да се заверат.",
    +	"authmanager-authn-no-local-user": "Укажаните најавни податоци не се поврзани со ниеден корисник на ова вики.",
    +	"authmanager-authn-no-local-user-link": "Укажаните најавни податоци се важечки, но не се поврзани со ниеден корисник на ова вики. Најавете се на поинаков начин, или создајте нов корисник, што ќе ви даде можност да ги сврзете вашите претходни најавни податоци со таа сметка.",
    +	"authmanager-authn-autocreate-failed": "Автоматското создавање на месна сметка не успеа: $1",
    +	"authmanager-change-not-supported": "Укажаните најавни податоци не можат да се изменат, бидејќи тогаш ништо нема да ги користи.",
    +	"authmanager-create-disabled": "Создавањето на сметки е оневозможено.",
    +	"authmanager-create-from-login": "За да направите сметка, пополнете ги полињата подолу.",
    +	"authmanager-create-not-in-progress": "Создавањето на сметката не е во тек, или има губиток на седничките податоци. Почнете одново.",
    +	"authmanager-create-no-primary": "Укажаните најавни податоци не можат да се употребат во создавање на сметка.",
    +	"authmanager-link-no-primary": "Укажаните најавни податоци не можат да се употребат во поврзување на сметка.",
    +	"authmanager-link-not-in-progress": "Поврзувањето на сметката не е во тек, или има губиток на седничките податоци. Почнете одново.",
    +	"authmanager-authplugin-setpass-failed-title": "Промената на лозинката не успеа",
    +	"authmanager-authplugin-setpass-failed-message": "Приклучокот за заверка ја одби промената на лозинката.",
    +	"authmanager-authplugin-create-fail": "Приклучокот за заверка го одби создавањето на сметката.",
    +	"authmanager-authplugin-setpass-denied": "Приклучокот за заверка не допушта менување на лозинки.",
     	"authmanager-authplugin-setpass-bad-domain": "Неважечки домен.",
     	"authmanager-autocreate-noperm": "Автоматското создавање на сметки не е дозволено.",
     	"authmanager-autocreate-exception": "Автоматското создавање на сметки е привремено оневозможено поради претходни грешки.",
    @@ -3739,6 +3852,44 @@
     	"authmanager-provider-password": "Заверка со лозинка",
     	"authmanager-provider-password-domain": "Заверка со лозинка и домен",
     	"authmanager-provider-temporarypassword": "Привремена лозинка",
    +	"authprovider-confirmlink-message": "Врз основа на неодамнешните обиди за најава, со вашата сметка можат да се поврзат следниве сметки. Поврзувањето ќе ви овозможи да се најавувате со овие сметки. Изберете кои од нив сакате да ги поврзете.",
    +	"authprovider-confirmlink-request-label": "Сметки кои треба да се поврзат",
    +	"authprovider-confirmlink-success-line": "$1: Успешно поврзано.",
    +	"authprovider-confirmlink-failed": "Поврзувањето на сметката не е целосно успешно: $1",
    +	"authprovider-confirmlink-ok-help": "Продолжи да прикажуваш пораки за неуспешно поврзување.",
     	"authprovider-resetpass-skip-label": "Прескокни",
    -	"authprovider-resetpass-skip-help": "Прескокни го задавањето на нова лозинка."
    +	"authprovider-resetpass-skip-help": "Прескокни го задавањето на нова лозинка.",
    +	"authform-nosession-login": "Заверката е успешна, но вашиот прелистувач не може да „запомни“ дека сте најавени.\n\n$1",
    +	"authform-nosession-signup": "Сметката е создадена, но вашиот прелистувач не може да „запомни“ дека сте најавени.\n\n$1",
    +	"authform-newtoken": "Недостасува шифра. $1",
    +	"authform-notoken": "Недостасува шифра",
    +	"authform-wrongtoken": "Погрешна шифра",
    +	"specialpage-securitylevel-not-allowed-title": "Не е дозволено",
    +	"specialpage-securitylevel-not-allowed": "За жал, не ви е дозволено да ја користите страницава бидејќи вашиот идентитет не може да се потврди (завери).",
    +	"authpage-cannot-login": "Не можам да ја почнам најавата.",
    +	"authpage-cannot-login-continue": "Не можам да продолжам со најавата. Најверојатно вашата седница има истечено.",
    +	"authpage-cannot-create": "Не можам да го започнам создавањето на сметката.",
    +	"authpage-cannot-create-continue": "Не можам да продолжам со создавањето на сметката. Најверојатно вашата седница има истечено.",
    +	"authpage-cannot-link": "Не можам да почнам со поврзување на сметката.",
    +	"authpage-cannot-link-continue": "Не можам да продолжам со поврзувањето на сметката. Најверојатно вашата седница има истечено.",
    +	"cannotauth-not-allowed-title": "Пристапот е одбиен",
    +	"cannotauth-not-allowed": "Не ви е дозволено да ја користите страницава",
    +	"changecredentials": "Смени најавни податоци",
    +	"changecredentials-submit": "Смени најавни податоци",
    +	"changecredentials-invalidsubpage": "$1 не претставува важечки тип на најавни податоци.",
    +	"changecredentials-success": "Вашите најавни податоци се сменети.",
    +	"removecredentials": "Отстрани најавни податоци",
    +	"removecredentials-submit": "Отстрани најавни податоци",
    +	"removecredentials-invalidsubpage": "$1 не претставува важечки тип на најавни податоци.",
    +	"removecredentials-success": "Вашите најавни податоци се отстранети.",
    +	"credentialsform-provider": "Тип на најавни податоци:",
    +	"credentialsform-account": "Име на сметката:",
    +	"cannotlink-no-provider-title": "Нема поврзливи сметки",
    +	"cannotlink-no-provider": "Нема поврзливи сметки.",
    +	"linkaccounts": "Поврзи сметки",
    +	"linkaccounts-success-text": "Сметката е поврзана.",
    +	"linkaccounts-submit": "Поврзи сметки",
    +	"unlinkaccounts": "Одврзи сметки",
    +	"unlinkaccounts-success": "Сметката е одврзана.",
    +	"authenticationdatachange-ignored": "Промената на податоците во заверката не е обработена. Можеби не е поставен услужник?"
     }
    diff --git a/languages/i18n/mr.json b/languages/i18n/mr.json
    index ea70e50309..1714a3e6bc 100644
    --- a/languages/i18n/mr.json
    +++ b/languages/i18n/mr.json
    @@ -398,7 +398,7 @@
     	"protectedpagetext": "हे पान बदल अथवा इतर कृती होऊ नयेत म्हणून सुरक्षित केले आहे.",
     	"viewsourcetext": "तुम्ही या पानाचा स्रोत पाहू व प्रत करू शकता.",
     	"viewyourtext": "तुम्ही या पानाची,<strong>तुमची संपादने</strong> पाहू शकता व त्याची प्रत करू शकता.",
    -	"protectedinterface": "हे पान सॉफ्टवेअरला इंटरफेस लेखन पुरवते, म्हणून दुरूपयोग टाळण्यासाठी संरक्षित केलेले आहे.\n\nसर्व विकिंवर, अनुवाद जोडण्याकरता किंवा बदलण्याकरता अथवा शुद्धलेखन चिकित्सेकरीता , कृपया [https://translatewiki.net/ translatewiki.net], या मिडियाविकि स्थानिकीकरण प्रकल्पावर जा.",
    +	"protectedinterface": "हे पान या विकिवर संचेतनास आंतरपृष्ठ मजकूर पुरविते, म्हणून दुरूपयोग टाळण्यासाठी ते संरक्षित केलेले आहे.\n\nसर्व विकिंवर, अनुवाद जोडण्याकरता किंवा बदलण्याकरता अथवा शुद्धलेखन चिकित्सेकरीता , कृपया [https://translatewiki.net/ translatewiki.net], या मिडियाविकि स्थानिकीकरण प्रकल्पाचा वापर करा.",
     	"editinginterface": "<strong>सावधान</strong>तुम्ही संचेतनाचे (सॉफ्टवेअर) संपर्क माध्यम मजकूर असलेले पान संपादित करित आहात. या पानावरील बदल या विकिवरील इतर सदस्यांच्या सदस्य संपर्क माध्यमाचे स्वरूप बदलू शकते.",
     	"translateinterface": "सर्व विकिंवर अनुवाद जोडण्याकरता किंवा बदलण्याकरता, कृपया [https://translatewiki.net/ ट्रांसलेटविकि.नेट]चा वापर करा,जो मिडियाविकिचा स्थानिकीकरण प्रकल्प आहे.",
     	"cascadeprotected": "हे पान संपादनांपासून सुरक्षित केल्या गेले आहे, कारण ते खालील {{PLURAL:$1|पानात|पानांमध्ये}} आंतरविन्यासित केलेले आहे,{{PLURAL:$1|जे पान|जी पाने }} निपतन पर्याय सुरु केल्यामुळे सुरक्षित आहेत:\n$2",
    @@ -648,6 +648,8 @@
     	"minoredit": "हा एक छोटा बदल आहे",
     	"watchthis": "या लेखावर लक्ष ठेवा",
     	"savearticle": "हा लेख साठवा",
    +	"savechanges": "बदल जतन करा",
    +	"publishchanges": "बदल प्रकाशित करा",
     	"preview": "झलक",
     	"showpreview": "झलक दाखवा",
     	"showdiff": "बदल दाखवा",
    @@ -677,7 +679,7 @@
     	"newarticle": "(नवीन लेख)",
     	"newarticletext": "आपण सध्या अस्तित्त्वात नसलेल्या पानाच्या दुव्याचा मागोवा घेत आला आहात.\nहे पान नव्याने तयार करण्यासाठी खालील पेटीत टंकन करणे सुरु करा(अधिक माहितीसाठी [$1 साहाय्य पान] बघा).\n\nजर आपण येथे चुकून आला असाल तर ब्राउझरच्या  <strong>परत</strong>(बॅक) कळीवर टिचकी द्या.",
     	"anontalkpagetext": "---- ''हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत. त्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो. जर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:UserLogin| खाते तयार करा]] किंवा [[Special:CreateAccount|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.''",
    -	"noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर नोंदी शोधा],\nकिंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}}संपादू शकता]</span>.",
    +	"noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर नोंदी शोधा],\nकिंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}}तयार करू शकता]</span>.",
     	"noarticletext-nopermission": "सध्या या लेखात  काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये [[Special:Search/{{PAGENAME}}| या मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}}आपण या लेखाच्या इतर नोंदी शोधा]</span>,परंतु, आपणास हा लेख लिहीण्याची परवानगी देण्यात येउ शकत नाही.",
     	"missing-revision": "\"{{FULLPAGENAME}}\" या लेखाचे #$1 हे संस्करण अस्तित्वात नाही.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे असे होते.याबाबत विस्तृत माहिती  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी]येथे बघता येईल.",
     	"userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" सदस्य खात्याची नोंद नाही. कृपया हे पान तुम्ही संपादित किंवा नव्याने तयार करू इच्छिता काय याबद्दल विचार करा.",
    @@ -1221,8 +1223,8 @@
     	"rightslogtext": "ही सदस्य अधिकारांमधील बदलांची नोंद आहे.",
     	"action-read": "हे पान वाचा",
     	"action-edit": "हे पान संपादित करा",
    -	"action-createpage": "लेख बनवा",
    -	"action-createtalk": "चर्चा पृष्ठे तयार करा",
    +	"action-createpage": "हे पान तयार करा",
    +	"action-createtalk": "हे चर्चा पृष्ठ तयार करा",
     	"action-createaccount": "हे सदस्यखाते तयार करा",
     	"action-autocreateaccount": "हे बाह्य सदस्य खाते आपोआप तयार करा",
     	"action-history": "या पानाचा इतिहास बघा.",
    @@ -1426,6 +1428,7 @@
     	"upload-too-many-redirects": "या आंतरजालपत्त्यात खूप पुनर्निर्देशने आहेत",
     	"upload-http-error": "एक एचटीटीपी चूक उद्भवली: $1",
     	"upload-copy-upload-invalid-domain": "या डोमेनमध्ये प्रत-अपभारणे अनुपलब्ध आहेत.",
    +	"upload-dialog-disabled": "हा डायलॉग वापरून  या विकिवर संचिका अपभारण अक्षम केले आहे.",
     	"upload-dialog-title": "संचिकेचे अपभारण करा",
     	"upload-dialog-button-cancel": "रद्द करा",
     	"upload-dialog-button-done": "झाले",
    @@ -1731,7 +1734,7 @@
     	"apihelp-no-such-module": "मॉड्यूल \"$1\" सापडत नाही.",
     	"apisandbox": "एपीआय(API) धूळपाटी",
     	"apisandbox-api-disabled": "या संकेतस्थळावर एपीआय अक्षम केला आहे.",
    -	"apisandbox-intro": "\"मिडियाविकि वेब सर्व्हीस एपीआय\" वर प्रयोग करण्यासाठी या पानाचा वापर करा. एपीआय वापरण्याच्या अधिक तपशिलासाठी [https://www.mediawiki.org/wiki/API:Main_page एपीआय दस्ताऐवजीकरण] हे पान बघा. उदाहरणार्थ:[https://www.mediawiki.org/wiki/API#A_simple_example मुख्य पानाचा आशय मिळवा]. अधिक उदाहरणे बघण्यास एखादी क्रिया निवडा.\n\n\"याची नोंद घ्या कि ही धूळपाटी असली तरी, या पानावर आपण केलेल्या क्रियांद्वारे विकिवर फेरफार होऊ शकतो.\"",
    +	"apisandbox-intro": "<strong>मिडियाविकि वेब सर्व्हीस एपीआय</strong> वर प्रयोग करण्यासाठी या पानाचा वापर करा. एपीआय वापरण्याच्या अधिक तपशिलासाठी  [[mw:API:Main page| एपीआय दस्ताऐवजीकरण]] हे पान बघा. उदाहरणार्थ:[https://www.mediawiki.org/wiki/API#A_simple_example मुख्य पानाचा आशय मिळवा]. अधिक उदाहरणे बघण्यास एखादी क्रिया निवडा.\n\nयाची नोंद घ्या कि ही धूळपाटी असली तरी, या पानावर आपण केलेल्या क्रियांद्वारे विकिवर फेरफार होऊ शकतो.",
     	"apisandbox-submit": "विनंती करा",
     	"apisandbox-reset": "हटवा",
     	"apisandbox-examples": "उदाहरण",
    @@ -2086,7 +2089,7 @@
     	"whatlinkshere-next": "{{PLURAL:$1|पुढील|पुढील $1}}",
     	"whatlinkshere-links": "← दुवे",
     	"whatlinkshere-hideredirs": "$1 पुनर्निर्देशने",
    -	"whatlinkshere-hidetrans": "$1 ट्रान्स्क्ल्युजन्स",
    +	"whatlinkshere-hidetrans": "$1 आंतर्न्यास",
     	"whatlinkshere-hidelinks": "$1 दुवे",
     	"whatlinkshere-hideimages": "$1 संचिका दुवे",
     	"whatlinkshere-filters": "गाळण्या",
    @@ -2284,7 +2287,7 @@
     	"allmessagesname": "नाव",
     	"allmessagesdefault": "अविचल संदेश मजकूर",
     	"allmessagescurrent": "सध्याचा मजकूर",
    -	"allmessagestext": "मीडियाविकी नामविश्वातील सर्व प्रणाली संदेशांची यादी",
    +	"allmessagestext": "मिडियाविकी नामविश्वात उपलब्ध सर्व प्रणाली संदेशांची ही यादी आहे. जर आपणास मिडियाविकि प्रजाति स्थानिकिकरणात योगदान करावयाचे असेल तर कृपया [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation मिडियाविकि स्थानिकीकरण] व [https://translatewiki.net ट्रांसलेटविकि.नेट]  ला भेट द्या.",
     	"allmessagesnotsupportedDB": "हे पान संपादित करता येत नाही कारण<strong>$wgUseDatabaseMessages</strong>अक्षम  आहे.",
     	"allmessages-filter-legend": "गाळक",
     	"allmessages-filter": "कस्टमायझेशन स्टेटनुसार गाळणी लावा :",
    @@ -3367,10 +3370,10 @@
     	"mw-widgets-dateinput-no-date": "कोणताही दिनांक निवडला नाही",
     	"mw-widgets-titleinput-description-new-page": "अद्याप पान अस्तित्वात नाही",
     	"mw-widgets-titleinput-description-redirect": "$1ला पुनर्निर्देशित करा",
    -	"api-error-blacklisted": "कुपया वेगळे वर्णनात्मक शीर्षक निवडा",
     	"sessionmanager-tie": "हे एकत्रित करु शकत नाही,बहुविध विनंती अधिप्रमाणन प्रकार:$1",
     	"sessionprovider-generic": "$1 सत्रे",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "कुकी-आधारीत सत्रे",
     	"sessionprovider-nocookies": "कुकिज अक्षम असू शकतात. याची खात्री करा कि कुकिज सक्षम केल्या आहेत व पुन्हा सुरुवात करा.",
    -	"randomrootpage": "अविशिष्ट मूळ पान"
    +	"randomrootpage": "अविशिष्ट मूळ पान",
    +	"log-action-filter-suppress-block": "रोधामार्फत सदस्य दाबणे"
     }
    diff --git a/languages/i18n/my.json b/languages/i18n/my.json
    index c1cf0194cd..9cae000b22 100644
    --- a/languages/i18n/my.json
    +++ b/languages/i18n/my.json
    @@ -825,8 +825,8 @@
     	"rightslogtext": "ဤသည်မှာ အသုံးပြုသူအခွင့်အရေးများ၏ ပြောင်းလဲမှုများမှတ်တမ်းဖြစ်သည်။",
     	"action-read": "ဤစာမျက်နှာကို ဖတ်ရန်",
     	"action-edit": "ဤစာမျက်နှာကို ပြင်ရန်",
    -	"action-createpage": "စာမျက်နှာများ စတင်ရေးသားရန်",
    -	"action-createtalk": "ဆွေးနွေးချက်စာမျက်နှာများ စတင်ရေးသားရန်",
    +	"action-createpage": "ဤစာမျက်နှာကို ဖန်တီးရန်",
    +	"action-createtalk": "ဤဆွေးနွေးချက်စာမျက်နှာကို ဖန်တီးရန်",
     	"action-createaccount": "ဤအသုံးပြုသူအကောင့်ကို ဖန်တီးရန်",
     	"action-minoredit": "ဤတည်းဖြတ်မှုကို အရေးမကြီးဟု မှတ်သားရန်",
     	"action-move": "ဤစာမျက်နှာကို ရွှေ့ပြောင်းရန်",
    @@ -912,9 +912,9 @@
     	"recentchangeslinked-page": "စာမျက်နှာ အမည် -",
     	"recentchangeslinked-to": "ပေးထားသော စာမျက်နှာများအစား လင့်များနှင့် ဆက်စပ်နေသာ စာမျက်နှာများ၏ အပြောင်းအလဲများကို ပြရန်",
     	"recentchanges-page-added-to-category": "ကဏ္ဍထဲသို့ [[:$1]] ကို ပေါင်းထည့်ခဲ့သည်",
    -	"recentchanges-page-added-to-category-bundled": "[[:$1]] နှင့် [[Special:WhatLinksHere/$1|{{PLURAL:$2|စာမျက်နှာ တစ်ခု|စာမျက်နှာ $2 ခု}}]]ကို ကဏ္ဍထဲသို့ ပေါင်းထည့်ခဲ့သည်",
    +	"recentchanges-page-added-to-category-bundled": "[[:$1]] အား ကဏ္ဍထဲသို့ ပေါင်းထည့်ခဲ့ပြီး၊ [[Special:WhatLinksHere/$1|ဤစာမျက်နှာသည် အခြားစာမျက်နှာများထဲတွင် ပါဝင်သည်]]",
     	"recentchanges-page-removed-from-category": "ကဏ္ဍထဲမှ [[:$1]] ကို ဖယ်ရှားခဲ့သည်",
    -	"recentchanges-page-removed-from-category-bundled": "[[:$1]] နှင့် {{PLURAL:$2|စာမျက်နှာ တစ်ခု|စာမျက်နှာ $2 ခု}}ကို ကဏ္ဍထဲမှ ဖယ်ရှားခဲ့သည်",
    +	"recentchanges-page-removed-from-category-bundled": "[[:$1]] အား ကဏ္ဍထဲမှ ဖယ်ရှားခဲ့ပြီး၊ [[Special:WhatLinksHere/$1|ဤစာမျက်နှာသည် အခြားစာမျက်နှာများထဲတွင် ပါဝင်သည်]]",
     	"upload": "ဖိုင်​တင်​ရန်​",
     	"uploadbtn": "ဖိုင်​တင်​ရန်​",
     	"reuploaddesc": "Upload တင်နေခြင်းကို ဖျက်သိမ်းပြီး upload တင်သည့် ပုံစံသို့ ပြန်သွားရန်",
    @@ -1304,9 +1304,9 @@
     	"whatlinkshere-prev": "{{PLURAL:$1|နောက်သို့|နောက်သို့ $1}}",
     	"whatlinkshere-next": "{{PLURAL:$1|ရှေ့သို့|ရှေ့သို့ $1}}",
     	"whatlinkshere-links": "← လင့်များ",
    -	"whatlinkshere-hideredirs": "ပြန်ညွှန်းများ $1ရန်",
    -	"whatlinkshere-hidetrans": "ထည့်သွင်းကူးယူချက် $1 ခု",
    -	"whatlinkshere-hidelinks": "လင့် $1 ခု",
    +	"whatlinkshere-hideredirs": "ပြန်ညွှန်းများ $1",
    +	"whatlinkshere-hidetrans": "ထည့်သွင်းကူးယူချက် $1",
    +	"whatlinkshere-hidelinks": "လင့်ခ်များ $1 ခု",
     	"whatlinkshere-hideimages": "ဖိုင်အချိတ်အဆက်များ $1 ခု",
     	"whatlinkshere-filters": "စိစစ်မှုများ",
     	"blockip": "{{GENDER:$1|အသုံးပြုသူ}} ပိတ်ပင်ရန်",
    diff --git a/languages/i18n/nah.json b/languages/i18n/nah.json
    index 8a350a667f..cb5901939e 100644
    --- a/languages/i18n/nah.json
    +++ b/languages/i18n/nah.json
    @@ -112,18 +112,18 @@
     	"october-date": "Īcmahtlactlimētztli $1",
     	"november-date": "Īcmahtlactlioncēmētztli $1",
     	"december-date": "Īcmahtlactliomōmemētztli $1",
    -	"pagecategories": "{{PLURAL:$1|Tlaìxmatkàtlàlilòtl|Tlaìxmatkàtlàlilòmë}}",
    +	"pagecategories": "{{PLURAL:$1|Tlaìxmatkàyòtlàlilòtl|Tlaìxmatkàyòtlàlilòme}}",
     	"category_header": "Tlâkuilòlpiltin ìpan tlaìxmatkàtlàlilòtl \"$1\"",
     	"subcategories": "Tlaìxmatkàtlàlilòpilòmë",
     	"category-media-header": "Media \"$1\" neneuhcāyōc",
     	"category-empty": "''Cah ahtlein inīn neneuhcāyōc.''",
    -	"hidden-categories": "{{PLURAL:$1|tlatlàtìlli tlaìxmatkàtlàlilòtl|tlatlàtìltìn tlaìxmatkàtlàlilòmë}}",
    +	"hidden-categories": "{{PLURAL:$1|tlatlàtìlli tlaìxmatkàyòtlàlilòtl|tlatlàtìltìn tlaìxmatkàyòtlàlilòme}}",
     	"hidden-category-category": "Tlatlàtìlkàtlaìxmatkàtlàlilòmë",
    -	"category-subcat-count": "{{PLURAL:$2|Inìn tlaìxmatkàtlàlilòtl kipia san inìn tlaìxmatkàtlàlilòpilli.|Inìn tlaìxmatkàtlàlilòtl {{PLURAL:$1|kipia inìn tlaìxmatkàtlàlilòpilli|kimpia inìn $1 tlaìxmatkàtlàlilòpiltìn}}, ìpan $2.}}",
    +	"category-subcat-count": "{{PLURAL:$2|Inìn tlaìxmatkàyòtlàlilòtl kipia san inìn tlaìxmatkàyòtlàlilòpilli.|Inìn tlaìxmatkàyòtlàlilòtl {{PLURAL:$1|kipia inìn tlaìxmatkàyòtlàlilòpilli|kimpia inîke $1 tlaìxmatkàyòtlàlilòpiltìn}}, ìpan $2.}}",
     	"category-subcat-count-limited": "Inīn {{PLURAL:$1|neneuhcāyōtzintli cah|$1 neneuhcāyōtzintli cateh}} inīn neneuhcāyōc.",
    -	"category-article-count": "{{PLURAL:$2|Inìn tlaìxmatkàtlàlilòtl san kipia|Inìn tlaìxmatkàtlàlilòtl kimpia {{PLURAL:$1|inìn tlaìxtlapalli|inîkë $1 tlaìxtlapaltìn}}, ìwikpa $2.}}",
    +	"category-article-count": "{{PLURAL:$2|Inìn tlaìxmatkàyòtlàlilòtl san kipia|Inìn tlaìxmatkàyòtlàlilòtl kimpia {{PLURAL:$1|inìn tlaìxtlapalli|inîke $1 tlaìxtlapaltìn}}, ìwikpa $2.}}",
     	"category-article-count-limited": "Inīn {{PLURAL:$1|zāzanilli cah|$1 zāzanilli cateh}} inīn neneuhcāyōc.",
    -	"category-file-count": "{{PLURAL:$2|Inìn tlaìxmatkàtlàlilòtl san kipia|Inìn tlaìxmatkàtlalilòtl kimpia {{PLURAL:$1|inìn èwalli|inîkë $1 èwaltìn}}, ìwikpa $2.}}",
    +	"category-file-count": "{{PLURAL:$2|Inìn tlaìxmatkàyòtlàlilòtl san kipia|Inìn tlaìxmatkàyòtlalilòtl kimpia {{PLURAL:$1|inìn èwalli|inîke $1 èwaltìn}}, ìwikpa $2.}}",
     	"category-file-count-limited": "{{PLURAL:$1|Inìn tlâkuilòlèwalli kä|Inîkë $1 tlâkuilòlèwaltìn katêkë}} ìpan inìn tlaìxmatkàtlàlilòtl.",
     	"listingcontinuesabbrev": "niman",
     	"about": "Ītechcopa",
    @@ -151,7 +151,7 @@
     	"returnto": "Ximocuepa īhuīc $1.",
     	"tagline": "Īhuīcpa {{SITENAME}}",
     	"help": "Tēpalēhuiliztli",
    -	"search": "Xitlatēmo",
    +	"search": "Mà motèmo",
     	"searchbutton": "Xictēmo",
     	"go": "Xiyauh",
     	"searcharticle": "Xiyauh",
    @@ -181,7 +181,7 @@
     	"unprotectthispage": "Xicpatla inīn tlaīxtli ītlapiyaliz",
     	"newpage": "Yancuic tlaīxtli",
     	"talkpage": "Xictlahto inīn tlaīxtli ītechcopa",
    -	"talkpagelinktext": "Zānīlli",
    +	"talkpagelinktext": "Nenônòtzalistli",
     	"specialpage": "Nònkuâkìskàtlaìxtlapalli",
     	"personaltools": "In tlein nitēquitiltilia",
     	"articlepage": "Xiquitta in tlamantlaīxtli",
    @@ -194,7 +194,7 @@
     	"mediawikipage": "Xiquitta tlahcuilōltzin zāzanilli",
     	"templatepage": "Xiquitta neīxcuītīllaīxtli",
     	"viewhelppage": "Xiquitta tēpalēhuiliztli zāzanilli",
    -	"categorypage": "Mà mỏta in tlaìxmatkàtlàlilòtlaìxtlapalli",
    +	"categorypage": "Mà mỏta in tlaìxmatkàyòtlàlilòtlaìxtlapalli",
     	"viewtalkpage": "Xiquitta tēixnāmiquiliztli zāzanilli",
     	"otherlanguages": "Occequīntīn tlahtōlcopa",
     	"redirectedfrom": "(Ōmotlacuep īhuīcpa $1)",
    @@ -259,7 +259,7 @@
     	"nstab-mediawiki": "Tlahcuilōltzintli",
     	"nstab-template": "Nemachiòtl",
     	"nstab-help": "Tèpalèwilistli",
    -	"nstab-category": "Tlaìxmatkàtlàlilòtl",
    +	"nstab-category": "Tlaìxmatkàyòtlàlilòtl",
     	"mainpage-nstab": "Huēyitlaīxtli",
     	"nosuchaction": "Ahmo ia tlachīhualiztli",
     	"nosuchspecialpage": "Âmò ka inòn nònkuâkìskàtlaìxtlapalli",
    @@ -483,6 +483,7 @@
     	"search-result-size": "$1 ({{PLURAL:$2|1 tlahtōl|$2 tlahtōltin}})",
     	"search-redirect": "(tlacuepaliztli $1)",
     	"search-section": "(tlahtōltzintli $1)",
    +	"search-category": "(tlaìxmatkàyòtlàlilòtl $1)",
     	"search-suggest": "Ahnōceh tiquihtōznequiya: $1",
     	"search-interwiki-caption": "Tlachīhualiztli īcnīhuān",
     	"search-interwiki-more": "(huehca ōmpa)",
    @@ -732,7 +733,7 @@
     	"withoutinterwiki": "Zāzaniltin ahtle tzonhuiliztli",
     	"withoutinterwiki-submit": "Tiquittāz",
     	"nbytes": "$1 {{PLURAL:$1|byte}}",
    -	"ncategories": "$1 {{PLURAL:$1|tlaìxmatkàtlàlilòtl|tlaìxmatkàtlàlilòmë}}",
    +	"ncategories": "$1 {{PLURAL:$1|tlaìxmatkàyòtlàlilòtl|tlaìxmatkàyòtlàlilòme}}",
     	"nlinks": "$1 {{PLURAL:$1|tzòwilistli|tzòwilistìn}}",
     	"nmembers": "$1 {{PLURAL:$1|tlâkuilòpilli|tlâkuilòpiltìn}}",
     	"nrevisions": "$1 {{PLURAL:$1|tlapiyaliztli}}",
    @@ -782,8 +783,8 @@
     	"allarticles": "Mochīntīn tlahcuilōlli",
     	"allinnamespace": "Mochīntīn zāzanilli (īpan $1)",
     	"allpagessubmit": "Tiyāz",
    -	"categories": "Tlaìxmatkàtlàlilòmë",
    -	"categoriespagetext": "{{PLURAL:$1|Inìn tlaìxmatkàtlàlilòtl kimpia|Inîkë tlaìxmatkàtlàlilòmë kimpiâkë}} tlaìxtlapaltìn noso medios.\nÂmò monèxtiâkë nikàn in [[Special:UnusedCategories|tlaìxmatkàtlàlilòmë tlèn âmò mokìntekitìltia]].\nNò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàtlàlilòtl]].",
    +	"categories": "Tlaìxmatkàyòtlàlilòme",
    +	"categoriespagetext": "{{PLURAL:$1|Inìn tlaìxmatkàyòtlàlilòtl kimpia|Inîke tlaìxmatkàyòtlàlilòme kimpiâke}} tlaìxtlapaltìn noso medios.\nÂmò monèxtiâke nikàn in [[Special:UnusedCategories|tlaìxmatkàyòtlàlilòme tlèn âmò mokìntekitìltia]].\nNò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàyòtlàlilòtl]].",
     	"categoriesfrom": "Mà monèxtìkàn tlaìxmatkàtlàlilòmë tlèn pèwâkë ìka:",
     	"linksearch": "Calān tzonhuiliztli tlatemoliztli",
     	"linksearch-ns": "Tōcātzin:",
    @@ -943,7 +944,7 @@
     	"move-leave-redirect": "Ticcāhuāz cē tlacuepaliztli",
     	"export": "Tiquinnamacāz zāzaniltin",
     	"export-submit": "Ticnamacāz",
    -	"export-addcattext": "Mà tlatlaìxtlapalwilo ìwikpa tlatlaìxmatkàtlàlilòpa:",
    +	"export-addcattext": "Mà tlatlaìxtlapalwilo ìwikpa tlatlaìxmatkàyòtlàlilòpa:",
     	"export-addcat": "Ticcētilīz",
     	"export-download": "Ticpiyāz quemeh tlahcuilōlli",
     	"export-templates": "Tiquimpiyāz nemachiyōtīlli",
    @@ -1010,7 +1011,7 @@
     	"tooltip-ca-nstab-mediawiki": "Xiquitta in tlahcuilōltzin",
     	"tooltip-ca-nstab-template": "Xiquitta in nemachiyōtīlli",
     	"tooltip-ca-nstab-help": "Xiquitta in tēpalēhuiliztli zāzanilli",
    -	"tooltip-ca-nstab-category": "Mà mỏta ìtlaìxtlapal in tlaìxmatkàtlàlilòtl",
    +	"tooltip-ca-nstab-category": "Mà mỏta ìtlaìxtlapal in tlaìxmatkàyòtlàlilòtl",
     	"tooltip-minoredit": "Ticmachiyōz quemeh tlapatlalitzintli",
     	"tooltip-save": "Ticpiyaz mopatlaliz",
     	"tooltip-preview": "Xachtopaitta mopatlaliz ¡Timitztlahtlauhtiliah, xicchīhua yēppa mā tiquimpiya!",
    @@ -1061,6 +1062,7 @@
     	"exif-gpslongitude": "Huehtlatzīncāyōtl",
     	"exif-gpsaltitude": "Huehcapancayōtl",
     	"exif-gpstimestamp": "GPS cāhuitl (atomic tepozcāhuitl)",
    +	"exif-iimcategory": "Tlaìxmatkàyòtlàlilòtl",
     	"exif-orientation-1": "Yēctli",
     	"exif-meteringmode-255": "Occē",
     	"exif-lightsource-1": "Tōnameyōtl",
    @@ -1143,7 +1145,7 @@
     	"htmlform-selectorother-other": "Occē",
     	"rightsnone": "ahtlein",
     	"revdelete-summary": "ticpatlāz tlahcuilōltōn",
    -	"searchsuggest-search": "Xitlatēmo",
    +	"searchsuggest-search": "Mà motèmo",
     	"api-error-ok-but-empty": "Tlâtek îtlakawilistli: Âmò tènankilia in tlatèmakani.",
     	"api-error-overwrite": "Awel motlâkuilnepanòltis sè èwalli tlèn yi katki.",
     	"api-error-stashfailed": "Tlâtek îtlakawilistli: In tlatèmakani awel òkeuh in èwalpanòni.",
    diff --git a/languages/i18n/nan.json b/languages/i18n/nan.json
    index b77439f9fa..9420fe44aa 100644
    --- a/languages/i18n/nan.json
    +++ b/languages/i18n/nan.json
    @@ -763,6 +763,7 @@
     	"linkstoimage": "ē-kha {{PLURAL:$1|ê ia̍h}} ū iōng tio̍h chit ê iáⁿ-siōng:",
     	"nolinkstoimage": "Bô poàⁿ ia̍h liân kàu chit tiuⁿ iáⁿ-siōng.",
     	"sharedupload-desc-here": "Chit--ê $1--ê tóng-àn ū khó-lêng hō͘ kî-thaⁿ--ê choan-àn ēng tio̍h.\nChia sī chit--ê tóng-àn i--ê [$2 soat-bêng].",
    +	"shared-repo-name-wikimediacommons": "Wikimedia Commons",
     	"upload-disallowed-here": "你袂使換掉个檔案",
     	"mimesearch": "MIME chhiau-chhoē",
     	"unwatchedpages": "Bô lâng kàm-sī ê ia̍h",
    diff --git a/languages/i18n/nap.json b/languages/i18n/nap.json
    index 2ec66f60c2..84f368fff8 100644
    --- a/languages/i18n/nap.json
    +++ b/languages/i18n/nap.json
    @@ -629,7 +629,9 @@
     	"minoredit": "Chisto è nu cagnamiénto piccerillo",
     	"watchthis": "Tiene d'uocchio sta paggena",
     	"savearticle": "Sarva 'a paggena",
    +	"savechanges": "Sarva 'e cagnamiénte",
     	"publishpage": "Pubbreca paggena",
    +	"publishchanges": "Pubbreca 'e cagnamiente",
     	"preview": "Anteprimma",
     	"showpreview": "Vire anteprimma",
     	"showdiff": "Fa veré 'e cagnamiente",
    @@ -1221,8 +1223,8 @@
     	"rightslogtext": "Ccà abbascio sta nu riggistro d' 'e cagnamiente a 'e deritte 'e ll'utente",
     	"action-read": "lieggere sta paggena",
     	"action-edit": "càgna chesta paggena",
    -	"action-createpage": "crìa paggene",
    -	"action-createtalk": "crìa chiacchiere 'e paggena",
    +	"action-createpage": "crìa sta paggena",
    +	"action-createtalk": "crìa sta paggena 'e chiacchiere",
     	"action-createaccount": "crìa stu cunto utente",
     	"action-autocreateaccount": "automaticamente crèa stu cunto utente 'e fore",
     	"action-history": "vide 'a cronologgia 'e sta paggena",
    @@ -1438,6 +1440,8 @@
     	"upload-http-error": "N'errore HTTP è succiesso: $1",
     	"upload-copy-upload-invalid-domain": "Nun è permessa 'a carreca 'e copie 'a chistu dumminio.",
     	"upload-foreign-cant-upload": "Stu wiki nun è mpustato pe' puté carrecà 'e file dint' 'o repository 'e file 'e fore addimannato.",
    +	"upload-foreign-cant-load-config": "Scassaje a carrecà 'o file 'e mpustaziune p' 'e repositorie 'e fore.",
    +	"upload-dialog-disabled": "'A carreca 'e file tramite sta fenesta 'e dialogo è stutata int'a stu wiki.",
     	"upload-dialog-title": "Carreca file",
     	"upload-dialog-button-cancel": "Canciella",
     	"upload-dialog-button-done": "Fatto",
    @@ -2155,6 +2159,7 @@
     	"sp-contributions-username": "Nnerizzo IP o nomme utente",
     	"sp-contributions-toponly": "Facenno vedé sulamente 'e contribbute 'e l'urdeme verziune",
     	"sp-contributions-newonly": "Facenno vedé sulamente 'e contribbute ca songo criazione 'e paggene",
    +	"sp-contributions-hideminor": "Annascunne cagnamiénte piccerille",
     	"sp-contributions-submit": "Truova",
     	"whatlinkshere": "Paggene ca cullegano a chesta",
     	"whatlinkshere-title": "Paggene ca cullegano a $1",
    @@ -3575,7 +3580,6 @@
     	"mw-widgets-dateinput-no-date": "Nisciuna data scigliuta",
     	"mw-widgets-titleinput-description-new-page": "'a pàggene nun esiste ancore",
     	"mw-widgets-titleinput-description-redirect": "redirezionate ncopp' a $1",
    -	"api-error-blacklisted": "Pe' piacere sciglite nu titolo differente e descrittivo.",
     	"sessionmanager-tie": "Nun se ponno cumbinà 'e tipe 'e richiesta 'autenticaziona: $1.",
     	"sessionprovider-generic": "$1 sessiune",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sessiune basate ncopp' 'e cookie",
    @@ -3632,5 +3636,38 @@
     	"log-action-filter-upload-overwrite": "Recarreca",
     	"authmanager-authn-not-in-progress": "L'autenticazione nun è 'ncurzo o 'e date d' 'a sessione so' ghiute pierze. Verite 'accummincià n'ata vota a 'o prencipio.",
     	"authmanager-authn-no-primary": "'E credenziale ca s'hanno rato nun se ponno autenticà.",
    -	"authmanager-authn-no-local-user": "'E credenziale ca s'hanno rato nun se ponno ffà suoccie a nisciun' 'utente int'a stu wiki."
    +	"authmanager-authn-no-local-user": "'E credenziale ca s'hanno rato nun se ponno ffà suoccie a nisciun' 'utente int'a stu wiki.",
    +	"authmanager-authn-no-local-user-link": "'E credenziale ca s'hanno rato so buone ma nun songo suoccie a nisciun'utente 'e sta wiki. Trasite 'n modo differente o criate n'utente nuovo, e tenarrite n'opzione pe' puté aunì 'e credenziale 'e primma a chill'utenza.",
    +	"authmanager-authn-autocreate-failed": "Criazione automatica 'e n'utenza locale fallita: $1",
    +	"authmanager-change-not-supported": "'E credenziale ca s'hanno rato nun se ponno cagnà, dato ca nun fossero ausate 'a nisciuna cosa.",
    +	"authmanager-create-disabled": "Criazione 'e cunte stutata",
    +	"authmanager-create-from-login": "Pe' puté crià n'utenza vosta, mettite sane sane 'e campe ccà abbascio.",
    +	"authmanager-create-not-in-progress": "'A criazione 'e cunte nun è 'ncurzo o 'e date d' 'a sessione so' ghiute pierze. Verite 'accummincià n'ata vota a 'o prencipio.",
    +	"authmanager-create-no-primary": "Le credenziali date nun se ponno ausà pe' puté crià n'utenza.",
    +	"authmanager-link-no-primary": "'E credenziale date nun se ponno ausà p' 'o cullegamento 'utenza.",
    +	"authmanager-link-not-in-progress": "'O cullegamento 'e cunte nun è 'ncurzo o 'e date d' 'a sessione so' ghiute pierze. Verite 'accummincià n'ata vota a 'o prencipio.",
    +	"authmanager-authplugin-setpass-failed-title": "'O cagnamento d' 'a password è ghiuto malamente",
    +	"authmanager-authplugin-setpass-failed-message": "'O plugin 'autenticazione nun ave lassato 'o cagnamento d' 'a password.",
    +	"authmanager-authplugin-create-fail": "'O plugin autenticazione nun lassaie crià ll'utenza.",
    +	"authmanager-authplugin-setpass-denied": "'O plugin autenticazione nun premmettesse 'e cagnà 'e password.",
    +	"authmanager-authplugin-setpass-bad-domain": "Dominio invalido.",
    +	"authmanager-autocreate-noperm": "'A criazione automatica 'e ll'utenza nun fosse premmessa.",
    +	"authmanager-autocreate-exception": "Criazione 'e cunte automatica mò mò è stutata pe' bbìa 'e ll'errure precedenti.",
    +	"authmanager-userdoesnotexist": "'O cunto utente \"$1\" nun è riggistrato.",
    +	"authmanager-userlogin-remembermypassword-help": "Si 'a pasword adda essere arricurdata cchiù a luongo cu rispett'a tutt' 'a durata d' 'a sessione.",
    +	"authmanager-username-help": "Nomme utente pe' ll'autenticaziona.",
    +	"authmanager-password-help": "Password pe' l'autenticaziona.",
    +	"authmanager-domain-help": "Dumminio pe' ffà autenticaziona 'a fore.",
    +	"authmanager-retype-help": "Cunferma n'ata vota 'a password.",
    +	"authmanager-email-label": "Email",
    +	"authmanager-email-help": "Indirizzo email",
    +	"authmanager-realname-label": "Nomme overo",
    +	"authmanager-realname-help": "Nomme overo 'e ll'utente",
    +	"authmanager-provider-password": "Autenticaziona basata ncopp' 'a password",
    +	"authmanager-provider-password-domain": "Autenticaziona cu' password e basata ncopp'a nu dominio",
    +	"authmanager-provider-temporarypassword": "Password a tiempo determinato",
    +	"authprovider-confirmlink-message": "Verenno 'e tentative d'acciesso mò, l'utente ccà putessero avé nu cullegamento c' 'o cunto wiki d' 'o vuosto. A ffà cullegamento premmettesse appiccià 'o sistema 'e trasuta pe' bbìa 'e sti cunte. Pe' piacere sciglite 'e cunte addò vulite fà cullegamento.",
    +	"authprovider-confirmlink-request-label": "Cunte ca s'avesser'a cullegà",
    +	"authprovider-confirmlink-success-line": "$1: cullegato e apposto.",
    +	"authprovider-confirmlink-failed": "'O cullegamento 'e ll'utenza nun è ngarrato sano sano: $1"
     }
    diff --git a/languages/i18n/nb.json b/languages/i18n/nb.json
    index 06b96268c3..dd4a3cc493 100644
    --- a/languages/i18n/nb.json
    +++ b/languages/i18n/nb.json
    @@ -444,6 +444,7 @@
     	"password-change-forbidden": "Du kan ikke endre passord på denne wikien.",
     	"externaldberror": "Det var en ekstern autentifiseringsfeil, eller du kan ikke oppdatere din eksterne konto.",
     	"login": "Logg inn",
    +	"login-security": "Bekreft identiteten din",
     	"nav-login-createaccount": "Logg inn eller opprett en konto",
     	"userlogin": "Logg inn eller opprett en konto",
     	"userloginnocreate": "Logg inn",
    @@ -461,18 +462,23 @@
     	"userlogin-resetpassword-link": "Glemt passordet?",
     	"userlogin-helplink2": "Hjelp med innlogging",
     	"userlogin-loggedin": "Du er allerede logget inn som {{GENDER:$1|$1}}.\nBruk skjemaet nedenfor for å logge inn som en annen bruker.",
    +	"userlogin-reauth": "Du må logge inn igjen for å bekrefte at du er {{GENDER:$1|$1}}.",
     	"userlogin-createanother": "Opprett ny konto",
     	"createacct-emailrequired": "E-postadresse",
     	"createacct-emailoptional": "E-postadresse (valgfritt)",
     	"createacct-email-ph": "Fyll inn e-postadressen din",
     	"createacct-another-email-ph": "Fyll inn epostadressen",
     	"createaccountmail": "Bruk et midlertidig, tilfeldig passord, og send det til angitt e-postadresse",
    +	"createaccountmail-help": "Kan brukes til å opprette en konto for en annen person uten at du får vite passordet.",
     	"createacct-realname": "Virkelig navn (valgfritt)",
     	"createaccountreason": "Årsak:",
     	"createacct-reason": "Årsak",
     	"createacct-reason-ph": "Hvorfor lager du en annen bruker",
    +	"createacct-reason-help": "Beskjed vist i kontoopprettelsesloggen",
     	"createacct-submit": "Opprett konto",
     	"createacct-another-submit": "Opprett konto",
    +	"createacct-continue-submit": "Fortsett kontooppretting",
    +	"createacct-another-continue-submit": "Fortsett kontooppretting",
     	"createacct-benefit-heading": "{{SITENAME}} er laget av folk som deg.",
     	"createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringer}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|side|sider}}",
    @@ -486,8 +492,9 @@
     	"nocookiesnew": "Din brukerkonto er nå opprettet, men du har ikke logget på. {{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på for å kunne logge på med ditt nye brukernavn og passord.",
     	"nocookieslogin": "{{SITENAME}} bruker informasjonskapsler («cookies») for å logge brukere på og du har slått dem av. Slå dem på og prøv igjen.",
     	"nocookiesfornew": "Brukerkontoen ble ikke opprettet siden vi ikke kunne bekrefte dens kilde.\nKontroller at du har aktivert informasjonskapsler, oppdater siden og prøv igjen.",
    +	"createacct-loginerror": "Kontoen ble opprettet, men du kunne ikke logges inn automatisk. GÃ¥ videre til [[Special:UserLogin|manuell innlogging]].",
     	"noname": "Du har ikke oppgitt et gyldig brukernavn.",
    -	"loginsuccesstitle": "Du er nå logget inn",
    +	"loginsuccesstitle": "Logget inn",
     	"loginsuccess": "Du er nå logget inn på {{SITENAME}} som «$1».",
     	"nosuchuser": "Det eksisterer ingen bruker ved navn «$1».\nMerk at det skilles mellom store og små bokstaver.\nSjekk stavemåten eller [[Special:CreateAccount|opprett en ny konto]].",
     	"nosuchusershort": "Det finnes ingen bruker ved navn «$1». Kontroller stavemåten.",
    @@ -530,6 +537,7 @@
     	"createacct-another-realname-tip": "Det er frivillig å oppgi ditt egentlige navn.\nHvis du velger å oppgi det, vil det blir anvendt for å gi deg som bruker anerkjennelse",
     	"pt-login": "Logg inn",
     	"pt-login-button": "Logg inn",
    +	"pt-login-continue-button": "Fortsett innlogging",
     	"pt-createaccount": "Opprett konto",
     	"pt-userlogout": "Logg ut",
     	"php-mail-error-unknown": "Ukjent feil i PHPs mail()-funksjon",
    @@ -543,7 +551,7 @@
     	"newpassword": "Nytt passord:",
     	"retypenew": "Gjenta nytt passord:",
     	"resetpass_submit": "Angi passord og logg inn",
    -	"changepassword-success": "Passordet ditt ble korrekt endret!",
    +	"changepassword-success": "Passordet ditt er endret!",
     	"changepassword-throttled": "Du har foretatt for mange nylige innloggingsforsøk.\nVær vennlig å vente $1 før du prøver igjen.",
     	"botpasswords": "Robotpassord",
     	"botpasswords-summary": "<em>Robotpassord</em> gir tilgang til en brukerkonto via API uten å bruke hovedpassordet til kontoen. Brukerrettighetene kan bli begrenset ved bruk av dette passordet.\n\nHvis du ikke vet om du vil benytte dette, er det sannsynlig at du ikke bør fylle det ut. Det skal ikke være nødvendig for andre personer å be deg om å fylle ut dette for å gi det til de.",
    @@ -577,6 +585,7 @@
     	"botpasswords-invalid-name": "Det angitte brukernavnet inneholder ikke separasjonstegnet for robotpassord (\"$1\").",
     	"botpasswords-not-exist": "Brukeren \"$1\" har ikke noe robotpassord for \"$2\".",
     	"resetpass_forbidden": "Passord kan ikke endres",
    +	"resetpass_forbidden-reason": "Passordene kan ikke endres: $1",
     	"resetpass-no-info": "Du må være logget inn for å gå til denne siden direkte",
     	"resetpass-submit-loggedin": "Endre passord",
     	"resetpass-submit-cancel": "Avbryt",
    @@ -1855,6 +1864,7 @@
     	"trackingcategories-msg": "Sporingskategori",
     	"trackingcategories-name": "Beskjednavn",
     	"trackingcategories-desc": "Kategori-inklusjonskriterium",
    +	"restricted-displaytitle-ignored": "Sider med ignorerte visningstitler",
     	"noindex-category-desc": "Denne siden indekseres ikke av roboter fordi den er merket med det magiske ordet <code><nowiki>__NOINDEX__</nowiki></code> og er i navnerom der dette flagget tillates.",
     	"index-category-desc": "Denne siden er påført det magiske ordet <code><nowiki>__INDEX__</nowiki></code> (og er i et navnerom hvor flagget er tillatt), og vil derfor bli indeksert av roboter selv når det normalt ikke ville skjedd.",
     	"post-expand-template-inclusion-category-desc": "Sidestørrelsen er større enn <code>$wgMaxArticleSize</code> etter at alle maler er utvidet, så noen maler ble ikke utvidet.",
    @@ -3383,7 +3393,7 @@
     	"feedback-close": "Utført",
     	"feedback-external-bug-report-button": "Registrer en teknisk sak",
     	"feedback-dialog-title": "Send tilbakemelding",
    -	"feedback-dialog-intro": "Du kan benytte det enkle skjemaet under for å gi din tilbakemelding. Kommentaren din vil bli lagt til siden «$1» sammen med ditt brukernavn.",
    +	"feedback-dialog-intro": "Bruk det enkle skjemaet under om du vil gi tilbakemelding. Kommentaren din vil bli lagt ut på siden «$1» sammen med brukernavnet ditt.",
     	"feedback-error-title": "Feil",
     	"feedback-error1": "Feil: Ukjent resultat fra API",
     	"feedback-error2": "Feil: Redigering feilet",
    @@ -3392,8 +3402,8 @@
     	"feedback-message": "Melding:",
     	"feedback-subject": "Emne:",
     	"feedback-submit": "Send",
    -	"feedback-terms": "Jeg er innforstått med at min nettleserinformasjon inkluderer nøyaktig informasjon om versjonen til min nettleser og mitt operativsystem og at dette vil bli delt offentlig sammen med min tilbakemelding.",
    -	"feedback-termsofuse": "Jeg godtar å gi tilbakemelding i henhold til brukervilkårene.",
    +	"feedback-terms": "Jeg er innforstått med at brukeragentinformasjonen min inkluderer nøyaktig informasjon om versjonen til nettleseren min og operativsystemet mitt, og at dette vil bli delt offentlig sammen med tilbakemeldingen min.",
    +	"feedback-termsofuse": "Jeg godtar å gi tilbakemelding i tråd med bruksvilkårene.",
     	"feedback-thanks": "Din tilbakemelding til siden \"[ $2  $1 ]\" er sendt. Takk skal du ha!",
     	"feedback-thanks-title": "Takk!",
     	"feedback-useragent": "Brukeragent",
    @@ -3556,7 +3566,6 @@
     	"mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
     	"mw-widgets-titleinput-description-new-page": "siden eksisterer ikke ennå",
     	"mw-widgets-titleinput-description-redirect": "omdiriger til $1",
    -	"api-error-blacklisted": "Vennligst velg en annen beskrivende tittel.",
     	"sessionprovider-generic": "$1 sesjoner",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "informasjons&shy;kapsel-baserte sesjoner",
     	"randomrootpage": "Tilfeldig rotside"
    diff --git a/languages/i18n/nds-nl.json b/languages/i18n/nds-nl.json
    index 5910f85fff..7beefc3aa4 100644
    --- a/languages/i18n/nds-nl.json
    +++ b/languages/i18n/nds-nl.json
    @@ -550,6 +550,9 @@
     	"minoredit": "kleine wieziging",
     	"watchthis": "volg disse zied",
     	"savearticle": "Zied opslaon",
    +	"savechanges": "Wiezigingen opslaon",
    +	"publishpage": "Zied uutbrengen",
    +	"publishchanges": "Wiezigingen uutbrengen",
     	"preview": "Naokieken",
     	"showpreview": "Bewarking naokieken",
     	"showdiff": "Verschil bekieken",
    @@ -651,6 +654,8 @@
     	"content-model-text": "tekste zonder opmaak",
     	"content-model-javascript": "JavaScript",
     	"content-model-css": "CSS",
    +	"content-json-empty-object": "Leeg objekt",
    +	"content-json-empty-array": "Lege reeks",
     	"expensive-parserfunction-warning": "Waorschuwing: disse zied gebruukt te veule kostbaore parserfunksies.\n\nNoen {{PLURAL:$1|is|bin}} t der $1, terwiel t der minder as $2 {{PLURAL:$2|mut|mutten}} ween.",
     	"expensive-parserfunction-category": "Ziejen die te veule kostbaore parserfunksies gebruken",
     	"post-expand-template-inclusion-warning": "Waorschuwing: de grootte van de in-evoegden mal is te groot.\nSommigen mallen wörden niet in-evoegd.",
    @@ -701,7 +706,7 @@
     	"history-feed-empty": "De op-evreugen zied besteet niet. t Kan ween dat disse zied vortedaon is of dat t herneumd is. Probeer te [[Special:Search|zeuken]] naor soortgelieke nieje ziejen.",
     	"rev-deleted-comment": "(bewarkingsopmarking vortedaon)",
     	"rev-deleted-user": "(gebrukersnaam vortedaon)",
    -	"rev-deleted-event": "(antekening vortedaon)",
    +	"rev-deleted-event": "(logboekregel vortedaon)",
     	"rev-deleted-user-contribs": "[gebrukersnaam of IP-adres vortedaon - bewarking verbörgen in biedragen]",
     	"rev-deleted-text-permission": "Disse bewarking is '''vortedaon'''.\nAs der meer informasie is, ku'j t vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} vortdologboek].",
     	"rev-deleted-text-unhide": "Disse bewarking is '''vortedaon'''.\nAs der meer informasie is, ku'j t vienen in t [{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} vortdologboek].\nJe kunnen [$1 disse versie bekieken] a'j willen.",
    @@ -731,7 +736,7 @@
     	"revdelete-legend": "Stel versiebeparkingen in:",
     	"revdelete-hide-text": "Versietekste",
     	"revdelete-hide-image": "Verbarg bestaandsinhoud",
    -	"revdelete-hide-name": "Verbarg logboekaksie",
    +	"revdelete-hide-name": "Verbarg haandeling en doel",
     	"revdelete-hide-comment": "Bewarkingssamenvatting",
     	"revdelete-hide-user": "Gebrukersnaam/IP-adres van disse gebruker",
     	"revdelete-hide-restricted": "Gegevens veur beheerders en aander volk onderdrokken",
    @@ -742,9 +747,9 @@
     	"revdelete-unsuppress": "Beparkingen veur weerummezetten versies vortdoon",
     	"revdelete-log": "Reden:",
     	"revdelete-submit": "Toepassen op de ekeuzen {{PLURAL:$1|bewarking|bewarkingen}}",
    -	"revdelete-success": "'''De zichtbaorheid van de wieziging is bie-ewörken.'''",
    +	"revdelete-success": "De zichtbaorheid van de wieziging is bie-ewörken.",
     	"revdelete-failure": "'''De zichtbaorheid veur de wieziging kon niet bie-ewörken wörden:'''\n$1",
    -	"logdelete-success": "'''Zichtbaorheid van de gebeurtenisse is suksesvol in-esteld.'''",
    +	"logdelete-success": "Zichtbaorheid van de gebeurtenisse is in-esteld.",
     	"logdelete-failure": "'''De zichtbaorheid van de logboekregel kon niet in-esteld wörden:'''\n$1",
     	"revdel-restore": "Zichtbaorheid wiezigen",
     	"pagehist": "Ziedgeschiedenisse",
    @@ -773,7 +778,7 @@
     	"mergehistory-go": "Bekiek bewarkingen die bie mekaar edaon kunnen wörden",
     	"mergehistory-submit": "Versies bie mekaar doon",
     	"mergehistory-empty": "Der bin gien versies die samenevoegd kunnen wörden.",
    -	"mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 bin suksesvol samenevoegd naor [[:$2]].",
    +	"mergehistory-done": "$3 {{PLURAL:$3|versie|versies}} van $1 {{PLURAL:$3|is|bin}} suksesvol samenevoegd naor [[:$2]].",
     	"mergehistory-fail": "Kan gien geschiedenisse samenvoegen, kiek opniej de zied- en tiedparameters nao.",
     	"mergehistory-no-source": "Bronzied $1 besteet niet.",
     	"mergehistory-no-destination": "Bestemmingszied $1 besteet niet.",
    @@ -920,12 +925,12 @@
     	"badsig": "Ongeldige haandtekening; HTML naokieken.",
     	"badsiglength": "Joew haandtekening is te lang.\nt Mut minder as {{PLURAL:$1|letter|letters}} hebben.",
     	"yourgender": "Geslacht:",
    -	"gender-unknown": "Geet joe niks an",
    +	"gender-unknown": "De programmatuur gebruukt zoveul meugelik geslachtsneutrale woorden as t over joe geet.",
     	"gender-male": "Keerl",
     	"gender-female": "Deerne",
     	"prefs-help-gender": "Disse instelling is opsioneel.\n\nDe programmatuur gebruukt disse weerde um joe op de juuste maniere an te spreken en veur aandere gebrukers um joew geslacht an te geven.\nDisse informasie is zichtbaor veur aandere gebrukers.",
     	"email": "Privéberichten",
    -	"prefs-help-realname": "* Echte naam (niet verplicht): a'j disse opsie invullen zu'w joew echte naam gebruken um erkenning te geven veur joew warkzaamheen.",
    +	"prefs-help-realname": "Echte naam is keuzevrie.\nA'j disse opsie invullen zu'w joew echte naam gebruken um erkenning te geven veur joew wark.",
     	"prefs-help-email": "n Netpostadres is niet verplicht, mer zo ku'w wel joew wachtwoord toesturen veur a'j t vergeten bin.",
     	"prefs-help-email-others": "Je kunnen oek aandere meensen de meugelikheid geven um kontakt mit joe op te nemen mit n verwiezing op joew gebrukers- en overlegzied zonder da'j de identiteit pries hoeven te geven.",
     	"prefs-help-email-required": "Hier he'w n netpostadres veur neudig.",
    @@ -949,7 +954,7 @@
     	"userrights": "Gebrukersrechtenbeheer",
     	"userrights-lookup-user": "Beheer gebrukersgroepen",
     	"userrights-user-editname": "Vul n gebrukersnaam in:",
    -	"editusergroup": "Bewark gebrukersgroepen",
    +	"editusergroup": "Bewark {{GENDER:$1|gebrukersgroepen}}",
     	"editinguser": "Doonde mit t wiezigen van de gebrukersrechten van '''[[User:$1|$1]]''' $2",
     	"userrights-editusergroup": "Bewark gebrukersgroep",
     	"saveusergroups": "Gebrukergroepen opslaon",
    @@ -1059,8 +1064,8 @@
     	"rightslogtext": "Dit is n logboek mit veraanderingen van gebrukersrechten",
     	"action-read": "disse zied lezen",
     	"action-edit": "disse zied bewarken",
    -	"action-createpage": "ziejen schrieven",
    -	"action-createtalk": "overlegziejen anmaken",
    +	"action-createpage": "disse zied anmaken",
    +	"action-createtalk": "disse overlegzied anmaken",
     	"action-createaccount": "disse gebrukerskonto anmaken",
     	"action-minoredit": "disse bewarking as klein markeren",
     	"action-move": "disse zied herneumen",
    @@ -1516,7 +1521,7 @@
     	"nopagetext": "De zied die'j herneumen willen besteet niet.",
     	"pager-newer-n": "{{PLURAL:$1|1 niejere|$1 niejere}}",
     	"pager-older-n": "{{PLURAL:$1|1 ouwere|$1 ouwere}}",
    -	"suppress": "Toezichte",
    +	"suppress": "Toezicht",
     	"querypage-disabled": "Disse spesiale zied is uutezet um prestasieredens.",
     	"apisandbox": "API-zaandkule",
     	"booksources": "Boekinformasie",
    @@ -2728,7 +2733,7 @@
     	"duplicate-defaultsort": "Waorschuwing: de standardsortering \"$2\" krig veurrang veur de sortering \"$1\".",
     	"version": "Versie",
     	"version-extensions": "Uutbreidingen die installeerd bin",
    -	"version-skins": "Vormgevingen",
    +	"version-skins": "Geïnstalleerden vormgevingen",
     	"version-specialpages": "Spesiale ziejen",
     	"version-parserhooks": "Parserhoeken",
     	"version-variables": "Variabels",
    @@ -2758,7 +2763,7 @@
     	"version-entrypoints": "Webadressen veur ingangen",
     	"version-entrypoints-header-entrypoint": "Ingang",
     	"version-entrypoints-header-url": "Webadres",
    -	"redirect": "Deurverwiezen op bestaandsnaam, gebrukersnummer, ziednummer of versienummer",
    +	"redirect": "Deurverwiezen op bestaandsnaam, gebrukers-, zied-, versie- of logboekregelnummer",
     	"redirect-summary": "Disse spesiale zied verwis deur naor n bestaand (as de bestaandsnaam op-egeven wördt), n zied (as n zied- of versienummer op-egeven wördt) of n gebrukerszied (as t gebrukersnummer op-egeven wördt). Gebruuk: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], of [[{{#Special:Redirect}}/user/101]].",
     	"redirect-submit": "Zeuk",
     	"redirect-lookup": "Opzeuken:",
    @@ -2991,6 +2996,5 @@
     	"special-characters-group-khmer": "Khmer",
     	"special-characters-title-endash": "liggend streepjen",
     	"special-characters-title-emdash": "gedachtenstreepjen",
    -	"special-characters-title-minus": "minteken",
    -	"api-error-blacklisted": "Kies n aandere, beschrievende naam."
    +	"special-characters-title-minus": "minteken"
     }
    diff --git a/languages/i18n/nl.json b/languages/i18n/nl.json
    index 1893d4a6e0..b3a3341f0f 100644
    --- a/languages/i18n/nl.json
    +++ b/languages/i18n/nl.json
    @@ -77,11 +77,12 @@
     			"Nemo bis",
     			"Lemondoge",
     			"Dinosaur918",
    -			"Jdforrester"
    +			"Jdforrester",
    +			"Jeleniccz"
     		]
     	},
     	"tog-underline": "Koppelingen onderstrepen:",
    -	"tog-hideminor": "Kleine wijzigingen verbergen in recente wijzigingen",
    +	"tog-hideminor": "Kleine bewerkingen verbergen in recente wijzigingen",
     	"tog-hidepatrolled": "Gemarkeerde wijzigingen verbergen in recente wijzigingen",
     	"tog-newpageshidepatrolled": "Gemarkeerde pagina's verbergen in de lijst met nieuwe pagina's",
     	"tog-hidecategorization": "Categorisatie van pagina's verbergen",
    @@ -474,6 +475,7 @@
     	"password-change-forbidden": "U kunt uw wachtwoord niet wijzigen in deze wiki.",
     	"externaldberror": "Er is een fout opgetreden bij het aanmelden bij de database of u hebt geen toestemming uw externe gebruiker bij te werken.",
     	"login": "Aanmelden",
    +	"login-security": "Uw identiteit controleren",
     	"nav-login-createaccount": "Aanmelden / registreren",
     	"userlogin": "Aanmelden / registreren",
     	"userloginnocreate": "Aanmelden",
    @@ -561,6 +563,7 @@
     	"createacct-another-realname-tip": "Echte naam is optioneel.\nAls u deze opgeeft, wordt deze naam gebruikt worden om u erkenning te geven voor uw werk.",
     	"pt-login": "Aanmelden",
     	"pt-login-button": "Aanmelden",
    +	"pt-login-continue-button": "Doorgaan met aanmelden",
     	"pt-createaccount": "Registreren",
     	"pt-userlogout": "Afmelden",
     	"php-mail-error-unknown": "Er is een onbekende fout opgetreden in de mail()-functie van PHP",
    @@ -608,6 +611,7 @@
     	"botpasswords-invalid-name": "De gebruikersnaam bevat niet het scheidingsteken van het botwachtwoord (\"$1\").",
     	"botpasswords-not-exist": "Gebruiker \"$1\" heeft geen botwachtwoord genaamd \"$2\"",
     	"resetpass_forbidden": "Wachtwoorden kunnen niet gewijzigd worden",
    +	"resetpass_forbidden-reason": "Wachtwoorden kunnen niet gewijzigd worden: $1",
     	"resetpass-no-info": "U dient aangemeld zijn voordat u deze pagina kunt gebruiken.",
     	"resetpass-submit-loggedin": "Wachtwoord wijzigen",
     	"resetpass-submit-cancel": "Annuleren",
    @@ -637,6 +641,7 @@
     	"passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
     	"passwordreset-emailsent-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord verzonden. Deze wordt hieronder weergegeven.",
     	"passwordreset-emailerror-capture": "Er is een e-mail voor het opnieuw instellen van een wachtwoord aangemaakt. Deze wordt hieronder weergegeven. Het verzenden naar de {{GENDER:$2|gebruiker}} is mislukt om de volgende reden: $1",
    +	"passwordreset-invalideamil": "Ongeldig e-mailadres",
     	"changeemail": "E-mailadres wijzigen of verwijderen",
     	"changeemail-header": "Vul dit formulier in om uw e-mailadres te wijzigen. Als u het e-mailadres wilt ontkoppelen van uw account, laat het e-mailadres dan leeg als u het formulier opslaat.",
     	"changeemail-passwordrequired": "U  moet uw wachtwoord invoeren om deze wijziging te bevestigen.",
    @@ -680,7 +685,9 @@
     	"minoredit": "Dit is een kleine bewerking",
     	"watchthis": "Deze pagina volgen",
     	"savearticle": "Pagina opslaan",
    +	"savechanges": "Wijzigingen opslaan",
     	"publishpage": "Pagina publiceren",
    +	"publishchanges": "Wijzigingen publiceren",
     	"preview": "Voorvertoning",
     	"showpreview": "Bewerking ter controle bekijken",
     	"showdiff": "Wijzigingen bekijken",
    @@ -1272,7 +1279,7 @@
     	"rightslogtext": "Hieronder staan de wijzigingen in gebruikersrechten.",
     	"action-read": "deze pagina te bekijken",
     	"action-edit": "deze pagina te bewerken",
    -	"action-createpage": "pagina's aan te maken",
    +	"action-createpage": "deze pagina aan te maken",
     	"action-createtalk": "overlegpagina's aan te maken",
     	"action-createaccount": "deze gebruiker aan te maken",
     	"action-autocreateaccount": "dit externe gebruikersaccount automatisch aanmaken",
    @@ -1335,7 +1342,7 @@
     	"recentchanges-submit": "Weergeven",
     	"rcnotefrom": "Wijzigingen sinds <strong>$3 om $4</strong> (maximaal <strong>$1</strong> {{PLURAL:$1|wijziging|wijzigingen}}).",
     	"rclistfrom": "Wijzigingen bekijken vanaf $3 $2",
    -	"rcshowhideminor": "Kleine wijzigingen $1",
    +	"rcshowhideminor": "Kleine bewerkingen $1",
     	"rcshowhideminor-show": "weergeven",
     	"rcshowhideminor-hide": "verbergen",
     	"rcshowhidebots": "bots $1",
    @@ -2170,7 +2177,7 @@
     	"undelete-error-long": "Er zijn fouten opgetreden bij het herstellen van het bestand:\n\n$1",
     	"undelete-show-file-confirm": "Weet u zeker dat u een verwijderde versie van het bestand \"<nowiki>$1</nowiki>\" van $2 om $3 wilt bekijken?",
     	"undelete-show-file-submit": "Ja",
    -	"namespace": "Naamruimte:&nbsp;",
    +	"namespace": "Naamruimte:",
     	"invert": "Selectie omkeren",
     	"tooltip-invert": "Selecteer dit om wijzigingen te verbergen in de geselecteerde naamruimte (en de gekoppelde naamruimte indien aangevinkt)",
     	"tooltip-whatlinkshere-invert": "Selecteer dit vakje om koppelingen van pagina's in de geselecteerde naamruimte te verbergen.",
    @@ -2203,6 +2210,7 @@
     	"sp-contributions-username": "IP-adres of gebruikersnaam:",
     	"sp-contributions-toponly": "Alleen nieuwste versies weergeven",
     	"sp-contributions-newonly": "Alleen nieuwe pagina's weergeven",
    +	"sp-contributions-hideminor": "Kleine bewerkingen verbergen",
     	"sp-contributions-submit": "Bekijken",
     	"whatlinkshere": "Koppelingen naar deze pagina",
     	"whatlinkshere-title": "Pagina's die verwijzen naar \"$1\"",
    @@ -3111,6 +3119,7 @@
     	"confirm-unwatch-button": "OK",
     	"confirm-unwatch-top": "Deze pagina verwijderen uit uw volglijst?",
     	"confirm-rollback-button": "OK",
    +	"confirm-rollback-top": "Bewerkingen op deze pagina terugdraaien?",
     	"quotation-marks": "\"$1\"",
     	"imgmultipageprev": "← vorige pagina",
     	"imgmultipagenext": "volgende pagina →",
    @@ -3647,7 +3656,6 @@
     	"mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
     	"mw-widgets-titleinput-description-new-page": "pagina bestaat nog niet",
     	"mw-widgets-titleinput-description-redirect": "doorverwijzing naar $1",
    -	"api-error-blacklisted": "Kies een andere, beschrijvende naam.",
     	"sessionmanager-tie": "Het is niet mogelijk om meerdere authenticatietypen voor verzoeken te combineren: $1.",
     	"sessionprovider-generic": "$1-sessies",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "op cookies gebaseerde sessies",
    @@ -3666,7 +3674,10 @@
     	"log-action-filter-block-unblock": "Opheffing van blokkade",
     	"log-action-filter-delete-delete": "Verwijderen van pagina",
     	"log-action-filter-delete-restore": "Terugplaatsen van pagina",
    +	"log-action-filter-newusers-create": "Aangemaakt door een anonieme gebruiker",
    +	"log-action-filter-newusers-create2": "Aangemaakt door een geregistreerde gebruiker",
     	"log-action-filter-newusers-autocreate": "Automatische aanmaak",
    +	"log-action-filter-newusers-byemail": "Aangemaakt met wachtwoord verzonden via e-mail",
     	"log-action-filter-patrol-patrol": "Handmatige markering",
     	"log-action-filter-patrol-autopatrol": "Automatische markering",
     	"log-action-filter-protect-protect": "Beveiliging",
    @@ -3677,5 +3688,13 @@
     	"log-action-filter-rights-autopromote": "Automatische aanpassing",
     	"log-action-filter-upload-upload": "Nieuwe upload",
     	"log-action-filter-upload-overwrite": "Herupload",
    -	"authmanager-email-label": "E-mail"
    +	"authmanager-authn-autocreate-failed": "Het automatisch aanmaken van een lokaal account is mislukt: $1",
    +	"authmanager-create-disabled": "Het aanmaken van accounts is uitgeschakeld.",
    +	"authmanager-email-label": "E-mail",
    +	"authmanager-email-help": "E-mailadres",
    +	"authmanager-realname-label": "Echte naam",
    +	"authmanager-realname-help": "Echte naam van de gebruiker",
    +	"authmanager-provider-temporarypassword": "Tijdelijk wachtwoord",
    +	"authprovider-resetpass-skip-label": "Overslaan",
    +	"specialpage-securitylevel-not-allowed-title": "Niet toegestaan"
     }
    diff --git a/languages/i18n/nn.json b/languages/i18n/nn.json
    index e74323708c..0909fd554d 100644
    --- a/languages/i18n/nn.json
    +++ b/languages/i18n/nn.json
    @@ -1241,6 +1241,7 @@
     	"upload-too-many-redirects": "URL-en inneheldt for mange omdirigeringar",
     	"upload-http-error": "Ein HTTP-feil oppstod: $1",
     	"upload-copy-upload-invalid-domain": "Kopiopplastingar er ikkje tilgjengelege frå dette domenet.",
    +	"upload-dialog-button-cancel": "Bryt av",
     	"backend-fail-stream": "Kunne ikkje strøyma fila «$1».",
     	"backend-fail-backup": "Kunne ikkje tryggingskopiera fila «$1».",
     	"backend-fail-notexists": "Fila $1 finst ikkje.",
    @@ -2973,7 +2974,7 @@
     	"api-error-badtoken": "Intern feil: ugild token.",
     	"api-error-copyuploaddisabled": "Opplasting etter URL er avslege på tenaren.",
     	"api-error-duplicate": "Det finst {{PLURAL:$1|ei anna fil|andre filer}} på nettstaden med same innhaldet.",
    -	"api-error-duplicate-archive": "Det fanst {{PLURAL:$1|ei anna fi]|andre file]}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.",
    +	"api-error-duplicate-archive": "Det fanst {{PLURAL:$1|ei anna fi|andre file}} på nettstaden med det same innhaldet, men {{PLURAL:$1|ho|dei}} vart sletta.",
     	"api-error-empty-file": "Fila du sende var tom.",
     	"api-error-emptypage": "Det er ikkje tillate å oppretta nye tomme sider.",
     	"api-error-fetchfileerror": "Intern feil: Noko gjekk gale då fila vart henta.",
    @@ -3079,6 +3080,5 @@
     	"mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
     	"mw-widgets-titleinput-description-new-page": "sida finst ikkje enno",
     	"mw-widgets-titleinput-description-redirect": "omdiriger til $1",
    -	"api-error-blacklisted": "Vel eit anna namn som er meir skildrande.",
     	"randomrootpage": "Tilfeldig rotsida"
     }
    diff --git a/languages/i18n/oc.json b/languages/i18n/oc.json
    index d404da02f7..75c020f23b 100644
    --- a/languages/i18n/oc.json
    +++ b/languages/i18n/oc.json
    @@ -55,7 +55,7 @@
     	"tog-ccmeonemails": "Me mandar una còpia dels corrièrs electronics que mandi als autres utilizaires",
     	"tog-diffonly": "Far pas veire lo contengut de las paginas jos las difs",
     	"tog-showhiddencats": "Afichar las categorias amagadas",
    -	"tog-norollbackdiff": "Ometre lo diff aprèp l’utilizacion d’un revert",
    +	"tog-norollbackdiff": "Afichar pas lo diff aprèp aver revocat",
     	"tog-useeditwarning": "M’avisar quand quiti una pagina de modificacion sens publicar los cambiaments",
     	"tog-prefershttps": "Utilizar totjorn una connexion securizada en essent connectat",
     	"underline-always": "Totjorn",
    @@ -218,7 +218,7 @@
     	"viewhelppage": "Vejatz la pagina d'ajuda",
     	"categorypage": "Vejatz la pagina de las categorias",
     	"viewtalkpage": "Pagina de discussion",
    -	"otherlanguages": "En autras lengas",
    +	"otherlanguages": "Dins d'autras lengas",
     	"redirectedfrom": "(Redirigit dempuèi $1)",
     	"redirectpagesub": "Pagina de redireccion",
     	"redirectto": "Redirigir cap a :",
    @@ -388,7 +388,7 @@
     	"createacct-yourpasswordagain": "Confirmatz lo senhal",
     	"createacct-yourpasswordagain-ph": "Entratz lo senhal tornarmai",
     	"remembermypassword": "Me reconnectar automaticament a las visitas venentas (al maximum $1 {{PLURAL:$1|jorn|jorns}})",
    -	"userlogin-remembermypassword": "Gardar ma sesilha activa",
    +	"userlogin-remembermypassword": "Gardar ma session activa",
     	"userlogin-signwithsecure": "Utilizar una connexion securizada",
     	"cannotloginnow-title": "Impossible de se connectar ara",
     	"yourdomainname": "Vòstre domeni",
    @@ -437,7 +437,7 @@
     	"nocookieslogin": "{{SITENAME}} utiliza de cookies per la connexion mas avètz los cookies desactivats. Activatz-los e reconnectatz-vos.",
     	"nocookiesfornew": "Lo compte d'utilizaire es pas estat creat, perque avèm pas pogut identificar son origina.\nVerificatz qu'avètz activat los cookies, recargatz la pagina e tornatz ensajar.",
     	"noname": "Avètz pas picat de nom d'utilizaire valid.",
    -	"loginsuccesstitle": "Identificacion capitada.",
    +	"loginsuccesstitle": "Connectat",
     	"loginsuccess": "Sètz actualament connectat(ada) sus {{SITENAME}} en tant que « $1 ».",
     	"nosuchuser": "L'utilizaire « $1 » existís pas.\nLo nom d'utilizaire es sensible a la cassa.\nVerificatz vòstra ortografia, o [[Special:CreateAccount|creatz-vos un compte novèl]].",
     	"nosuchusershort": "I a pas de contributor amb lo nom « $1 ». Verificatz l’ortografia.",
    @@ -471,7 +471,7 @@
     	"createaccount-title": "Creacion d'un compte per {{SITENAME}}",
     	"createaccount-text": "Qualqu'un a creat un compte per vòstra adreça de corrièr electronic sus {{SITENAME}} ($4) intitolat « $2 », amb per senhal « $3 ». Deuriaz dobrir una sessilha e cambiar, tre ara, aqueste senhal.\n\nIgnoratz aqueste messatge se aqueste compte es estat creat per error.",
     	"login-throttled": "Avètz ensajat un tròp grand nombre de connexions darrièrament.\nEsperatz $1 abans d’ensajar tornarmai.",
    -	"login-abort-generic": "Vòstra temptativa de connexion a fracassat",
    +	"login-abort-generic": "Vòstra temptativa de connexion a fracassat - Anullat",
     	"loginlanguagelabel": "Lenga: $1",
     	"suspicious-userlogout": "Vòstra demanda de desconnexion es estada refusada perque sembla qu’es estada mandada per un navigador copat o la mesa en cache d’un proxy.",
     	"createacct-another-realname-tip": "Lo nom vertadièr es opcional.\nSe decidissètz de lo provesir, serà utilizat per atribuir a l’utilizaire sos trabalhs.",
    @@ -585,11 +585,11 @@
     	"loginreqlink": "connectar",
     	"loginreqpagetext": "Vos cal vos $1 per veire las autras paginas.",
     	"accmailtitle": "Senhal mandat.",
    -	"accmailtext": "Un senhal generat aleatòriament per [[User talk:$1|$1]] es estat mandat a $2.\nLo senhal per aqueste compte novèl pòt èsser cambiat sus la pagina ''[[Special:ChangePassword|Cambiament de senhal]]'' aprèp s'èsser connectat.",
    +	"accmailtext": "Un senhal generat aleatòriament per [[User talk:$1|$1]] es estat mandat a $2.\nLo senhal per aqueste compte novèl pòt èsser cambiat sus la pagina ''[[Special:ChangePassword|Cambiament de senhal]]'' aprèp connexion.",
     	"newarticle": "(Novèl)",
     	"newarticletext": "Avètz seguit un ligam cap a una pagina qu’existís pas encara o qu'es estada [{{fullurl:Special:Log|type=delete&page={{FULLPAGENAMEE}}}} escafada].\nPer crear aquesta pagina, picatz vòstre tèxte dins la bóstia çaijós (podètz consultar [$1 la pagina d’ajuda] per mai d’entresenhas).\nSe sètz arribat(ada) aicí per error, clicatz sul boton '''retorn''' de vòstre navigador.",
     	"anontalkpagetext": "---- ''Sètz sus la pagina de discussion d'un utilizaire anonim qu'a pas encara creat un compte o que n'utiliza pas.\nPer aquesta rason, devèm utilizar son adreça IP per l'identificar. Una adreça d'aqueste tipe pòt èsser partejada entre mantun utilizaire. Se sètz un utilizaire anonim e se constatatz que de comentaris que vos concernisson pas vos son estats adreçats, podètz [[Special:CreateAccount|crear un compte]] o [[Special:UserLogin|vos connectar]] per evitar tota confusion venenta amb d’autres contributors anonims.''",
    -	"noarticletext": "Pel moment, i a pas cap de tèxte sus aquesta pagina ;\npodètz [[Special:Search/{{PAGENAME}}|aviar una recèrca sul títol d'aqueste títol de pagina]] dins las autras pagina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins las operacions ligadas]\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear aquesta pagina]</span>.",
    +	"noarticletext": "Pel moment, i a pas cap de tèxte sus aquesta pagina.\nPodètz [[Special:Search/{{PAGENAME}}|aviar una recèrca sul títol d'aqueste títol de pagina]] dins las autras pagina,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins las operacions ligadas],\no [{{fullurl:{{FULLPAGENAME}}|action=edit}} crear aquesta pagina]</span>.",
     	"noarticletext-nopermission": "Actualament i a pas cap de tèxte dins aquesta pagina.\nPodètz [[Special:Search/{{PAGENAME}}|far una recèrca sul títol de la pagina]] dins las autras paginas,\no <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} recercar dins los jornals associats]</span>.",
     	"missing-revision": "La revision n° $1 de la pagina intitulada « {{FULLPAGENAME}} » existís pas.\n\nAquò se produtz en general en seguent un ligam istoric obsolèt cap a una pagina qu'es estada suprimida.\nPodètz trobar mai de detalhs dins lo [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} jornal de las supressions].",
     	"userpage-userdoesnotexist": "Lo compte d'utilizaire « <nowiki>$1</nowiki> » es pas enregistrat. Indicatz se volètz crear o editar aquesta pagina.",
    @@ -608,8 +608,8 @@
     	"previewnote": "'''Remembratz-vos qu'es pas qu'una previsualizacion.'''\nVòstras modificacions son pas encara estadas enregistradas !",
     	"continue-editing": "Anar a la zòna de modificacion",
     	"previewconflict": "Aquesta previsualizacion fa veire lo tèxte de la bóstia de modificacion superiora coma apareisserà se causissètz de lo salvar.",
    -	"session_fail_preview": "'''Podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions concernent vòstra sesilha.\nEnsajatz tornarmai.\nS'aquò fracassa encara, [[Special:UserLogout|desconnectatz-vos]], puèi connectatz-vos tornamai.'''",
    -	"session_fail_preview_html": "'''Podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions que concernís vòstra sesilha.'''\n\n''Perque {{SITENAME}} a activat l’HTML brut, la previsualizacion es estada amagada per prevenir un atac per JavaScript.''\n\n'''Se la temptativa de modificacion èra legitima, ensajatz encara.\nS'aquò capita pas un còp de mai, [[Special:UserLogout|desconnectatz-vos]], puèi connectatz-vos tornamai.'''",
    +	"session_fail_preview": "O planhèm, podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions a prepaus de vòstra session.\n\nBenlèu que sètz estat desconnectat. <strong>Verificatz que sètz encara connectat e ensajatz tornamai.</strong>\nSe aquò fracassa tornamai, ensajatz en vos [[Special:UserLogout|desconnectant]], puèi en vos reconnectant, e verificatz que vòstre navigador accèpta los cookies d'aqueste site.",
    +	"session_fail_preview_html": "O planhèm, podèm pas enregistrar vòstra modificacion a causa d’una pèrda d’informacions que concernís vòstra session.\n\n<em>Perque {{SITENAME}} a activat l’HTML brut, la previsualizacion es estada amagada per prevenir un atac per JavaScript.</em>\n\n<strong>Se la temptativa de modificacion èra legitima, ensajatz encara.</strong>\nS'aquò capita pas un còp de mai, [[Special:UserLogout|desconnectatz-vos]], puèi connectatz-vos tornamai.",
     	"token_suffix_mismatch": "'''Vòstra modificacion es pas estada acceptada perque vòstre navigador a mesclat los caractèrs de ponctuacion dins l’identificant d’edicion. La modificacion es estada regetada per empachar la corrupcion del tèxte de l’article. Aqueste problèma se produtz quand utilizatz un mandatari (proxy) anonim problematic.'''",
     	"edit_form_incomplete": "'''D'unas partidas del formulari de modificacion an pas atench lo servidor, verificatz que vòstras modificacions son intactas e ensajatz tornarmai.'''",
     	"editing": "Modificacion de $1",
    @@ -768,9 +768,9 @@
     	"revdelete-unsuppress": "Levar las restriccions sus las versions restablidas",
     	"revdelete-log": "Motiu :",
     	"revdelete-submit": "Aplicar {{PLURAL:$1|a la version seleccionada|a las versions seleccionadas}}",
    -	"revdelete-success": "'''Visibilitat de las versions mesas a jorn amb succès.'''",
    +	"revdelete-success": "Visibilitat de las versions mesa a jorn.",
     	"revdelete-failure": "'''La visibilitat de la revision a pas pogut èsser mesa a jorn :'''\n$1",
    -	"logdelete-success": "'''Jornal de las visibilitat parametrat amb succès.'''",
    +	"logdelete-success": "Visibilitat del jornal modificada.",
     	"logdelete-failure": "'''La visibilitat del jornal a pas pogut èsser definida :'''\n$1",
     	"revdel-restore": "Modificar la visibilitat",
     	"pagehist": "Istoric de la pagina",
    @@ -799,7 +799,7 @@
     	"mergehistory-go": "Veire las edicions fusionablas",
     	"mergehistory-submit": "Fusionar las revisions",
     	"mergehistory-empty": "Cap de revision pòt pas èsser fusionada.",
    -	"mergehistory-done": "$3 {{PLURAL:$3|revision|revisions}} de $1 {{PLURAL:$3|fusionada|fusionadas}} amb succès amb [[:$2]].",
    +	"mergehistory-done": "$3 version{{PLURAL:$3||s}} de $1 {{PLURAL:$3|es estada fusionada|son estada fusionadas}} dins [[:$2]].",
     	"mergehistory-fail": "Impossible de procedir a la fusion dels istorics. Seleccionatz  tornamai la pagina e mai los paramètres de data.",
     	"mergehistory-fail-toobig": "Impossible d’efectuar la fusion de l’istoric perque un nombre de {{PLURAL:$1|revisions}} superior al limit de $1 deuriá èsser desplaçat.",
     	"mergehistory-no-source": "La pagina d'origina $1 existís pas.",
    @@ -1333,7 +1333,7 @@
     	"uploadstash": "Cache d'impòrt",
     	"uploadstash-clear": "Escafar los fichièrs en cache",
     	"uploadstash-nofiles": "Avètz pas de fichièrs en cache d'impòrt.",
    -	"uploadstash-errclear": "L'escafament dels fichièrs a fracassat.",
    +	"uploadstash-errclear": "La supression dels fichièrs a fracassat.",
     	"uploadstash-refresh": "Actualizar la lista dels fichièrs",
     	"invalid-chunk-offset": "Offset de segment invalid",
     	"img-auth-accessdenied": "Accès refusat",
    @@ -1586,7 +1586,7 @@
     	"booksources-text": "Vaquí una lista de ligams cap a d’autres sites que vendon de libres nòus e d’ocasion e suls quals trobaretz benlèu d'entresenhas suls obratges que cercatz. {{SITENAME}} es pas ligada a cap d'aquestas societats, a pas l’intencion de ne far la promocion.",
     	"booksources-invalid-isbn": "Lo numèro ISBN balhat sembla pas èsser valid ; verificatz s'avètz fait una error al moment de la còpia dempuèi la font.",
     	"specialloguserlabel": "Autor :",
    -	"speciallogtitlelabel": "Cibla (títol o utilizaire):",
    +	"speciallogtitlelabel": "Cibla (títol o {{ns:user}}:nom d'utilizaire) :",
     	"log": "Jornals",
     	"all-logs-page": "Totas las operacions publicas",
     	"alllogstext": "Afichatge combinat de totes los jornals de {{SITENAME}}.\nPodètz restrénher la vista en seleccionant un tipe de jornal, un nom d’utilizaire (cassa sensibla) o una pagina ciblada (idem).",
    @@ -1681,7 +1681,7 @@
     	"emailccsubject": "Còpia de vòstre messatge a $1 : $2",
     	"emailsent": "Messatge mandat",
     	"emailsenttext": "Vòstre messatge es estat mandat.",
    -	"emailuserfooter": "Aqueste corrièr electronic es estat mandat per « $1 » a « $2 » per la foncion « Mandar un corrièr electronic a l’utilizaire » sus {{SITENAME}}.",
    +	"emailuserfooter": "Aqueste corrièr electronic es estat mandat per « $1 » a « $2 » per la foncion « {{int:emailuser}} » sus {{SITENAME}}.",
     	"usermessage-summary": "A daissat un messatge de sistèma.",
     	"usermessage-editor": "Messatgièr del sistèma",
     	"watchlist": "Lista de seguiment",
    @@ -1764,8 +1764,9 @@
     	"revertpage": "Anullacion de las modificacions de [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]]) cap a la darrièra version de [[User:$1|$1]]",
     	"revertpage-nouser": "Revocacion de las modificacions per un utilizaire amagat a la darrièra version per {{GENDER:$1|[[User:$1|$1]]}}",
     	"rollback-success": "Anullacion de las modificacions de $1 ; retorn a la version de $2.",
    -	"sessionfailure-title": "La sesilha a fracassat",
    -	"sessionfailure": "Vòstra sesilha de connexion sembla aver de problèmas ;\naquesta accion es estada anullada en prevencion d’un piratatge de sesilha.\nClicatz sus « Precedent » e tornatz cargar la pagina d’ont venètz, puèi ensajatz tornarmai.",
    +	"sessionfailure-title": "La session a fracassat",
    +	"sessionfailure": "Vòstra session de connexion sembla aver de problèmas ;\naquesta accion es estada anullada en prevencion d’un piratatge de session.\nClicatz sus « Precedent » e tornatz cargar la pagina d’ont venètz, puèi ensajatz tornarmai.",
    +	"changecontentmodel": "Modificar lo modèl de contengut d’una pagina",
     	"changecontentmodel-title-label": "Títol de la pagina",
     	"changecontentmodel-model-label": "Novèl modèl de contengut",
     	"changecontentmodel-reason-label": "Motiu :",
    @@ -1910,8 +1911,8 @@
     	"whatlinkshere-prev": "{{PLURAL:$1|precedent|$1 precedents}}",
     	"whatlinkshere-next": "{{PLURAL:$1|seguent|$1 seguents}}",
     	"whatlinkshere-links": "← ligams",
    -	"whatlinkshere-hideredirs": "$1 redireccions",
    -	"whatlinkshere-hidetrans": "$1 transclusions",
    +	"whatlinkshere-hideredirs": "$1 las redireccions",
    +	"whatlinkshere-hidetrans": "$1 las inclusions",
     	"whatlinkshere-hidelinks": "$1 ligams",
     	"whatlinkshere-hideimages": "$1 los fichièrs ligats",
     	"whatlinkshere-filters": "Filtres",
    @@ -2160,7 +2161,7 @@
     	"import-nonewrevisions": "Cap de revision pas importada (totas èran ja presentas, o ignoradas del fait d’errors).",
     	"xml-error-string": "$1 a la linha $2, col $3 (octet $4) : $5",
     	"import-upload": "Impòrt d'un fichier XML",
    -	"import-token-mismatch": "Pèrda de las donadas de sesilha. Tornatz ensajar.",
    +	"import-token-mismatch": "Pèrda de las donadas de session.\n\nBenlèu que sètz estats desconnectats. <strong>Verificatz que sètz totjorn connectat e reensajatz</strong>.\nSe aquò fonciona totjorn pas, ensajatz de [[Special:UserLogout|vos desconnectar]] e reconnectatz-vos, e verificatz que vòstre navigador accèpta los cookies d'aqueste site.",
     	"import-invalid-interwiki": "Impossible d'importar dempuèi lo wiki especificat.",
     	"import-error-edit": "La pagina « $1 » es pas estada importada perque sètz pas autorizat a la modificar.",
     	"import-error-create": "La pagina « $1 » es pas estada importada perque sètz pas autorizat a la crear.",
    @@ -3182,5 +3183,6 @@
     	"special-characters-title-endash": "jonhent anglés",
     	"special-characters-title-emdash": "jonhent em",
     	"special-characters-title-minus": "signe mens",
    -	"randomrootpage": "Pagina raiç aleatòria"
    +	"randomrootpage": "Pagina raiç aleatòria",
    +	"changecredentials": "Modificar las informacions d’identificacion"
     }
    diff --git a/languages/i18n/olo.json b/languages/i18n/olo.json
    index 18d8a84877..750bc46f3e 100644
    --- a/languages/i18n/olo.json
    +++ b/languages/i18n/olo.json
    @@ -219,7 +219,7 @@
     	"jumpto": "Siirry",
     	"jumptonavigation": "navigatsii",
     	"jumptosearch": "eči",
    -	"view-pool-error": "Pahakse mielekse palvelimet ollah ylikuormittunnuot täl hetkel. Liijan moni käyttäi oppiu tarkastella tädä sivuu. Vuota kodvaine enne gu opit uvvessah.",
    +	"view-pool-error": "Pahakse mielekse palvelimet ollah ylikuormittunnuot täl hetkel. Liijan moni käyttäi oppiu tarkastella tädä sivuu. Vuota kodvaine, enne gu opit uvvessah.\n\n$1",
     	"generic-pool-error": "Pahakse mielekse palvelimet ollah ylikuormittunnuot nygöi. Liijan moni käyttäi oppiu tarkastella tädä sivuu.",
     	"pool-timeout": "Lukittumizen vuotanduaigu on loppenuhes.",
     	"pool-queuefull": "Ečindykyzymykzien tallendustila on täyzi",
    @@ -245,7 +245,7 @@
     	"privacypage": "Project:Luottamuksen periuateh",
     	"badaccess": "Ei oigevuksii",
     	"badaccess-group0": "Sinul ei ole lubua suorittua tädä toiminduo.",
    -	"badaccess-groups": "Tämän toimindon voijah suorittua vai {{PLURAL:$2|täh joukkoh|nämmih joukkoloih}} kuulujat käyttäjät.",
    +	"badaccess-groups": "Tämän toimindon voijah suorittua vai {{PLURAL:$2|täh joukkoh|nämmih joukkoloih}}:$1 kuulujat käyttäjät.",
     	"versionrequired": "MediiWikis pidäy vähimyölleh versii $1",
     	"versionrequiredtext": "MediiWikis pidäy vähimyölleh versii $1 tädä sivuu kaččojes. Kačo [[Special:Version|versii]].",
     	"ok": "OK",
    @@ -558,7 +558,7 @@
     	"revdelete-radio-same": "(älä vaihta)",
     	"revdelete-radio-set": "Peitetty",
     	"revdelete-radio-unset": "Nägövil",
    -	"logdelete-success": "'''Tapahtumuhistourien nägyvytty on muutettu.'''",
    +	"logdelete-success": "Tapahtumuhistourien nägyvytty on muutettu.",
     	"logdelete-failure": "'''Tapahtumuhistourien nägyvytty ei voidu azettua:'''\n$1",
     	"revdel-restore": "vaihta nägyvys",
     	"pagehist": "Sivuhistourii",
    diff --git a/languages/i18n/pa.json b/languages/i18n/pa.json
    index 91cefe4dfc..cb9ca86e48 100644
    --- a/languages/i18n/pa.json
    +++ b/languages/i18n/pa.json
    @@ -22,7 +22,8 @@
     			"לערי ריינהארט",
     			"아라",
     			"Macofe",
    -			"ਪ੍ਰਚਾਰਕ"
    +			"ਪ੍ਰਚਾਰਕ",
    +			"Tow"
     		]
     	},
     	"tog-underline": "ਲਿੰਕ ਹੇਠ-ਲਾਈਨ:",
    @@ -160,7 +161,7 @@
     	"morenotlisted": "ਇਹ ਸੂਚੀ ਪੂਰੀ ਨਹੀਂ ਹੈ।",
     	"mypage": "ਸਫ਼ਾ",
     	"mytalk": "ਗੱਲ-ਬਾਤ",
    -	"anontalk": "ਇਸ IP ਲਈ ਗੱਲ-ਬਾਤ",
    +	"anontalk": "ਗੱਲ-ਬਾਤ",
     	"navigation": "ਫੇਰੀ ਪਾਓ",
     	"and": "&#32;ਅਤੇ",
     	"qbfind": "ਖੋਜ",
    @@ -1772,7 +1773,7 @@
     	"tooltip-t-recentchangeslinked": "ਇਸ ਸਫ਼ੇ ਤੋਂ ਲਿੰਕ ਕੀਤੇ ਸਫ਼ਿਆਂ ਵਿਚ ਤਾਜ਼ਾ ਤਬਦੀਲੀਆਂ",
     	"tooltip-feed-rss": "ਇਸ ਸਫ਼ੇ ਲਈ RSS ਫ਼ੀਡ",
     	"tooltip-feed-atom": "ਇਸ ਸਫ਼ੇ ਦੀ ਐਟਮ ਫ਼ੀਡ",
    -	"tooltip-t-contributions": "ਇਸ ਵਰਤੋਂਕਾਰ ਦੀ ਯੋਗਦਾਨ ਸੂਚੀ",
    +	"tooltip-t-contributions": "{{GENDER:$1|}} ਦੀ ਯੋਗਦਾਨ ਸੂਚੀ",
     	"tooltip-t-emailuser": "ਇਸ ਵਰਤੋਂਕਾਰ ਨੂੰ ਈ-ਮੇਲ ਭੇਜੋ",
     	"tooltip-t-upload": "ਫ਼ਾਈਲਾਂ ਅਪਲੋਡ ਕਰੋ",
     	"tooltip-t-specialpages": "ਸਾਰੇ ਖ਼ਾਸ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ",
    diff --git a/languages/i18n/pl.json b/languages/i18n/pl.json
    index ecf97a917e..7600f64e50 100644
    --- a/languages/i18n/pl.json
    +++ b/languages/i18n/pl.json
    @@ -509,12 +509,15 @@
     	"createacct-email-ph": "Wpisz swój adres e-mail",
     	"createacct-another-email-ph": "Podaj adres e-mail",
     	"createaccountmail": "Użyj tymczasowego hasła wygenerowanego losowo i wyślij je na podany adres e-mail",
    +	"createaccountmail-help": "Pozwala utworzyć konto dla innej osoby, nie znając jej hasła.",
     	"createacct-realname": "Prawdziwe imię i nazwisko (opcjonalnie)",
     	"createaccountreason": "Powód:",
     	"createacct-reason": "Powód",
     	"createacct-reason-ph": "Dlaczego zakładasz kolejne konto",
    +	"createacct-reason-help": "Komunikat wyświetlany w rejestrze tworzenia kont",
     	"createacct-submit": "Utwórz konto",
     	"createacct-another-submit": "Utwórz konto",
    +	"createacct-continue-submit": "Kontynuuj tworzenie konta",
     	"createacct-another-continue-submit": "Kontynuuj tworzenie konta",
     	"createacct-benefit-heading": "{{grammar:B.lp|{{SITENAME}}}} tworzą ludzie tacy jak Ty.",
     	"createacct-benefit-body1": "{{PLURAL:$1|edycja|edycje|edycji}}",
    @@ -529,6 +532,7 @@
     	"nocookiesnew": "Konto użytkownika zostało utworzone, ale nie jesteś zalogowany.\n{{SITENAME}} używa ciasteczek do przechowywania informacji o zalogowaniu się.\nMasz obecnie w przeglądarce wyłączoną obsługę ciasteczek.\nŻeby się zalogować, włącz obsługę ciasteczek, następnie podaj nazwę użytkownika i hasło dostępu do swojego konta.",
     	"nocookieslogin": "{{SITENAME}} wykorzystuje ciasteczka do przechowywania informacji o zalogowaniu się przez użytkownika.\nMasz obecnie w przeglądarce wyłączoną obsługę ciasteczek.\nSpróbuj ponownie po jej włączeniu.",
     	"nocookiesfornew": "Konto użytkownika nie zostało utworzone, ponieważ nie można było potwierdzić jego źródła.\nUpewnij się, że masz włączoną obsługę ciasteczek, przeładuj stronę i spróbuj ponownie.",
    +	"createacct-loginerror": "Konto zostało pomyślnie utworzone, ale nie mogłeś zostać zalogowany automatycznie. Proszę, [[Special:UserLogin|zalogować się ręcznie]].",
     	"noname": "To nie jest poprawna nazwa użytkownika.",
     	"loginsuccesstitle": "Zalogowano",
     	"loginsuccess": "'''{{GENDER:|Zalogowałeś się|Zalogowałaś się|Zalogowano}} do {{GRAMMAR:D.lp|{{SITENAME}}}} jako „$1”.'''",
    @@ -590,7 +594,7 @@
     	"changepassword-success": "Twoje hasło zostało zmienione!",
     	"changepassword-throttled": "Ostatnio zbyt wiele razy próbowałeś zalogować się na to konto.\nOdczekaj $1, zanim ponowisz próbę.",
     	"botpasswords": "Hasła bota",
    -	"botpasswords-summary": "<em>Hasła bota</em> pozwalają na dostęp do konta użytkownika za pośrednictwem interfejsu API bez korzystania z danych konta. Uprawnienia uczestnika przy użyciu hasła bota mogą być ograniczone.\n\nJeśli nie wiesz, dlaczego miałbyś je tworzyć, nie powinieneś tego robić. Nikt nie powinien prosić Cię o utworzyć i podanie tego hasła.",
    +	"botpasswords-summary": "<em>Hasła bota</em> pozwalają na dostęp do konta użytkownika za pośrednictwem interfejsu API bez korzystania z danych konta. Uprawnienia użytkownika przy użyciu hasła bota mogą być ograniczone.\n\nJeśli nie wiesz, dlaczego miałbyś je tworzyć, nie powinieneś tego robić. Nikt nie powinien prosić Cię o utworzenie i podanie tego hasła.",
     	"botpasswords-disabled": "Hasła robotów zostały wyłączone.",
     	"botpasswords-no-central-id": "Aby użyć hasła robotów, musisz być zalogowany na koncie uniwersalnym.",
     	"botpasswords-existing": "Istniejące hasło bota",
    @@ -626,7 +630,7 @@
     	"resetpass-temp-password": "Tymczasowe hasło:",
     	"resetpass-abort-generic": "Zmiana hasła została przerwana przez rozszerzenie.",
     	"resetpass-expired": "Twoje hasło wygasło. Proszę ustawić nowe hasło do logowania.",
    -	"resetpass-expired-soft": "Twoje hasło wygasło i musi zostać zresetowane. Proszę wybrać nowe hasło albo kliknąć na \"{{int:authprovider-resetpass-skip-label}}\", aby zresetować je później.",
    +	"resetpass-expired-soft": "Twoje hasło wygasło i musi zostać zresetowane. Proszę wybrać nowe hasło albo kliknąć na „{{int:authprovider-resetpass-skip-label}}”, aby zresetować je później.",
     	"resetpass-validity-soft": "Twoje hasło jest niepoprawne: $1\n\nWybierz teraz nowe hasło albo kliknij „{{int:authprovider-resetpass-skip-label}}”, aby zresetować je później.",
     	"passwordreset": "Wyczyść hasło",
     	"passwordreset-text-one": "Wypełnij ten formularz, aby otrzymać tymczasowe hasło na email.",
    @@ -691,7 +695,9 @@
     	"minoredit": "To jest drobna zmiana",
     	"watchthis": "Obserwuj",
     	"savearticle": "Zapisz",
    +	"savechanges": "Zapisz zmiany",
     	"publishpage": "Opublikuj stronę",
    +	"publishchanges": "Opublikuj zmiany",
     	"preview": "Podgląd",
     	"showpreview": "Pokaż podgląd",
     	"showdiff": "Podgląd zmian",
    @@ -943,7 +949,7 @@
     	"mergehistory-fail-bad-timestamp": "Znacznik czasu jest nieprawidłowy.",
     	"mergehistory-fail-invalid-source": "Strona źródłowa jest nieprawidłowa.",
     	"mergehistory-fail-invalid-dest": "Strona docelowa jest nieprawidłowa.",
    -	"mergehistory-fail-permission": "Brak uprawnień aby połączyć historię.",
    +	"mergehistory-fail-permission": "Brak uprawnień, aby połączyć historię.",
     	"mergehistory-fail-self-merge": "Strona źródłowa i docelowa są takie same.",
     	"mergehistory-fail-toobig": "Nie można połączyć historii, gdyż wymagałoby to przeniesienia więcej niż maksymalnej dopuszczalnej liczby $1 {{PLURAL:$1|wersji}}.",
     	"mergehistory-no-source": "Strona źródłowa $1 nie istnieje.",
    @@ -1039,7 +1045,7 @@
     	"prefs-editwatchlist-raw": "Tekstowy edytor obserwowanych",
     	"prefs-editwatchlist-clear": "Wyczyść listę obserwowanych",
     	"prefs-watchlist-days": "Liczba dni widocznych na liście obserwowanych:",
    -	"prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|dzień|dni}}",
    +	"prefs-watchlist-days-max": "Maksymalnie $1 {{PLURAL:$1|dzień|dni}}",
     	"prefs-watchlist-edits": "Liczba edycji pokazywanych w rozszerzonej liście obserwowanych:",
     	"prefs-watchlist-edits-max": "Maksymalnie 1000",
     	"prefs-watchlist-token": "Identyfikator listy obserwowanych:",
    @@ -1266,6 +1272,7 @@
     	"grant-editprotected": "Edycja stron zabezpieczonych",
     	"grant-highvolume": "Masowe edytowanie",
     	"grant-oversight": "Ukrywanie użytkowników i wersji stron",
    +	"grant-patrol": "Patrolować zmiany w stronach",
     	"grant-protect": "Zabezpieczanie i odbezpieczanie stron",
     	"grant-rollback": "Wycofywanie zmian na stronach",
     	"grant-sendemail": "Wysyłanie e‐maili do innych użytkowników",
    @@ -1280,9 +1287,10 @@
     	"rightslogtext": "Rejestr zmian uprawnień użytkowników.",
     	"action-read": "przeglądania tej strony",
     	"action-edit": "edytowania tej strony",
    -	"action-createpage": "tworzenia stron",
    -	"action-createtalk": "tworzenia stron dyskusji",
    +	"action-createpage": "utwórz tę stronę",
    +	"action-createtalk": "tworzenia tej strony dyskusji",
     	"action-createaccount": "utworzenia tego konta użytkownika",
    +	"action-autocreateaccount": "automatycznego utworzenia tego zewnętrznego konta użytkownika",
     	"action-history": "przeglądania historii tej strony",
     	"action-minoredit": "do oznaczenia tej edycji jako drobna zmiana",
     	"action-move": "przeniesienia tej strony",
    @@ -1487,6 +1495,9 @@
     	"upload-too-many-redirects": "URL zawiera zbyt wiele przekierowań",
     	"upload-http-error": "Wystąpił błąd protokołu HTTP – $1",
     	"upload-copy-upload-invalid-domain": "Przesyłanie kopii z tej domeny nie jest dostępne.",
    +	"upload-foreign-cant-upload": "Ta wiki nie jest skonfigurowana, aby przesyłać pliki do żądanego zewnętrznego repozytorium plików.",
    +	"upload-foreign-cant-load-config": "Wczytywanie konfiguracji przesyłania plików do zewnętrznego repozytorium nie powiodło się.",
    +	"upload-dialog-disabled": "Przesyłanie plików przy pomocy tego okna jest wyłączone na tej wiki.",
     	"upload-dialog-title": "Prześlij plik",
     	"upload-dialog-button-cancel": "Anuluj",
     	"upload-dialog-button-done": "Gotowe",
    @@ -1807,7 +1818,7 @@
     	"apisandbox": "Środowisko testowe API",
     	"apisandbox-jsonly": "Do korzystania z brudnopisu API wymagany jest JavaScript.",
     	"apisandbox-api-disabled": "API jest wyłączone na tej stronie.",
    -	"apisandbox-intro": "Użyj tej strony do eksperymentowania z <strong>serwisem API MediaWiki</strong>.\nWięcej szczegółów na temat wykorzystywania API można znaleźć w [[mw:API:Main page|dokumentacji API]]. Przykład: [https://www.mediawiki.org/wiki/API#A_simple_example pobranie zawartości strony głównej]. Wybierz akcję, by zobaczyć więcej przykładów.\n\nZwróć uwagę, że chociaż jest to brudnopis, to działania, które można przeprowadzać na tej stronie, mogą zmienić wiki.",
    +	"apisandbox-intro": "Użyj tej strony do eksperymentowania z <strong>serwisem API MediaWiki</strong>.\nWięcej szczegółów na temat wykorzystywania API można znaleźć w [[mw:API:Main page|dokumentacji API]]. Przykład: [https://www.mediawiki.org/wiki/API#A_simple_example pobranie zawartości strony głównej]. Wybierz akcję, by zobaczyć więcej przykładów.\n\nZwróć uwagę, że chociaż jest to środowisko testowe, to działania, które można przeprowadzać na tej stronie, mogą zmienić zawartość wiki.",
     	"apisandbox-fullscreen": "Rozszerz panel",
     	"apisandbox-fullscreen-tooltip": "Rozszerz panel środowiska testowego, aby zajmował całe okno przeglądarki.",
     	"apisandbox-unfullscreen": "Pokaż stronę",
    @@ -1835,6 +1846,7 @@
     	"apisandbox-request-url-label": "URL zapytania:",
     	"apisandbox-request-time": "Czas przetwarzania zapytania: {{PLURAL:$1|$1 ms}}",
     	"apisandbox-results-fixtoken": "Popraw token i wyślij ponownie",
    +	"apisandbox-results-fixtoken-fail": "Nie udało się pobrać tokena „$1”.",
     	"apisandbox-alert-page": "Pola na tej stronie są nieprawidłowe.",
     	"apisandbox-alert-field": "Wartość tego pola jest nieprawidłowa.",
     	"booksources": "Książki",
    @@ -2049,12 +2061,14 @@
     	"rollbacklinkcount": "cofnij $1 {{PLURAL:$1|edycję|edycje|edycji}}",
     	"rollbacklinkcount-morethan": "cofnij więcej niż $1 {{PLURAL:$1|edycję|edycje|edycji}}",
     	"rollbackfailed": "Nie udało się cofnąć zmiany",
    +	"rollback-missingparam": "W żądaniu nie podano wymaganych parametrów.",
     	"cantrollback": "Nie można cofnąć edycji tego autora, ponieważ jest jedynym autorem tej strony.",
     	"alreadyrolled": "Nie można dla strony [[:$1|$1]] cofnąć ostatniej zmiany, którą wykonał [[User:$2|$2]] ([[User talk:$2|dyskusja]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]).\nKtoś inny zdążył już to zrobić lub wprowadził własne poprawki do treści strony.\n\nAutorem ostatniej zmiany jest teraz [[User:$3|$3]] ([[User talk:$3|dyskusja]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     	"editcomment": "Edycję opisał: <em>$1</em>.",
     	"revertpage": "Wycofano edycje użytkownika [[Special:Contributions/$2|$2]] ([[User talk:$2|dyskusja]]). Autor przywróconej wersji to [[User:$1|$1]].",
     	"revertpage-nouser": "Wycofano edycje ukrytego użytkownika. Autor przywróconej wersji to {{GENDER:$1|[[User:$1|$1]]}}.",
     	"rollback-success": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2.",
    +	"rollback-success-notify": "Wycofano edycje użytkownika $1;\nprzywrócono ostatnią wersję autorstwa $2. [$3 Pokaż zmiany]",
     	"sessionfailure-title": "Błąd sesji",
     	"sessionfailure": "Wystąpił problem z weryfikacją zalogowania.\nPolecenie zostało anulowane, aby uniknąć przechwycenia sesji.\nNaciśnij „wstecz” w przeglądarce, przeładuj stronę, po czym ponownie wydaj polecenie.",
     	"changecontentmodel": "Edycja modelu zawartości strony",
    @@ -2067,6 +2081,7 @@
     	"changecontentmodel-success-text": "Typ zawartości [[:$1]] został zmieniony.",
     	"changecontentmodel-cannot-convert": "Zawartość [[:$1]] nie może być przekształcona do typu $2.",
     	"changecontentmodel-nodirectediting": "Model zawartości $1 nie obsługuje bezpośredniego edytowania",
    +	"changecontentmodel-emptymodels-text": "Zawartość [[:$1]] nie może być przekształcona do żadnego typu.",
     	"log-name-contentmodel": "Rejestr zmian modelu zawartości",
     	"log-description-contentmodel": "Wydarzenia związane z modelami zawartości stron",
     	"logentry-contentmodel-change": "$1 {{GENDER:$2|zmienił|zmieniła|zmienił(a)}} model zawartości strony $3 z „$4” na „$5”",
    @@ -2199,6 +2214,7 @@
     	"sp-contributions-username": "Adres IP lub nazwa użytkownika:",
     	"sp-contributions-toponly": "Pokaż wyłącznie ostatnie wersje",
     	"sp-contributions-newonly": "Pokazuj tylko edycje tworzące nową stronę",
    +	"sp-contributions-hideminor": "Ukryj drobne zmiany",
     	"sp-contributions-submit": "Szukaj",
     	"whatlinkshere": "Linkujące",
     	"whatlinkshere-title": "Strony linkujące do „$1”",
    @@ -2647,7 +2663,7 @@
     	"rcpatroldisabled": "Wyłączono funkcję patrolowania na stronie ostatnich zmian",
     	"rcpatroldisabledtext": "Patrolowanie ostatnich zmian jest obecnie wyłączone.",
     	"markedaspatrollederror": "Nie można oznaczyć jako „sprawdzone”",
    -	"markedaspatrollederrortext": "Musisz wybrać wersję żeby oznaczyć ją jako „sprawdzoną”.",
    +	"markedaspatrollederrortext": "Musisz wybrać wersję, żeby oznaczyć ją jako „sprawdzoną”.",
     	"markedaspatrollederror-noautopatrol": "Nie masz uprawnień wymaganych do oznaczania swoich edycji jako „sprawdzone”.",
     	"markedaspatrollednotify": "Ta zmiana na stronie «$1» została oznaczona jako sprawdzona.",
     	"markedaspatrollederrornotify": "Oznaczenie strony jako sprawdzonej nie powiodło się.",
    @@ -3135,7 +3151,7 @@
     	"size-megabytes": "$1&nbsp;MB",
     	"size-gigabytes": "$1&nbsp;GB",
     	"lag-warn-normal": "Zmiany nowsze niż $1 {{PLURAL:$1|sekunda|sekundy|sekund}} mogą nie być widoczne na tej liście.",
    -	"lag-warn-high": "Z powodu dużego obciążenia serwerów bazy danych, zmiany nowsze niż $1 {{PLURAL:$1|sekunda|sekundy|sekund}} mogą nie być widoczne na tej liście.",
    +	"lag-warn-high": "Z powodu dużego obciążenia serwerów bazy danych zmiany nowsze niż $1 {{PLURAL:$1|sekunda|sekundy|sekund}} mogą nie być widoczne na tej liście.",
     	"watchlistedit-normal-title": "Edytuj listę obserwowanych stron",
     	"watchlistedit-normal-legend": "Usuń strony z listy obserwowanych",
     	"watchlistedit-normal-explain": "Poniżej znajduje się lista obserwowanych przez Ciebie stron.\nAby usunąć stronę z listy zaznacz znajdujące się obok niej pole i naciśnij „{{int:Watchlistedit-normal-submit}}”.\nMożesz także skorzystać z [[Special:EditWatchlist/raw|tekstowego edytora listy obserwowanych]].",
    @@ -3463,7 +3479,7 @@
     	"log-name-managetags": "Rejestr zarządzania znacznikami",
     	"log-description-managetags": "Na tej stronie są wymienione zadania związane z zarządzaniem [[Special:Tags|znacznikami]]. Dziennik (log) zawiera tylko działania wykonane ręcznie przez administratora; znaczniki mogą być tworzone lub usuwane przez oprogramowanie wiki bez dodawania wpisów w dzienniku (logu).",
     	"logentry-managetags-create": "$1 {{GENDER:$2|utworzył|utworzyła}} znacznik „$4”",
    -	"logentry-managetags-delete": "$1 {{GENDER:$2|usunął|usunęła}} znacznik \"$4\" (usunięty z $5 {{PLURAL:$5|wersji lub wpisu dziennika|wersji i/lub wpisów dziennika}})",
    +	"logentry-managetags-delete": "$1 {{GENDER:$2|usunął|usunęła}} znacznik „$4” (usunięty z $5 {{PLURAL:$5|wersji lub wpisu dziennika|wersji i/lub wpisów dziennika}})",
     	"logentry-managetags-activate": "$1 aktywował{{GENDER:$2||a}} znacznik \"$4\" do korzystania przez uczestników i boty",
     	"logentry-managetags-deactivate": "$1 wyłączył{{GENDER:$2||a}} znacznik \"$4\" z korzystania przez uczestników i boty",
     	"log-name-tag": "Rejestr znaczników",
    @@ -3661,42 +3677,64 @@
     	"mw-widgets-dateinput-placeholder-month": "RRRR-MM",
     	"mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje",
     	"mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
    -	"api-error-blacklisted": "Wybierz inny, opisowy tytuł.",
     	"sessionmanager-tie": "Nie można łączyć kilku rodzajów uwierzytelniania dla zapytania: $1.",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sesje na podstawie cookie",
     	"sessionprovider-nocookies": "Być może cookies są wyłączone. Upewnij się, że masz włączone cookies i zacznij od nowa.",
     	"randomrootpage": "Losowa strona (bez podstron)",
     	"log-action-filter-block": "Rodzaj blokady:",
    +	"log-action-filter-contentmodel": "Typ modyfikacji modelu zawartości:",
     	"log-action-filter-delete": "Rodzaj usunięcia:",
    +	"log-action-filter-import": "Typ importu:",
    +	"log-action-filter-managetags": "Typ działania zarządzania znacznikami:",
    +	"log-action-filter-move": "Typ przeniesienia:",
    +	"log-action-filter-newusers": "Typ utworzenia konta:",
     	"log-action-filter-patrol": "Rodzaj patrolu:",
     	"log-action-filter-protect": "Rodzaj zabezpieczenia:",
    -	"log-action-filter-rights": "Typ zmiany uprawień",
    +	"log-action-filter-rights": "Typ zmiany uprawień:",
    +	"log-action-filter-suppress": "Typ ukrycia:",
     	"log-action-filter-upload": "Rodzaj przesłanych:",
     	"log-action-filter-all": "Wszystkie",
     	"log-action-filter-block-block": "Zablokowanie",
     	"log-action-filter-block-reblock": "Zmiana blokady",
     	"log-action-filter-block-unblock": "Odblokowanie",
    +	"log-action-filter-contentmodel-change": "Zmiana modelu zawartości",
    +	"log-action-filter-contentmodel-new": "Utworzenie strony z niestandardowym modelem zawartości",
     	"log-action-filter-delete-delete": "Usunięcie strony",
     	"log-action-filter-delete-restore": "Odtworzenie strony",
     	"log-action-filter-delete-event": "Usunięcie wpisu rejestru",
     	"log-action-filter-delete-revision": "Usunięcie wersji",
     	"log-action-filter-import-interwiki": "Import transwiki",
    +	"log-action-filter-import-upload": "Import poprzez przesłanie XML",
     	"log-action-filter-managetags-create": "Utworzenie znacznika",
     	"log-action-filter-managetags-delete": "Usunięcie znacznika",
     	"log-action-filter-managetags-activate": "Aktywacja znacznika",
     	"log-action-filter-managetags-deactivate": "Deaktywacja znacznika",
    +	"log-action-filter-move-move": "Przeniesienie bez nadpisania przekierowania",
    +	"log-action-filter-move-move_redir": "Przeniesienie ponad przekierowaniem",
    +	"log-action-filter-newusers-create": "Utworzenie przez anonimowego użytkownika",
    +	"log-action-filter-newusers-create2": "Utworzenie przez zarejestrowanego użytkownika",
    +	"log-action-filter-newusers-autocreate": "Automatyczne utworzenie",
    +	"log-action-filter-newusers-byemail": "Utworzenie z hasłem przesłanym e-mailem",
     	"log-action-filter-patrol-patrol": "Ręczny",
     	"log-action-filter-patrol-autopatrol": "Automatyczny",
     	"log-action-filter-protect-protect": "Zabezpieczenie",
     	"log-action-filter-protect-modify": "Zmiana zabezpieczenia",
     	"log-action-filter-protect-unprotect": "Odbezpieczenie",
    +	"log-action-filter-protect-move_prot": "Przeniesienie zabezpieczenia",
     	"log-action-filter-rights-rights": "Ręczna zmiana",
     	"log-action-filter-rights-autopromote": "Automatyczna zmiana",
    +	"log-action-filter-suppress-event": "Ukrycie wpisu rejestru",
    +	"log-action-filter-suppress-revision": "Ukrycie wersji",
    +	"log-action-filter-suppress-delete": "Ukrycie strony",
    +	"log-action-filter-suppress-block": "Ukrycie użytkownika poprzez blokadę",
    +	"log-action-filter-suppress-reblock": "Ukrycie użytkownika poprzez ponowną blokadę",
     	"log-action-filter-upload-upload": "Nowe przesłane",
     	"log-action-filter-upload-overwrite": "Przesłane ponownie",
     	"authmanager-create-disabled": "Utworzenie konta jest wyłączone.",
     	"authmanager-create-from-login": "Aby utworzyć konto, wypełnij poniższe pola.",
     	"authmanager-authplugin-setpass-failed-title": "Zmiana hasła nie powiodła się",
    +	"authmanager-authplugin-setpass-failed-message": "Wtyczka do uwierzytelniania uniemożliwiła zmianę hasła.",
    +	"authmanager-authplugin-create-fail": "Wtyczka do uwierzytelniania uniemożliwiła utworzenie konta.",
     	"authmanager-authplugin-setpass-denied": "Wtyczka uwierzytelniania nie zezwala na zmianę haseł.",
     	"authmanager-authplugin-setpass-bad-domain": "Niepoprawna domena.",
     	"authmanager-autocreate-noperm": "Automatyczne tworzenie konta jest niedozwolone.",
    @@ -3704,13 +3742,16 @@
     	"authmanager-userdoesnotexist": "Konto użytkownika „$1” nie jest zarejestrowane.",
     	"authmanager-username-help": "Nazwa użytkownika dla uwierzytelniania.",
     	"authmanager-password-help": "Hasło do uwierzytelniania.",
    +	"authmanager-domain-help": "Domena uwierzytelniania zewnętrznego.",
     	"authmanager-retype-help": "Ponownie hasło w celu potwierdzenia.",
     	"authmanager-email-label": "E-mail",
     	"authmanager-email-help": "Adres e‐mail",
    +	"authmanager-realname-label": "Imię i nazwisko",
     	"authmanager-realname-help": "Prawdziwe imię i nazwisko użytkownika",
     	"authmanager-provider-password": "Uwierzytelnianie oparte na haśle",
     	"authmanager-provider-password-domain": "Uwierzytelnianie na podstawie hasła i domeny",
     	"authmanager-provider-temporarypassword": "Hasło tymczasowe",
    +	"authprovider-confirmlink-success-line": "$1: Połączono.",
     	"authprovider-resetpass-skip-label": "Pomiń",
     	"authprovider-resetpass-skip-help": "Pomiń resetowanie hasła.",
     	"authform-newtoken": "Brakujący token. $1",
    @@ -3719,9 +3760,15 @@
     	"specialpage-securitylevel-not-allowed": "Niestety, nie możesz korzystać z tej strony, ponieważ twoja tożsamość nie może zostać zweryfikowana.",
     	"authpage-cannot-login-continue": "Nie można kontynuować logowania. Sesja najprawdopodobniej wygasła.",
     	"authpage-cannot-create": "Nie można rozpocząć tworzenie konta.",
    +	"authpage-cannot-create-continue": "Nie można kontynuować tworzenia konta. Twoja sesja najprawdopodobniej wygasła.",
     	"cannotauth-not-allowed-title": "Brak dostępu",
     	"cannotauth-not-allowed": "Nie masz uprawnień, aby skorzystać z tej strony",
     	"changecredentials-submit": "Zmień poświadczenia",
     	"removecredentials-submit": "Usuń poświadczenia",
    -	"credentialsform-account": "Nazwa konta:"
    +	"credentialsform-account": "Nazwa konta:",
    +	"linkaccounts": "Połącz konta",
    +	"linkaccounts-success-text": "Konto zostało połączone.",
    +	"linkaccounts-submit": "Połącz konta",
    +	"unlinkaccounts": "Odłącz konta",
    +	"unlinkaccounts-success": "Konta zostały odłączone."
     }
    diff --git a/languages/i18n/pnb.json b/languages/i18n/pnb.json
    index f7c2aa3f06..21272c157a 100644
    --- a/languages/i18n/pnb.json
    +++ b/languages/i18n/pnb.json
    @@ -129,10 +129,10 @@
     	"period-am": "AM",
     	"period-pm": "PM",
     	"pagecategories": "{{PLURAL:$1|گٹھ|گٹھیاں}}",
    -	"category_header": "\"$1\" کیٹاگری وچ صفے",
    -	"subcategories": "تھلے آلی کیٹاگری",
    -	"category-media-header": "اس \"$1\" کیٹاگری وچ میڈيا",
    -	"category-empty": "''اس کیٹاگری وچ کوئی صفحہ یا میڈیا موجود نہیں۔''",
    +	"category_header": "\"$1\" گٹھیاں وچ صفے",
    +	"subcategories": "تھلے آلی گٹھ",
    +	"category-media-header": "اس \"$1\" گٹھ وچ میڈيا",
    +	"category-empty": "''اس گٹھ وچ کوئی صفحہ یا میڈیا نئی۔''",
     	"hidden-categories": "{{PLURAL:$1|چھپی گٹھ|چھپی گٹھیاں}}",
     	"hidden-category-category": "لکائیاں گٹھاں",
     	"category-subcat-count": "{{PLURAL:$2|اس گٹھ دی صرف اکو تھلے آلی نکی گٹھ اے|اس گٹھ دیاں 2$ چوں   {{PLURAL:$1|نکی گٹھ|$1 نکی گٹھیاں}}}} نیں۔",
    @@ -164,7 +164,7 @@
     	"faq": "FAQ",
     	"faqpage": "Project:FAQ",
     	"actions": "کم",
    -	"namespaces": "ناواں دی جگہ:",
    +	"namespaces": "ناواں دی تھاں:",
     	"variants": "قسماں",
     	"navigation-heading": "کھوج پتر",
     	"errorpagetitle": "مسئلہ",
    @@ -219,7 +219,7 @@
     	"redirectedfrom": "(لیایا گیا $1)",
     	"redirectpagesub": "صفحہ ریڈائریکٹ کرو",
     	"redirectto": "اگے کرو:",
    -	"lastmodifiedat": "This page was last modified on $1, at $2.\nاس صفحے نوں آخری آری $1 تریخ نوں $2 وجے بدلیا گیا۔",
    +	"lastmodifiedat": "اس صفحے نوں آخری آری $1 تریخ نوں $2 وجے بدلیا گیا۔",
     	"viewcount": "اس صفحے نوں {{PLURAL:$1|اک واری|$1 واری}} کھولیا گیا اے۔",
     	"protectedpage": "بجایا صفحہ",
     	"jumpto": "جاؤ:",
    @@ -275,6 +275,7 @@
     	"site-atom-feed": "$1 Atom Feed",
     	"page-rss-feed": "\"$1\" RSS Feed",
     	"page-atom-feed": "\"$1\" Atom Feed",
    +	"feed-atom": "ایٹم",
     	"red-link-title": "$1 (ایہ صفہ حلے تک نئیں بنایا گیا)",
     	"sort-descending": "ونڈ تھلے ول",
     	"sort-ascending": "ونڈ اتے ول",
    @@ -287,7 +288,8 @@
     	"nstab-mediawiki": "سنیعا",
     	"nstab-template": "سانچہ",
     	"nstab-help": "مدد آلا صفہ",
    -	"nstab-category": "کیٹاگری",
    +	"nstab-category": "Ú¯Ù¹Ú¾",
    +	"mainpage-nstab": "پہلا صفہ",
     	"nosuchaction": "کوئی ایسا کم نئیں",
     	"nosuchactiontext": "یو آر ایل نال دسیا کم نئیں ہوےکدا۔\nتساں ہوسکدا اے یو ار ایل غلط ٹائپ کردتی ہووے۔\nایہ اک بگ نوں وی دسدا اے سوفٹویر چ جینوں {{سائٹناں}} نے ورتیا",
     	"nosuchspecialpage": "انج دا کوئی خاص صفحہ نئیں",
    @@ -345,7 +347,7 @@
     	"userlogin-yourpassword": "کنجی",
     	"userlogin-yourpassword-ph": "کنجی پاؤ",
     	"createacct-yourpassword-ph": "کنجی پاؤ",
    -	"yourpasswordagain": "کنجی دوبارہ لکھو:",
    +	"yourpasswordagain": "کنجی فیر لکھو:",
     	"createacct-yourpasswordagain": "کنجی پکی کرو",
     	"createacct-yourpasswordagain-ph": "کنجی فیر پاؤ",
     	"remembermypassword": "اس براؤزر تے میرا ورتن ناں یاد رکھو ($1 {{PLURAL:$1|دن|دناں}} واسطے)",
    @@ -439,7 +441,7 @@
     	"resetpass_forbidden": "کنجی بدلی نئیں جاسکدی",
     	"resetpass-no-info": "تسی لاگ ان ہوکے ای اس صفحے نوں ویکھ سکدے او۔",
     	"resetpass-submit-loggedin": "کنجی بدلو",
    -	"resetpass-submit-cancel": "ختم",
    +	"resetpass-submit-cancel": "مکاؤ",
     	"resetpass-wrong-oldpass": "غلط عارضی یا ہلے دی کنجی۔\nتساں نے شاید اپنی کنجی بدل لئی ہوۓ یا عارضی کنجی دی درخواست کیتی ہوۓ۔",
     	"resetpass-temp-password": "عارضی کنجی:",
     	"passwordreset": "کنجی فیر بناؤ",
    @@ -475,7 +477,9 @@
     	"headline_tip": "دوسرے درجے دی سرخی",
     	"nowiki_sample": "فارمیٹ نہ ہوئی لکھائی ایتھے پاؤ",
     	"nowiki_tip": "وکی فارمیٹ رھندیو۔",
    +	"image_sample": "Example.jpg",
     	"image_tip": "وچ مورت لگاؤ",
    +	"media_sample": "Example.ogg",
     	"media_tip": "فائل دا جوڑ",
     	"sig_tip": "تواڈے دستخط ویلے دے نال",
     	"hr_tip": "سدھی لکیر",
    @@ -989,6 +993,7 @@
     	"recentchanges-label-plusminus": "صفے دا ناپ اینے بائٹاں نال بدلیا گیا",
     	"recentchanges-legend-heading": "<strong>وات:</strong>",
     	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (ایہ وی ویکھو [[Special:NewPages|نویں صفیاں دی لسٹ]])",
    +	"recentchanges-legend-plusminus": "(<em>±123</em>)",
     	"rcnotefrom": "ہلے تک '''$2''' توں '''$1''' تبدیلیاں تھلے دتیاں گئیاں نیں۔",
     	"rclistfrom": "$3 $2 توں ہونے آلیاں نویاں تبدیلیاں وکھاؤ",
     	"rcshowhideminor": "$1 معمولی تبدیلیاں",
    @@ -1225,6 +1230,7 @@
     	"uploadnewversion-linktext": "اس فائل دا نوا ورژن چھڑھاؤ",
     	"shared-repo-from": "$1 توں",
     	"shared-repo": "اک سانجی ریپوزیٹری",
    +	"shared-repo-name-wikimediacommons": "وکیمیڈیا کامنز",
     	"upload-disallowed-here": "تسیں ایس فائل تے نہیں لکھ سکدے",
     	"filerevert": "$1 واپس",
     	"filerevert-legend": "فائل پچھلی حالت چ لے جاؤ",
    @@ -1609,6 +1615,7 @@
     	"contributions": " $1 ورتن آلے دا حصہ",
     	"contributions-title": "$1 دے کم",
     	"mycontris": "میرے کم",
    +	"anoncontribs": "حصےداری",
     	"contribsub2": "$1 آستے ($2)",
     	"nocontribs": "ایناں ناپاں نال رلدیاں کوئی تبدیلیاں نئیں لبیاں۔",
     	"uctop": "(اتے)",
    @@ -1898,16 +1905,16 @@
     	"import-logentry-interwiki-detail": "$1 {{PLURAL:$1|ریوین|ریویناں }} $2 توں",
     	"javascripttest": "JavaScript ٹیسٹنگ",
     	"javascripttest-qunit-intro": "mediawiki.org تے [$1 ٹسٹنگ ڈوکومنٹیشن] ویکھو۔",
    -	"tooltip-pt-userpage": "میرا صفہ",
    +	"tooltip-pt-userpage": "{{GENDER:|میرا صفہ}}صفہ",
     	"tooltip-pt-anonuserpage": "ورتن صفہ IP  پتے لئی تسی تبدیل کر رۓ او۔۔۔",
    -	"tooltip-pt-mytalk": "میریاں گلاں",
    +	"tooltip-pt-mytalk": "{{GENDER:|Your}} گل بات",
     	"tooltip-pt-anontalk": "ایس IP  پتے دیاں تبدیلیاں تے گل بات",
     	"tooltip-pt-preferences": "میریاں تانگاں",
     	"tooltip-pt-watchlist": "او صفے جنہاں وچ تبدیلیاں تسی ویکھ رہے او",
     	"tooltip-pt-mycontris": "میرے کم",
     	"tooltip-pt-login": "ایہ بہتر اے کہ لاگ ان ہو جاؤ، فیر وی ایہ لازمی نئیں۔",
     	"tooltip-pt-logout": "باہر آؤ",
    -	"tooltip-pt-createaccount": "ایہ تواڈے لئی چنگا اے جے تسیں کھاتہ بناؤ تے لاگ ان ہوو؛ پر ایہ لازمی وی نئیں",
    +	"tooltip-pt-createaccount": "ایہ تواڈے لئی چنگا اے جے تسیں کھاتہ کھولو تے لاگ ان ہوو؛ پر ایہ لازمی وی نئیں",
     	"tooltip-ca-talk": "اس صفے بارے گل بات",
     	"tooltip-ca-edit": "اس صفے تے لکھو",
     	"tooltip-ca-addsection": "اس گل بات وچ حصہ لے لو۔",
    @@ -1925,7 +1932,7 @@
     	"tooltip-search-fulltext": "اس شبد نوں صفیاں چ لبو",
     	"tooltip-p-logo": "پہلا صفہ",
     	"tooltip-n-mainpage": "پہلے صفے نوں ویکھو",
    -	"tooltip-n-mainpage-description": "پہلے ورقے تے جاؤ",
    +	"tooltip-n-mainpage-description": "پہلے صفے تے جاؤ",
     	"tooltip-n-portal": "پربندھ بارے ، تسیں کی کر سکدے او تے کنج کھوج سکدے او",
     	"tooltip-n-currentevents": "موجودہ حالات تے پچھلیاں معلومات دیکھو",
     	"tooltip-n-recentchanges": "وکی تے نویاں تبدیلیاں۔",
    @@ -1935,7 +1942,7 @@
     	"tooltip-t-recentchangeslinked": "اس صفے توں جڑے صفیاں چ نویاں تبدیلیاں",
     	"tooltip-feed-rss": "RSS feed for this page",
     	"tooltip-feed-atom": "Atom feed for this page",
    -	"tooltip-t-contributions": "اس ورتن والے دے کم ویکھو",
    +	"tooltip-t-contributions": "اس ورتن والے دے کم ویکھو {{GENDER:$1|this user}}",
     	"tooltip-t-emailuser": "اس ورتن والے نو ای میل کرو",
     	"tooltip-t-upload": "فائل چڑھاؤ",
     	"tooltip-t-specialpages": "سارے خاص صفیاں دی اک لسٹ",
    @@ -1944,7 +1951,7 @@
     	"tooltip-ca-nstab-main": "مواد آلا صفہ ویکھو",
     	"tooltip-ca-nstab-user": "ورتن آلے دا صفہ ویکھو",
     	"tooltip-ca-nstab-media": "میڈیا آلا صفحہ ویکھو",
    -	"tooltip-ca-nstab-special": "ایہ اک خاص صفہ اے، تے ایہ صفہ آپے نئیں لکھ سکدے",
    +	"tooltip-ca-nstab-special": "ایہ اک خاص صفہ اے، تے ایہنوں لکھیا نئی جا سکدا۔",
     	"tooltip-ca-nstab-project": "وینت دا صفہ ویکھو",
     	"tooltip-ca-nstab-image": "فائل دا صفہ ویکھو",
     	"tooltip-ca-nstab-mediawiki": "پربندھ سنیعہ ویکھو",
    diff --git a/languages/i18n/ps.json b/languages/i18n/ps.json
    index 25d0bab3cb..f40ed82ef5 100644
    --- a/languages/i18n/ps.json
    +++ b/languages/i18n/ps.json
    @@ -489,7 +489,7 @@
     	"resetpass-temp-password": "لنډمهالی پټنوم:",
     	"resetpass-abort-generic": "پټنوم بدلون مو د يو شاتاړي لخوا لغوه شوی.",
     	"resetpass-expired": "ستاسې د پټنوم وخت پای ته رسېدلی. د ننوتلو لپاره لطفاً خپل ځانته يو نوی پټنوم وټاکئ.",
    -	"resetpass-expired-soft": "ستاسې د پټنوم وخت پای ته رسېدلی او بايد بياپرځای شي. لطفاً خپل ځانته يو نوی پټنوم همدا اوس وټاکئ او يا هم د وروسته پرځای کولو لپاره \"{{int:authprovider-resetpass-skip-label}}\" ټک ورکړئ.",
    +	"resetpass-expired-soft": "ستاسې د پټنوم وخت پای ته رسېدلی او بايد بياپرځای شي. لطفاً خپل ځان ته يو نوی پټنوم همدا اوس وټاکئ او يا هم د وروسته پرځای کولو لپاره \"{{int:authprovider-resetpass-skip-label}}\" ټک ورکړئ.",
     	"resetpass-validity-soft": "ستاسې پټنوم سم نه دی: $1\n\nلطفاً يو نوی پټنوم همدا اوس وټاکئ او يا هم د وروسته پر ځای کولو لپاره په  \"{{int:authprovider-resetpass-skip-label}}\" ټک ورکړئ.",
     	"passwordreset": "پټنوم بياپرځايول",
     	"passwordreset-text-one": "د برېښليک له لارې د لنډمهاله پټنوم د ترلاسه کولو لپاره دا فورمه ډکه کړئ.",
    @@ -538,7 +538,9 @@
     	"minoredit": "دا يو وړوکی سمون دی",
     	"watchthis": "همدا مخ کتل",
     	"savearticle": "مخ خوندي کول",
    +	"savechanges": "بدلونونه خوندي کول",
     	"publishpage": "مخ خپرول",
    +	"publishchanges": "بدلونونه خپرول",
     	"preview": "مخليدنه",
     	"showpreview": "مخليدنه",
     	"showdiff": "بدلونونه ښکاره کول",
    @@ -967,8 +969,8 @@
     	"rightslogtext": "دا د کارن رښتو د بدلونونو يو يادښت دی.",
     	"action-read": "همدا مخ لوستل",
     	"action-edit": "دا مخ سمول",
    -	"action-createpage": "مخونه جوړول",
    -	"action-createtalk": "د خبرو اترو مخونه جوړول",
    +	"action-createpage": "همدا مخ جوړول",
    +	"action-createtalk": "د خبرو اترو دا مخ جوړول",
     	"action-createaccount": "دا گڼون جوړول",
     	"action-history": "د دې مخ پېښليک کتل",
     	"action-minoredit": "دا سمون وړوکی په نخښه کول",
    diff --git a/languages/i18n/pt-br.json b/languages/i18n/pt-br.json
    index 0c864b5b76..73381f0e8c 100644
    --- a/languages/i18n/pt-br.json
    +++ b/languages/i18n/pt-br.json
    @@ -96,7 +96,9 @@
     			"Luk3",
     			"Ryuu",
     			"Luan",
    -			"Anderson Costa"
    +			"Anderson Costa",
    +			"LucyDiniz",
    +			"Tusca"
     		]
     	},
     	"tog-underline": "Sublinhar links:",
    @@ -542,7 +544,7 @@
     	"noname": "Você não colocou um nome de usuário válido.",
     	"loginsuccesstitle": "Autenticado",
     	"loginsuccess": "'''Agora você está {{GENDER:autenticado|autenticada}} ao wiki {{SITENAME}} como \"$1\"'''.",
    -	"nosuchuser": "Não existe nenhum usuário com o nome \"$1\".\nOs nomes de usuário são sensíveis a letras maiúsculas.\nVerifique o que foi digitado ou [[Special:CreateAccount|crie uma nova conta]].",
    +	"nosuchuser": "Não existe nenhum usuário com o nome \"$1\".\nOs nomes de usuário são sensíveis a letras maiúsculas.\nVerifique se digitou corretamente ou [[Special:CreateAccount|crie uma nova conta]].",
     	"nosuchusershort": "Não existe um usuário com o nome \"$1\". Verifique o nome que introduziu.",
     	"nouserspecified": "Você precisa especificar um nome de usuário.",
     	"login-userblocked": "Este usuário está bloqueado. Entrada proibida.",
    @@ -583,6 +585,7 @@
     	"createacct-another-realname-tip": "O nome verdadeiro é opcional.\nSe você optar por fornecê-lo, este nome será utilizado para dar ao usuário a atribuição de seu trabalho.",
     	"pt-login": "Entrar",
     	"pt-login-button": "Entrar",
    +	"pt-login-continue-button": "Continuar conexão",
     	"pt-createaccount": "Crie uma conta",
     	"pt-userlogout": "Sair",
     	"php-mail-error-unknown": "Erro desconhecido na função mail() do PHP",
    @@ -629,6 +632,7 @@
     	"botpasswords-invalid-name": "O nome de usuário especificado não contém o separador de senha de robô (\"$1\").",
     	"botpasswords-not-exist": "O usuário \"$1\" não possui uma senha de robô \"$2\".",
     	"resetpass_forbidden": "As senhas não podem ser alteradas",
    +	"resetpass_forbidden-reason": "Senhas não podem ser alteradas: $1",
     	"resetpass-no-info": "Você precisa estar autenticado para acessar esta página diretamente.",
     	"resetpass-submit-loggedin": "Alterar senha",
     	"resetpass-submit-cancel": "Cancelar",
    @@ -658,6 +662,7 @@
     	"passwordreset-emailsentusername": "Se houver um endereço de email associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua senha.",
     	"passwordreset-emailsent-capture": "Foi enviado um e-mail de lembrete, que é mostrado abaixo.",
     	"passwordreset-emailerror-capture": "Foi gerado um e-mail de recuperação da senha, conforme mostrado abaixo, mas o envio {{GENDER:$2|ao usuário|à usuária}} falhou. $1",
    +	"passwordreset-emailsent-capture2": "A redefinição da senha {{PLURAL:$1|do e-mail|dos e-mails}} foi enviada. {{PLURAL:$1|O nome de usuário e senha|A lista de nomes de usuário e senhas}} encontram-se a seguir.",
     	"changeemail": "Alterar ou remover endereço de email",
     	"changeemail-header": "Preencha este formulário para alterar seu endereço de e-mail. Se você gostaria de remover a associação de qualquer endereço de e-mail da sua conta, deixe o novo endereço de email em branco quando enviar o formulário.",
     	"changeemail-passwordrequired": "Você terá que digitar sua senha para confirmar esta mudança.",
    @@ -1253,9 +1258,10 @@
     	"right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
     	"right-sendemail": "Enviar email a outros usuários",
     	"right-passwordreset": "Ver todos os e-mails de reposição de senhas",
    -	"right-managechangetags": "Criar e apagar [[Special:Tags|tags]] na base de dados",
    +	"right-managechangetags": "Criar e (des)ativar [[Special:Tags|tags]]",
     	"right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações de alguém",
     	"right-changetags": "Adicionar e remover [[Special:Tags|etiquetas]] arbitrárias em revisões e ''logs'' individuais",
    +	"right-deletechangetags": "Deletar [[Special:Tags|tags]] da base de dados.",
     	"grant-generic": "conjunto de direitos \"$1\"",
     	"grant-group-page-interaction": "Interagir com páginas",
     	"grant-group-file-interaction": "Interagir com multimídia",
    @@ -1333,9 +1339,10 @@
     	"action-viewmyprivateinfo": "veja suas informações privadas",
     	"action-editmyprivateinfo": "modifique suas informações privadas",
     	"action-editcontentmodel": "editar o conteudo do modelo de uma pagina",
    -	"action-managechangetags": "Criar e apagar etiquetas da base de dados",
    +	"action-managechangetags": "Criar e (des)ativar marcações",
     	"action-applychangetags": "aplicar etiquetas juntamente com suas alterações",
     	"action-changetags": "adicionar e remover etiquetas arbitrárias em revisões e ''logs'' individuais",
    +	"action-deletechangetags": "deletar marcações da base de dados",
     	"nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
     	"enhancedrc-since-last-visit": "$1 {{PLURAL:$1|desde a última visita}}",
     	"enhancedrc-history": "histórico",
    @@ -3584,6 +3591,5 @@
     	"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
     	"mw-widgets-titleinput-description-new-page": "a página ainda não existe",
     	"mw-widgets-titleinput-description-redirect": "redirecionar para $1",
    -	"api-error-blacklisted": "Por favor, escolha  um título descritivo diferente.",
     	"randomrootpage": "Página raiz aleatória"
     }
    diff --git a/languages/i18n/pt.json b/languages/i18n/pt.json
    index ed19d0b0b0..e9ccb9aeb3 100644
    --- a/languages/i18n/pt.json
    +++ b/languages/i18n/pt.json
    @@ -114,7 +114,7 @@
     	"tog-ccmeonemails": "Enviar-me cópias das mensagens por correio electrónico que eu enviar a outros utilizadores",
     	"tog-diffonly": "Não mostrar o conteúdo da página ao comparar duas edições",
     	"tog-showhiddencats": "Mostrar categorias ocultas",
    -	"tog-norollbackdiff": "Omitir diferenças depois de reverter edições em bloco",
    +	"tog-norollbackdiff": "Ocultar diferenças depois de reverter edições em bloco",
     	"tog-useeditwarning": "Avisar-me ao abandonar uma página editada sem gravar as alterações.",
     	"tog-prefershttps": "Usar sempre uma ligação segura enquanto tiver sessão iniciada",
     	"underline-always": "Sempre",
    @@ -420,7 +420,7 @@
     	"viewyourtext": "Pode ver e copiar o código-fonte das <strong>suas edições</strong> desta página.",
     	"protectedinterface": "Esta página fornece o texto da interface ao software, e está protegida para prevenir abusos.",
     	"editinginterface": "<strong>Aviso:</strong> Está a editar uma página usada para fornecer texto de interface ao software. Alterações a esta página afetarão a aparência da interface de utilizador para os outros utilizadores.",
    -	"translateinterface": "Para traduções, considere utilizar a [https://translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projeto destinado à tradução do MediaWiki.",
    +	"translateinterface": "Para adicionar ou alterar traduções para todas as wikis, considere utilizar a [https://translatewiki.net/wiki/Main_Page?setlang=pt translatewiki.net], um projeto destinado à tradução do MediaWiki.",
     	"cascadeprotected": "Esta página foi protegida contra edições por estar transcluída {{PLURAL:$1|na página listada|nas páginas listadas}} a seguir, ({{PLURAL:$1|página essa que está protegida|páginas essas que estão protegidas}} com a opção de proteção \"em cascata\" ativada):\n$2",
     	"namespaceprotected": "Não tem permissão para editar páginas no domínio '''$1'''.",
     	"customcssprotected": "Não tem permissão para editar esta página de CSS porque esta contém as configurações pessoais de outro utilizador.",
    @@ -465,6 +465,7 @@
     	"password-change-forbidden": "Não pode alterar palavras-passe nesta wiki.",
     	"externaldberror": "Ocorreu um erro externo à base de dados durante a autenticação ou não lhe é permitido atualizar a sua conta externa.",
     	"login": "Entrar",
    +	"login-security": "Verificar a sua identidade",
     	"nav-login-createaccount": "Entrar / criar conta",
     	"userlogin": "Criar uma conta ou entrar",
     	"userloginnocreate": "Entrar",
    @@ -482,18 +483,22 @@
     	"userlogin-resetpassword-link": "Esqueceu-se da sua palavra-passe?",
     	"userlogin-helplink2": "Ajuda para iniciar sessão",
     	"userlogin-loggedin": "Já está {{GENDER:$1|autenticado|autenticada|autenticado}} com o nome $1.\nUse o formulário abaixo para iniciar sessão com outro nome.",
    +	"userlogin-reauth": "Deve iniciar novamente sessão para verificar se é {{GENDER:$1|$1}}.",
     	"userlogin-createanother": "Criar outra conta",
     	"createacct-emailrequired": "Endereço de correio eletrónico",
     	"createacct-emailoptional": "Endereço de correio eletrónico (opcional)",
     	"createacct-email-ph": "Digite o seu endereço de correio eletrónico",
     	"createacct-another-email-ph": "Digite o endereço de correio eletrónico",
     	"createaccountmail": "Usar uma palavra passe aleatória e temporária e enviar para o endereço de correio eletrónico especificado",
    +	"createaccountmail-help": "Pode ser utilizado para criar uma conta para outra pessoa sem saber a palavra-passe.",
     	"createacct-realname": "Nome verdadeiro (opcional)",
     	"createaccountreason": "Motivo:",
     	"createacct-reason": "Motivo",
     	"createacct-reason-ph": "Porque está a criar outra conta",
     	"createacct-submit": "Crie a sua conta",
     	"createacct-another-submit": "Criar conta",
    +	"createacct-continue-submit": "Continuar criação de conta",
    +	"createacct-another-continue-submit": "Continuar criação de conta",
     	"createacct-benefit-heading": "{{SITENAME}} é feito por pessoas como você.",
     	"createacct-benefit-body1": "{{PLURAL:$1|edição|edições}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
    @@ -510,7 +515,7 @@
     	"noname": "Não especificou um nome de utilizador válido.",
     	"loginsuccesstitle": "Autenticação bem sucedida",
     	"loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
    -	"nosuchuser": "Não existe nenhum utilizador com o nome \"$1\".\nOs nomes de utilizador são sensíveis à capitalização.\nVerifique a ortografia, ou [[Special:CreateAccount|crie uma nova conta]].",
    +	"nosuchuser": "Não existe nenhum utilizador com o nome \"$1\".\nOs nomes de utilizador são sensíveis às letras maiúsculas e minúsculas.\nVerifique a ortografia, ou [[Special:CreateAccount|crie uma nova conta]].",
     	"nosuchusershort": "Não existe um utilizador com o nome \"$1\". Verifique o nome que introduziu.",
     	"nouserspecified": "Precisa de especificar um nome de utilizador.",
     	"login-userblocked": "Este utilizador está bloqueado. Não é permitido o acesso.",
    @@ -551,6 +556,7 @@
     	"createacct-another-realname-tip": "O fornecimento do nome verdadeiro é opcional.\nSe optar por revelá-lo, ele será utilizado para atribuir-lhe crédito pelo seu trabalho.",
     	"pt-login": "Entrar",
     	"pt-login-button": "Entrar",
    +	"pt-login-continue-button": "Continuar o início de sessão",
     	"pt-createaccount": "Criar uma conta",
     	"pt-userlogout": "Sair",
     	"php-mail-error-unknown": "Erro desconhecido na função mail() do PHP",
    @@ -594,6 +600,7 @@
     	"botpasswords-newpassword": "A nova palavra-passe para iniciar sessão com <strong>$1</strong> é <strong>$2</strong>. Por favor, recorde-se dela para futura referência.</em>",
     	"botpasswords-no-provider": "BotPasswordsSessionProvider não está disponível.",
     	"resetpass_forbidden": "Não é possível alterar palavras-passe",
    +	"resetpass_forbidden-reason": "As palavras-passe não podem ser alteradas: $1",
     	"resetpass-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
     	"resetpass-submit-loggedin": "Alterar palavra-passe",
     	"resetpass-submit-cancel": "Cancelar",
    @@ -623,6 +630,8 @@
     	"passwordreset-emailsentusername": "Se houver um endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua palavra-passe.",
     	"passwordreset-emailsent-capture": "Foi enviado um correio eletrónico para recuperação da palavra-passe, que é mostrado abaixo.",
     	"passwordreset-emailerror-capture": "Foi gerado um correio eletrónico para redefinição da palavra-passe, mostrado abaixo, mas o seu envio para {{GENDER:$2|o utilizador|a utilizadora}} falhou: $1",
    +	"passwordreset-invalideamil": "Correio eletrónico inválido",
    +	"passwordreset-nodata": "Não foram fornecidos nome de utilizador(a) nem endereço de correio eletrónico",
     	"changeemail": "Alterar ou remover o endereço de correio eletrónico",
     	"changeemail-header": "Complete este formulário para alterar o seu endereço de correio eletrónico. Se quer eliminar a associação de qualquer endereço de correio eletrónico com a sua conta, deixe em branco o novo endereço de correio eletrónico ao submeter o formulário.",
     	"changeemail-passwordrequired": "Necessita de introduzir a sua palavra-passe para confirmar esta alteração.",
    @@ -666,7 +675,9 @@
     	"minoredit": "Marcar como edição menor",
     	"watchthis": "Vigiar esta página",
     	"savearticle": "Gravar página",
    +	"savechanges": "Gravar alterações",
     	"publishpage": "Publicar página",
    +	"publishchanges": "Publicar alterações",
     	"preview": "Antevisão",
     	"showpreview": "Antever resultado",
     	"showdiff": "Mostrar alterações",
    @@ -702,7 +713,7 @@
     	"userpage-userdoesnotexist": "A conta \"<nowiki>$1</nowiki>\" não se encontra registada.\nVerifique se deseja realmente criar ou editar esta página, por favor.",
     	"userpage-userdoesnotexist-view": "A conta de utilizador \"$1\" não está registada.",
     	"blocked-notice-logextract": "Este utilizador está bloqueado.\nPara referência, o último registo de bloqueio é apresentado abaixo:",
    -	"clearyourcache": "'''Nota:''' Após gravar, terá de limpar a ''cache'' do seu navegador para ver as alterações.\n*'''Firefox / Safari:''' Pressione ''Shift'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' no Mac)\n*'''Google Chrome:''' Pressione ''Ctrl-Shift-R'' (''⌘-Shift-R'' no Mac)\n*'''Internet Explorer:''' Pressione ''Ctrl'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5''\n*'''Opera:''' Limpe a ''cache'' em ''Ferramentas → Preferências'' (''Tools → Preferences'')",
    +	"clearyourcache": "'''Nota:''' Após gravar, terá de limpar a ''cache'' do seu navegador para ver as alterações.\n*'''Firefox / Safari:''' Pressione ''Shift'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' no Mac)\n*'''Google Chrome:''' Pressione ''Ctrl-Shift-R'' (''⌘-Shift-R'' no Mac)\n*'''Internet Explorer:''' Pressione ''Ctrl'' enquanto clica ''Recarregar'', ou pressione ''Ctrl-F5''\n*'''Opera:''' Ir para <em>Menu → Configurações</em> (<em>Opera → Preferências</em> no Mac) e, em seguida, <em>Privacidade e segurança → Limpar dados de navegação → Imagens e ficheiros em cache</em>.",
     	"usercssyoucanpreview": "'''Dica:''' Use o botão \"{{int:showpreview}}\" para testar o seu novo CSS antes de gravar.",
     	"userjsyoucanpreview": "'''Dica:''' Use o botão \"{{int:showpreview}}\" para testar o seu novo JavaScript antes de gravar.",
     	"usercsspreview": "'''Lembre-se de que está apenas a antever o seu CSS particular.\nEste ainda não foi gravado!'''",
    @@ -1217,9 +1228,10 @@
     	"right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
     	"right-sendemail": "Enviar correio eletrónico a outros utilizadores",
     	"right-passwordreset": "Ver mensagens de redefinição da palavra-passe",
    -	"right-managechangetags": "Criar e eliminar [[Special:Tags|etiquetas]] da base de dados",
    +	"right-managechangetags": "Criar e (des)ativar [[Special:Tags|etiquetas]]",
     	"right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações",
     	"right-changetags": "Adicionar ou remover [[Special:Tags|etiquetas]] arbitrárias em revisões e entradas de registo individuais",
    +	"right-deletechangetags": "Eliminar [[Special:Tags|etiquetas]] da base de dados",
     	"grant-generic": "Conjunto de direitos \"$1\"",
     	"grant-group-page-interaction": "Interagir com páginas",
     	"grant-group-file-interaction": "Interagir com conteúdo multimédia",
    @@ -1256,8 +1268,8 @@
     	"rightslogtext": "Este é um registo de mudanças nos privilégios dos utilizadores.",
     	"action-read": "ler esta página",
     	"action-edit": "editar esta página",
    -	"action-createpage": "criar páginas",
    -	"action-createtalk": "criar páginas de discussão",
    +	"action-createpage": "criar esta página",
    +	"action-createtalk": "criar esta página de discussão",
     	"action-createaccount": "criar esta conta de utilizador",
     	"action-autocreateaccount": "criar automaticamente esta conta de utilizador externa",
     	"action-history": "ver histórico desta página",
    @@ -1297,7 +1309,7 @@
     	"action-viewmyprivateinfo": "ver a sua informação privada",
     	"action-editmyprivateinfo": "editar a sua informação privada",
     	"action-editcontentmodel": "editar o modelo de conteúdo de uma página",
    -	"action-managechangetags": "criar e eliminar etiquetas da base de dados",
    +	"action-managechangetags": "criar e (des)ativar etiquetas",
     	"action-applychangetags": "aplicar etiquetas juntamente com as suas alterações",
     	"action-changetags": "adicionar e remover etiquetas arbitrárias em revisões e entradas de registo individuais",
     	"nchanges": "$1 {{PLURAL:$1|alteração|alterações}}",
    @@ -1439,6 +1451,7 @@
     	"uploaded-script-svg": "Encontrou um elemento scriptable no ficheiro \"$1\" SVG carregado.",
     	"uploaded-hostile-svg": "Encontrou-se um código CSS não seguro no elemento de estilo do arquivo SVG carregado.",
     	"uploaded-event-handler-on-svg": "Não está permitido configurar atributos controladores de eventos <code>$1=\"$2\"</code> nos arquivos SVG.",
    +	"uploaded-image-filter-svg": "Foi encontrado um filtro de imagem com a URL: <code>&lt;$1 $2=\"$3\"&gt;</code> no ficheiro SVG carregado.",
     	"uploadscriptednamespace": "Este ficheiro SVG contém um domínio que não é permitido \"$1\".",
     	"uploadinvalidxml": "Erro detectado na análise do XML do ficheiro carregado.",
     	"uploadvirus": "O ficheiro contém um vírus! \nDetalhes: $1",
    @@ -1452,6 +1465,7 @@
     	"upload-options": "Opções de carregamento",
     	"watchthisupload": "Vigiar este ficheiro",
     	"filewasdeleted": "Um ficheiro com este nome foi carregado anteriormente e subsequentemente eliminado.\nDeverá verificar o $1 antes de voltar a enviá-lo.",
    +	"filename-thumb-name": "Isto parecer ser o título de uma miniatura. Por favor, não torne a carregar miniaturas na mesma wiki. Se este não é o caso, corrija o nome do ficheiro por um mais significativo, e que não possua o prefixo de miniatura.",
     	"filename-bad-prefix": "O nome do ficheiro que está a enviar começa por '''\"$1\"''', um nome pouco explicativo, normalmente originado de forma automática por câmaras digitais. Escolha um nome de ficheiro mais explicativo, por favor.",
     	"filename-prefix-blacklist": " #<!-- deixe esta linha exactamente como está --> <pre>\n# A sintaxe é a seguinte:\n#   * Tudo a partir do carácter \"#\" até ao fim da linha é um comentário\n#   * Todas as linhas não vazias são um prefixo para nomes de ficheiros típicos atribuídos automaticamente por câmaras digitais\nCIMG # Casio\nDSC_ # Nikon\nDSCF # Fuji\nDSCN # Nikon\nDUW # alguns telefones móveis\nIMG # genérico\nJD # Jenoptik\nMGP # Pentax\nPICT # misc.\n #</pre> <!-- deixe esta linha exactamente como está -->",
     	"upload-proto-error": "Protocolo incorreto",
    @@ -1463,6 +1477,7 @@
     	"upload-too-many-redirects": "A URL continha demasiados redirecionamentos",
     	"upload-http-error": "Ocorreu um erro HTTP: $1",
     	"upload-copy-upload-invalid-domain": "Não é possível realizar carregamentos remotos neste domínio.",
    +	"upload-foreign-cant-upload": "Esta wiki não está configurada para carregar ficheiros para o repositório externo solicitado.",
     	"upload-dialog-title": "Carregar ficheiro",
     	"upload-dialog-button-cancel": "Cancelar",
     	"upload-dialog-button-done": "Feito",
    @@ -2021,7 +2036,7 @@
     	"revertpage": "Foram revertidas as edições de [[Special:Contributions/$2|$2]] ([[User talk:$2|disc]]) para a última revisão de [[User:$1|$1]]",
     	"revertpage-nouser": "Foram revertidas as edições de um utilizador oculto para a última revisão de {{GENDER:$1|[[User:$1|$1]]}}",
     	"rollback-success": "Foram revertidas as edições de $1, com o conteúdo passando a estar como na última edição de $2.",
    -	"rollback-success-notify": "Foram revertidas as edições de $1 para a última revisão de $2. [$3 Mostrar alterações]",
    +	"rollback-success-notify": "Revertidas as edições de $1;\nMudança para a última revisão de $2. [$3 Mostrar alterações]",
     	"sessionfailure-title": "Erro de sessão",
     	"sessionfailure": "Foram detectados problemas com a sua sessão;\na operação foi cancelada como medida de proteção contra a interceptação de sessões.\nVolte à página anterior, recarregue-a e tente novamente.",
     	"changecontentmodel": "Editar o modelo de conteúdo de uma página",
    @@ -2167,6 +2182,7 @@
     	"sp-contributions-username": "Endereço de IP ou utilizador(a):",
     	"sp-contributions-toponly": "Mostrar apenas as edições mais recentes",
     	"sp-contributions-newonly": "Mostrar só edições que são criações de páginas",
    +	"sp-contributions-hideminor": "Ocultar edições menores",
     	"sp-contributions-submit": "Pesquisar",
     	"whatlinkshere": "Páginas afluentes",
     	"whatlinkshere-title": "Páginas com ligações para \"$1\"",
    @@ -2182,7 +2198,7 @@
     	"whatlinkshere-links": "← afluentes",
     	"whatlinkshere-hideredirs": "$1 redirecionamentos",
     	"whatlinkshere-hidetrans": "$1 transclusões",
    -	"whatlinkshere-hidelinks": "$1 links",
    +	"whatlinkshere-hidelinks": "$1 ligações",
     	"whatlinkshere-hideimages": "$1 links para arquivos",
     	"whatlinkshere-filters": "Filtros",
     	"whatlinkshere-submit": "Ir",
    @@ -2520,6 +2536,7 @@
     	"tooltip-ca-nstab-category": "Ver a página de categoria",
     	"tooltip-minoredit": "Marcar como edição menor",
     	"tooltip-save": "Gravar as alterações",
    +	"tooltip-publish": "Publicar as suas alterações",
     	"tooltip-preview": "Antever as suas alterações. Use antes de gravar, por favor!",
     	"tooltip-diff": "Mostrar alterações que fez a este texto.",
     	"tooltip-compareselectedversions": "Ver as diferenças entre as duas versões selecionadas desta página.",
    @@ -3047,6 +3064,10 @@
     	"confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
     	"confirmemail_invalidated": "Confirmação de endereço de correio eletrónico cancelada",
     	"invalidateemail": "Cancelar confirmação do correio eletrónico",
    +	"notificationemail_subject_changed": "O endereço de e-mail registrado em {{SITENAME}} foi alterado",
    +	"notificationemail_subject_removed": "O endereço de e-mail registrado em {{SITENAME}} foi eliminado",
    +	"notificationemail_body_changed": "Alguém, provavelmente você, a partir do endereço IP $1, alterou o endereço de e-mail da conta \"$2\" para \"$3\" em {{SITENAME}}.\n\nCaso não tenha alterado, contate imediatamente um administrador do sítio.",
    +	"notificationemail_body_removed": "Alguém, provavelmente você, a partir do endereço IP $1, eliminou o endereço de e-mail da conta \"$2\" em {{SITENAME}}.\n\nCaso não tenha alterado, contate imediatamente um administrador do sítio.",
     	"scarytranscludedisabled": "[Transclusão interwikis foi impossibilitada]",
     	"scarytranscludefailed": "[Não foi possível obter a predefinição a partir de $1]",
     	"scarytranscludefailed-httpstatus": "[Não foi possível obter a predefinição a partir de $1: HTTP $2]",
    @@ -3419,8 +3440,10 @@
     	"feedback-useragent": "Agente de utilizador:",
     	"searchsuggest-search": "Pesquisa",
     	"searchsuggest-containing": "contendo...",
    +	"api-error-autoblocked": "O seu endereço de IP foi bloqueado automaticamente, pois foi utilizado por um utilizador bloqueado.",
     	"api-error-badaccess-groups": "Não tem permissão para enviar ficheiros para esta wiki.",
     	"api-error-badtoken": "Erro interno: Chave incorrecta.",
    +	"api-error-blocked": "Foi bloqueado de editar.",
     	"api-error-copyuploaddisabled": "O carregamento de ficheiros por URL não foi possibilitado neste servidor.",
     	"api-error-duplicate": "Já {{PLURAL:$1|existia outro ficheiro|existiam outros ficheiro}} na wiki com o mesmo conteúdo.",
     	"api-error-duplicate-archive": "Já {{PLURAL:$1|estava outro ficheiro|estavam outros ficheiros}} no  site com o mesmo conteúdo, mas {{PLURAL:$1|foi|foram}} eliminados.",
    @@ -3576,7 +3599,6 @@
     	"mw-widgets-dateinput-placeholder-month": "AAAA-MM",
     	"mw-widgets-titleinput-description-new-page": "a página ainda não existe.",
     	"mw-widgets-titleinput-description-redirect": "redirecionar para $1",
    -	"api-error-blacklisted": "Escolha um título diferente e descritivo, por favor.",
     	"sessionprovider-generic": "Sessões $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sessões baseadas em cookie",
     	"sessionprovider-nocookies": "Os cookies podem estar desativados. Certifique-se de que os cookies estão ativados e inicie novamente.",
    @@ -3624,5 +3646,41 @@
     	"log-action-filter-suppress-event": "Supressão de registo",
     	"log-action-filter-suppress-delete": "Supressão de página",
     	"log-action-filter-upload-upload": "Novo carregamento",
    -	"log-action-filter-upload-overwrite": "Recarregar"
    +	"log-action-filter-upload-overwrite": "Recarregar",
    +	"authmanager-create-disabled": "A criação de contas está desativada.",
    +	"authmanager-create-from-login": "Para criar a sua conta, por favor, preencha os campos abaixo.",
    +	"authmanager-authplugin-setpass-bad-domain": "Domínio inválido.",
    +	"authmanager-userdoesnotexist": "A conta de utilizador(a) \"$1\" não está registada.",
    +	"authmanager-username-help": "Nome de utilizador(a) para autenticação.",
    +	"authmanager-password-help": "Palavra-passe para autenticação.",
    +	"authmanager-domain-help": "Domínio para a autenticação externa.",
    +	"authmanager-retype-help": "A palavra-passe novamente para confirmação.",
    +	"authmanager-email-label": "Correio eletrónico",
    +	"authmanager-email-help": "Endereço de correio eletrónico",
    +	"authmanager-realname-label": "Nome verdadeiro",
    +	"authmanager-realname-help": "Nome verdadeiro do(a) utilizador(a)",
    +	"authprovider-resetpass-skip-label": "Ignorar",
    +	"authpage-cannot-login": "Não é possível iniciar sessão.",
    +	"authpage-cannot-login-continue": "Não é possível continuar a iniciar sessão. A sua sessão pode ter expirado.",
    +	"authpage-cannot-create": "Não é possível iniciar a criação da conta.",
    +	"authpage-cannot-create-continue": "Não é possível continuar a criação da conta. A sua sessão pode ter expirado.",
    +	"cannotauth-not-allowed-title": "Permissão negada",
    +	"cannotauth-not-allowed": "Não possui permissão para utilizar esta página",
    +	"changecredentials": "Alterar credenciais",
    +	"changecredentials-submit": "Alterar credenciais",
    +	"changecredentials-invalidsubpage": "$1 não é um tipo de credencial válido.",
    +	"changecredentials-success": "As suas credenciais foram alteradas.",
    +	"removecredentials": "Remover credenciais",
    +	"removecredentials-submit": "Remover credenciais",
    +	"removecredentials-invalidsubpage": "$1 não é um tipo de credencial válido.",
    +	"removecredentials-success": "As suas credenciais foram removidas.",
    +	"credentialsform-provider": "Tipo de credenciais:",
    +	"credentialsform-account": "Nome da conta:",
    +	"cannotlink-no-provider-title": "Não existem contas vinculáveis",
    +	"cannotlink-no-provider": "Não existem contas vinculáveis",
    +	"linkaccounts": "Associar contas",
    +	"linkaccounts-success-text": "A conta foi associada.",
    +	"linkaccounts-submit": "Associar contas",
    +	"unlinkaccounts": "Desassociar contas",
    +	"unlinkaccounts-success": "A conta foi desassociada."
     }
    diff --git a/languages/i18n/qqq.json b/languages/i18n/qqq.json
    index dfe755ed43..c405ee5815 100644
    --- a/languages/i18n/qqq.json
    +++ b/languages/i18n/qqq.json
    @@ -838,8 +838,10 @@
     	"subject": "Used as label for input box in the EditPage page.\n\nSee also:\n* {{msg-mw|Summary}}\n{{Identical|Subject}}",
     	"minoredit": "Text above Save page button in editor\n\nSee also:\n* {{msg-mw|Minoredit}}\n* {{msg-mw|Accesskey-minoredit}}\n* {{msg-mw|Tooltip-minoredit}}",
     	"watchthis": "Text of checkbox above {{msg-mw|Showpreview}} button in editor.\n\nSee also:\n* {{msg-mw|Watchthis}}\n* {{msg-mw|Accesskey-watch}}\n* {{msg-mw|Tooltip-watch}}\n{{Identical|Watch this page}}",
    -	"savearticle": "Text on the Save page button. See also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nSee also:\n* {{msg-mw|Savearticle}}\n* {{msg-mw|Accesskey-save}}\n* {{msg-mw|Tooltip-save}}\n{{Identical|Save page}}",
    -	"publishpage": "Text on the button to save the changes to the page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish page}}",
    +	"savearticle": "Text on the button to create a new page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|savechanges}} for the label for the button when the page is being modified.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Save page}}",
    +	"savechanges": "Text on the button to save the changes to an existing page. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|savearticle}} for the label for the button when the page is being modified.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Save changes}}",
    +	"publishpage": "Text on the button to create a new page on a public wiki. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|publishchanges}} for the label for the button when the page is being modified.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish page}}",
    +	"publishchanges": "Text on the button to save the changes to an existing page on a public wiki. It should be an action which is short and makes clear that the effect is immediate and public.\n\nSee also {{msg-mw|showpreview}} and {{msg-mw|showdiff}} for the other buttons, and {{msg-mw|publishchanges}} for the label for the button when the page is being created.\n\nNote: This i18n is being introduced in advance of usage to provide extra time for translators.\n\nSee also:\n* {{msg-mw|Accesskey-publish}}\n* {{msg-mw|Tooltip-publish}}\n{{Identical|Publish changes}}",
     	"preview": "The title of the Preview page shown after clicking the \"Show preview\" button in the edit page. Since this is a heading, it should probably be translated as a noun and not as a verb.\n\n{{Identical|Preview}}",
     	"showpreview": "The text of the button to preview the page you are editing. See also {{msg-mw|showdiff}} and {{msg-mw|savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showpreview}}\n* {{msg-mw|Accesskey-preview}}\n* {{msg-mw|Tooltip-preview}}\n{{Identical|Show preview}}",
     	"showdiff": "Button below the edit page. See also {{msg-mw|Showpreview}} and {{msg-mw|Savearticle}} for the other buttons.\n\nSee also:\n* {{msg-mw|Showdiff}}\n* {{msg-mw|Accesskey-diff}}\n* {{msg-mw|Tooltip-diff}}\n{{Identical|Show change}}",
    @@ -957,12 +959,14 @@
     	"editpage-notsupportedcontentformat-title": "Title of error page shown when using an incompatible format on EditPage.\n\nUsed as title for the following error message:\n* {{msg-mw|Editpage-notsupportedcontentformat-text}}.",
     	"editpage-notsupportedcontentformat-text": "Error message shown when using an incompatible format on EditPage.\n\nThe title for this error is {{msg-mw|Editpage-notsupportedcontentformat-title}}.\n\nParameters:\n* $1 - the format id\n* $2 - the content model name",
     	"content-model-wikitext": "Name for the wikitext content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
    -	"content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n{{Identical|Plain text}}",
    +	"content-model-text": "Name for the plain text content model, used when decribing what type of content a page contains. Plaintext means that the content of the page will be rendered as is like:\n\n<nowiki>This is [[plain text]]. <a href=\"https://www.mediawiki.org/\">Really!</a></nowiki>\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}\n\n{{Identical|Plain text}}",
     	"content-model-javascript": "Name for the JavaScript content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
     	"content-model-css": "Name for the CSS content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
     	"content-model-json": "Name for the JSON content model, used when decribing what type of content a page contains.\n\nThis message is substituted in:\n*{{msg-mw|Bad-target-model}}\n*{{msg-mw|Content-not-allowed-here}}",
     	"content-json-empty-object": "Used to represent an object with no properties on a JSON content model page.",
     	"content-json-empty-array": "Used to represent an array with no values on a JSON content model page.",
    +	"deprecated-self-close-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain invalid self-closed HTML tags, such as <code>&lt;b/></code> or <code>&lt;span/></code>.  The behavior of these will change soon to be consistent with the HTML5 specification, so their use in wikitext is deprecated.",
    +	"deprecated-self-close-category-desc": "Invalid self-closed HTML tag category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|deprecated-self-close-category}}",
     	"duplicate-args-warning": "If a page calls a template and specifies the same argument more than once, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>, this warning is displayed when previewing.\n\nParameters:\n* $1 - The calling page\n* $2 - The called template\n* $3 - The name of the duplicated argument",
     	"duplicate-args-category": "This message is used as a category name for a [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]] where pages are placed automatically if they contain template calls that use duplicates of arguments, such as <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
     	"duplicate-args-category-desc": "Duplicate arguments category description. Shown on [[Special:TrackingCategories]].\n\nSee also:\n* {{msg-mw|Duplicate-args-category}}",
    @@ -1695,6 +1699,7 @@
     	"upload-copy-upload-invalid-domain": "Error message shown if a user is trying to upload (i.e. copy) a file from a website that is not in $wgCopyUploadsDomains (if set).\n\nSee also:\n* {{msg-mw|http-invalid-url}}\n* {{msg-mw|tmp-create-error}}\n* {{msg-mw|tmp-write-error}}",
     	"upload-foreign-cant-upload": "Error message shown when a user is trying to upload a file to foreign repository that is not configured to receive file uploads from current wiki.",
     	"upload-foreign-cant-load-config": "Error message shown when a user is trying to upload a file to foreign repository and the foreign wiki is down or otherwise unable to respond to API requests.",
    +	"upload-dialog-disabled": "Message shown when the upload dialog functionality is disabled. (This doesn't mean that uploads in general are disabled, only this specific method of uploading.)",
     	"upload-dialog-title": "Title of the upload dialog box\n{{Identical|Upload file}}",
     	"upload-dialog-button-cancel": "Button to cancel the dialog\n{{Identical|Cancel}}",
     	"upload-dialog-button-done": "Button to close the dialog once upload is complete\n{{Identical|Done}}",
    @@ -1996,7 +2001,7 @@
     	"prefixindex-namespace": "The page title of [[Special:PrefixIndex]] limited to a specific namespace. Similar to {{msg-mw|allinnamespace}}. $1 is the name of the namespace",
     	"prefixindex-summary": "{{notranslate}}\n\nThe summary displayed at the top of [[Special:Prefixindex]]. [[mw:Manual:Interface/Special pages summary|MediaWiki manual]].",
     	"prefixindex-submit": "Label on submit button in [[Special:PrefixIndex]]\n{{Identical|Show}}",
    -	"prefixindex-strip": "Label for a checkbox. If the checkbox is checked, the prefix searched will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].\n\nSee the following search results:\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)",
    +	"prefixindex-strip": "Label for a checkbox. If the checkbox is checked, the prefix searched (do not confuse with prefix of the namespace) will be removed from the title displayed in the list. Used in [[Special:PrefixIndex]].\n\nSee the following search results:\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10}} Special:PrefixIndex?prefix=Doc&namespace=10] (prefix NOT stripped)\n* [{{canonicalurl:Special:PrefixIndex|prefix=Doc&namespace=10&stripprefix=1}} Special:PrefixIndex?prefix=Doc&namespace=10&stripprefix=1] (prefix stripped)",
     	"shortpages": "{{doc-special|ShortPages}}",
     	"shortpages-summary": "{{notranslate}}\nThe summary displayed at the top of [[Special:Shortpages]]. [[mw:Manual:Interface/Special pages summary|mw manual]].",
     	"longpages": "{{doc-special|LongPages}}",
    @@ -4237,7 +4242,6 @@
     	"mw-widgets-dateinput-placeholder-month": "Placeholder displayed in a date input field when it's empty, representing a date format with 4 digits for year and 2 digits for month, separated with hyphens (without a day). This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
     	"mw-widgets-titleinput-description-new-page": "Description label for a new page in the title input widget.",
     	"mw-widgets-titleinput-description-redirect": "Description label for a redirect in the title input widget.",
    -	"api-error-blacklisted": "Used as error message.\n\nFollowed by the link {{msg-mw|Mwe-upwiz-feedback-blacklist-info-prompt}}.",
     	"sessionmanager-tie": "Used as an error message when multiple session sources are tied in priority.\n\nParameters:\n* $1 - List of dession type descriptions, from messages like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
     	"sessionprovider-generic": "Used to create a generic session type description when one isn't provided via the proper message. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.\n\nParameters:\n* $1 - PHP classname.",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "Description of the sessions provided by the CookieSessionProvider class, which use HTTP cookies. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.",
    @@ -4367,5 +4371,5 @@
     	"linkaccounts-submit": "Text of the main submit button on [[Special:LinkAccounts]] (when there is one)",
     	"unlinkaccounts": "Title of the special page [[Special:UnlinkAccounts]] which allows the user to remove linked remote accounts.",
     	"unlinkaccounts-success": "Account unlinking form success message",
    -	"authenticationdatachange-ignored": "Shown when authentication data change was unsuccessful due to configuration problems."
    +	"authenticationdatachange-ignored": "Shown when authentication data change was unsuccessful due to configuration problems.\n\nCf. e.g. {{msg-mw|Passwordreset-ignored}}."
     }
    diff --git a/languages/i18n/ru.json b/languages/i18n/ru.json
    index 3f092a0bfd..3818327e81 100644
    --- a/languages/i18n/ru.json
    +++ b/languages/i18n/ru.json
    @@ -92,7 +92,8 @@
     			"Lemondoge",
     			"SamGold",
     			"Jdforrester",
    -			"Jack who built the house"
    +			"Jack who built the house",
    +			"Cat1987"
     		]
     	},
     	"tog-underline": "Подчёркивание ссылок:",
    @@ -217,7 +218,7 @@
     	"category-empty": "''Эта категория в данный момент пуста.''",
     	"hidden-categories": "{{PLURAL:$1|1=Скрытая категория|Скрытые категории}}",
     	"hidden-category-category": "Скрытые категории",
    -	"category-subcat-count": "{{PLURAL:$2|1=Эта категория содержит только следующую подкатегорию.|В этой категории отображается $1 {{PLURAL:$1|подкатегория|подкатегорий|подкатегории}} из имеющихся $2.}}",
    +	"category-subcat-count": "{{PLURAL:$2|1=Эта категория содержит только следующую подкатегорию.|В этой категории отображается $1 {{PLURAL:$1|подкатегория|подкатегории|подкатегорий}} из имеющихся $2.}}",
     	"category-subcat-count-limited": "В этой категории {{PLURAL:$1|$1 подкатегория|$1 подкатегории|$1 подкатегорий}}.",
     	"category-article-count": "{{PLURAL:$2|1=Эта категория содержит единственную страницу.|{{PLURAL:$1|Показана $1 страница|Показаны $1 страницы|Показано $1 страниц}} из $2, {{PLURAL:$2|находящейся|находящихся}} в данной категории.}}",
     	"category-article-count-limited": "В этой категории {{PLURAL:$1|$1 страница|$1 страницы|$1 страниц|1=только одна страница}}.",
    @@ -437,7 +438,7 @@
     	"perfcached": "Следующие данные взяты из кэша и могут не учитывать последних изменений. В кэше хранится не более $1 {{PLURAL:$1|записи|записей}}.",
     	"perfcachedts": "Следующие данные взяты из кэша, последний раз он обновлялся в $1. В кэше хранится не более $4 {{PLURAL:$4|записи|записей}}.",
     	"querypage-no-updates": "Обновление этой страницы сейчас отключено.\nПредставленные здесь данные не будут обновляться.",
    -	"viewsource": "Просмотр",
    +	"viewsource": "Просмотр вики-текста",
     	"viewsource-title": "Просмотр исходного текста страницы $1",
     	"actionthrottled": "Ограничение по скорости",
     	"actionthrottledtext": "Для борьбы со спамом было установлено ограничение на максимальное число попыток выполнения этого действия в короткий промежуток времени — и вы исчерпали этот лимит. Пожалуйста, повторите попытку через несколько минут.",
    @@ -490,11 +491,11 @@
     	"yourdomainname": "Ваш домен:",
     	"password-change-forbidden": "Вы не можете изменить пароль в этой вики.",
     	"externaldberror": "Произошла ошибка при аутентификации с помощью внешней базы данных или у вас недостаточно прав для внесения изменений в свою внешнюю учётную запись.",
    -	"login": "Представиться системе",
    +	"login": "Войти",
     	"login-security": "Подтвердите свою личность",
     	"nav-login-createaccount": "Представиться / зарегистрироваться",
     	"userlogin": "Представиться или зарегистрироваться",
    -	"userloginnocreate": "Представиться",
    +	"userloginnocreate": "Войти",
     	"logout": "Завершение сеанса",
     	"userlogout": "Завершение сеанса",
     	"notloggedin": "Вы не представились системе",
    @@ -647,7 +648,7 @@
     	"passwordreset": "Сброс пароля",
     	"passwordreset-text-one": "Заполните эту форму, чтобы сбросить свой пароль.",
     	"passwordreset-text-many": "{{PLURAL:$1|Заполните одно из полей для получения временного пароля по электронной почте.}}",
    -	"passwordreset-disabled": "Сбросы пароля отключены на этой вики.",
    +	"passwordreset-disabled": "Сбросы пароля в этой вики отключены.",
     	"passwordreset-emaildisabled": "Функции электронной почты отключены в этой вики.",
     	"passwordreset-username": "Имя участника:",
     	"passwordreset-domain": "Домен:",
    @@ -663,7 +664,9 @@
     	"passwordreset-emailsent-capture": "Отправлено электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже.",
     	"passwordreset-emailerror-capture": "Было создано электронное письмо с информацией о сбросе пароля, текст которого можно увидеть ниже, однако его не удалось отправить {{GENDER:$2|участнику|участнице}} по следующей причине: $1",
     	"passwordreset-emailsent-capture2": "{{PLURAL:$1|Письмо|Письма}} для сброса пароля {{PLURAL:$1|было отправлено|были отправлены}}. {{PLURAL:$1|Логин и пароль показаны|Список логинов и паролей показан}} ниже.",
    +	"passwordreset-emailerror-capture2": "Отправка {{GENDER:$2|участнику}} письма по электронной почте не удалась: $1 В {{PLURAL:$3|логин и пароль показаны|список логинов и паролей показан}} ниже.",
     	"passwordreset-invalideamil": "Недопустимый адрес электронной почты",
    +	"passwordreset-nodata": "Ни имя участника, ни адрес электронной почты не были предоставлены",
     	"changeemail": "Изменить или удалить адрес электронной почты",
     	"changeemail-header": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Если вы хотите отвязать свой адрес электронной почты от учётной записи, то при заполнении формы оставьте пустым поле нового адреса электронной почты.",
     	"changeemail-passwordrequired": "Чтобы подтвердить это изменение, вам нужно будет ввести свой пароль.",
    @@ -705,7 +708,9 @@
     	"minoredit": "Малое изменение",
     	"watchthis": "Включить эту страницу в список наблюдения",
     	"savearticle": "Записать страницу",
    +	"savechanges": "Сохранить изменения",
     	"publishpage": "издавать страницу",
    +	"publishchanges": "Опубликовать изменения",
     	"preview": "Предпросмотр",
     	"showpreview": "Предварительный просмотр",
     	"showdiff": "Внесённые изменения",
    @@ -728,7 +733,7 @@
     	"nosuchsectiontitle": "Невозможно найти раздел",
     	"nosuchsectiontext": "Вы пытаетесь редактировать несуществующий раздел.\nВозможно, он был перемещён или удалён, пока вы просматривали эту страницу.",
     	"loginreqtitle": "Требуется авторизация",
    -	"loginreqlink": "представиться",
    +	"loginreqlink": "войти",
     	"loginreqpagetext": "Вы должны $1, чтобы просмотреть другие страницы.",
     	"accmailtitle": "Пароль выслан",
     	"accmailtext": "Сгенерированный случайным образом пароль для [[User talk:$1|$1]] выслан на адрес $2.\n\nПосле авторизации можно будет сменить пароль для этой учётной записи на ''[[Special:ChangePassword|специальной странице смены пароля]]''.",
    @@ -1025,7 +1030,7 @@
     	"searchall": "все",
     	"showingresults": "Ниже {{PLURAL:$1|1=показан <strong>1</strong> результат|показан  <strong>$1</strong> результат|показано <strong>$1</strong> результата|показаны <strong>$1</strong> результатов}}, начиная с № <strong>$2</strong>.",
     	"showingresultsinrange": "Ниже показано до {{PLURAL:$1|<strong>1</strong> результата|<strong>$1</strong> результата|<strong>$1</strong> результатов}} в диапазоне от <strong>$2</strong> до <strong>$3</strong>.",
    -	"search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1 — $2</strong> из <strong>$3</strong>}}",
    +	"search-showingresults": "{{PLURAL:$4|Результат <strong>$1</strong> из <strong>$3</strong>|Результаты <strong>$1—$2</strong> из <strong>$3</strong>}}",
     	"search-nonefound": "Соответствий запросу не найдено.",
     	"search-nonefound-thiswiki": "Нет результатов, соответствующих запросу на этом сайте.",
     	"powersearch-legend": "Расширенный поиск",
    @@ -1159,7 +1164,7 @@
     	"userrights-groupsmember-auto": "Неявно состоит в группах:",
     	"userrights-groups-help": "Вы можете изменить группы, в которые входит этот участник.\n* Если около названия группы стоит отметка, значит участник входит в эту группу.\n* Если отметка не стоит — участник не относится к соответствующей группе.\n* Знак * отмечает, что вы не сможете удалить участника из группы, если добавите его в неё, или наоборот.",
     	"userrights-reason": "Причина:",
    -	"userrights-no-interwiki": "У вас нет разрешения изменять права участников на других вики.",
    +	"userrights-no-interwiki": "У вас нет разрешения изменять права участников в других вики.",
     	"userrights-nodatabase": "База данных $1 не существует или расположена не локально.",
     	"userrights-nologin": "Вы должны [[Special:UserLogin|представиться системе]] с учётной записи администратора, чтобы присваивать права участникам.",
     	"userrights-notallowed": "У вас нет разрешения добавлять и удалять права участников.",
    @@ -1230,7 +1235,7 @@
     	"right-protect": "изменение уровня защиты страниц и правка каскадно защищённых страниц",
     	"right-editprotected": "правка страниц, защищённых как «{{int:protect-level-sysop}}»",
     	"right-editsemiprotected": "правка страниц, защищённых как «{{int:protect-level-autoconfirmed}}»",
    -	"right-editcontentmodel": "Редактирование контентной модели страницы",
    +	"right-editcontentmodel": "редактирование контентной модели страницы",
     	"right-editinterface": "изменение пользовательского интерфейса",
     	"right-editusercssjs": "правка CSS- и JS-файлов других участников",
     	"right-editusercss": "правка CSS-файлов других участников",
    @@ -1258,10 +1263,10 @@
     	"right-override-export-depth": "экспортирование страниц, включая связанные страницы с глубиной до 5",
     	"right-sendemail": "отправка электронной почты другим участникам",
     	"right-passwordreset": "просмотр электронных писем с изменением пароля",
    -	"right-managechangetags": "Создание и (де)активация [[Special:Tags|меток]]",
    +	"right-managechangetags": "создание и (де)активация [[Special:Tags|меток]]",
     	"right-applychangetags": "применение [[Special:Tags|меток]] вместе со своими правками",
     	"right-changetags": "добавление и удаление произвольных [[Special:Tags|меток]] на отдельных правках и записях в журнале",
    -	"right-deletechangetags": "Удаление [[Special:Tags|меток]] из базы данных",
    +	"right-deletechangetags": "удаление [[Special:Tags|меток]] из базы данных",
     	"grant-generic": "Набор прав «$1»",
     	"grant-group-page-interaction": "Взаимодействие со страницами",
     	"grant-group-file-interaction": "Взаимодействие с медиафайлами",
    @@ -1298,8 +1303,8 @@
     	"rightslogtext": "Это журнал изменений прав участника.",
     	"action-read": "чтение этой страницы",
     	"action-edit": "редактирование этой страницы",
    -	"action-createpage": "создание страниц",
    -	"action-createtalk": "создание страниц обсуждений",
    +	"action-createpage": "создание этой страницы",
    +	"action-createtalk": "создание этой страницы обсуждения",
     	"action-createaccount": "создание этой учётной записи",
     	"action-autocreateaccount": "автоматический вход с помощью внешней учётной записи участника",
     	"action-history": "просмотр истории этой страницы",
    @@ -1389,7 +1394,7 @@
     	"hide": "Скрыть",
     	"show": "Показать",
     	"minoreditletter": "м",
    -	"newpageletter": "Н",
    +	"newpageletter": "н",
     	"boteditletter": "б",
     	"unpatrolledletter": "!",
     	"number_of_watching_users_pageview": "[$1 {{PLURAL:$1|наблюдающий участник|наблюдающих участника|наблюдающих участников}}]",
    @@ -1518,6 +1523,8 @@
     	"upload-http-error": "Произошла ошибка HTTP: $1",
     	"upload-copy-upload-invalid-domain": "Копирование загрузок не доступно в этом домене.",
     	"upload-foreign-cant-upload": "Эта вики не настроена для загрузки файлов на запрошенный сторонний файловый репозиторий.",
    +	"upload-foreign-cant-load-config": "Не удалось загрузить конфигурацию загрузки файлов на внешнее хранилище файлов.",
    +	"upload-dialog-disabled": "На этом вики-сайте отключена возможность загрузки файлов с помощью этого диалогового окна.",
     	"upload-dialog-title": "Загрузить файл",
     	"upload-dialog-button-cancel": "Отменить",
     	"upload-dialog-button-done": "Готово",
    @@ -1960,6 +1967,7 @@
     	"trackingcategories-msg": "Отслеживающая категория",
     	"trackingcategories-name": "Имя сообщения",
     	"trackingcategories-desc": "Критерий включения в категорию",
    +	"restricted-displaytitle-ignored": "Страницы с игнорируемыми отображаемыми названиями",
     	"noindex-category-desc": "Страница не индексируются поисковыми роботами, потому что на ней имеется «волшебное слово» <code><nowiki>__NOINDEX__</nowiki></code>, и она находится в пространстве имён, где разрешён этот флаг).",
     	"index-category-desc": "На странице имеется «волшебное слово» <nowiki>__INDEX__</nowiki> (и страница находится в пространстве имён, где разрешён этот флаг), поэтому она индексируются поисковыми роботами в тех случаях, когда этого обычно не происходит.",
     	"post-expand-template-inclusion-category-desc": "Размер страницы станет больше <code>$wgMaxArticleSize</code> после показа всех шаблонов, поэтому некоторые из них не были показаны полностью.",
    @@ -2084,12 +2092,14 @@
     	"rollbacklinkcount": "откатить $1 {{PLURAL:$1|правку|правки|правок}}",
     	"rollbacklinkcount-morethan": "откатить больше, чем $1 {{PLURAL:$1|правку|правки|правок}}",
     	"rollbackfailed": "Ошибка при совершении отката",
    +	"rollback-missingparam": "Отсутствуют обязательные параметры по запросу.",
     	"cantrollback": "Невозможно откатить изменения. Последним, кто вносил изменения, был единственный автор этой страницы.",
     	"alreadyrolled": "Невозможно откатить последние изменения страницы «[[:$1]]», совершённые [[User:$2|$2]] ([[User talk:$2|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]),\nпоскольку кто-то другой уже успел откатить эти правки или отредактировать страницу.\n\nПоследние изменения {{GENDER:$3|внёс|внесла}} [[User:$3|$3]] ([[User talk:$3|обсуждение]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     	"editcomment": "Было дано описание изменения: <em>$1</em>.",
     	"revertpage": "Откат правок [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]]) к версии [[User:$1|$1]]",
     	"revertpage-nouser": "Правки (имя участника скрыто) откачены к версии {{GENDER:$1|[[User:$1|$1]]}}",
     	"rollback-success": "Откачены правки $1; возврат к версии $2.",
    +	"rollback-success-notify": "Откачены правки $1; возврат к последней версии $2. [$3 Показать изменения]",
     	"sessionfailure-title": "Ошибка сеанса",
     	"sessionfailure": "Похоже, возникли проблемы с текущим сеансом работы;\nэто действие было отменено в целях предотвращения «захвата сеанса».\nПожалуйста, нажмите кнопку «Назад» и перезагрузите страницу, с которой вы пришли.",
     	"changecontentmodel": "Редактирование контентной модели страницы",
    @@ -2237,6 +2247,7 @@
     	"sp-contributions-username": "IP-адрес или имя участника:",
     	"sp-contributions-toponly": "Показывать только правки, являющиеся последними версиями",
     	"sp-contributions-newonly": "Показывать только правки, являющиеся созданием страниц",
    +	"sp-contributions-hideminor": "Скрыть малые правки",
     	"sp-contributions-submit": "Найти",
     	"whatlinkshere": "Ссылки сюда",
     	"whatlinkshere-title": "Страницы, ссылающиеся на «$1»",
    @@ -2395,7 +2406,7 @@
     	"cant-move-category-page": "У вас нет разрешения переименовывать страницы категорий.",
     	"cant-move-to-category-page": "У вас нет разрешения переименовывать страницы в страницу категории.",
     	"newtitle": "Новое название:",
    -	"move-watch": "Включить эту страницу в список наблюдения",
    +	"move-watch": "Добавить в список наблюдения исходную и целевую страницы",
     	"movepagebtn": "Переименовать страницу",
     	"pagemovedsub": "Страница переименована",
     	"movepage-moved": "'''Страница «$1» переименована в «$2»'''",
    @@ -3755,7 +3766,6 @@
     	"mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
     	"mw-widgets-titleinput-description-new-page": "страница ещё не существует",
     	"mw-widgets-titleinput-description-redirect": "перенаправление на $1",
    -	"api-error-blacklisted": "Пожалуйста, выберите другое, более понятное название.",
     	"sessionmanager-tie": "Невозможно использовать одновременно несколько типов проверки подлинности запроса: $1.",
     	"sessionprovider-generic": "$1 сессий",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "сессий на основе куки",
    @@ -3770,8 +3780,8 @@
     	"log-action-filter-newusers": "Тип создания учётной записи:",
     	"log-action-filter-patrol": "Тип патрулирования:",
     	"log-action-filter-protect": "Тип защиты:",
    -	"log-action-filter-rights": "Тип изменения прав",
    -	"log-action-filter-suppress": "Тип сокрытия",
    +	"log-action-filter-rights": "Тип изменения прав:",
    +	"log-action-filter-suppress": "Тип сокрытия:",
     	"log-action-filter-upload": "Тип загрузки:",
     	"log-action-filter-all": "Все",
     	"log-action-filter-block-block": "Блокировка",
    @@ -3810,23 +3820,51 @@
     	"log-action-filter-suppress-reblock": "Сокрытие пользователя через повторное блокирование",
     	"log-action-filter-upload-upload": "Новая загрузка",
     	"log-action-filter-upload-overwrite": "Повторно загрузить",
    +	"authmanager-authn-no-primary": "Предоставленные учётные данные не могут быть проверены на подлинность.",
    +	"authmanager-authn-no-local-user": "Предоставленные учётные данные не связаны ни с одним участником этой вики.",
     	"authmanager-authn-autocreate-failed": "Автоматическое создание локальной учётной записи не удалось: $1",
     	"authmanager-create-disabled": "Создание учётных записей отключено.",
    +	"authmanager-create-from-login": "Чтобы создать учётную запись, пожалуйста, заполните приведённые ниже поля.",
    +	"authmanager-create-not-in-progress": "Создание учётной записи не выполняется или данные сессии были утеряны. Пожалуйста, начните снова с самого начала.",
    +	"authmanager-link-not-in-progress": "Связывание учётной записи не выполняется или данные сессии были утеряны. Пожалуйста, начните снова с самого начала.",
     	"authmanager-authplugin-setpass-failed-title": "Ошибка изменения пароля",
    +	"authmanager-authplugin-setpass-failed-message": "Плагин аутентификации запрещает смену пароля.",
    +	"authmanager-authplugin-create-fail": "Плагин аутентификации запрещает создание учётных записей.",
    +	"authmanager-authplugin-setpass-denied": "Плагин аутентификации не позволяет изменять пароли.",
     	"authmanager-authplugin-setpass-bad-domain": "Неверный домен.",
    +	"authmanager-autocreate-noperm": "Автоматическое создание учётных записей не разрешено.",
     	"authmanager-autocreate-exception": "Автоматическое создание учётной записи временно отключено из-за предыдущих ошибок.",
     	"authmanager-userdoesnotexist": "Не зарегистрировано учётной записи «$1».",
    +	"authmanager-username-help": "Имя участника для проверки подлинности.",
    +	"authmanager-password-help": "Пароль для проверки подлинности.",
     	"authmanager-domain-help": "Домен для внешней аутентификации.",
    +	"authmanager-retype-help": "Ещё раз пароль для подтверждения.",
     	"authmanager-email-label": "Электронная почта",
     	"authmanager-email-help": "Адрес электронной почты",
     	"authmanager-realname-label": "Настоящее имя",
     	"authmanager-realname-help": "Настоящее имя участника",
     	"authmanager-provider-password": "Аутентификация на основе пароля",
    +	"authmanager-provider-password-domain": "Проверка подлинности на основе пароля и домена",
     	"authmanager-provider-temporarypassword": "Временный пароль",
    +	"authprovider-confirmlink-option": "$1 ($2)",
    +	"authprovider-confirmlink-request-label": "Учётные записи, которые должны быть связаны",
    +	"authprovider-confirmlink-success-line": "$1: успешно связан.",
    +	"authprovider-confirmlink-failed-line": "$1: $2",
    +	"authprovider-confirmlink-failed": "Удалось связать не все учётные записи: $1",
    +	"authprovider-confirmlink-ok-help": "Продолжать после вывода сообщений об ошибках связывания.",
     	"authprovider-resetpass-skip-label": "Пропустить",
     	"authprovider-resetpass-skip-help": "Пропустить сброс пароля.",
     	"authform-newtoken": "Отсутствует токен. $1",
    +	"authform-notoken": "Отсутствует токен",
     	"authform-wrongtoken": "Неверный токен",
    +	"specialpage-securitylevel-not-allowed-title": "Не разрешено",
    +	"specialpage-securitylevel-not-allowed": "Извините, вам не можете использовать эту страницу, поскольку ваша личность не может быть проверена.",
    +	"authpage-cannot-login": "Невозможно продолжить вход в учётную запись.",
    +	"authpage-cannot-login-continue": "Невозможно продолжить вход в учётную запись. Скорее всего, время вашей сессии истекло.",
    +	"authpage-cannot-create": "Невозможно продолжить создание учётной записи.",
    +	"authpage-cannot-create-continue": "Невозможно продолжить создание учётной записи. Скорее всего, время вашей сессии истекло.",
    +	"authpage-cannot-link": "Невозможно начать связывание учётной записи.",
    +	"authpage-cannot-link-continue": "Невозможно продолжить связывание учётной записи. Скорее всего, время вашей сессии истекло.",
     	"cannotauth-not-allowed-title": "Доступ запрещён",
     	"cannotauth-not-allowed": "Вы не можете использовать эту страницу",
     	"changecredentials": "Изменение учётных данных",
    @@ -3835,9 +3873,12 @@
     	"changecredentials-success": "Ваши учётные данные были изменены.",
     	"removecredentials": "Удалить учётные данные",
     	"removecredentials-submit": "Удалить учётные данные",
    +	"removecredentials-invalidsubpage": "$1 является недопустимым типом учётных данных.",
     	"removecredentials-success": "Ваши учётные данные были удалены.",
     	"credentialsform-provider": "Тип учётных данных:",
     	"credentialsform-account": "Имя учётной записи:",
    +	"cannotlink-no-provider-title": "Нет связываемых учётных записей",
    +	"cannotlink-no-provider": "Нет связываемых учётных записей.",
     	"linkaccounts": "Связать учётные записи",
     	"linkaccounts-success-text": "Учетная запись была связана.",
     	"linkaccounts-submit": "Связать учётные записи",
    diff --git a/languages/i18n/sah.json b/languages/i18n/sah.json
    index 8ddb3d794c..643d1654be 100644
    --- a/languages/i18n/sah.json
    +++ b/languages/i18n/sah.json
    @@ -136,7 +136,7 @@
     	"category_header": "\"$1\" категория ыстатыйалара",
     	"subcategories": "Субкатегориялар",
     	"category-media-header": "\"$1\" категория билэлэрэ",
    -	"category-empty": "''Бу категорияҕа билигин туох да суох.''",
    +	"category-empty": "<em>Бу категорияҕа билигин туох да суох.</em>",
     	"hidden-categories": "{{PLURAL:$1|Кистэммит категория|Кистэммит категориялар}}",
     	"hidden-category-category": "Кистэммит категориялар",
     	"category-subcat-count": "{{PLURAL:$2|Бу категория манна көстүбүт субкатегориялаах.|$2 категорияттан {{PLURAL:$1|субкатегорията|$1 субкатегориялара}} көрдөрүлүннүлэр.}}",
    @@ -152,7 +152,7 @@
     	"about": "Бу туһунан",
     	"article": "Ыстатыйа",
     	"newwindow": "(атын түннүккэ арыллар)",
    -	"cancel": "Алҕас",
    +	"cancel": "Салҕаама",
     	"moredotdotdot": "Өссө...",
     	"morenotlisted": "Бу тиһик толорута суох.",
     	"mypage": "Сирэй",
    @@ -181,7 +181,7 @@
     	"searcharticle": "Көрдөр",
     	"history": "Устуоруйата",
     	"history_short": "Устуоруйа",
    -	"updatedmarker": "Кэнники киириим кэнниттэн уларыйыылар",
    +	"updatedmarker": "тиһэх киириим кэнниттэн уларыйбыт",
     	"printableversion": "Бэчээттииргэ аналлаах барыл",
     	"permalink": "Куруук баар сигэ",
     	"print": "Бэчээттээ",
    @@ -205,7 +205,7 @@
     	"unprotectthispage": "Бу сирэй көмүскэлин уларыт",
     	"newpage": "Саҥа сирэй",
     	"talkpage": "Бу сирэйи ырыт",
    -	"talkpagelinktext": "Ырытыы",
    +	"talkpagelinktext": "ырытыы",
     	"specialpage": "Анал сирэй",
     	"personaltools": "Тус бэйэ туттар тэриллэрэ",
     	"articlepage": "Ыстатыйаны көр",
    @@ -238,9 +238,9 @@
     	"pool-servererror": "Пул ааҕааччытын сулууспата үлэлээбэт($1).",
     	"poolcounter-usage-error": "Туһаныы алҕаһа: $1",
     	"aboutsite": "{{SITENAME}} туһунан",
    -	"aboutpage": "Project:туһунан",
    +	"aboutpage": "Project:Бу туһунан",
     	"copyright": "Маны туһанары $1 лиссиэнсийэ көҥүллүүр (атын ыйыллыбытах буоллаҕына).",
    -	"copyrightpage": "{{ns:project}}:бас билиитэ",
    +	"copyrightpage": "{{ns:project}}:Бас билии",
     	"currentevents": "Туох буола турара",
     	"currentevents-url": "Project:Сонуннар",
     	"disclaimers": "Бүк охсунуу",
    @@ -249,9 +249,9 @@
     	"helppage-top-gethelp": "Көмө",
     	"mainpage": "Сүрүн сирэй",
     	"mainpage-description": "Сүрүн сирэй",
    -	"policy-url": "Project:Сиэрэ",
    +	"policy-url": "Project:Сиэр-туом",
     	"portal": "Түмсүү сирэ",
    -	"portal-url": "Project:Кистээһин сиэрэ",
    +	"portal-url": "Project:Түмсүү сирэ",
     	"privacy": "Кистээһин сиэрэ",
     	"privacypage": "Project:Кистээһин сиэрэ",
     	"badaccess": "Сатаан киирбэтэ",
    @@ -260,8 +260,8 @@
     	"versionrequired": "MediaWiki $1 -с барыла ирдэнэр",
     	"versionrequiredtext": "Бу сирэйи туттарга MediaWiki $1 -с барыла наада. [[Special:Version|Барыллар тустарынан сирэйи]] көр.",
     	"ok": "Сөп",
    -	"retrievedfrom": "\"$1\" -н кэллэ",
    -	"youhavenewmessages": "$1 ($2) кэллэ",
    +	"retrievedfrom": "Төрдө — «$1»",
    +	"youhavenewmessages": "$1 ($2) кэллэ.",
     	"youhavenewmessagesfromusers": "Маны $1 {{PLURAL:$3|соҕотох кыттааччыттан|$3 кыттааччыттан}} туппуккун ($2).",
     	"youhavenewmessagesmanyusers": "Маны $1 элбэх кыттааччыттан туппуккун ($2).",
     	"newmessageslinkplural": "{{PLURAL:$1|саҥа этии|999=саҥа этии}}",
    @@ -282,7 +282,7 @@
     	"confirmable-yes": "Сөп",
     	"confirmable-no": "Суох",
     	"thisisdeleted": "$1 көрдөрөбүн эбэтэр хостуубун дуу?",
    -	"viewdeleted": "$1 көрдөрөбүн?",
    +	"viewdeleted": "$1 - көрөҕүн дуо?",
     	"restorelink": "{{PLURAL:$1|биир сотторуллубут көннөрүү|$1 сотторуллубут көннөрүүлэр}}",
     	"feedlinks": "Маннык:",
     	"feed-invalid": "Суруттарыыга анаммыт ханаал сыыһа тииптээх.",
    @@ -308,7 +308,7 @@
     	"nosuchaction": "Маннык дьайыы суох",
     	"nosuchactiontext": "Бу URL-га баар дьайыы сыыһалаах.\nБаҕар URL суруйарга алҕаһаабытыҥ буолуо эбэтэр сыыһалаах сигэннэн тахсыбытыҥ буолуо.\n{{SITENAME}} бэйэтин сыыһата эмиэ буолуон сөп.",
     	"nosuchspecialpage": "Маннык анал сирэй суох",
    -	"nospecialpagetext": "Аналлаах сирэйи сыыһа көрдөөтүҥ,  [[Special:SpecialPages|манна]] аналлаах сирэйдэр испииһэктэрин булуоххун сөп.",
    +	"nospecialpagetext": "<strong>Көрдөөбүт сирэйиҥ суох эбит.</strong>\n\n[[Special:SpecialPages|Аналлаах сирэйдэр испииһэктэрэ]].",
     	"error": "Алҕас",
     	"databaseerror": "Билии олоҕор сыыһа",
     	"databaseerror-text": "Билии олоҕор алҕас таҕыста.\nБырагыраамма алҕаһа буолуон сөп.",
    @@ -316,11 +316,11 @@
     	"databaseerror-query": "Ыйытык: $1",
     	"databaseerror-function": "Функция: $1",
     	"databaseerror-error": "Алҕас: $1",
    -	"transaction-duration-limit-exceeded": "\nРепликация оҥорорго улахан лаг мэһэйдээбэтин туһугар транзакция тохтотуллубута, сурутуу уһуна ($1) ($2){{PLURAL:$2|}}лимиты таһынан ааһарын быһыытынан.\nЭн  биир олорууга хас да элэмиэни уларытар буоллаххына, ол оннугар элбэх улахана суох операциялары оҥорорго холонон көрүҥ.",
    -	"laggedslavemode": "Болҕой: Бу сирэй бүтэһик уларытыылара суох буолуон сөп",
    +	"transaction-duration-limit-exceeded": "Репликация оҥорорго улахан лаг мэһэйдээбэтин туһугар транзакция тохтотулунна, сурутуу ($1) уһуна ($2){{PLURAL:$2|сөкүүндэ}} лимиты таһынан ааһарын быһыытынан.\nХас да элэмиэни күргүөмүнэн уларытар буоллаххына, ол оннугар биирдиилээн уларытан көр.",
    +	"laggedslavemode": "<strong>Болҕой:</strong> Бу сирэй бүтэһик уларытыылара суох буолуон сөп.",
     	"readonly": "Билии олоҕун уларытар бобуллубут",
     	"enterlockreason": "Уларытыыны бобуу төрүөтүн уонна төһө өр бобулларын ый.",
    -	"readonlytext": "Билии олоҕор билигин саҥа киллэриилэр уонна атын уларытыылар бобуллубуттар, бука былааннаммыт көрүү-истии үлэлэр буолалларыттан.\nОну боппут сүрүннээччи маннык сурук хаалларбыт: $1",
    +	"readonlytext": "Билии олоҕор билигин саҥа киллэриилэр уонна атын уларытыылар бобуллубуттар, бука былааннаммыт көрүү-истии үлэлэр буолалларыттан буолуо.\n\nОну боппут дьаһабыл маннык быһаарыы сурук хаалларбыт: $1",
     	"missing-article": "Көрдөөбүт тиэкиһиҥ манна көстүбэтэ: «$1» $2.\n\nМаннык үксүн сотуллубут сирэй историятыгар тиэрдэр эргэрбит сигэнииттэн тахсааччы.\n\nАтын биричиинэ дии саныыр буоллаххына бырагыраамма сыыһата буолуон сөп.\nОччоҕо [[Special:ListUsers/sysop|администраатарга]] биллэрэриҥ буоллар (URLын умнаайаҕын).",
     	"missingarticle-rev": "(#-с торум: $1)",
     	"missingarticle-diff": "(Уратыта: $1, $2)",
    diff --git a/languages/i18n/sat.json b/languages/i18n/sat.json
    index b0a3dce1b0..75e3238e76 100644
    --- a/languages/i18n/sat.json
    +++ b/languages/i18n/sat.json
    @@ -97,8 +97,8 @@
     	"october-gen": "O̠ḱ́ṭo̠bo̠r",
     	"november-gen": "NoveÌ mboÌ r",
     	"december-gen": "December",
    -	"jan": "Jạn",
    -	"feb": "Febr",
    +	"jan": "Jạnuari",
    +	"feb": "Phebuari",
     	"mar": "MaÌ r",
     	"apr": "Epr",
     	"may": "Me",
    @@ -108,7 +108,7 @@
     	"sep": "Seṕ",
     	"oct": "Oká¹­",
     	"nov": "NoÌ v",
    -	"dec": "Dis",
    +	"dec": "Disembor",
     	"pagecategories": "{{PLURAL:$1|Bivag|Bivagko}}",
     	"category_header": "Sakam korenaḱ rokom sokom \"$1\"",
     	"subcategories": "Huḍiń rokom sokomko",
    @@ -132,9 +132,9 @@
     	"cancel": "Badme",
     	"moredotdotdot": "Aema",
     	"mypage": "In̕aḱ sakam",
    -	"mytalk": "Iñaḱ́ ro̠ṛ",
    +	"mytalk": "Galmarao",
     	"anontalk": "Nui baṅ ńutumanić beoharićaḱ galmarao sakam",
    -	"navigation": "Ñamme",
    +	"navigation": "Ạcurbaṛa",
     	"and": "&#31;ar",
     	"qbfind": "N̕am",
     	"qbbrowse": "Sendra",
    @@ -144,8 +144,9 @@
     	"faq": "Baḍae kupuliko",
     	"faqpage": "Project:FAQ",
     	"actions": "Kạmi",
    -	"namespaces": "Ñutum jaiga",
    +	"namespaces": "Ńutum reaḱ ṭhai",
     	"variants": "Etaḱko",
    +	"navigation-heading": "Ạcurbaṛa minu",
     	"errorpagetitle": "vul",
     	"returnto": "$1 te ruar-rok' me",
     	"tagline": "Oka khoć",
    @@ -157,11 +158,12 @@
     	"history": "Sakam reaḱ jạṛ",
     	"history_short": "Jạṛ",
     	"updatedmarker": "Ińaḱ mucạt hiripor khon nitaḱ halot",
    -	"printableversion": "Chapai lekan version",
    -	"permalink": "Terejuge joṛao",
    +	"printableversion": "Chapa sodorḱ bharson",
    +	"permalink": "Tirejuge joṛao",
     	"print": "Chapa",
     	"view": "Udukme",
    -	"edit": "SoÌ mpadoÌ n",
    +	"view-foreign": "$1 re ńelme",
    +	"edit": "Toṅge",
     	"create": "Tearme",
     	"editthispage": "Noa sakam joṛaome",
     	"create-this-page": "Noa sakam benao me",
    @@ -181,8 +183,8 @@
     	"personaltools": "Nijaḱ jontropạti",
     	"articlepage": "Menaḱ sakam uduḱme",
     	"talk": "Galmarao",
    -	"views": "Ñel koyoḱ",
    -	"toolbox": "Jontopạti baḱso",
    +	"views": "Ńelogoḱ",
    +	"toolbox": "Jontropạti",
     	"userpage": "Laṛcaṛićaḱ sakam uduḱme",
     	"projectpage": "Porjakṭ sakam uduḱme",
     	"imagepage": "Rẽt sakam uduḱme",
    @@ -197,7 +199,7 @@
     	"lastmodifiedat": "Noa sakam do sạjao hoena $1, $2 te",
     	"viewcount": "Noa sakamdo {{PLURAL:$1 dhom $1 dhom}} udug hoena.",
     	"protectedpage": "Rukhíạ sakamko",
    -	"jumpto": "Calaḱme :",
    +	"jumpto": "Donme :",
     	"jumptonavigation": "Ñamme",
     	"jumptosearch": "Sendra",
     	"view-pool-error": "Ikạkańmẽ, sarvarre nitoḱ do aḍi cap menaḱa.\nẠḍi aema beoharko noa sakam ńel lạgit́ko kurumuṭueda.\nNãwate noa sakam ńel kurumuṭuy lạgit́te dayakate mit́ghạṛi tạṅgiymẽ.\n$1",
    @@ -216,9 +218,9 @@
     	"mainpage": "Mukhiạ Sakam",
     	"mainpage-description": "Mukhiạ sakam",
     	"policy-url": "Project:Ritiniti",
    -	"portal": "Khũṭ boloḱ ho̠r",
    -	"portal-url": "Project: Khũṭ bolokt họr",
    -	"privacy": "Nijaḱ eḱtear",
    +	"portal": "Hoṛko boloḱ hor",
    +	"portal-url": "Projeṭ:Hoṛko bolon hor",
    +	"privacy": "Oku eḱtear",
     	"privacypage": "Project: Nijaḱ eḱteạr",
     	"badaccess": "Ektiạr vul",
     	"badaccess-group0": "Am do oka kạmi lạgit́em aroj akat́, ona kạmi purạo lạgit́te ạidạri do bạnuḱa.",
    @@ -229,12 +231,12 @@
     	"retrievedfrom": "\"$1\" khon ñam ạgui",
     	"youhavenewmessages": "Amaḱ do $1 ($2) menaḱa",
     	"youhavenewmessagesmulti": "Amaḱ nãwã mesagko do $1 menaḱa",
    -	"editsection": "SoÌ mpadoÌ n",
    -	"editold": "SoÌ mpadoÌ n",
    +	"editsection": "Tońge",
    +	"editold": "Toṅge",
     	"viewsourceold": "Ńamoḱ jayga",
     	"editlink": "Tońge",
     	"viewsourcelink": "vitrireaḱ́ jo̠to̠ ńelme",
    -	"editsectionhint": "Sapṛao dhara: $1",
    +	"editsectionhint": "Toṅge dhara: $1",
     	"toc": "Menaḱaḱko",
     	"showtoc": "Uduḱme",
     	"hidetoc": "uku, Danaṅ",
    @@ -256,13 +258,14 @@
     	"nstab-main": "Sakam",
     	"nstab-user": "Laṛcaṛicaḱ sakam",
     	"nstab-media": "Midiạ sakam",
    -	"nstab-special": "Jạruṛ pata",
    +	"nstab-special": "Osokayteaḱ sakam",
     	"nstab-project": "Porject reaḱ sakam",
    -	"nstab-image": "Fail",
    +	"nstab-image": "Phayel",
     	"nstab-mediawiki": "Mesag",
     	"nstab-template": "Sajao sakam",
     	"nstab-help": "Goṛo sakam",
     	"nstab-category": "Juṛu ko",
    +	"mainpage-nstab": "Mukhiạ sakam",
     	"nosuchaction": "Noṅkanaḱ kạmi bạnuḱa",
     	"nosuchactiontext": "Noa URL re goṭa akan kạmi do ạnlekate baṅkana.\nAm do paseć mit́ṭen vul joṛaoem emakada se URL oltem vul akada.\nNoa do noṅkanaḱ menkana je {{SITENAME}} sayeṭre beoharen sofṭower re mit́ṭen vul menaḱa.",
     	"nosuchspecialpage": "Noṅkanaḱ asokay sakam do banuḱa",
    @@ -308,10 +311,17 @@
     	"welcomeuser": "Johar",
     	"welcomecreation-msg": "Amaḱ ekaunṭ do̠ jhićena. Amaḱ pạsindko bodol alom hiṛińa.",
     	"yourname": "Beoboharicaḱ ńutum",
    +	"userlogin-yourname": "Beoharićaḱ ńutum:",
     	"userlogin-yourname-ph": "Amaḱ beohar ńutum emme.",
     	"yourpassword": "Uku namber",
    +	"userlogin-yourpassword": "Uku nambar",
    +	"userlogin-yourpassword-ph": "Amaḱ uku nambar emme",
    +	"createacct-yourpassword-ph": "Uku namber emme",
     	"yourpasswordagain": "Arhõ oku namber olme",
    +	"createacct-yourpasswordagain": "Uku nambar sãyãḱme",
    +	"createacct-yourpasswordagain-ph": "Uku nambar arhõ emme",
     	"remembermypassword": "Mitṭen khon bạṛti khata reaḱ cạbi disạ dohoḱma (Jạsti $1 {{PLURAL:$1 din reaḱ din reaḱ}} lạgit)",
    +	"userlogin-remembermypassword": "Bolo thirege dohokạńme",
     	"yourdomainname": "Amaḱ ḍomen:",
     	"externaldberror": "Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.",
     	"login": "bolok' duar",
    @@ -321,14 +331,25 @@
     	"logout": "Bahre oḍoń",
     	"userlogout": "Bahre oḍoń",
     	"notloggedin": "Bhitri baṅ bolokana",
    +	"userlogin-noaccount": "Cet́ accountge banuḱtama?",
    +	"userlogin-joinproject": "Seledoḱ {{SITENAME}}",
     	"nologin": "Amaḱ do cet́ wikipeḍiare ekaunṭ banuḱtama? Ado '''$1'''",
     	"nologinlink": "account tear me",
     	"createaccount": "Ṭhai benaome",
     	"gotaccount": "Amaḱ do cet́ miṭten ekaunṭ tear menaḱtama? $1 tearmẽ.",
     	"gotaccountlink": "Bhitri bolon",
     	"userlogin-resetlink": "Amaḱ boloḱ talam cạbi sanamem hiṛińkeda?",
    +	"userlogin-resetpassword-link": "Amaḱ uku nambarem hiṛiń akada?",
    +	"userlogin-helplink2": "Bolon khạtir go̠ṛo̠",
    +	"createacct-emailoptional": "Email á¹­hikana (iccha lekate)",
    +	"createacct-email-ph": "Amaḱ e-mail ṭhikana emme",
     	"createaccountmail": "E-mail hotete",
     	"createaccountreason": "Karon",
    +	"createacct-submit": "Amaḱ account tearme",
    +	"createacct-benefit-heading": "{{SITENAME}} am lekan hoṛ hotete tear akan.",
    +	"createacct-benefit-body1": "{{PLURAL:$1|joṛao|joṛaoko}}",
    +	"createacct-benefit-body2": "{{PLURAL:$1|sakam|sakamko}}",
    +	"createacct-benefit-body3": "nahaḱ {{PLURAL:$1|kamiạ|kạmiako}}",
     	"badretype": "Am do okaṭaḱ oku nambarkom em keda ona do baṅ milạolena.",
     	"userexists": "Laṛcaṛicaḱ ńutum em hoyena ona do beohar hoyakana.\nDayakatet́ eṭagaḱ ńutum bachaome.",
     	"loginerror": "Bhitri bolok do vulgea",
    @@ -368,7 +389,11 @@
     	"createaccount-text": "Okoe co am lạgit́te mitṭen ekaunṭko amaḱ e-mail ṭhikạna lạgit {{SITENAME}} re ($4) ńutum \"$2\", oku nambar \"$3\".\nAm do mesagem baṅ daṛeyaḱa, judi noa ekaunṭ do vulge benaolen khan.",
     	"login-throttled": "Am do mitghạri lahare por por aema dhao boloḱem kurumuṭu keda.\nArhõ kurumuṭue lahare dayakate thoṛagan tạṅgiemẽ.",
     	"login-abort-generic": "Amaḱ bhitri boloḱ do baṅ hoylena - batena.",
    -	"loginlanguagelabel": "katha: $1",
    +	"loginlanguagelabel": "Pạrsi: $1",
    +	"pt-login": "Bolok' duar",
    +	"pt-login-button": "Bolon",
    +	"pt-createaccount": "Ṭhai benaome",
    +	"pt-userlogout": "Bahre oḍoń",
     	"user-mail-no-addy": "Jahan e-mail ṭhikana bạgi kate e-mail kul kurumuṭu hoena.",
     	"changepassword": "Uku nombor bodolme",
     	"resetpass_header": "Ekauná¹­ oku namber bodol",
    @@ -425,7 +450,7 @@
     	"preview": "Ńel, Unuduḱ",
     	"showpreview": "Unuduḱ",
     	"showdiff": "Bodolko ńeloḱma",
    -	"anoneditwarning": "'''Sabdhan:''' amdo begor logkatem bolowakana.\nAmaḱ IP ṭhikana do noa sakam sompadon jạṛre rekorḍoḱa.",
    +	"anoneditwarning": "Husiạr: amdo nit́hõ bam boloakana.\nJudil am nonḍem toṅge lekhan amaḱ IP ṭhikana do noa sakamre ol tahẽna.",
     	"anonpreviewwarning": "\"Am do bhitri bam bolo akana. Noa sakamre amaḱ kạmiko jạre IP ṭhiikạ̣nare rukhiyạ ḱa.\"",
     	"missingcommenttext": "Daya kate amaḱ menaḱ katha latare olmẽ.",
     	"summary-preview": "Guṭ katha unuduḱ:",
    @@ -441,7 +466,7 @@
     	"accmailtext": "[[User talk:$1 $1]] lạgit́te aćte benaoen uku nambar do $2 kul hoena.\nBhitri bolo kateḱ noa nãwã ekaunṭ lạgit uku nambar \"[[Special:ChangePassword Change password]]\" sakam khonem bodol daṛyakya.",
     	"newarticle": "(Nãwa)",
     	"newarticletext": "Am do oka mitṭen joṛaoem pańja akada, onaṭak do bạnuḱa.\nOna sakam tear lạgit́te, latar reaḱ baksore ol ehoṕmẽ (arhõ jạsti baḍae lạgit́te [$1 help page] pańjaemẽ).\nAm do judi nonḍe vulkatem heć akan khan, tobe amaḱ sendrakore '''back''' baṭon linmẽ.",
    -	"noarticletext": "Nitoḱ noa sakamre do ol bạnuḱa.\n\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
    +	"noarticletext": "Nitoḱ noa sakamre do cet́olge bạnuḱa.\n\nAm menlekhan eṭaḱ sakamkore [[Special:Search/{{PAGENAME}}|search for this page title]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} edit this page]</span>.",
     	"noarticletext-nopermission": "Noa sakamre do nitoḱ o̠l banuḱa.\n\nYou can [[Special:Search/{{PAGENAME}}|search for this page title]] in other pages,\nor <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>.",
     	"userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" ńutuman jahãe beoharićaḱ ekaunṭ do baṅ resṭri hoeakana. Daya kate biḍạo katet́ ńelmẽ noa sakam do benoa/sompadonem menet́ kana se baṅ.",
     	"userpage-userdoesnotexist-view": "Beoharićaḱ \"$1\" ekaunṭ do baṅ resṭire akana.",
    @@ -488,7 +513,7 @@
     	"currentrev": "Mucạt nãwã aroe",
     	"currentrev-asof": "Mucạt nãwã aroy",
     	"revisionasof": "Nãwã aro sakam $1 leka",
    -	"revision-info": "Ńel/pańja ruạṛ $1 khon $2",
    +	"revision-info": "Revision as of $1 by {{GENDER:$6|$2}}$7",
     	"previousrevision": "Pạhilaḱ paṛhao ruạṛ",
     	"nextrevision": "nãwate n'el ruar",
     	"currentrevisionlink": "Nitoḱaḱ nãwa aroy",
    @@ -511,7 +536,7 @@
     	"rev-deleted-user": "(laṛcaṛić ńutum ocoḱena)",
     	"rev-deleted-event": "(Log kạmi do ocog hoena)",
     	"rev-deleted-user-contribs": "[Beoharićaḱ ńutum se IP ṭhikạna do ocog hoena - kạmi khon sompadon do uku hoe akana]",
    -	"rev-delundel": "ńeloḱ/danaṅ",
    +	"rev-delundel": "Juḍawaḱko ńel",
     	"rev-showdeleted": "Uduḱme",
     	"revisiondelete": "Get giḍi/nãwã aro baṅ getgiḍi",
     	"revdelete-show-file-submit": "Hẽ",
    @@ -534,7 +559,7 @@
     	"lineno": "Sạr $1:",
     	"compareselectedversions": "Noa barea nãwã bachawanaḱ talare tolonayme",
     	"editundo": "ruạṛ",
    -	"searchresults": "SeÌ ndra foÌ l",
    +	"searchresults": "SeÌ ndra phoÌ l",
     	"searchresults-title": "\"$1\"  renaḱ Sẽndra  phol",
     	"prevn": "Laha reaḱ {{PLURAL:$1|$1}}",
     	"nextn": "Táyom teaḱ {{PLURAL:$1|$1}}",
    @@ -561,13 +586,13 @@
     	"search-interwiki-default": "$1 folko:",
     	"search-interwiki-more": "(Arhõ)",
     	"searchrelated": "songenko",
    -	"searchall": "Sanam",
    +	"searchall": "Sanamaḱ",
     	"search-nonefound": "Kupuli leka roṛruạṛ bạnuḱa",
     	"powersearch-togglelabel": "Sendra",
     	"powersearch-toggleall": "Sanamaḱ",
     	"powersearch-togglenone": "Okaṭaḱ hõ baṅ",
     	"preferences": "Pạsindko",
    -	"mypreferences": "Iñaḱ pạsindko",
    +	"mypreferences": "Pạsindko",
     	"prefs-skin": "Harta",
     	"skin-preview": "Ńel, Unuduḱ",
     	"datedefault": "Pạsind banuḱa",
    @@ -610,30 +635,42 @@
     	"newuserlogpage": "Laṛcaṛićaḱ tear cạbi",
     	"action-edit": "noa sakam joṛao",
     	"nchanges": "$1 {{PLURAL:$1 bodol bodolko}}",
    +	"enhancedrc-history": "Jạṛ",
     	"recentchanges": "Nãwã bo̠do̠lko",
     	"recentchanges-legend": "Nahaḱ bodol teaḱko",
     	"recentchanges-summary": "Noa sakamre wiki reaḱ joto khon nãwã bodolko paṅjaṅjaymẽ.",
     	"recentchanges-feed-description": "Noa feedre wiki reaḱ joto khon nãwã bodolko paṅjaymẽ",
     	"recentchanges-label-newpage": "Noa sompadon do nãwã mint́ṭen sakame tearkeda",
    -	"recentchanges-label-minor": "Noado hudiń mạchi sompadonkana",
    -	"recentchanges-label-bot": "Noa sompadon do bot darate purauena",
    +	"recentchanges-label-minor": "Noado hudiń mạchi toṅge",
    +	"recentchanges-label-bot": "Noa toṅge do bot hotete purauena",
     	"recentchanges-label-unpatrolled": "Noa sompadon do ńit́ hạbić baṅ ńel ńamakana",
    +	"recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (arhõ ńelme [[Asokaete:Nãwã sakamko |nãwã sakamko reaḱ lisṭi]])",
     	"rcnotefrom": "$2 habić bodolak ko do latare ńeloḱkana",
     	"rclistfrom": "Nãwã  bodolko uduḱme $3 $2 khon ehoṕkate",
    -	"rcshowhideminor": "$1 kaṭic culuń tońge",
    +	"rcshowhideminor": "$1 kaṭic culuń tońgeko",
    +	"rcshowhideminor-show": "Uduḱme",
    +	"rcshowhideminor-hide": "Danaṅ",
     	"rcshowhidebots": " boá¹­ko $1",
    -	"rcshowhideliu": "Beoharićaḱ boloḱ $1",
    +	"rcshowhidebots-show": "Uduḱme",
    +	"rcshowhidebots-hide": "Danaṅ",
    +	"rcshowhideliu": "Regisṭari beoharićko $1",
    +	"rcshowhideliu-hide": "Danaṅ",
     	"rcshowhideanons": "$1 Nũtum bańa bebohariḱ",
    +	"rcshowhideanons-show": "Uduḱme",
    +	"rcshowhideanons-hide": "Danaṅ",
     	"rcshowhidepatr": "$1 Biḍạen sompadonko",
    -	"rcshowhidemine": "$1 ińaḱ tońge",
    +	"rcshowhidemine": "$1 ińaḱ tońgeko",
    +	"rcshowhidemine-show": "Uduḱme",
    +	"rcshowhidemine-hide": "Danaṅ",
     	"rclinks": "$2 din lahare $1 bodol unuduḱme <br />$3",
     	"diff": "Judạ",
     	"hist": "Jạr",
     	"hide": "Danaṅ",
    -	"show": "Udugme",
    +	"show": "Uduḱme",
     	"minoreditletter": "m",
     	"newpageletter": "N",
     	"boteditletter": "b",
    +	"rc-change-size-new": "Bodol tayomte",
     	"rc-enhanced-expand": "Purạote uduḱ",
     	"rc-enhanced-hide": "Purạo cuku",
     	"recentchangeslinked": "Sãotenaḱ bodolko",
    @@ -642,7 +679,7 @@
     	"recentchangeslinked-summary": "Noa do ona tạlika kana oka do nebetarge bodol hoyakan oka do asokayte hatao akan sakam khon.\n\n[[Special:Watchlist|your watchlist]] renaḱ sakamko do '''bold''' .",
     	"recentchangeslinked-page": "sakạm ńutum",
     	"recentchangeslinked-to": "Joṛaoaḱ sakamre ńel ocoyme emaḱ sakam bạgi katet",
    -	"upload": "Fael aploḍme",
    +	"upload": "Phayel aploḍme",
     	"uploadbtn": "Rẽt rakabmẽ",
     	"uploadlogpage": "Chạbi do uthạome",
     	"filename": "Rẽt ńutum",
    @@ -660,7 +697,7 @@
     	"listfiles_name": "Ńutum",
     	"listfiles_user": "Beoharić, Laṛcaṛic",
     	"file-anchor-link": "Re̕t",
    -	"filehist": "Fael renaḱ Jạṛ",
    +	"filehist": "Phayel reaḱ Jạṛ",
     	"filehist-help": "date re click me/somóy re click me fail reak obostha nel lagit",
     	"filehist-deleteall": "Joto get giḍi",
     	"filehist-deleteone": "Get giḍi",
    @@ -672,10 +709,11 @@
     	"filehist-user": "Laṛcaṛić",
     	"filehist-dimensions": "Maṕ",
     	"filehist-comment": "Roṛ",
    -	"imagelinks": "Fael bebohar",
    +	"imagelinks": "Phayel bebohar",
     	"linkstoimage": "Latar reaḱ {{PLURAL:$1 sakam $1 sakam}} khon noa rẽtre joṛao menaḱa:",
     	"nolinkstoimage": "Nonḍe do noa são joṛao sakam banuka",
     	"sharedupload-desc-here": "Noa rẽt do nonḍe khon-  $1 ar paseć eṭaḱaḱ porjekṭko beoharakana.\nNoa reaḱ pasnao katha [$2 rẽt pasnao sakam] latare emena",
    +	"upload-disallowed-here": "Am do noa phayel cetanre bam ol daṛẽaḱa",
     	"randompage": "Joṛao sakam",
     	"statistics": "Halot",
     	"statistics-pages": "Sakamko",
    @@ -695,6 +733,7 @@
     	"pager-older-n": "{{PLURAL:$1 arhõ mare 1ṭen arhõ mare $1ṭen}}",
     	"booksources": "Puthi ńamoḱ ṭhại/jayga",
     	"booksources-search-legend": "Puthi reak á¹­hai sendrayme",
    +	"booksources-search": "Sendra",
     	"log": "Cạbiko",
     	"allpages": "joto sakam",
     	"allarticles": "Sanam sakam",
    @@ -718,7 +757,7 @@
     	"emailmessage": "Mesag",
     	"emailsend": "Kulmẽ",
     	"watchlist": "Inak' n'el ko",
    -	"mywatchlist": "Iñak jagarna tạlikạ",
    +	"mywatchlist": "Ńeloḱgoḱ tạlika",
     	"watchlistfor2": "$1 ($2) lạ̣gitte",
     	"watch": "Ńelme",
     	"unwatch": "bang nelok' a",
    @@ -745,9 +784,10 @@
     	"namespace": "Ńutum reaḱ ṭhai",
     	"invert": "Seć bachao",
     	"blanknamespace": "Mukhiạ̣",
    -	"contributions": "Beharićaḱ Kạmiko",
    +	"contributions": "{{GENDER:$1|Beoharićaḱ }} Kạmiko",
     	"contributions-title": "$1 Beoharićaḱ kạmiko",
     	"mycontris": "Ińaḱ kạmiko",
    +	"anoncontribs": "Ińaḱ kạmiko",
     	"contribsub2": "$1 ($2) lạgitte",
     	"uctop": "(coṭ utạr)",
     	"month": "Cando khon (ar etohopreaḱ)",
    @@ -772,9 +812,9 @@
     	"whatlinkshere-prev": "{{PLURAL:$1 Laha reaḱ Laha reaḱ$1ṭen}}",
     	"whatlinkshere-next": "{{PLURAL:$1 |Laha renaḱ | Laha renaḱko $1}}",
     	"whatlinkshere-links": "Joṛaoko",
    -	"whatlinkshere-hideredirs": "$1 acurgeya",
    -	"whatlinkshere-hidetrans": "$1 ṭarnskuleson uduḱme",
    -	"whatlinkshere-hidelinks": "$1 joṛao",
    +	"whatlinkshere-hideredirs": "$1 arhõ unuduḱ",
    +	"whatlinkshere-hidetrans": "Selet́ $1",
    +	"whatlinkshere-hidelinks": "$1 joṛaoko",
     	"whatlinkshere-hideimages": "$1 Chubi joṛaoko",
     	"whatlinkshere-filters": "Sapha",
     	"block": "Beoharić esedem",
    @@ -808,15 +848,16 @@
     	"thumbnail-more": "Lạṭui mẽ",
     	"thumbnail_error": "Benawakan unuduḱ kạṭuṕ do baṅ ṭhika: $1",
     	"import-upload-filename": "Rẽt ńutum",
    -	"tooltip-pt-userpage": "Amaḱ́ bebo̠harić sakam",
    -	"tooltip-pt-mytalk": "Amaḱ katha ro̠ṛrenaḱ́ sakam",
    -	"tooltip-pt-preferences": "Amaḱ pạsindko",
    +	"tooltip-pt-userpage": "{{GENDER:|am beoharićaḱ}} sakam",
    +	"tooltip-pt-mytalk": "{{GENDER:|Amaḱ}} ro̠ṛreaḱ́ sakam",
    +	"tooltip-pt-preferences": "{{GENDER:|Amaḱ}} pạsindko",
     	"tooltip-pt-watchlist": "Sakam tạlika okaṭak̕katet́ am do nãwã aroy lạgitem ńeleḱkan",
    -	"tooltip-pt-mycontris": "Amaḱ kạmi reaḱ tạlika",
    -	"tooltip-pt-login": "Am do log in lagit́ metao am kana; menkhan noa do jarur bań kana",
    +	"tooltip-pt-mycontris": "Mit́ṭen lisṭ {{GENDER:|amaḱ}} kạmiko reaḱ",
    +	"tooltip-pt-login": "Am do boloḱ lagit́te udgạoiń emamkana; Nonḍe boloḱ unạḱ jarur do bań kana",
     	"tooltip-pt-logout": "O̠nḍo̠ńme",
    +	"tooltip-pt-createaccount": "Am do mit́ṭen hisạb jhić katet́ boloniń metamkana, tobe joborjosti katet́ do baṅ.",
     	"tooltip-ca-talk": "Galmãrao bhitri renaḱ sakam lạgit́",
    -	"tooltip-ca-edit": "Noa sakam em edit daṛeaḱ. Daya kateć save laha re preview batton bebohar me.",
    +	"tooltip-ca-edit": "Noa sakam joṛaome",
     	"tooltip-ca-addsection": "Nãwã sekson sạrdi",
     	"tooltip-ca-viewsource": "Noa sakam do poṭom gea\nOna te source em ńel daṛeaḱ",
     	"tooltip-ca-history": "Noa sakam renaḱ calao parom ńel ruạṛ",
    @@ -833,22 +874,22 @@
     	"tooltip-n-mainpage-description": "Mukhiạ sakamre calaḱme",
     	"tooltip-n-portal": "Niạ pro̠je̠ḱ́ṭreaḱ Biso̠yko, Cet́em ceka daṛia,Okare̠ sendra ñamoḱ́a",
     	"tooltip-n-currentevents": "Nitaḱ events re jos hudis ńãm me",
    -	"tooltip-n-recentchanges": "Uiki nãhaḱ palaṭrenaḱ́ tạlikạ",
    +	"tooltip-n-recentchanges": "Uikire nãhaḱ bodolko reaḱ tạlikạ",
     	"tooltip-n-randompage": "Ãr hõ sakam ko agui mẽ",
     	"tooltip-n-help": "Sendra ñamreaḱ jayga",
     	"tooltip-t-whatlinkshere": "Sanam wiki sakam renaḱ list ar link do nonde",
     	"tooltip-t-recentchangeslinked": "Noa sakam re nitaḱ bodol akan sakam renaḱ linked",
    -	"tooltip-feed-atom": "Noa sakam lạgit́ atom jomaḱ",
    +	"tooltip-feed-atom": "Noa sakam lạgit́ atom phiḍ",
     	"tooltip-t-contributions": "Beoharićak kami reaḱ tạ̣lika",
     	"tooltip-t-emailuser": "Nui beoharić mitṭen e-mail kulayme",
    -	"tooltip-t-upload": "Failko aploḍ̣me",
    +	"tooltip-t-upload": "Phayelko aploḍ̣me",
     	"tooltip-t-specialpages": "Jạruṛ patakureaḱ tạlikạ",
     	"tooltip-t-print": "Printoḱ lekan sakam",
     	"tooltip-t-permalink": "Terejuge joṛaokam ñel sakam",
     	"tooltip-ca-nstab-main": "Bahal sakam ńel me",
     	"tooltip-ca-nstab-user": "Beoharićaḱ sakam uduḱme",
    -	"tooltip-ca-nstab-special": "Noa do nij/bises sakam kana, amem menle rehõ bam joṛao dareaḱa",
    -	"tooltip-ca-nstab-project": "project page nel' me",
    +	"tooltip-ca-nstab-special": "Noa do mit́ṭen bises sakam kana, ar noa do bam joṛao daṛẽaḱa",
    +	"tooltip-ca-nstab-project": "projeṭ sakam ńelmẽ",
     	"tooltip-ca-nstab-image": "Fael sakam ńel",
     	"tooltip-ca-nstab-template": "Forom uduḱme",
     	"tooltip-ca-nstab-help": "Goṛo sakam ńelmẽ",
    @@ -864,14 +905,19 @@
     	"tooltip-preferences-save": "Pạsindko rukhiyaymẽ",
     	"tooltip-summary": "Khaá¹­ote guá¹­ katha bhoraome",
     	"others": "Eṭagaḱko",
    +	"simpleantispam-label": "Enṭi espam ńel\nDo <strong>not</strong> noa purạome!",
     	"pageinfo-header-edits": "Toṅgeko",
     	"pageinfo-watchers": "Ńeńelkoaḱ nombor",
    -	"previousdiff": "mareak' kamiko",
    +	"pageinfo-toolboxlink": "Sakam reaḱ baḍaejońaḱko",
    +	"previousdiff": "Marenaḱ toṅgeko",
     	"nextdiff": "Nãwã joṛao",
     	"file-info-size": "$1 x $2 pixels, file size: $3, MIME type: $4",
     	"file-nohires": "Aema resulation nondḍe banuḱa",
     	"svg-long-desc": "SVG rẽt, normalte $1 x $2 pixels, rẽt sayej: $3",
    -	"show-big-image": "Purạo resulation",
    +	"show-big-image": "Mukhiạ phayel",
    +	"show-big-image-preview": "Noa ńeloḱ akar do:$1",
    +	"show-big-image-other": "Eman teaḱ {{PLURAL:$2|resolution|resolutions}}: $1",
    +	"show-big-image-size": "$1 X $2 Pikcel",
     	"ilsubmit": "Sendra",
     	"bad_image_list": "Format do latar re leka",
     	"metadata": "Meá¹­a khobor",
    @@ -886,8 +932,13 @@
     	"watchlisttools-view": "Jońgṛao bodolaḱko ńel",
     	"watchlisttools-edit": "Ńelok tạlika ńel ar joṛao",
     	"watchlisttools-raw": "Baṇ purạo akan ńelok tạlika purạomẽ",
    +	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_galmarao}}:$1|talk]])",
     	"duplicate-defaultsort": "'''Sontoroḱmẽ:''' ḍifolṭ sajao reaḱ cạbi: $2 lahare ḍifolṭ sajao reaḱ sakam: ''$1'' e bae luturaḱ kana.",
    -	"specialpages": "Jạruṛ patako",
    +	"specialpages": "Osokayteaḱ sakamko",
     	"external_image_whitelist": "#Noa sakam do cet leka menaḱa oṅkage dohoemẽ\n#Sanam okte re jạhiren kuṭrạ latar re (khạli hạtiń //talare) bạisạomẽ\n#Noako do bahre reaḱ (hotlinked) chubi reaḱ URL saõte milạo hoyoḱa\n#Okako milạḱa, onako do chubi lekate udugoḱa, baṅkhan do khali chubi joṛao udugoḱa\n#Noa layen reaḱ ehoṕre # menaḱa ona layenko menko hisapte beohar hoyoḱka\n#Noa do kas-baṅ rimjhạoaḱge\n#Noa dag cetanre regex kuṭrạ bạsạomẽ. Noa layen cetleka menaḱa oṅkage dohoemẽ</pre>",
    -	"tag-filter": "[[Special:Tags|Tag]] saphay:"
    +	"tag-filter": "[[Special:Tags|Tag]] saphay:",
    +	"logentry-move-move": "$1 beoharić $3 sakam do $4 ńutumre {{GENDER:$2|ạcạr}} akada",
    +	"logentry-newusers-create": "Beoharićaḱ hisạb khata $1 do jhićena",
    +	"logentry-upload-upload": "$1 {{GENDER:$2|rakaṕ akadae}} $3",
    +	"searchsuggest-search": "SeÌ ndra"
     }
    diff --git a/languages/i18n/sco.json b/languages/i18n/sco.json
    index f01ac02e84..b85a4d51d8 100644
    --- a/languages/i18n/sco.json
    +++ b/languages/i18n/sco.json
    @@ -135,6 +135,8 @@
     	"october-date": "$1 October",
     	"november-date": "$1 November",
     	"december-date": "$1 Dezember",
    +	"period-am": "AM",
    +	"period-pm": "PM",
     	"pagecategories": "{{PLURAL:$1|Categerie|Categeries}}",
     	"category_header": "Pages in categerie \"$1\"",
     	"subcategories": "Subcategeries",
    @@ -160,7 +162,7 @@
     	"morenotlisted": "This leet isna complete.",
     	"mypage": "Ma page",
     	"mytalk": "Ma tauk",
    -	"anontalk": "Tauk fer this IP address",
    +	"anontalk": "Tauk",
     	"navigation": "Navigation",
     	"and": "&#32;n",
     	"qbfind": "Fynd",
    @@ -239,6 +241,7 @@
     	"pool-queuefull": "Pool line is ful",
     	"pool-errorunknown": "Onknawn mistak.",
     	"pool-servererror": "The puil coonter service is na available ($1).",
    +	"poolcounter-usage-error": "Uisage error: $1",
     	"aboutsite": "Aneat {{SITENAME}}",
     	"aboutpage": "Project:Aneat",
     	"copyright": "Content is available unner $1 onless itherwise noted.",
    @@ -306,6 +309,7 @@
     	"nstab-template": "Template",
     	"nstab-help": "Help page",
     	"nstab-category": "Categerie",
    +	"mainpage-nstab": "Main page",
     	"nosuchaction": "Nae sic action",
     	"nosuchactiontext": "The action speceefieed bi the URL isna recognised\nYe micht hae mistyped the URL, or follaed ae wrang link\nThis micht forby be caused bi ae bug in the saffware uised bi {{SITENAME}}.",
     	"nosuchspecialpage": "Nae sic byordinar page",
    @@ -325,8 +329,10 @@
     	"missingarticle-rev": "(reveesion#: $1)",
     	"missingarticle-diff": "(Diff: $1, $2)",
     	"readonly_lag": "The database haes been autaematiclie lockit while the sclave database servers catch up tae the maister",
    +	"nonwrite-api-promise-error": "The 'Promise-Non-Write-API-Action' HTTP header wis sent but the request wis tae an API write module.",
     	"internalerror": "Internal mistak",
     	"internalerror_info": "Internal mistak: $1",
    +	"internalerror-fatal-exception": "Fatal exception o teep \"$1\"",
     	"filecopyerror": "Cuidna copie file \"$1\" til \"$2\".",
     	"filerenameerror": "Cuidna rename file \"$1\" til \"$2\".",
     	"filedeleteerror": "Cuidna delyte file \"$1\".",
    @@ -376,6 +382,7 @@
     	"virus-scanfailed": "the scan failed (code $1)",
     	"virus-unknownscanner": "onken't antivirus:",
     	"logouttext": "<strong>Ye'r nou loggit oot.</strong>\n\nMynd that some pages micht continue tae be displeyed aes gif ye were still loggit in, til ye clear yer brouser cache.",
    +	"cannotlogoutnow-title": "Canna log oot nou",
     	"welcomeuser": "Weelcome, $1!",
     	"welcomecreation-msg": "Yer accoont haes been cræftit.\nYe can chynge yer {{SITENAME}} [[Special:Preferences|preeferences]] gif ye like.",
     	"yourname": "Uisername:",
    @@ -392,10 +399,12 @@
     	"remembermypassword": "Mynd ma login oan this brouser (fer $1 {{PLURAL:$1|day|days}} at the maist)",
     	"userlogin-remembermypassword": "Keep me loggit in",
     	"userlogin-signwithsecure": "Uise secure connection",
    +	"cannotloginnow-title": "Canna log in nou",
     	"yourdomainname": "Yer domain:",
     	"password-change-forbidden": "Ye canna chynge passwords oan this wiki.",
     	"externaldberror": "Aither thaur wis aen external authentication database mistak, or ye'r naw permitit tae update yer external accoont.",
     	"login": "Log in",
    +	"login-security": "Verify yer identity",
     	"nav-login-createaccount": "Log in / cræft aen accoont",
     	"userlogin": "Cræft aen accoont or log in",
     	"userloginnocreate": "Log in.",
    @@ -413,6 +422,7 @@
     	"userlogin-resetpassword-link": "Fergot yer password?",
     	"userlogin-helplink2": "Heelp wi loggin in",
     	"userlogin-loggedin": "Ye'r awreadie loggit in as {{GENDER:$1|$1}}.\nUise the form ablow tae log in as anither uiser.",
    +	"userlogin-reauth": "Ye must log in again tae verify that ye are {{GENDER:$1|$1}}.",
     	"userlogin-createanother": "Mak anither accoont",
     	"createacct-emailrequired": "Wab-mail address",
     	"createacct-emailoptional": "Wab-mail address (optional)",
    @@ -423,13 +433,17 @@
     	"createaccountreason": "Raison:",
     	"createacct-reason": "Raison",
     	"createacct-reason-ph": "Why ar ye creating anither accoont",
    +	"createacct-reason-help": "Message shawn in the accoont creation log",
     	"createacct-submit": "Mak yer accoont",
     	"createacct-another-submit": "Mak anither accoont",
    +	"createacct-continue-submit": "Continue accoont creation",
    +	"createacct-another-continue-submit": "Continue accoont creation",
     	"createacct-benefit-heading": "{{SITENAME}} is makit bi fowk like ye.",
     	"createacct-benefit-body1": "{{PLURAL:$1|eidit|eidits}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|page|pages}}.",
     	"createacct-benefit-body3": "recent {{PLURAL:$1|contreebuter|contreebuters}}",
     	"badretype": "The passwairds ye entered dinna match.",
    +	"usernameinprogress": "An accoont creation for this uiser name is already in progress.\nPlease wait.",
     	"userexists": "The uiser name ye entered is awreadie in uiss. Please chuise ae different name.",
     	"loginerror": "Login mistak",
     	"createacct-error": "Accoont cræftin mistak",
    @@ -438,15 +452,16 @@
     	"nocookieslogin": "{{SITENAME}} uises cookies tae log in uisers. Ye hae cookies disabled. Please enable thaim an gie it anither shot.",
     	"nocookiesfornew": "The uiser accoont wisna cræftit, aes we couda confirm its soorce.\nEnsure that ye have cookies enabled, relaid this page n gie it anither shote.",
     	"noname": "Ye'v na speceefie'd ae valid uisername.",
    -	"loginsuccesstitle": "Login fine",
    +	"loginsuccesstitle": "Logged in",
     	"loginsuccess": "<strong>Ye're nou loggit in tae {{SITENAME}} aes \"$1\".</strong>",
    -	"nosuchuser": "Thaur's nae sic uiser aes \"$1\".\nUiser names ar case-sensiteeve.\nCheck yer speelin, or [[Special:CreateAccount|mak ae new accoont]].",
    +	"nosuchuser": "Thare is no uiser bi the name \"$1\".\nUisernames are case sensitive.\nCheck yer spellin, or [[Special:CreateAccount|create a new accoont]].",
     	"nosuchusershort": "Thaur's nae sic uiser aes \"$1\". Check yer spellin.",
     	"nouserspecified": "Ye hae tae merk up ae uisername.",
     	"login-userblocked": "Uiser \"$1\" is blockit. Log-in naw permitit.",
     	"wrongpassword": "The passwaird ye entered is wrang. Please gie it anither shot.",
     	"wrongpasswordempty": "The passwaird ye entered is blank. Please gie it anither shot.",
     	"passwordtooshort": "Yer password is ower short.\nIt maun hae at laest {{PLURAL:$1|1 chairacter|$1 chairacters}}.",
    +	"passwordtoolong": "Passwirds canna be langer nor {{PLURAL:$1|1 character|$1 characters}}.",
     	"password-name-match": "Yer passwaird maun be different fae yer uisername.",
     	"password-login-forbidden": "The uise o this uisername n passwaird haes been ferbidden.",
     	"mailmypassword": "Reset password",
    @@ -479,6 +494,7 @@
     	"createacct-another-realname-tip": "Real name is aen optie.\nGif ye chuise tae provide it, this will be uised fer giein the uiser attreebution fer their wark.",
     	"pt-login": "Log in",
     	"pt-login-button": "Log in",
    +	"pt-login-continue-button": "Continue login",
     	"pt-createaccount": "Mak accoont",
     	"pt-userlogout": "Log oot",
     	"php-mail-error-unknown": "Onken't mistak in PHP's mail() function.",
    @@ -1189,6 +1205,8 @@
     	"recentchangeslinked-summary": "This is ae leet o chynges makit recentlie til pages linked fae ae speceefied page (or til memmers o ae speceefied categerie).\nPages oan [[Special:Watchlist|yer watchleet]] ar <strong>baud</strong.",
     	"recentchangeslinked-page": "Page name:",
     	"recentchangeslinked-to": "Shaw chynges til pages linked til the gien page instead",
    +	"recentchanges-page-added-to-category": "[[:$1]] addit tae category",
    +	"recentchanges-page-removed-from-category": "[[:$1]] remuived frae category",
     	"upload": "Uplaid file",
     	"uploadbtn": "Uplaid file",
     	"reuploaddesc": "Gang back til the uplaid form.",
    @@ -1566,6 +1584,8 @@
     	"querypage-disabled": "This speecial page is disablit fer performance raisons.",
     	"apihelp": "API help",
     	"apihelp-no-such-module": "Module \"$1\" wis no foond.",
    +	"apisandbox-loading": "Laidin information for API module \"$1\"...",
    +	"apisandbox-load-error": "An error occurred while laidin information for API module \"$1\": $2",
     	"booksources": "Buik soorces",
     	"booksources-search-legend": "Rake fer buik soorces",
     	"booksources-search": "Rake",
    @@ -1579,6 +1599,7 @@
     	"logempty": "Nae matchin eetems in log.",
     	"log-title-wildcard": "Rake titles stairtin wi this tex",
     	"showhideselectedlogentries": "Chynge veesibeelitie o selectit log entries",
    +	"log-edit-tags": "Eedit tags o selectit log entries",
     	"allpages": "Aw pages",
     	"nextpage": "Neis page ($1)",
     	"prevpage": "Aforegaun page ($1)",
    @@ -1762,6 +1783,7 @@
     	"rollback-success": "Reverted eedits b $1;\nchynged back til the laist reveesion bi $2.",
     	"sessionfailure-title": "Session failure",
     	"sessionfailure": "Thaur seems tae be ae proablem wi yer login session;\nthis action haes been canceled aes ae precaution again session hijackin.\nGang back til the preeveeoos page, relaid that page n than gie it anither gae.",
    +	"log-name-contentmodel": "Content model chynge log",
     	"protectlogpage": "Fend log",
     	"protectlogtext": "Ablow is ae leet o chynges til page protections.\nSee the [[Special:ProtectedPages|protected pages leet]] fer the leet o currently operational page protections.",
     	"protectedarticle": "protectit \"[[$1]]\"",
    @@ -2318,6 +2340,7 @@
     	"patrol-log-page": "Patrow log",
     	"patrol-log-header": "This is ae log o patrowed reveesions.",
     	"log-show-hide-patrol": "$1 patrow log",
    +	"log-show-hide-tag": "$1 tag log",
     	"deletedrevision": "Delytit auld reveesion $1.",
     	"filedeleteerror-short": "Mistak delytin file: $1",
     	"filedeleteerror-long": "mistaks were encoontered while delytin the file:\n\n$1",
    @@ -2902,6 +2925,9 @@
     	"tags-active-no": "Naw",
     	"tags-edit": "eedit",
     	"tags-hitcount": "$1 {{PLURAL:$1|chynge|chynges}}",
    +	"tags-edit-logentry-selected": "{{PLURAL:$1|Selectit log event|Selectit log events}}:",
    +	"tags-edit-logentry-legend": "Add or remuive tags frae {{PLURAL:$1|this log entry|aw $1 log entries}}",
    +	"tags-edit-logentry-submit": "Apply chynges tae {{PLURAL:$1|this log entry|$1 log entries}}",
     	"comparepages": "Compare pages",
     	"compare-page1": "Page 1",
     	"compare-page2": "Page 2",
    @@ -2973,6 +2999,10 @@
     	"logentry-upload-upload": "$1 {{GENDER:$2|uplaidit}} $3",
     	"logentry-upload-overwrite": "$1 {{GENDER:$2|uplaidit}} ae new version o $3",
     	"logentry-upload-revert": "$1 {{GENDER:$2|uplaidit}} $3",
    +	"log-name-managetags": "Tag management log",
    +	"log-description-managetags": "This page leets management tasks relatit tae [[Special:Tags|tags]]. The log conteens anly actions carried oot manually bi an admeenistrator; tags mey be creatit or deletit bi the wiki saftware wioot an entry bein recordit in this log.",
    +	"logentry-managetags-delete": "$1 {{GENDER:$2|deletit}} the tag \"$4\" (remuived frae $5 {{PLURAL:$5|reveesion or log entry|reveesions an/or log entries}})",
    +	"log-name-tag": "Tag log",
     	"rightsnone": "(nane)",
     	"revdelete-summary": "eedit the ootline",
     	"feedback-adding": "Eikin feedback til page...",
    @@ -3081,7 +3111,7 @@
     	"pagelang-select-lang": "Pick yer leid",
     	"right-pagelang": "Chynge page leid",
     	"action-pagelang": "chynge the page leid",
    -	"log-name-pagelang": "Chynge leid log",
    +	"log-name-pagelang": "Leid chynge log",
     	"log-description-pagelang": "This is ae log o chynges in page leids.",
     	"logentry-pagelang-pagelang": "$1 {{GENDER:$2|chynged}} page leid fer $3 fae $4 tae $5.",
     	"default-skin-not-found": "Whoops! The defaut skin fer yer wiki, defined in <code dir=\"ltr\">$wgDefaultSkin</code> aes <code>$1</code>, is no available.\n\nYer instawation seems tae incluid the follaein skins. See [https://www.mediawiki.org/wiki/Manual:Skin_configuration Manual: Skin configuration] fer information oan hou tae enable thaim n chuise the defaut.\n\n$2\n\n; Gif ye'v juist instawed MediaWiki:\n: Ye proabablie instawed it fae git, or directlie fae the soorce code uisin some ither method. This is expectie. Gie instawin some skins fae [https://www.mediawiki.org/wiki/Category:All_skins mediawiki.org's skin directory] ae shot, bi:\n:* Dounlaidin the [https://www.mediawiki.org/wiki/Download tarball installer], this comes wi several skins n extensions. Ye can than capie n paste the <code>skins/</code> directerie fae this.\n:* Dounlaidin indiveedual skin tarballs frae [https://www.mediawiki.org/wiki/Special:SkinDistributor mediawiki.org].\n:* Clonin one of the <code>mediawiki/skins/*</code> repositries bi wa o git intae the <code dir=\"ltr\">skins/</code> directerie o yer MediaWiki instawation.\n: Daein this shoudna interfere wi yer git repositrie gif ye'r ae MediaWiki deveeloper.\n\n; Gif ye,v juist upgradit MediaWiki:\n: MediaWiki 1.24 n newer nae langer enables instawed skins autæmateeclie (see [https://www.mediawiki.org/wiki/Manual:Skin_autodiscovery Manual: Skin autodiscovery]). Ye can paste the follaein lines intae <code>LocalSettings.php</code> tae enable aw nou installed skins:\n\n<pre dir=\"ltr\">$3</pre>\n\n; Gif ye'v juist modified <code>LocalSettings.php</code>:\n: Double-check the skin names fer typos.",
    @@ -3115,5 +3145,11 @@
     	"json-error-recursion": "Yin or mair recurseeve references in the value tae be encoded",
     	"json-error-inf-or-nan": "Yin or mair NAN or INF values in the value tae be encoded",
     	"json-error-unsupported-type": "Ae value o ae type that canna be encoded wis gien",
    -	"special-characters-group-ipa": "IPA"
    +	"special-characters-group-ipa": "IPA",
    +	"log-action-filter-delete-event": "Log deletion",
    +	"log-action-filter-suppress-event": "Log suppression",
    +	"authmanager-authn-no-local-user-link": "The supplee'd credentials are valid but are nae associatit wi ony uiser on this wiki. Login in a different way, or create a new uiser, an ye will hae an option tae airtin yer previous credentials tae that accoont.",
    +	"authform-nosession-login": "The authentication wis successfu, but yer brouser canna \"remember\" bein logged in.\n\n$1",
    +	"authpage-cannot-login": "Unable tae stairt login.",
    +	"authpage-cannot-login-continue": "Unable tae continue login. Yer session maist likly timed oot."
     }
    diff --git a/languages/i18n/sd.json b/languages/i18n/sd.json
    index 63217b16dd..279b68f1ef 100644
    --- a/languages/i18n/sd.json
    +++ b/languages/i18n/sd.json
    @@ -510,7 +510,7 @@
     	"accmailtitle": "ڳجھو لفظ اماڻجي چڪو.",
     	"newarticle": "(نئون)",
     	"newarticletext": "توهان اهڙي صفحي جو ڳنڍڻو وٺي هتي پهتا آهيو، جيڪو اڃا وجود نہ ٿو رکي. اهڙو صفحو جوڙڻ لاءِ هيٺين باڪس ۾ ٽائيپ ڪرڻ شروع ڪريو (وڌيڪ ڄاڻڻ لاءِ [$1 امدادي صفحو] ڏسندا). جي توهان هتي غلطيءَ ۾ اچي ويا آهيو تہ رڳو پنهنجي جهانگُوءَ جو '''back''' بٽڻ ڪلڪ ڪندا.",
    -	"noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي. توهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا.  \n\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
    +	"noarticletext": "في‌الوقت هن صفحي اندر ڪو بہ ٽيڪسٽ نہ آهي.\nتوهان ٻين صفحن ۾ [[Special:Search/{{PAGENAME}}|search ساڳي عنوان جي ڳولا]] ڪري سگھو ٿا،  \n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} لاڳاپيل لاگس ۾ ڳوليو]،\nor [{{fullurl:{{FULLPAGENAME}}|action=edit}} هيءُ صفحو ترميميو]</span>.",
     	"userpage-userdoesnotexist-view": "يُوزر کاتو $1 درج ٿيل نہ آهي.",
     	"blocked-notice-logextract": "هيءَ يُوزر في‌الحال بندشيل آهي. تازو بندش لاگ حوالي طور پيش ڪجي ٿو:",
     	"updated": "(تجديديل)",
    @@ -670,6 +670,7 @@
     	"search-relatedarticle": "لاڳاپيل",
     	"searchrelated": "لاڳاپيل",
     	"searchall": "سڀ",
    +	"search-showingresults": "{{PLURAL:$4|نتيجو <strong>$1</strong> of <strong>$3</strong>|نتيجا <strong>$1 - $2</strong> of <strong>$3</strong>}}",
     	"search-nonefound": "توهان جي ڳولا جي نتيجي ۾ ڪجھہ بہ ڪو نہ لڌو.",
     	"powersearch-legend": "اعليٰ ڳولا",
     	"powersearch-togglelabel": "چڪاسيو:",
    @@ -1332,7 +1333,7 @@
     	"whatlinkshere-prev": "{{PLURAL:$1|پويون|پويون $1}}",
     	"whatlinkshere-next": "{{PLURAL:$1|اڳيون|اڳيان $1}}",
     	"whatlinkshere-links": "← ڳنڍڻا",
    -	"whatlinkshere-hideredirs": "$1 چورجي ٿو",
    +	"whatlinkshere-hideredirs": "$1 چوري ٿو",
     	"whatlinkshere-hidelinks": "$1 ڳنڍڻا",
     	"whatlinkshere-filters": "ڇاڻيون",
     	"whatlinkshere-submit": "هلو",
    @@ -1417,11 +1418,11 @@
     	"import-upload-filename": "فائيل نانءُ:",
     	"import-comment": "تاثر:",
     	"importlogpage": "درآمد لاگ",
    -	"tooltip-pt-userpage": "توهان جو تعارفي صفحو",
    -	"tooltip-pt-mytalk": "توهان جو مباحثي صفحو",
    -	"tooltip-pt-preferences": "منهنجون ترجيحات",
    +	"tooltip-pt-userpage": "{{GENDER:|توھانجو يوزر}} صفحو",
    +	"tooltip-pt-mytalk": "{{GENDER:|توھانجو}} يوزر صفحو",
    +	"tooltip-pt-preferences": "{{GENDER:|توھانجون}} ترجيحات",
     	"tooltip-pt-watchlist": "توهان جي ٽيٽ فهرست ۾ شامل صفحا",
    -	"tooltip-pt-mycontris": "توهان جون ڀاڱيداريون",
    +	"tooltip-pt-mycontris": "{{GENDER:|توھانجي}} ڀاڱيدارين جي فھرست",
     	"tooltip-pt-login": "توهان کي همٿائجي ٿو تہ توهان لاگ اِن ٿيو، بهرحال اهو لازمي نہ آهي.",
     	"tooltip-pt-logout": "لاگ آئوٽ",
     	"tooltip-pt-createaccount": "کاتو کولڻ ۽ لاگ اِن ٿيڻ تي توهان کي همٿايو ويندو؛  جيتوڻيڪ، اهو ضروري نہ آهي",
    @@ -1449,7 +1450,7 @@
     	"tooltip-t-whatlinkshere": "هتان ڳنڍيل سمورا وڪي صفحا",
     	"tooltip-t-recentchangeslinked": "ويجھڙائيءَ ۾ صفحن ۾ ٿيل تبديليون هن صفحي سان ڳنڍيل آهن",
     	"tooltip-feed-atom": "هن صفحي لاءِ ايٽم فيڊ",
    -	"tooltip-t-contributions": "هن يُوزر جون ڀاڱيداريون ڏسو",
    +	"tooltip-t-contributions": "{{GENDER:$1|ھن يوزر}} جي ڀاڱيدارين جي فھرست",
     	"tooltip-t-emailuser": "هن يُوزر کي برق ٽپال اماڻيو",
     	"tooltip-t-upload": "فائيل چاڙهيو",
     	"tooltip-t-specialpages": "سڀني خاص صفحن جي فهرست",
    diff --git a/languages/i18n/shn.json b/languages/i18n/shn.json
    index 75624c0317..9d36abbf5d 100644
    --- a/languages/i18n/shn.json
    +++ b/languages/i18n/shn.json
    @@ -343,6 +343,9 @@
     	"title-invalid-interwiki": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းပႃးဝႆႉ ႁဵင်းၵွင်ႉ တူဝ်ၼႂ်းဝီႇၶီႇ ဢၼ်ဢမ်ႇၸၢင်ႈဢဝ်ၸႂ်ႉလႆႈ တႃႇႁူဝ်ၶေႃႈ။",
     	"title-invalid-talk-namespace": "ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းမၢႆထိုင်ၸူး ၼႃႈလိၵ်ႈဢုပ်ႇဢူဝ်း ဢၼ်ဢမ်ႇၸၢင်ႈ မီးလႆႈၼၼ်ႉ။",
     	"title-invalid-characters": "ႁူဝ်ၶေႃႈ ၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းၶဝ်ႈပႃးဝႆႉ တူဝ်လိၵ်ႈ ဢၼ်ဢမ်ႇ ၸႂ်ႉလႆႈ : \"$1\"",
    +	"title-invalid-magic-tilde": "ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးဝႆႉၼၼ်ႉ မၼ်းပႃးဝႆႉ ၶႅပ်းႁၢင်ႈသၢႆသွႆႉ ဢၼ်ဢမ်ႇၸၢင်ႈၸႂ်ႉလႆႈၼၼ်ႉ။\n\n(<nowiki>~~~</nowiki>).",
    +	"title-invalid-too-long": "ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းမႃးၼၼ်ႉ မၼ်းႁႅင်ႉယၢဝ်းၼႃႇၽႅဝ်။ မၼ်းတေဢမ်ႇလႆႈ ယၢဝ်းလိူဝ် $1 {{PLURAL:$1|byte|bytes}} တီႈၼႂ်း UTF-8 encoding။",
    +	"title-invalid-leading-colon": "ႁူဝ်ၶေႃႈၼႃႈလိၵ်ႈ ဢၼ်တုၵ်းယွၼ်းဝႆႉၼၼ်ႉ တီႈတႄႇမၼ်း ပႃးဝႆႉ မၢႆၶႅၼ်ႈ ဢၼ်ဢမ်ႇ ၸၢင်ႈၸႂ်ႉလႆႈၼၼ်ႉ။",
     	"viewsource": "တူၺ်း ငဝ်ႈငႃႇ",
     	"viewsource-title": "တူၺ်းငဝ်ႈငႃႇ တွၼ်ႈတႃႇ $1",
     	"protectedpagetext": "ၼႃႈလိၵ်ႈၼႆႉ ထုၵ်ႇႁႄႉၵင်ႈဝႆႉ တႃႇၵႅတ်ႇၶႄ လွင်ႈမူၼ်ႉမႄး ဢမ်ႇၼၼ် လွင်ႈႁဵတ်းသၢင်ႈ တၢင်ႇၸိူဝ်း",
    @@ -354,8 +357,13 @@
     	"customjsprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ JavaScript ဢၼ်ၼႆႉ။ ယွၼ်ႉပိူဝ်ႈဝႃႈ မၼ်းပႃးဝႆႉ ၵၢၼ်တင်ႈ လွင်ႈသုၼ်ႇတူဝ် ၽူႈၸႂ်ႉတိုဝ်းတၢင်ႇၵေႃႉဢေႃႈ။",
     	"mycustomcssprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ CSS ဢၼ်ၼႆႉ။",
     	"mycustomjsprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇၶႂၢင်းပၼ် တွၼ်ႈတႃႇမႄးထတ်း ၼႃႈလိၵ်ႈ JavaScript ဢၼ်ၼႆႉ။",
    +	"myprivateinfoprotected": "ၸဝ်ႈၵဝ်ႇ ဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇတေမႄးထတ်း ​လွၼ်ႉၶၢဝ်ႇသုၼ်ႇတူဝ်ၸဝ်ႈၵဝ်ႇ။",
    +	"mypreferencesprotected": "ၸဝ်ႈၵဝ်ႇဢမ်ႇမီးသုၼ်ႇ တွၼ်ႈတႃႇမႄးထတ်း ငဝ်ႈၵုမ်းပိူင်ၸဝ်ႈၵဝ်ႇ။",
     	"ns-specialprotected": "ၼႃႈလိၵ်ႈၶိုၵ်ႉတွၼ်းၸိူဝ်းၼႆႉ တေဢမ်ႇၸၢင်ႈ မႄးထတ်းလႆႈ",
     	"titleprotected": "ႁူဝ်ၶေႃႈဢၼ်ၼႆႉၼႆႉ ထုၵ်ႇ ၽူႈၸႂ်ႉတိုဝ်း [[User:$1|$1]] ၵေႃႉၼႆႉ ႁႄႉၵင်ႈဝႆႉ။ လွင်ႈတၢင်း ဢၼ်မၼ်းပၼ်ဝႆႉတႄႉ <em>$2</em>.",
    +	"filereadonlyerror": "ဢမ်ႇၸၢင်ႈမူၼ်ႉမႄး ၾၢႆႇ \"$1\" ၼႆႉ၊ ယွၼ်ႉပိူဝ်ႈဝႃႈ ယွင်ၾႆႇ \"$2\" ၼႆႉ မၼ်းပဵၼ် လၢႆးငၢၼ်းတွၼ်ႈတႃႇ လူဢၼ်လဵဝ်ၵူၺ်း။\n\nဢၼ်ပဵၼ် ၽူႈၵုမ်းပိူင်သၢင်ႈ ၵေႃႉဢၼ်လႆႈၶတ်းဝႆႉၼႆႉ မၼ်းသပ်းလႅင်းဝႆႉဝႃႈ : \"$3\".",
    +	"invalidtitle-knownnamespace": "ႁူဝ်ၶေႃႈ ၽိတ်းပိူင်ႈဝႆႉ ၸွမ်းၼင်ႇ လွၵ်းၸိုဝ်ႈ \"$2\" လႄႈ တူဝ်လိၵ်ႈ \"$3\"",
    +	"invalidtitle-unknownnamespace": "ႁူဝ်ၶေႃႈ ၽိတ်းပိူင်ႈဝႆႉ ၸွမ်းၼင်ႇ ဢမ်ႇလႆႈႁူႉ တၢင်းၼမ်လွၵ်းၸိုဝ်ႈ $1 လႄႈ တူဝ်လိၵ်ႈ \"$2\"",
     	"exception-nologin": "ဢမ်ႇလႆႈၶဝ်ႈဝႆ့",
     	"cannotlogoutnow-title": "ဢမ်ႇၸၢင်ႈ လွၵ်ႉဢွၵ်ႇ ယၢမ်းလဵဝ်",
     	"cannotlogoutnow-text": "တေဢမ်ႇၸၢင်ႈ လွၵ်ႉၶဝ်ႈ ၽွင်းမိူဝ်ႈၸႂ်ႉ $1",
    diff --git a/languages/i18n/sl.json b/languages/i18n/sl.json
    index 06b6740cde..e538857d91 100644
    --- a/languages/i18n/sl.json
    +++ b/languages/i18n/sl.json
    @@ -410,6 +410,7 @@
     	"password-change-forbidden": "Na tem wikiju ne morete spreminjati gesel.",
     	"externaldberror": "Pri potrjevanju istovetnosti je prišlo do notranje napake ali pa za osveževanje zunanjega računa nimate dovoljenja.",
     	"login": "Prijava",
    +	"login-security": "Potrdite svojo identiteto",
     	"nav-login-createaccount": "Prijavite se / registrirajte se",
     	"userlogin": "Prijavite se / registrirajte se",
     	"userloginnocreate": "Prijava",
    @@ -427,18 +428,23 @@
     	"userlogin-resetpassword-link": "Ste pozabili svoje geslo?",
     	"userlogin-helplink2": "Pomoč pri prijavi",
     	"userlogin-loggedin": "Prijavljeni ste že kot {{GENDER:$1|$1}}.\nUporabite spodnji obrazec, da se prijavite kot drug uporabnik.",
    +	"userlogin-reauth": "Ponovno se morate prijaviti, da potrditev, da ste {{GENDER:$1|$1}}.",
     	"userlogin-createanother": "Ustvari drug račun",
     	"createacct-emailrequired": "E-poštni naslov",
     	"createacct-emailoptional": "E-poštni naslov (izbirno)",
     	"createacct-email-ph": "Vnesite svoj e-poštni naslov",
     	"createacct-another-email-ph": "Vnesite e-poštni naslov",
     	"createaccountmail": "Ustvari začasno naključno geslo in ga pošlji na spodaj navedeni e-poštni naslov",
    +	"createaccountmail-help": "Se lahko uporablja za ustvarjanje računa za drugo osebo brez da bi vedeli geslo.",
     	"createacct-realname": "Pravo ime (izbirno)",
     	"createaccountreason": "Razlog:",
     	"createacct-reason": "Razlog",
     	"createacct-reason-ph": "Zakaj ustvarjate drug račun",
    +	"createacct-reason-help": "Sporočilo, prikazano v dnevniku ustvarjanja računov",
     	"createacct-submit": "Ustvarite svoj račun",
     	"createacct-another-submit": "Ustvarite račun",
    +	"createacct-continue-submit": "Nadaljuj z ustvarjanjem računa",
    +	"createacct-another-continue-submit": "Nadaljuj z ustvarjanjem računa",
     	"createacct-benefit-heading": "{{GRAMMAR:tožilnik|{{SITENAME}}}} ustvarjajo ljudje, kot ste vi.",
     	"createacct-benefit-body1": "{{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|stran|strani}}",
    @@ -452,6 +458,7 @@
     	"nocookiesnew": "Uporabniški račun je ustvarjen, vendar niste prijavljeni.\n{{SITENAME}} za prijavo uporabnikov uporablja piškotke, ki pa so pri vas onemogočeni.\nProsimo, omogočite jih, nato pa se s svojim uporabniškim imenom in geslom ponovno prijavite.",
     	"nocookieslogin": "{{SITENAME}} za prijavljanje uporabnikov uporablja piškotke.\nKer jih imate onemogočene, vas prosimo, da jih omogočite in se ponovno prijavite.",
     	"nocookiesfornew": "Uporabniški račun ni bil ustvarjen, ker nismo mogli potrditi njegovega izvora.\nPoskrbite, da imate omogočene piškotke, osvežite to stran in poskusite znova.",
    +	"createacct-loginerror": "Račun ste uspešno ustvarili, vendar vas nismo mogli samodejno prijaviti. Prosimo, nadaljujte z [[Special:UserLogin|ročno prijavo]].",
     	"noname": "Niste vnesli veljavnega uporabniškega imena.",
     	"loginsuccesstitle": "Sedaj ste prijavljeni",
     	"loginsuccess": "'''Zdaj ste prijavljeni v {{GRAMMAR:tožilnik|{{SITENAME}}}} kot »$1«.'''",
    @@ -496,6 +503,7 @@
     	"createacct-another-realname-tip": "Pravo ime ni obvezno.\nČe se ga odločite navesti, bo uporabljeno za priznavanje uporabnikovega dela.",
     	"pt-login": "Prijava",
     	"pt-login-button": "Prijava",
    +	"pt-login-continue-button": "Nadaljuj s prijavo",
     	"pt-createaccount": "Ustvari račun",
     	"pt-userlogout": "Odjava",
     	"php-mail-error-unknown": "Neznana napaka v funkciji PHP mail()",
    @@ -543,6 +551,7 @@
     	"botpasswords-invalid-name": "Navedeno uporabniško ime ne vsebuje ločila za geslo bota (»$1«).",
     	"botpasswords-not-exist": "Uporabnik »$1« nima gesla bota z imenom »$2«.",
     	"resetpass_forbidden": "Gesla ne morete spremeniti",
    +	"resetpass_forbidden-reason": "Gesel nismo mogli spremeniti: $1",
     	"resetpass-no-info": "Za neposreden dostop do te strani morate biti prijavljeni.",
     	"resetpass-submit-loggedin": "Spremenite geslo",
     	"resetpass-submit-cancel": "Prekliči",
    @@ -572,6 +581,13 @@
     	"passwordreset-emailsentusername": "Če obstaja e-poštni naslov, povezan s tem uporabniškim imenom, vam bomo poslali e-pošto za postavitev gesla.",
     	"passwordreset-emailsent-capture": "Poslali smo e-pošto za ponastavitev gesla, ki je prikazana spodaj.",
     	"passwordreset-emailerror-capture": "Ustvarili smo e-pošto za ponastavitev gesla, ki je prikazana spodaj, vendar pa pošiljanje {{GENDER:$2|uporabniku|uporabnici}} ni uspelo: $1",
    +	"passwordreset-emailsent-capture2": "Poslali smo {{PLURAL:$1|e-pošto|e-pošti|e-pošte}} za ponastavitev gesla. {{PLURAL:$1|Uporabniško ime in geslo sta navedena spodaj.|Seznam uporabniških imen in gesel je naveden spodaj.}}",
    +	"passwordreset-emailerror-capture2": "Pošiljanje e-pošte {{GENDER:$2|uporabniku|uporabnici}} je spodletelo: $1 {{PLURAL:$3|Uporabniško ime in geslo sta navedena spodaj.|Seznam uporabniških imen in gesel je naveden spodaj.}}",
    +	"passwordreset-nocaller": "Podati morate klicatelja",
    +	"passwordreset-nosuchcaller": "Klicatelj ne obstaja: $1",
    +	"passwordreset-ignored": "Ponastavitve gesla nismo izvedli. Morda ni nastavljen noben ponudnik?",
    +	"passwordreset-invalideamil": "Neveljavni e-poštni naslov",
    +	"passwordreset-nodata": "Navedli niste ne uporabniškega imena ne e-poštnega naslova",
     	"changeemail": "Sprememba ali odstranitev e-poštnega naslova",
     	"changeemail-header": "Izpolnite obrazec za spremembo vašega e-poštnega naslova. Če želite s svojega računa odstraniti povezavo s katerim koli e-poštnim naslovom, pustite polje za nov e-poštni naslov med potrjevanje obrazca prazno.",
     	"changeemail-passwordrequired": "Za potrditev spremembe boste morali vnesti svoje geslo.",
    @@ -615,7 +631,9 @@
     	"minoredit": "manjše urejanje",
     	"watchthis": "Opazuj članek",
     	"savearticle": "Shrani stran",
    +	"savechanges": "Shrani spremembe",
     	"publishpage": "Objavi stran",
    +	"publishchanges": "Objavi spremembe",
     	"preview": "Predogled",
     	"showpreview": "Prikaži predogled",
     	"showdiff": "Prikaži spremembe",
    @@ -1209,8 +1227,8 @@
     	"rightslogtext": "Prikazan je dnevnik sprememb uporabniških pravic.",
     	"action-read": "branje te strani",
     	"action-edit": "urejanje te strani",
    -	"action-createpage": "ustvarjenje strani",
    -	"action-createtalk": "ustvarjanje pogovornih strani",
    +	"action-createpage": "ustvarjenje te strani",
    +	"action-createtalk": "ustvarjanje te pogovorne strani",
     	"action-createaccount": "registracija tega uporabniškega računa",
     	"action-autocreateaccount": "samodejno ustvarjanje zunanjega uporabniškega računa",
     	"action-history": "ogled zgodovine strani",
    @@ -1427,6 +1445,8 @@
     	"upload-http-error": "Prišlo je do napake HTTP: $1",
     	"upload-copy-upload-invalid-domain": "Nalaganje kopij s te domene ni možno.",
     	"upload-foreign-cant-upload": "Wiki ni konfiguriran za nalaganje datotek z zahtevanega tujega skladišča datotek.",
    +	"upload-foreign-cant-load-config": "Nismo uspeli naložiti konfiguracije nalaganja datotek za zunanje skladišče datotek.",
    +	"upload-dialog-disabled": "Nalaganj datotek z uporabo tega obrazca je na wikiju onemogočeno.",
     	"upload-dialog-title": "Naloži datoteko",
     	"upload-dialog-button-cancel": "Prekliči",
     	"upload-dialog-button-done": "Končano",
    @@ -1865,6 +1885,8 @@
     	"trackingcategories-msg": "Sledilna kategorija",
     	"trackingcategories-name": "Ime sporočila",
     	"trackingcategories-desc": "Merila za vključitev v kategorijo",
    +	"restricted-displaytitle-ignored": "Strani s prezrtimi prikaznimi naslovi",
    +	"restricted-displaytitle-ignored-desc": "Stran ima prezrt <code><nowiki>{{DISPLAYTITLE}}</nowiki></code>, saj ni enak dejanskemu naslovu strani.",
     	"noindex-category-desc": "Stran vsebuje čarobno besedo <code><nowiki>__NOINDEX__</nowiki></code> (in je v imenskem prostoru, ki dovoljuje to oznako) in posledično je roboti ne indeksirajo.",
     	"index-category-desc": "Stran vsebuje čarobno besedo <code><nowiki>__INDEX__</nowiki></code> (in je v imenskem prostoru, ki dovoljuje to oznako) in posledično jo roboti indeksirajo, čeprav je drugače ne bi.",
     	"post-expand-template-inclusion-category-desc": "Velikost strani je po razširitvi vseh predlog več kot <code>$wgMaxArticleSize</code>, zato nekaterih predlog nismo razširili.",
    @@ -1989,12 +2011,14 @@
     	"rollbacklinkcount": "vrni $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
     	"rollbacklinkcount-morethan": "vrni več kot $1 {{PLURAL:$1|urejanje|urejanji|urejanja|urejanj}}",
     	"rollbackfailed": "Vrnitev ni uspela",
    +	"rollback-missingparam": "Pri zahtevi manjkajo zahtevani parametri.",
     	"cantrollback": "Urejanja ne morem vrniti; zadnji urejevalec je hkrati edini.",
     	"alreadyrolled": "Zadnje spremembe [[:$1]] uporabnika [[User:$2|$2]] ([[User talk:$2|pogovor]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) ne morem vrniti;\nstran je spremenil ali vrnil že nekdo drug.\n\nZadnji je stran urejal uporabnik [[User:$3|$3]] ([[User talk:$3|pogovor]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
     	"editcomment": "Povzetek urejanja je bil: <em>$1</em>.",
     	"revertpage": "vrnitev sprememb uporabnika [[Special:Contributions/$2|$2]] ([[User talk:$2|pogovor]]) na zadnje urejanje uporabnika [[User:$1|$1]]",
     	"revertpage-nouser": "vrnitev sprememb skritega uporabnika na zadnjo redakcijo {{GENDER:$1|[[User:$1|$1]]}}",
     	"rollback-success": "Razveljavljene spremembe uporabnika $1;\nvrnjeno na urejanje uporabnika $2.",
    +	"rollback-success-notify": "Povrnili smo urejanja $1;\nspremenjeno nazaj na zadnjo redakcijo $2. [$3 Prikaži spremembe]",
     	"sessionfailure-title": "Neuspeh seje",
     	"sessionfailure": "Vaša prijava ni uspela; da bi preprečili ugrabitev seje, je bilo dejanje preklicano. Prosimo, izberite »Nazaj« in ponovno naložite stran, s katere prihajate, nato poskusite znova.",
     	"changecontentmodel": "Spremeni model vsebine strani",
    @@ -2142,6 +2166,7 @@
     	"sp-contributions-username": "IP-naslov ali uporabniško ime:",
     	"sp-contributions-toponly": "Prikaži samo vrhnje redakcije",
     	"sp-contributions-newonly": "Prikaži samo urejanja, ki so ustvarila nove strani",
    +	"sp-contributions-hideminor": "Skrij manjša urejanja",
     	"sp-contributions-submit": "Išči",
     	"whatlinkshere": "Kaj se povezuje sem",
     	"whatlinkshere-title": "Strani, ki se povezujejo na $1",
    @@ -3047,6 +3072,8 @@
     	"confirm-watch-top": "Dodam stran na vaš spisek nadzorov?",
     	"confirm-unwatch-button": "V redu",
     	"confirm-unwatch-top": "Odstranim stran z vašega spiska nadzorov?",
    +	"confirm-rollback-button": "V redu",
    +	"confirm-rollback-top": "Povrnemo urejanja te strani?",
     	"percent": "$1&#160;%",
     	"quotation-marks": "»$1«",
     	"imgmultipageprev": "← prejšnja stran",
    @@ -3575,7 +3602,6 @@
     	"mw-widgets-dateinput-placeholder-month": "LLLL-MM",
     	"mw-widgets-titleinput-description-new-page": "stran Å¡e ne obstaja",
     	"mw-widgets-titleinput-description-redirect": "preusmeritev na $1",
    -	"api-error-blacklisted": "Prosimo, izberite drugačen, opisen naslov.",
     	"sessionmanager-tie": "Ne morem združiti več vrst overitvenih zahtev: $1.",
     	"sessionprovider-generic": "sej $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "sej, ki temeljijo na piškotkih",
    @@ -3590,8 +3616,8 @@
     	"log-action-filter-newusers": "Vrsta ustvarjanja računa:",
     	"log-action-filter-patrol": "Vrsta nadzora:",
     	"log-action-filter-protect": "Vrsta zaščite:",
    -	"log-action-filter-rights": "Vrsta spremembe pravic",
    -	"log-action-filter-suppress": "Vrsta zatrtja",
    +	"log-action-filter-rights": "Vrsta spremembe pravic:",
    +	"log-action-filter-suppress": "Vrsta zatrtja:",
     	"log-action-filter-upload": "Vrsta nalaganja:",
     	"log-action-filter-all": "Vse",
     	"log-action-filter-block-block": "Blokada",
    @@ -3629,5 +3655,77 @@
     	"log-action-filter-suppress-block": "Zatrtje uporabnika z blokado",
     	"log-action-filter-suppress-reblock": "Zatrtje uporabnika s ponovno blokado",
     	"log-action-filter-upload-upload": "Novo nalaganje",
    -	"log-action-filter-upload-overwrite": "Ponovno nalaganje"
    +	"log-action-filter-upload-overwrite": "Ponovno nalaganje",
    +	"authmanager-authn-not-in-progress": "Overjanje ni v teku ali pa smo izgubili podatke seje. Prosimo, pričnite znova od začetka.",
    +	"authmanager-authn-no-primary": "Navedenih poverilnic nismo mogli overiti.",
    +	"authmanager-authn-no-local-user": "Navedene poverilnice niso povezane z nobenim uporabnikom na wikiju.",
    +	"authmanager-authn-no-local-user-link": "Navedene poverilnice so veljavne, vendar niso povezane z nobenim uporabnikom na wikiju. Prijavite se na drug način ali ustvarite novega uporabnika in vaše prejšnje poverilnice boste lahko povezali s tem računom.",
    +	"authmanager-authn-autocreate-failed": "Samodejno ustvarjanje lokalnega računa je spodletelo: $1",
    +	"authmanager-change-not-supported": "Navedenih poverilnic nismo mogli spremeniti, saj jih ne bi nič uporabljalo.",
    +	"authmanager-create-disabled": "Ustvarjanje računov je onemogočeno.",
    +	"authmanager-create-from-login": "Da ustvarite svoj račun, prosimo, izpolnite spodnja polja.",
    +	"authmanager-create-not-in-progress": "Ustvarjanje računa ni v teku ali pa smo izgubili podatke seje. Prosimo, pričnite znova od začetka.",
    +	"authmanager-create-no-primary": "Navedenih poverilnic ne moremo uporabiti za ustvarjanje računa.",
    +	"authmanager-link-no-primary": "Navedenih poverilnic ne moremo uporabiti za povezovanje računa.",
    +	"authmanager-link-not-in-progress": "Povezovanje računa ni v teku ali pa smo izgubili podatke seje. Prosimo, pričnite znova od začetka.",
    +	"authmanager-authplugin-setpass-failed-title": "Sprememba gesla je spodletela",
    +	"authmanager-authplugin-setpass-failed-message": "Vtičnik za overitev je zavrnil spremembo gesla.",
    +	"authmanager-authplugin-create-fail": "Vtičnik za overitev je zavrnil ustvarjanje računa.",
    +	"authmanager-authplugin-setpass-denied": "Vtičnik za overitev ne dovoljuje spreminjanje gesel.",
    +	"authmanager-authplugin-setpass-bad-domain": "Neveljavna domena.",
    +	"authmanager-autocreate-noperm": "Samodejno ustvarjanje računov ni dovoljeno.",
    +	"authmanager-autocreate-exception": "Samodejno ustvarjanje računov smo začasno onemogočili zaradi predhodnih napak.",
    +	"authmanager-userdoesnotexist": "Uporabniški račun »$1« ni registriran.",
    +	"authmanager-userlogin-remembermypassword-help": "Ali naj si geslo zapomnimo dlje, kot traja seja.",
    +	"authmanager-username-help": "Uporabniško ime za overjanje.",
    +	"authmanager-password-help": "Geslo za overjanje.",
    +	"authmanager-domain-help": "Domena za zunanje overjanje.",
    +	"authmanager-retype-help": "Geslo ponovno za potrditev.",
    +	"authmanager-email-label": "E-pošta",
    +	"authmanager-email-help": "E-poštni naslov",
    +	"authmanager-realname-label": "Pravo ime",
    +	"authmanager-realname-help": "Pravo ime uporabnika",
    +	"authmanager-provider-password": "Overjanje, ki temelji na geslu",
    +	"authmanager-provider-password-domain": "Overjanje, ki temelji na geslu in domeni",
    +	"authmanager-provider-temporarypassword": "Začasno geslo",
    +	"authprovider-confirmlink-message": "Na podlagi vaših nedavnih poskusov prijave lahko naslednje račune povežemo z vašim wikiračunom. Povezovanje omogoča prijavo prek teh računov. Prosimo, izberite, katere želite povezati.",
    +	"authprovider-confirmlink-request-label": "Računi, ki naj bodo povezani",
    +	"authprovider-confirmlink-success-line": "$1: Uspešno povezan",
    +	"authprovider-confirmlink-failed": "Povezovanje računov ni uspelo v celoti: $1",
    +	"authprovider-confirmlink-ok-help": "Nadaljuj po prikazu sporočil o spodletelih povezovanjih.",
    +	"authprovider-resetpass-skip-label": "Preskoči",
    +	"authprovider-resetpass-skip-help": "Preskoči ponastavljanje gesla.",
    +	"authform-nosession-login": "Overjanje je bilo uspešno, vendar si vaš brskalnik ne more »zapomniti« prijave.\n\n$1",
    +	"authform-nosession-signup": "Račun smo ustvarili, vendar si vaš brskalnik ne more »zapomniti« prijave.\n\n$1",
    +	"authform-newtoken": "Manjka žeton. $1",
    +	"authform-notoken": "Manjka žeton",
    +	"authform-wrongtoken": "Napačen žeton",
    +	"specialpage-securitylevel-not-allowed-title": "Ni dovoljeno",
    +	"specialpage-securitylevel-not-allowed": "Oprostite, vendar te strani ne morete uporabljati, saj vaše identitete nismo mogli preveriti.",
    +	"authpage-cannot-login": "Ne moremo pričeti prijave.",
    +	"authpage-cannot-login-continue": "Ne moremo nadaljevati s prijavo. Vaša seja je najverjetneje potekla.",
    +	"authpage-cannot-create": "Ne moremo pričeti ustvarjanja računa.",
    +	"authpage-cannot-create-continue": "Ne moremo nadaljevati z ustvarjanjem računa. Vaša seja je najverjetneje potekla.",
    +	"authpage-cannot-link": "Ne moremo pričeti povezovanja računa.",
    +	"authpage-cannot-link-continue": "Ne moremo nadaljevati s povezovanjem računov. Vaša seja je najverjetneje potekla.",
    +	"cannotauth-not-allowed-title": "Dovoljenje je zavrnjeno",
    +	"cannotauth-not-allowed": "Nimate dovoljenja za uporabo te strani",
    +	"changecredentials": "Spremeni poverilnice",
    +	"changecredentials-submit": "Spremeni poverilnice",
    +	"changecredentials-invalidsubpage": "$1 ni veljavna vrsta poverilnic.",
    +	"changecredentials-success": "Vaše poverilnice smo spremenili.",
    +	"removecredentials": "Odstrani poverilnice",
    +	"removecredentials-submit": "Odstrani poverilnice",
    +	"removecredentials-invalidsubpage": "$1 ni veljavna vrsta poverilnic.",
    +	"removecredentials-success": "Vaše poverilnice smo odstranili.",
    +	"credentialsform-provider": "Vrsta poverilnic:",
    +	"credentialsform-account": "Ime račun:",
    +	"cannotlink-no-provider-title": "Ni računov za povezati",
    +	"cannotlink-no-provider": "Ni računov za povezati.",
    +	"linkaccounts": "Poveži račune",
    +	"linkaccounts-success-text": "Račun smo povezali.",
    +	"linkaccounts-submit": "Poveži račune",
    +	"unlinkaccounts": "Razveži račune",
    +	"unlinkaccounts-success": "Račun smo razvezali.",
    +	"authenticationdatachange-ignored": "Sprememba overitvenih podatkov ni bila obdelana. Morda ni bil konfiguriran noben ponudnik?"
     }
    diff --git a/languages/i18n/sq.json b/languages/i18n/sq.json
    index af0fb55f8a..a49e46a46d 100644
    --- a/languages/i18n/sq.json
    +++ b/languages/i18n/sq.json
    @@ -584,6 +584,7 @@
     	"minoredit": "Ky është një redaktim i vogël",
     	"watchthis": "Vëzhgoje këtë faqe",
     	"savearticle": "Kryej ndryshimet",
    +	"publishpage": "Publiko faqen",
     	"preview": "Shqyrto",
     	"showpreview": "Shfaq për shqyrtim",
     	"showdiff": "Trego ndryshimet",
    @@ -2829,6 +2830,7 @@
     	"feedback-subject": "Subjekti:",
     	"feedback-submit": "Dërgo",
     	"feedback-thanks": "Faleminderit! Përshtypja juaj është postuar në faqen \"[$2 $1]\".",
    +	"feedback-thanks-title": "Ju faleminderit!",
     	"searchsuggest-search": "Kërko",
     	"searchsuggest-containing": "përmban ...",
     	"api-error-badaccess-groups": "Ju nuk lejoheni të ngarkoni skeda në këtë wiki.",
    diff --git a/languages/i18n/sr-ec.json b/languages/i18n/sr-ec.json
    index fe673208fa..46a5238b59 100644
    --- a/languages/i18n/sr-ec.json
    +++ b/languages/i18n/sr-ec.json
    @@ -489,7 +489,7 @@
     	"noemail": "Не постоји имејл адреса за {{GENDER:$1|корисника|корисницу}} $1.",
     	"noemailcreate": "Морате навести исправну имејл адресу.",
     	"passwordsent": "Нова лозинка је послата на имејл адресу {{GENDER:$1|корисника|кориснице|корисника}} $1.\nПријавите се пошто је примите.",
    -	"blocked-mailpassword": "Вашој ИП адреси је онемогућено уређивање страница, као и могућност захтевања нове лозинке.",
    +	"blocked-mailpassword": "Ваша IP адреса има забрану уређивања. Ради спречавања злоупотребе, није дозвољено враћање лозинке са ње.",
     	"eauthentsent": "На наведену имејл адресу је послат потврдни код.\nПре него што пошаљемо даљње поруке, пратите упутства с имејла да бисте потврдили да сте ви отворили налог.",
     	"throttled-mailpassword": "Порука за промену лозинке је послата у {{PLURAL:$1|1=последњих сат времена|последња $1 сата|последњих $1 сати}}.\nДа бисмо спречили злоупотребу, подсетник шаљемо само једном у року од {{PLURAL:$1|1=сат времена|$1 сата|$1 сати}}.",
     	"mailerror": "Грешка при слању поруке: $1",
    @@ -1071,7 +1071,7 @@
     	"group-bot-member": "{{GENDER:$1|бот}}",
     	"group-sysop-member": "{{GENDER:$1|администратор|администраторка|администратор}}",
     	"group-bureaucrat-member": "{{GENDER:$1|бирократа}}",
    -	"group-suppress-member": "{{GENDER:$1|ревизор|ревизорка}}",
    +	"group-suppress-member": "{{GENDER:$1|брисач измена}}",
     	"grouppage-user": "{{ns:project}}:Корисници",
     	"grouppage-autoconfirmed": "{{ns:project}}:Аутоматски потврђени корисници",
     	"grouppage-bot": "{{ns:project}}:Ботови",
    @@ -1177,7 +1177,7 @@
     	"rightslogtext": "Ово је дневник измена корисничких права.",
     	"action-read": "читање ове странице",
     	"action-edit": "уређивање ове странице",
    -	"action-createpage": "прављење страница",
    +	"action-createpage": "направи ову страницу",
     	"action-createtalk": "прављење страница за разговор",
     	"action-createaccount": "отварање овог корисничког налога",
     	"action-history": "гледање историје ове странице",
    @@ -2052,6 +2052,7 @@
     	"sp-contributions-username": "ИП адреса или корисничко име:",
     	"sp-contributions-toponly": "Само најновије измене",
     	"sp-contributions-newonly": "Само измене којима су направљене нове странице",
    +	"sp-contributions-hideminor": "Сакриј мање измене",
     	"sp-contributions-submit": "Претражи",
     	"whatlinkshere": "Шта води овде",
     	"whatlinkshere-title": "Странице које су повезане са „$1“",
    @@ -2104,6 +2105,7 @@
     	"ipb-unblock": "Деблокирај корисничко име или IP адресу",
     	"ipb-blocklist": "Погледај постојећа блокирања",
     	"ipb-blocklist-contribs": "Доприноси за {{GENDER:$1|$1}}",
    +	"ipb-blocklist-duration-left": "преостало: $1",
     	"unblockip": "Деблокирај корисника",
     	"unblockiptext": "Користите образац испод да бисте вратили право писања блокираној ИП адреси или корисничком имену.",
     	"ipusubmit": "Уклони ову блокаду",
    @@ -2996,6 +2998,7 @@
     	"confirmemail_body_set": "Неко, вероватно ви, са ИП адресе $1 \nје променио имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали могућности имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај потврдни код истиче $4.",
     	"confirmemail_invalidated": "Потврда имејл адресе је отказана",
     	"invalidateemail": "Отказивање потврде имејла",
    +	"notificationemail_body_changed": "Неко, вероватно Ви је променио имејл адресу налога из $2“ у „$3“ са IP адресе $1 на сајту {{SITENAME}}.\n\nАко ово нисте били Ви, одмах обавестите администраторе сајта.",
     	"scarytranscludedisabled": "[Међувики укључивање шаблона је онемогућено]",
     	"scarytranscludefailed": "[Добављање шаблона за $1 није успело]",
     	"scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
    @@ -3499,7 +3502,6 @@
     	"mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
     	"mw-widgets-titleinput-description-new-page": "страница још увек не постоји",
     	"mw-widgets-titleinput-description-redirect": "преусмерава на $1",
    -	"api-error-blacklisted": "Изаберите другачији, описан назив.",
     	"randomrootpage": "Случајна коренска страница",
     	"log-action-filter-block": "Тип блокирања:",
     	"log-action-filter-contentmodel": "Тип промене модела садржаја:",
    diff --git a/languages/i18n/sr-el.json b/languages/i18n/sr-el.json
    index 996d191ed2..6574e6a39a 100644
    --- a/languages/i18n/sr-el.json
    +++ b/languages/i18n/sr-el.json
    @@ -577,7 +577,7 @@
     	"minoredit": "manja izmena",
     	"watchthis": "nadgledaj ovu stranicu",
     	"savearticle": "Sačuvaj stranicu",
    -	"preview": "Pregled",
    +	"preview": "Pretpregled",
     	"showpreview": "Prikaži pretpregled",
     	"showdiff": "Prikaži izmene",
     	"blankarticle": "<strong>Upozorenje:</strong> stranica koju pravite nema nikakav sadržaj.\nAko još jednom pritisnete „{{int:savearticle}}“ napravićete praznu stranicu.",
    @@ -754,7 +754,7 @@
     	"rev-showdeleted": "prikaži",
     	"revisiondelete": "Obriši/vrati izmene",
     	"revdelete-nooldid-title": "Nema tražene izmene",
    -	"revdelete-nooldid-text": "Niste naveli željenu izmenu, ona ne postoji ili pokušavate da je sakrijete.",
    +	"revdelete-nooldid-text": "Niste izabrali odredišnu izmenu na kojoj treba da se izvrši ova funkcija, ta izmena ne postoji, ili pokušavate sakriti trenutnu izmenu.",
     	"revdelete-no-file": "Tražena datoteka ne postoji.",
     	"revdelete-show-file-confirm": "Želite li da vidite obrisanu izmenu datoteke „<nowiki>$1</nowiki>“ od $2; $3?",
     	"revdelete-show-file-submit": "Da",
    @@ -1035,7 +1035,7 @@
     	"group-bot-member": "{{GENDER:$1|bot}}",
     	"group-sysop-member": "{{GENDER:$1|administrator|administratorka}}",
     	"group-bureaucrat-member": "{{GENDER:$1|birokrata}}",
    -	"group-suppress-member": "{{GENDER:$1|revizor|revizorka}}",
    +	"group-suppress-member": "{{GENDER:$1|brisač izmena}}",
     	"grouppage-user": "{{ns:project}}:Korisnici",
     	"grouppage-autoconfirmed": "{{ns:project}}:Automatski potvrđeni korisnici",
     	"grouppage-bot": "{{ns:project}}:Botovi",
    @@ -3438,6 +3438,5 @@
     	"mw-widgets-dateinput-placeholder-month": "GGGG-MM",
     	"mw-widgets-titleinput-description-new-page": "stranica još uvek ne postoji",
     	"mw-widgets-titleinput-description-redirect": "preusmerava na $1",
    -	"api-error-blacklisted": "Izaberite drugačiji, opisan naziv.",
     	"randomrootpage": "Slučajna korenska stranica"
     }
    diff --git a/languages/i18n/sv.json b/languages/i18n/sv.json
    index 26ee88d95f..107cd1829b 100644
    --- a/languages/i18n/sv.json
    +++ b/languages/i18n/sv.json
    @@ -689,7 +689,9 @@
     	"minoredit": "Mindre ändring (m)",
     	"watchthis": "Bevaka denna sida",
     	"savearticle": "Spara sidan",
    +	"savechanges": "Spara ändringar",
     	"publishpage": "Publicera sida",
    +	"publishchanges": "Publicera ändringar",
     	"preview": "Förhandsgranska",
     	"showpreview": "Visa förhandsgranskning",
     	"showdiff": "Visa ändringar",
    @@ -1283,8 +1285,8 @@
     	"rightslogtext": "Detta är en logg över ändringar av användares rättigheter.",
     	"action-read": "läs denna sida",
     	"action-edit": "redigera denna sida",
    -	"action-createpage": "skapa sidor",
    -	"action-createtalk": "skapa diskussionssidor",
    +	"action-createpage": "skapa denna sida",
    +	"action-createtalk": "skapa den här diskussionssidan",
     	"action-createaccount": "skapa detta användarkonto",
     	"action-autocreateaccount": "skapa detta externa användarkonto automatiskt",
     	"action-history": "visa historiken för denna sida",
    @@ -1502,6 +1504,8 @@
     	"upload-http-error": "Ett HTTP-fel uppstod: $1",
     	"upload-copy-upload-invalid-domain": "Uppladdning av kopior är inte tillgängligt från denna domän.",
     	"upload-foreign-cant-upload": "Denna wiki är inte konfigurerad för att ladda upp filer till det begärda externa filförvaret.",
    +	"upload-foreign-cant-load-config": "Misslyckades att läsa in konfigurationen för filuppladdningar till det externa filförvaret.",
    +	"upload-dialog-disabled": "Filuppladdningar med denna dialogruta har inaktiverats på denna wiki.",
     	"upload-dialog-title": "Ladda upp fil",
     	"upload-dialog-button-cancel": "Avbryt",
     	"upload-dialog-button-done": "Klar",
    @@ -1650,6 +1654,7 @@
     	"uploadnewversion-linktext": "Ladda upp en ny version av denna fil",
     	"shared-repo-from": "från $1",
     	"shared-repo": "en gemensam filförvaring",
    +	"shared-repo-name-wikimediacommons": "Wikimedia Commons",
     	"filepage.css": "/* CSS som skrivs här inkluderas på filbeskrivningssidan, även på utländska klientwikis */",
     	"upload-disallowed-here": "Du kan inte skriva över denna fil.",
     	"filerevert": "Återställ $1",
    @@ -2221,6 +2226,7 @@
     	"sp-contributions-username": "IP-adress eller användarnamn:",
     	"sp-contributions-toponly": "Visa endast aktuella sidversioner",
     	"sp-contributions-newonly": "Visa endast redigeringar där sidor skapas",
    +	"sp-contributions-hideminor": "Dölj mindre ändringar",
     	"sp-contributions-submit": "Sök",
     	"whatlinkshere": "Vad som länkar hit",
     	"whatlinkshere-title": "Sidor som länkar till \"$1\"",
    @@ -3665,7 +3671,6 @@
     	"mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
     	"mw-widgets-titleinput-description-new-page": "sidan existerar inte ännu",
     	"mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
    -	"api-error-blacklisted": "Välj en annan beskrivande titel.",
     	"sessionmanager-tie": "Kan inte kombinera flera begäransautentiseringstyper: $1.",
     	"sessionprovider-generic": "$1-sessioner",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebaserade sessioner",
    @@ -3681,7 +3686,7 @@
     	"log-action-filter-patrol": "Typ av patrullering:",
     	"log-action-filter-protect": "Typ av skydd:",
     	"log-action-filter-rights": "Typ av rättighetsändring",
    -	"log-action-filter-suppress": "Censurtyp",
    +	"log-action-filter-suppress": "Censurtyp:",
     	"log-action-filter-upload": "Typ av uppladdning:",
     	"log-action-filter-all": "Alla",
     	"log-action-filter-block-block": "Blockering",
    @@ -3790,5 +3795,6 @@
     	"linkaccounts-success-text": "Kontot länkades.",
     	"linkaccounts-submit": "Länka konton",
     	"unlinkaccounts": "Avlänka konton",
    -	"unlinkaccounts-success": "Kontot avlänkades."
    +	"unlinkaccounts-success": "Kontot avlänkades.",
    +	"authenticationdatachange-ignored": "Ändringen av autentiseringsdata hanterades inte. Kanske ingen tillhandahållare har konfigurerats?"
     }
    diff --git a/languages/i18n/ta.json b/languages/i18n/ta.json
    index ff9f10e912..ccd1f6ce68 100644
    --- a/languages/i18n/ta.json
    +++ b/languages/i18n/ta.json
    @@ -2077,8 +2077,9 @@
     	"sp-contributions-blocked-notice-anon": "இந்த IP முகவரி தற்போது தடுக்கப்பட்டுள்ளது.\nசமீபத்திய தடுப்பு குறிப்பேடு  கீழே குறிப்பிற்காக வழங்கப்பட்டுள்ளது :",
     	"sp-contributions-search": "பங்களிப்புகளைத் தேடு",
     	"sp-contributions-username": "ஐ.பி. அல்லது பயனர் பெயர்:",
    -	"sp-contributions-toponly": "சமீபத்திய பரிசீலனைகளுக்குட்பட்ட  திருத்தங்களை மட்டும் காண்பி",
    -	"sp-contributions-newonly": "பக்க உருவாக்க திருத்தங்களை மட்டும் காட்டு",
    +	"sp-contributions-toponly": "சமீபத்திய மாற்றமைவுத் திருத்தங்கள் மட்டும்",
    +	"sp-contributions-newonly": "பக்க உருவாக்கங்கள் மட்டும்",
    +	"sp-contributions-hideminor": "சிறு தொகுப்புக்களை மறை",
     	"sp-contributions-submit": "தேடுக",
     	"whatlinkshere": "இப்பக்கத்தை இணைத்தவை",
     	"whatlinkshere-title": "\"$1\" பக்கத்துக்கு இணைக்கப்பட்டவை",
    @@ -2500,7 +2501,7 @@
     	"markaspatrolleddiff": "ரோந்திட்டதாக குறி",
     	"markaspatrolledtext": "இதனை சுற்றுக்காவல் செய்ததாகக் குறி",
     	"markaspatrolledtext-file": "இக்கோப்பு பதிப்பினை ரோந்திட்டதாக குறி",
    -	"markedaspatrolled": "ரோந்திட்டதாக குறிக்கப்பட்டது",
    +	"markedaspatrolled": "சுற்றுக்காவல் செய்ததாகக் குறிக்கப்பட்டது",
     	"markedaspatrolledtext": "தெரிவு செய்யப்பட்டத் திருத்தம் [[:$1]]  பார்வையிட்டதாக குறிக்கப்பட்டுள்ளது.",
     	"rcpatroldisabled": "அண்மைய மாற்றங்களின் ரோந்து முடக்கப்பட்டுள்ளது",
     	"rcpatroldisabledtext": "அண்மைய மாற்றங்களின் ரோந்து தற்காலிகமாக முடக்கப்பட்டுள்ளது.",
    @@ -3399,7 +3400,6 @@
     	"mw-widgets-dateinput-no-date": "திகதி தெரிவுச் செய்யப்படவில்லை",
     	"mw-widgets-titleinput-description-new-page": "இப்பக்கம் இன்னும் உருவாக்கப்படவில்லை",
     	"mw-widgets-titleinput-description-redirect": "$1-க்கு வழிமாற்று",
    -	"api-error-blacklisted": "தயவுகூர்ந்து வேறு, விளக்கமான தலைப்பைத் தேர்ந்தெடுக்கவும்.",
     	"sessionprovider-generic": "$1 பகுதி",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "குக்கீயை அடிபடையாக்கக் கொண்ட பகுதிகள்",
     	"sessionprovider-nocookies": "குக்கீசு செயலற்று இருக்கலாம். உங்களது குக்கீசு செயலில் உள்ளது என உறுதிப்படுத்திவிட்டு மீண்டும் முயல்க.",
    diff --git a/languages/i18n/tcy.json b/languages/i18n/tcy.json
    index 662edaf324..8aece73c11 100644
    --- a/languages/i18n/tcy.json
    +++ b/languages/i18n/tcy.json
    @@ -496,7 +496,9 @@
     	"minoredit": "ಉಂದು ಎಲ್ಯ ಬದಲಾವಣೆ",
     	"watchthis": "ಈ ಪುಟೊನು ತೂಲೆ",
     	"savearticle": "ಪುಟೊನು ಒರಿಪಾಲೆ",
    +	"savechanges": "ಬದಲಾವಣೆನ್ ಒರಿಪಾಲೇ",
     	"publishpage": "ಪುಟೋನು ಪ್ರಕಟಿಸಲೇ",
    +	"publishchanges": "ಬದಲಾವಣೆನ್ ತೋಜಾಲೇ",
     	"preview": "ಮುನ್ನೋಟ",
     	"showpreview": "ಮುನ್ನೋಟೊ ತೋಜಾವು",
     	"showdiff": "ಬದಲಾವಣೆಲೆನ್ ತೋಜಾವ್",
    diff --git a/languages/i18n/tr.json b/languages/i18n/tr.json
    index e9f7962735..a4a02e368f 100644
    --- a/languages/i18n/tr.json
    +++ b/languages/i18n/tr.json
    @@ -103,6 +103,7 @@
     	"tog-watchdefault": "Değişiklik yaptığım sayfaları ve dosyaları izleme listeme ekle",
     	"tog-watchmoves": "Taşıdığım sayfaları ve dosyaları izleme listeme ekle",
     	"tog-watchdeletion": "Sildiğim sayfaları ve dosyaları izleme listeme ekle",
    +	"tog-watchuploads": "Yüklediğim yeni dosyaları izleme listeme ekle",
     	"tog-watchrollback": "Geridönüş yaptığım sayfaları izleme listeme ekle",
     	"tog-minordefault": "Varsayılan olarak, bütün düzenlemelerimi küçük değişiklik olarak işaretle",
     	"tog-previewontop": "Ön izlemeyi, düzenleme kutusunun üstünde göster",
    @@ -127,7 +128,7 @@
     	"tog-ccmeonemails": "Diğer kullanıcılara gönderdiğim e-postaların bir kopyasını bana da gönder",
     	"tog-diffonly": "Sayfa içeriğini, sürüm farklarının altında gösterme",
     	"tog-showhiddencats": "Gizli kategorileri göster",
    -	"tog-norollbackdiff": "Geri döndürme uygulandıktan sonra değişiklik görünümünü es geç",
    +	"tog-norollbackdiff": "Geri döndürme uygulandıktan sonra farkları gösterme",
     	"tog-useeditwarning": "Yaptığım değişiklikleri kaydetmeden sayfayı kapatırken beni uyar",
     	"tog-prefershttps": "Oturum açarken her zaman güvenli bağlantı kullan",
     	"underline-always": "Daima",
    @@ -484,6 +485,7 @@
     	"password-change-forbidden": "Bu vikide parolanızı değiştiremezsiniz.",
     	"externaldberror": "Ya doğrulama veritabanı hatası var ya da kullanıcı hesabınızı güncellemeye yetkiniz yok.",
     	"login": "Oturum aç",
    +	"login-security": "Kimliğinizi doğrulayın",
     	"nav-login-createaccount": "Oturum aç / hesap oluştur",
     	"userlogin": "Oturum aç / hesap oluştur",
     	"userloginnocreate": "Giriş yap",
    @@ -501,6 +503,7 @@
     	"userlogin-resetpassword-link": "Parolanızı mı unuttunuz?",
     	"userlogin-helplink2": "Oturum açma konusunda yardım alın",
     	"userlogin-loggedin": "Zaten {{GENDER:$1|$1}} olarak oturum açtınız.\nBaşka bir kullanıcı olarak oturum açmak için aşağıdaki formu kullanın.",
    +	"userlogin-reauth": "{{GENDER:$1|$1}} olduğunuzu doğrulamak için tekrar giriş yapmalısınız.",
     	"userlogin-createanother": "Başka bir hesap oluşturun",
     	"createacct-emailrequired": "E-posta adresi",
     	"createacct-emailoptional": "E-posta adresi (isteğe bağlı)",
    @@ -513,6 +516,8 @@
     	"createacct-reason-ph": "Neden başka bir hesap oluşturuyorsunuz",
     	"createacct-submit": "Hesabınızı oluşturun",
     	"createacct-another-submit": "Hesap oluşturun",
    +	"createacct-continue-submit": "Hesap oluşturmaya devam et",
    +	"createacct-another-continue-submit": "Hesap oluşturmaya devam et",
     	"createacct-benefit-heading": "{{SITENAME}} sizin gibi insanlar tarafından geliştirilir.",
     	"createacct-benefit-body1": "{{PLURAL:$1|düzenleme|düzenleme}}",
     	"createacct-benefit-body2": "{{PLURAL:$1|madde|madde}}",
    @@ -526,6 +531,7 @@
     	"nocookiesnew": "Kullanıcı hesabı oluşturuldu ama oturum açamadınız.\nOturum açmak için {{SITENAME}} çerezleri kullanır.\nÇerez kullanımı devredışı.\nLütfen çerez kullanımını açınız ve yeni kullanıcı adınız ve şifrenizle oturum açınız.",
     	"nocookieslogin": "{{SITENAME}} sitesinde oturum açabilmek için çerezlerinizin açık olması gerekiyor. Sizin çerezleriniz kapalı. Lütfen açınız ve bir daha deneyiniz.",
     	"nocookiesfornew": "Kullanıcı hesabı oluşturulamadı, sorunun kaynağını da tespit edemedik.\nÇerezlerin açık olduğundan emin olun ve bu sayfayı yeniden yükleyip tekrar deneyin.",
    +	"createacct-loginerror": "Hesap başarılı şekilde oluşturuldu ancak otomatik olarak oturumunuz açılmadı. Lütfen [[Special:UserLogin|manuel giriş]] sayfasına gidin.",
     	"noname": "Geçerli bir kullanıcı adı girmediniz.",
     	"loginsuccesstitle": "Oturum açıldı",
     	"loginsuccess": "'''{{SITENAME}} üzerinde \"$1\" kullanıcı adıyla oturum açtınız.'''",
    @@ -546,7 +552,7 @@
     	"noemail": "\"$1\" adlı kullanıcıya kayıtlı bir e-posta adresi yok.",
     	"noemailcreate": "Geçerli bir e-posta adresi sağlamalısınız",
     	"passwordsent": "\"$1\" adına kayıtlı e-posta adresine yeni bir parola gönderildi. Oturumu, lütfen, iletiyi aldıktan sonra açın.",
    -	"blocked-mailpassword": "Siteye erişiminiz engellenmiş olduğundan, yeni şifre gönderilme işlemi yapılamamaktadır.",
    +	"blocked-mailpassword": "IP adresiniz düzenleme yapmaya engellenmiştir. Kötüye kullanımın önüne geçmek için söz konusu IP adresinden şifre kurtarmaya izin verilmemektedir.",
     	"eauthentsent": "Belirtilen e-posta adresine onay kodu içeren bir e-posta gönderildi.\nHesaba başka bir e-posta gönderilmeden önce, e-postadaki yönergeleri uygulayıp, hesabın gerçekten size ait olduğunu onaylamanız gerekir.",
     	"throttled-mailpassword": "Bir parola sıfırlama e-postası son {{PLURAL:$1|bir saat|$1 saat}} içinde zaten gönderildi. Hizmeti kötüye kullanmayı önlemek için, her {{PLURAL:$1|bir saatte|$1 saatte}} sadece bir parola sıfırlama e-postası gönderilecektir.",
     	"mailerror": "E-posta gönderim hatası: $1",
    @@ -563,13 +569,14 @@
     	"createaccount-title": "{{SITENAME}} için yeni kullanıcı hesabı oluşturulması",
     	"createaccount-text": "Birisi {{SITENAME}} sitesinde ($4) sizin e-posta adresinizi kullarak, şifresi \"$3\" olan, \"$2\" isimli bir hesap oluşturdu.\n\nSiteye giriş yapmalı ve parolanızı değiştirmelisiniz.\n\nEğer kullanıcı hesabını yanlışlıkla oluşturmuş iseniz, bu mesajı yoksayabilirsiniz.",
     	"login-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nDevam etmeden önce $1 bekleyin.",
    -	"login-abort-generic": "Girişiniz başarısız - iptal edilmiş",
    +	"login-abort-generic": "Giriş başarısız - Durduruldu",
     	"login-migrated-generic": "Hesabınız aktarılmış ve kullanıcı adınız artık bu vikide yok.",
     	"loginlanguagelabel": "Dil: $1",
     	"suspicious-userlogout": "Çıkış isteğiniz reddedildi çünkü bozuk bir tarayıcı ya da önbellekli vekil tarafından gönerilmiş gibi görünüyor.",
     	"createacct-another-realname-tip": "Gerçek adınız isteğe bağlıdır.\nEğer gerçek adınızı belirtirseniz, çalışmalarınıza atıfta bulunulması için de kullanılacaktır.",
     	"pt-login": "Giriş yap",
     	"pt-login-button": "Oturum aç",
    +	"pt-login-continue-button": "Oturum açmaya devam edin",
     	"pt-createaccount": "Hesap oluştur",
     	"pt-userlogout": "Oturumu kapat",
     	"php-mail-error-unknown": "PHP's mail() fonksiyonunda bilinmeyen hata",
    @@ -597,19 +604,24 @@
     	"botpasswords-label-cancel": "Ä°ptal",
     	"botpasswords-label-delete": "Sil",
     	"botpasswords-label-resetpassword": "Şifreyi sıfırla",
    +	"botpasswords-label-grants": "Geçerli ayrıcalıklar:",
     	"botpasswords-label-restrictions": "Kullanım kısıtlamaları:",
     	"botpasswords-label-grants-column": "Verilen",
     	"botpasswords-bad-appid": "Bot ismi \"$1\" geçerli değil.",
     	"botpasswords-insert-failed": "Bot adı \"$1\" eklenemedi. Zaten eklenmiş olmalı?",
     	"botpasswords-update-failed": "Bot ismini \"$1\" olarak güncelleme başarısız oldu. Silinmiş olabilir mi?",
     	"botpasswords-created-title": "Bot şifresi oluşturuldu.",
    -	"botpasswords-created-body": "Bot şifresi \"$1\" başarıyla oluşturuldu.",
    +	"botpasswords-created-body": "\"$2\" adlı kullanıcının \"$1\" isimli botu için şifre oluşturuldu.",
     	"botpasswords-updated-title": "Bot şifresi guncellendi",
    -	"botpasswords-updated-body": "Bot şifresi \"$1\" başarıyla güncellendi.",
    +	"botpasswords-updated-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi güncellendi.",
     	"botpasswords-deleted-title": "Bot şifresi silindi.",
    -	"botpasswords-deleted-body": "Bot şifresi $1 silinmiş.",
    +	"botpasswords-deleted-body": "\"$2\" adlı kullanıcının \"$1\" isimli botunun şifresi silindi.",
    +	"botpasswords-newpassword": "<strong>$1</strong> ile oturum açmak için yeni şifre: <strong>$2</strong>. <em>İlerde başvurmak için lütfen kaydedin.</em>",
     	"botpasswords-no-provider": "BotPasswordsSessionProvider kullanılamaz.",
    +	"botpasswords-restriction-failed": "Bot şifresi sınırlamaları oturum açmayı engelledi.",
    +	"botpasswords-invalid-name": "Belirtilen kullanıcı adı bot şifresi ayırıcısını içermiyor (\"$1\").",
     	"resetpass_forbidden": "Parolalar değiştirilememektedir",
    +	"resetpass_forbidden-reason": "Şifre değiştirilemedi: $1",
     	"resetpass-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
     	"resetpass-submit-loggedin": "Parolayı değiştir",
     	"resetpass-submit-cancel": "Ä°ptal",
    @@ -636,14 +648,18 @@
     	"passwordreset-emailtext-user": "$1 adlı kullanıcı, {{SITENAME}} ($4) için hesap bilgilerinizin hatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir başkasına aitse veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
     	"passwordreset-emailelement": "Kullanıcı adı: \n$1\n\nGeçici şifre: \n$2",
     	"passwordreset-emailsentemail": "Eğer bu e-posta adresi hesabınızın bağlı olduğu adres ise, bir parola sıfırlama e-postası gönderilecektir.",
    +	"passwordreset-emailsentusername": "Eğer bu e-posta adresi hesabınızın bağlı olduğu adres ise, bir parola sıfırlama e-postası gönderilecektir.",
     	"passwordreset-emailsent-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası gönderildi.",
     	"passwordreset-emailerror-capture": "Aşağıda gözüktüğü gibi bir parola sıfırlama e-postası oluşturuldu ancak {{GENDER:$2|kullanıcıya}} gönderme işlemi başarısız oldu: $1",
    +	"passwordreset-invalideamil": "Geçersiz e-posta adresi",
    +	"passwordreset-nodata": "Ne bir kullanıcı adı ne de bir e-posta adresi verildi.",
     	"changeemail": "E-posta adresini değiştir veya çıkar",
    -	"changeemail-header": "Hesabın e-posta adresini değiştirin",
    +	"changeemail-header": "E-posta adresinizi değiştirmek için bu formu doldurun. Eğer e-posta adresini hesabınızdan kaldırmak istiyorsanız formu gönderirken e-posta adresi bölümünü boş bırakın.",
     	"changeemail-passwordrequired": "Bu değişikliği onaylamak için şifrenizi girmeniz gerekir.",
     	"changeemail-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
     	"changeemail-oldemail": "Mevcut E-posta adresi:",
     	"changeemail-newemail": "Yeni E-posta adresi:",
    +	"changeemail-newemail-help": "E-posta adresinizi silmek istiyorsanız bu alan boş bırakılmalıdır. E-posta adresi silindikten sonra unutulan şifreyi sıfırlayamazsınız ve bu Viki'den e-posta alamazsınız.",
     	"changeemail-none": "(yok)",
     	"changeemail-password": "{{SITENAME}} parolanız:",
     	"changeemail-submit": "E-posta'yı değiştir",
    @@ -680,6 +696,8 @@
     	"minoredit": "Bu küçük bir değişiklik",
     	"watchthis": "Bu sayfayı izle",
     	"savearticle": "Sayfayı kaydet",
    +	"savechanges": "Değişiklikleri kaydet",
    +	"publishpage": "Sayfayı yayımla",
     	"preview": "Önizleme",
     	"showpreview": "Önizlemeyi göster",
     	"showdiff": "Değişiklikleri göster",
    @@ -708,14 +726,14 @@
     	"accmailtext": "[[User talk:$1|$1]] için rastgele oluşturulan parola $2 adresine gönderildi.\n\nBu yeni hesap için parola, giriş yapıldıktan sonra ''[[Special:ChangePassword|parolayı değiştir]]'' bölümünde değiştirilebilir.",
     	"newarticle": "(Yeni)",
     	"newarticletext": "Henüz varolmayan bir sayfaya konulmuş bir bağlantıya tıkladınız.\nSayfayı oluşturmak için aşağıdaki metin kutusunu kullanın. ([$1 yardım sayfasına] bakınız).\nBuraya yanlışlıkla geldiyseniz tarayıcınızın  <strong>geri </strong> tuşuna tıklayın.",
    -	"anontalkpagetext": "----''Bu sayfa henüz bir kullanıcı hesabı oluşturmamış veya hesabını kullanmayan bir anonim kullanıcının mesaj sayfasıdır. Bu nedenle bu kişiyi belirtmek için rakamsal IP adresini kullanmak zorundayız. Bu gibi IP adresleri birçok kullanıcı tarafından paylaşılabilir. Eğer siz de bir anonim kullanıcıysanız ve size sizin ilginiz olmayan iletiler geliyorsa, lütfen diğer anonim kullanıcılarla olabilecek olan karmaşayı önlemek için [[Special:CreateAccount|bir hesap edinin]] veya [[Special:UserLogin|oturum açın]].''",
    +	"anontalkpagetext": "----\n<em>Bu sayfa henüz bir kullanıcı hesabı oluşturmamış veya hesabını kullanmayan bir anonim kullanıcının mesaj sayfasıdır.</em>\nBu nedenle bu kişiyi belirtmek için rakamsal IP adresini kullanmak zorundayız.\nBu gibi IP adresleri birçok kullanıcı tarafından paylaşılabilir.\nEğer siz de bir anonim kullanıcıysanız ve size sizin ilginiz olmayan iletiler geliyorsa, lütfen diğer anonim kullanıcılarla olabilecek olan karmaşayı önlemek için [[Special:CreateAccount|bir hesap edinin]] veya [[Special:UserLogin|oturum açın]].",
     	"noarticletext": "Bu sayfa şu anda boştur.\nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları arayabilir],\nya da bu sayfayı [{{fullurl:{{FULLPAGENAME}}|action=edit}} oluşturabilirsiniz]</span>.",
     	"noarticletext-nopermission": "Bu sayfa şu anda boştur. \nBu başlığı [[Special:Search/{{PAGENAME}}|diğer sayfalarda arayabilir]] ya da <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ilgili kayıtları tarayabilirsiniz]</span>, fakat sayfayı oluşturma yetkiniz bulunmamaktadır.",
     	"missing-revision": "\"{{FULLPAGENAME}}\" sayfasının #$1 sürümü yok.\n\nBu duruma genellikle silinmiş bir sayfaya eski tarihli bir bağlantının takip edilmesi neden olur.\n\nDaha fazla detaylı bilgi [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sayfasında bulunabilir].",
     	"userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" kullanıcı hesabı kayıtlı değil. Bu sayfayı oluşturmak/değiştirmek istiyorsanız lütfen kontrol edin.",
     	"userpage-userdoesnotexist-view": "\"$1\" kullanıcı hesabı kayıtlı değil.",
     	"blocked-notice-logextract": "Bu kullanıcı şuanda engellenmiş.\nSon engelleme günlüğü girdisi referans için aşağıda sağlanmıştır:",
    -	"clearyourcache": "'''Not:''' Kaydettikten sonra değişiklikleri görmek için tarayıcınızın önbelleğini temizlemeniz gerekebilir.\n* '''Firefox / Safari:''' ''Shift'' tuşuna basılıyken \"Yeniden yükle\"'ye tıklayın ya da \"Ctrl-F5\" ya da ''Ctrl-R'' yapın (Mac için '⌘-R'').\n* '''Google Chrome:''' ''Ctrl-Shift-R'''ye basın. (Mac için ''⌘-Shift-R'')\n* '''Internet Explorer:''' ''Ctrl'' basılıyken ''Yenile'''ye tıklayın ya da ''Ctrl-F5'' yapın.\n* '''Opera:''' ''Araçlar → Tercihler'''den önbelliği temizleyin.",
    +	"clearyourcache": "<strong>Note:</strong> Kaydettikten sonra değişiklikleri görmek için tarayıcınızın önbelleğini temizlemeniz gerekebilir.\n* <strong>Firefox / Safari:</strong> <em>Shift</em> tuşuna basılıyken <em>Yeniden yükle</em>'ye tıklayın ya da <em>Ctrl-F5</em> ya da <em>Ctrl-R</em> yapın (Mac için <em>⌘-R</em>).\n* <strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em>'ye basın. (Mac için <em>⌘-Shift-R</em>)\n* <strong>Internet Explorer:</strong> <em>Ctrl</em> basılıyken <em>Yenile</em>'ye tıklayın ya da <em>Ctrl-F5</em> yapın.\n* <strong>Opera:</strong> <em>Araçlar → Tercihler</em>'den önbelliği temizleyin.",
     	"usercssyoucanpreview": "'''İpucu:''' Kaydetmeden önce \"{{int:showpreview}}\"e tıklayarak yeni CSSinizi deneyin.",
     	"userjsyoucanpreview": "'''İpucu:''' Kaydetmeden önce \"{{int:showpreview}}\"e tıklayarak yeni JavaScript'inizi test edin.",
     	"usercsspreview": "'''Sadece kullanıcı CSS dosyanızın önizlemesini görüyorsun.''' '''Kullanıcı CSS dosyası henüz kaydolmadı!'''",
    @@ -728,7 +746,7 @@
     	"previewnote": "'''Bunun yalnızca bir ön izleme olduğunu unutmayın.'''\nYaptığınız değişiklikler henüz kaydedilmedi!",
     	"continue-editing": "Düzenlemeye devam et",
     	"previewconflict": "Bu önizleme metin düzenleme kutucuğunun üstünde, maddenin eğer değişikliklerinizi kaydetmeyi seçerseniz nasıl görüneceğini yansıtır.",
    -	"session_fail_preview": "Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik. Lütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.",
    +	"session_fail_preview": "Özür dileriz. Oturum açılması ile ilgili veri kaybından kaynaklı değişikliğinizi kaydedemedik.\n\nLütfen tekrar deneyiniz. Eğer bu yöntem işe yaramazsa oturumu kapatıp tekrar sisteme geri giriş yapınız.",
     	"session_fail_preview_html": "'''Üzgünüz! Oturum verisinin kaybolmasından dolayı düzenlemenizi işleme geçiremeyeceğiz.'''\n\n''Çünkü {{SITENAME}} sitesinde raw HTML etkindir, önizleme JavaScript saldırılarına önlem olarak gizlenmiştir.''\n\n'''Eğer bu haklı bir düzenleme girişimiyse, lütfen yeniden deneyin. Eğer hala çalışmazsa, [[Special:UserLogout|çıkış yapıp]] yeniden oturum açmayı deneyin.'''",
     	"token_suffix_mismatch": "'''Değişikliğiniz geri çevrildi çünkü alıcınız düzenleme kutucuğundaki noktalama işaretlerini bozdu.\nDeğişikliğiniz, sayfa metninde bozulmayı önlemek için geri çevrildi.\nEğer sorunlu bir web-tabanlı anonim proksi servisi kullanıyorsanız bu olay bazen gerçekleşebilir.'''",
     	"edit_form_incomplete": "'''Değişiklik formu için bazı sunuculara erişilemedi; yaptığınız değişiklikler bozulmamıştır, gözden geçirip tekrar deneyiniz.'''",
    @@ -893,7 +911,7 @@
     	"revdelete-unsuppress": "Geri döndürülmüş revizyonlardaki kısıtlamaları kaldır",
     	"revdelete-log": "Neden:",
     	"revdelete-submit": "Seçilen {{PLURAL:$1|sürüme|sürümlere}} uygula",
    -	"revdelete-success": "'''Revizyon görünürlüğü başarıyla güncellendi.'''",
    +	"revdelete-success": "Revizyon görünürlüğü güncellendi.",
     	"revdelete-failure": "'''Revizyon görünürlüğü güncellenemiyor:'''\n$1",
     	"logdelete-success": "Günlük görünürlüğü ayarlandı.",
     	"logdelete-failure": "'''Günlük görünürlüğü ayarlanamadı:'''\n$1",
    @@ -926,8 +944,12 @@
     	"mergehistory-empty": "Hiçbir sürüm birleştirilemez.",
     	"mergehistory-done": "$1 sayfasının $3 {{PLURAL:$3|revizyonu|revizyonu}} başarıyla [[:$2]] içine birleştirildi.",
     	"mergehistory-fail": "Geçmiş birleştirmesi gerçekleştirlemiyor, lütfen sayfa ve zaman parametrelerini yeniden kontrol edin.",
    +	"mergehistory-fail-bad-timestamp": "Zaman damgası geçersiz.",
    +	"mergehistory-fail-invalid-source": "Kaynak sayfa geçersiz.",
     	"mergehistory-fail-invalid-dest": "Hedef sayfa geçersiz.",
    +	"mergehistory-fail-no-change": "Geçmiş birleştirme hiçbir sürümü birleştirmedi. Lütfen sayfa ve zaman parametrelerini bir kez daha kontrol edin.",
     	"mergehistory-fail-permission": "Geçmiş birleştirmek için gerekli izinler yok.",
    +	"mergehistory-fail-self-merge": "Kaynak ve hedef sayfa aynı.",
     	"mergehistory-fail-toobig": "Limit olarak belirlenen $1 {{PLURAL:$1|sürümden|sürümden}} daha fazlasını taşımak gerekeceği için geçmiş birleştirme gerçekleştirilemiyor.",
     	"mergehistory-no-source": "Kaynak sayfa $1 bulunmamaktadır.",
     	"mergehistory-no-destination": "Hedef sayfa $1 bulunmamaktadır.",
    @@ -1048,6 +1070,7 @@
     	"prefs-help-recentchangescount": "Bu, son değişiklikleri, sayfa geçmişlerini ve günlükleri içerir.",
     	"prefs-help-watchlist-token2": "Bu izleme listenizin gizli anahtarıdır. Anahtarı bilen herkes izleme listenizi görebilir. Bu nedenle kimseyle paylaşmayın. [[Special:ResetTokens|Bu anahtarı sıfırlamak isterseniz buraya tıklayın]].",
     	"savedprefs": "Tercihleriniz kaydedildi.",
    +	"savedrights": "{{GENDER:$1|$1}} için kullanıcı hakları kaydedildi.",
     	"timezonelegend": "Zaman dilimi:",
     	"localtime": "Yerel saat:",
     	"timezoneuseserverdefault": "Viki varsayılanını kullanın ($1)",
    @@ -1596,7 +1619,7 @@
     	"filerevert-legend": "Dosyayı eski haline döndür",
     	"filerevert-intro": "'''[[Media:$1|$1]]''' medyasının [$4 $3, $2 tarihli sürüm]ünü geri getiriyorsunuz.",
     	"filerevert-comment": "Neden:",
    -	"filerevert-defaultcomment": "$2, $1 tarihli sürüme geri döndürüldü",
    +	"filerevert-defaultcomment": "$2, $1 ($3) tarihli sürüme geri döndürüldü",
     	"filerevert-submit": "Eski haline döndür",
     	"filerevert-success": "'''[[Media:$1|$1]]''' dosyası [$4 $3, $2 tarihli sürüme] geri döndürüldü.",
     	"filerevert-badversion": "Bu dosyanın verilen zaman bilgisine sahip önceki bir yerel sürümü yok.",
    @@ -1728,11 +1751,13 @@
     	"protectedpages-performer": "Koruyan kullanıcı",
     	"protectedpages-params": "Koruma parametreleri",
     	"protectedpages-reason": "Sebep",
    +	"protectedpages-submit": "Sayfaları görüntüle",
     	"protectedpages-unknown-timestamp": "Bilinmiyor",
     	"protectedpages-unknown-performer": "Bilinmeyen kullanıcı",
     	"protectedtitles": "Korunan başlıklar",
     	"protectedtitles-summary": "Bu sayfa şu anda oluşturulması korunan başlıkları listeler. Koruma altında olan mevcut sayfaların listesi için [[{{#special:ProtectedPages}}|{{int:protectedpages}}]] sayfasına bakın.",
     	"protectedtitlesempty": "Şu anda, bu parametrelerle korunan hiç bir başlık yok.",
    +	"protectedtitles-submit": "Başlıkları görüntüle",
     	"listusers": "Kullanıcı listesi",
     	"listusers-editsonly": "Sadece değişiklik yapan kullanıcıları göster",
     	"listusers-creationsort": "Oluşturma tarihine göre sırala",
    @@ -1761,8 +1786,9 @@
     	"apisandbox-submit": "Ä°stek yap",
     	"apisandbox-reset": "Temizle",
     	"apisandbox-retry": "Tekrar dene",
    +	"apisandbox-helpurls": "Yardım bağlantıları",
     	"apisandbox-examples": "Örnekler",
    -	"apisandbox-results": "Sonuç",
    +	"apisandbox-results": "Sonuçlar",
     	"apisandbox-request-url-label": "Ä°stek URL:",
     	"apisandbox-request-time": "İstek zamanı: $1",
     	"booksources": "Kaynak kitaplar",
    @@ -2112,6 +2138,7 @@
     	"sp-contributions-username": "IP adresi veya kullanıcı adı:",
     	"sp-contributions-toponly": "Sadece son revizyon olan değişiklikleri göster",
     	"sp-contributions-newonly": "Yalnızca yeni sayfa oluşturan değişiklikleri görüntüle",
    +	"sp-contributions-hideminor": "Küçük değişiklikleri gizle",
     	"sp-contributions-submit": "Ara",
     	"whatlinkshere": "Sayfaya bağlantılar",
     	"whatlinkshere-title": "\"$1\" maddesine bağlantı veren sayfalar",
    @@ -2265,7 +2292,7 @@
     	"cant-move-to-user-page": "Bir sayfayı, bir kullanıcı sayfasına taşımaya izniniz yok (bir kullanıcı altsayfası dışında).",
     	"cant-move-category-page": "Kategori sayfalarını taşıma yetkiniz yok.",
     	"cant-move-to-category-page": "Bir sayfayı, bir kategoriye taşımaya izniniz yok.",
    -	"newtitle": "Yeni isim",
    +	"newtitle": "Yeni başlık:",
     	"move-watch": "Bu sayfayı izle",
     	"movepagebtn": "İsmi değiştir",
     	"pagemovedsub": "İsim değişikliği tamamlandı.",
    @@ -2288,7 +2315,7 @@
     	"movenosubpage": "Bu sayfanın altsayfası yoktur.",
     	"movereason": "Neden:",
     	"revertmove": "geri al",
    -	"delete_and_move_text": "==Silinmesi gerekiyor==\n\n\"[[:$1]]\" isimli bir sayfa zaten mevcut. O sayfayı silerek, isim değişikliğini gerçekleştirmeye devam etmek istiyor musunuz?",
    +	"delete_and_move_text": "Hedef sayfa olan \"[[:$1]]\" zaten mevcut. Taşımayı gerçekleştirebilmek için, mevcut sayfayı silmek ister misiniz?",
     	"delete_and_move_confirm": "Evet, sayfayı sil",
     	"delete_and_move_reason": "[[$1]] sayfasının isim değişikliğinin gerçekleşmesi için silindi.",
     	"selfmove": "Olmasını istediğiniz isim ile mevcut isim aynı. Değişiklik mümkün değil.",
    @@ -2812,6 +2839,7 @@
     	"exif-compression-6": "JPEG",
     	"exif-copyrighted-true": "Telif hakkı",
     	"exif-copyrighted-false": "Telif Hakkı durumu belirtilmemiş",
    +	"exif-photometricinterpretation-1": "Siyah ve beyaz (Siyah 0)",
     	"exif-photometricinterpretation-2": "RGB",
     	"exif-photometricinterpretation-6": "YCbCr",
     	"exif-unknowndate": "Bilinmeyen zaman",
    @@ -3003,6 +3031,7 @@
     	"confirmemail_body_set": "Birisi, muhtemelen siz, $1 IP adresiyle {{SITENAME}} sitesinde \"$2\" kullanıcı hesabının e-posta adresi olarak bu e-posta adresini belirtti.\n\nBu hesabın gerçekten size ait olduğunu onaylamak ve {{SITENAME}} sitesindeki e-posta işlevlerini aktif etmek için alttaki bağlantıyı tarayıcınızda açmanız gerekiyor:\n\n$3\n\nEğer bu hesap size ait değilse, e-posta adresi onayını iptal etmek için alttaki bağlantıyı takip edin:\n\n$5\n\nBu onay kodu $4 tarihine kadar geçerlidir.",
     	"confirmemail_invalidated": "E-posta adresi doğrulaması iptal edildi",
     	"invalidateemail": "E-posta doğrulamasını iptal et",
    +	"notificationemail_subject_changed": "{{SITENAME}} sitesine kayıtlı e-posta adresi değiştirildi",
     	"scarytranscludedisabled": "[Vikilerarası çapraz ekleme devre dışı]",
     	"scarytranscludefailed": "[$1 için şablon alımı başarısız oldu]",
     	"scarytranscludefailed-httpstatus": "[$1 için şablon alımı başarısız oldu: HTTP $2]",
    @@ -3058,7 +3087,7 @@
     	"watchlistedit-raw-done": "İzleme listeniz güncellendi.",
     	"watchlistedit-raw-added": "{{PLURAL:$1|1 başlık|$1 başlık}} eklendi:",
     	"watchlistedit-raw-removed": "{{PLURAL:$1|1 başlık|$1 başlık}} silindi:",
    -	"watchlistedit-clear-title": "Ä°zleme listesi temizlendi",
    +	"watchlistedit-clear-title": "Ä°zleme listesini temizle",
     	"watchlistedit-clear-legend": "Ä°zleme listesini temizle",
     	"watchlistedit-clear-explain": "İzleme listenizdeki tüm başlıklar silinecek",
     	"watchlistedit-clear-titles": "Başlıklar:",
    @@ -3075,6 +3104,7 @@
     	"hijri-calendar-m9": "Ramazan",
     	"hijri-calendar-m10": "Şevval",
     	"signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|mesaj]])",
    +	"timezone-local": "Yerel",
     	"duplicate-defaultsort": "'''Uyarı:''' Varsayılan \"$2\" sınıflandırma anahtarı, önceki \"$1\" sınıflandırma anahtarını geçersiz kılıyor.",
     	"duplicate-displaytitle": "<strong>Uyarı:</strong> \"$2\" şeklindeki yeni başlık \"$1\" şeklindeki eski başlığın üzerine yazılacak.",
     	"invalid-indicator-name": "<strong>Hata:</strong> Sayfa durum göstergelerinin <code>name</code> özelliği boş olamaz.",
    @@ -3454,14 +3484,14 @@
     	"expand_templates_preview": "Önizleme",
     	"expand_templates_preview_fail_html": "<em>{{SITENAME}} işlenmemiş HTML koduna izin verdiği ve oturum verilerinde kayıp yaşandığı için, ön izleme, JavaScript saldırılarına karşı önlem olarak gizlendi.</em>\n\n<strong>Eğer meşru bir ön izleme girişimi idiyse, tekrar deneyiniz.</strong>\nYine de çalışmıyorsa, [[Special:UserLogout|oturum kapamayı]] ve tekrar açmayı deneyin.",
     	"expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} işlenmemiş HTML koduna izin verdiği ve oturum verilerinde kayıp yaşandığı için, ön izleme, JavaScript saldırılarına karşı önlem olarak gizlendi.</em>\n\n<strong>Eğer meşru bir ön izleme girişimi idiyse, lütfen  [[Special:UserLogin|oturum açarak]] tekrar deneyin.</strong>",
    -	"pagelanguage": "Sayfa dili seçicisi",
    +	"pagelanguage": "Sayfa dilini değiştir",
     	"pagelang-name": "Sayfa",
     	"pagelang-language": "Dil",
     	"pagelang-use-default": "Varsayılan dili kullan",
     	"pagelang-select-lang": "Dil seçin",
     	"right-pagelang": "Sayfa dilini değiştir",
     	"action-pagelang": "sayfa dilini değiştir",
    -	"log-name-pagelang": "Dil günlüğünü değiştir",
    +	"log-name-pagelang": "Dil değişimi günlüğü",
     	"log-description-pagelang": "Bu, sayfalardaki dil değişikliklerinin kayıt günlüğüdür.",
     	"logentry-pagelang-pagelang": "$1, $3 sayfasının dilini $4 dilinden $5 diline {{GENDER:$2|çevirdi}}.",
     	"default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (etkin)",
    @@ -3528,6 +3558,8 @@
     	"log-action-filter-delete": "Silme türü:",
     	"log-action-filter-patrol": "Devriye türü:",
     	"log-action-filter-protect": "Koruma tipi:",
    +	"log-action-filter-rights": "Hak türü seçimi:",
    +	"log-action-filter-suppress": "Kaldırma türü:",
     	"log-action-filter-upload": "Yükleme türü:",
     	"log-action-filter-all": "Tümü",
     	"log-action-filter-block-block": "Blok",
    @@ -3543,5 +3575,12 @@
     	"log-action-filter-protect-modify": "Koruma değişikliği",
     	"log-action-filter-protect-unprotect": "Korunmayan",
     	"log-action-filter-upload-upload": "Yeni yükleme",
    -	"log-action-filter-upload-overwrite": "Yeniden yükle"
    +	"log-action-filter-upload-overwrite": "Yeniden yükle",
    +	"authmanager-email-label": "E-posta",
    +	"authmanager-email-help": "E-posta adresi",
    +	"authmanager-realname-label": "Gerçek ad",
    +	"authmanager-realname-help": "Kullanıcının gerçek adı",
    +	"authmanager-provider-temporarypassword": "Geçici parola",
    +	"authprovider-resetpass-skip-label": "Atla",
    +	"authprovider-resetpass-skip-help": "Parola sıfırlamayı atla."
     }
    diff --git a/languages/i18n/tt-cyrl.json b/languages/i18n/tt-cyrl.json
    index bafa6e8736..f0128f9c5b 100644
    --- a/languages/i18n/tt-cyrl.json
    +++ b/languages/i18n/tt-cyrl.json
    @@ -986,8 +986,8 @@
     	"rightslog": "Кулланучының хокуклары көндәлеге",
     	"action-read": "бу битне укырга",
     	"action-edit": "бу битне үзгәртергә",
    -	"action-createpage": "битләрне язырга",
    -	"action-createtalk": "бәхәс битен ясарга",
    +	"action-createpage": "бу битне төзү",
    +	"action-createtalk": "бу бәхәс битен төзү",
     	"action-move": "бу битне күчерерге",
     	"action-sendemail": "электрон хат җибәрү",
     	"nchanges": "$1 {{PLURAL:$1|үзгәртү}}",
    diff --git a/languages/i18n/tyv.json b/languages/i18n/tyv.json
    index 91a3e3af95..757e97e123 100644
    --- a/languages/i18n/tyv.json
    +++ b/languages/i18n/tyv.json
    @@ -131,7 +131,7 @@
     	"history": "Арынның төөгүзү",
     	"history_short": "Төөгү",
     	"printableversion": "Парлап үндүрер янзызы",
    -	"permalink": "Доктаамал шөлүлге",
    +	"permalink": "Доктаамал хевири",
     	"print": "Саазынга үндүрер",
     	"view": "Көөр",
     	"view-foreign": "$1 сайттан көөр",
    @@ -308,9 +308,9 @@
     	"italic_sample": "курсив хевир",
     	"italic_tip": "Курсив хевир",
     	"link_sample": "Шөлүлгениң ады",
    -	"link_tip": "Иштики шөлүлге",
    +	"link_tip": "Иштики арынче айтыг",
     	"extlink_sample": "http://www.example.com холбааның ады",
    -	"extlink_tip": "Даштыкы шөлүлге (\"http://\" префикс дугайында утпаңар)",
    +	"extlink_tip": "Даштыкы арынче айтыг (\"http://\" префикс дугайында утпаңар)",
     	"headline_sample": "Эге аттың сөзүглели",
     	"headline_tip": "2-ги деңнелдиң эге ады",
     	"nowiki_sample": "Форматтавас сөзүглелди бээр салыңар",
    @@ -318,7 +318,7 @@
     	"image_sample": "Чижек.jpg",
     	"image_tip": "Киирген файл",
     	"media_sample": "Чижек.ogg",
    -	"media_tip": "Файлче шөлүлге",
    +	"media_tip": "Файлче айтыг",
     	"sig_tip": "Холуңар үжүү, үе-шагы",
     	"hr_tip": "Доора шугум (көвей ажыглаваңар)",
     	"summary": "Түңнел:",
    @@ -639,7 +639,7 @@
     	"unwatchedpages": "Хайгаарабас арыннар",
     	"unusedtemplates": "Ажыглаан эвес майыктар",
     	"unusedtemplateswlh": "өске холбаалар",
    -	"randompage": "Дужа-келби таварышкан арын",
    +	"randompage": "Душ бооп таваржып келген арын",
     	"statistics": "Статистика",
     	"statistics-pages": "Арыннар",
     	"brokenredirects-edit": "өскертири",
    @@ -696,7 +696,7 @@
     	"linksearch": "Даштыкы холбааларга дилээри",
     	"linksearch-ns": "Аттар делгеми:",
     	"linksearch-ok": "Дилээри",
    -	"linksearch-line": "$1-же $2-ден шөлүлге",
    +	"linksearch-line": "$2-де бижиттинген $1 деп тускай айтыг",
     	"listusers-submit": "Көргүзери",
     	"activeusers-hidebots": "Роботтарны чажырары",
     	"activeusers-hidesysops": "Эргелекчыларны чажырары",
    @@ -774,8 +774,8 @@
     	"sp-contributions-username": "ИП-адрес азы ажыглачының ады:",
     	"sp-contributions-toponly": "Чазалгаларның чүгле сөөлгү хевирлерин көргүзер",
     	"sp-contributions-submit": "Дилээри",
    -	"whatlinkshere": "Шөлүлгелерни бээр",
    -	"whatlinkshere-title": "«$1» деп арынга шөлүтген арыннар",
    +	"whatlinkshere": "Аргышкан арыннар",
    +	"whatlinkshere-title": "«$1» деп арынче айтып турар тускай арыннар",
     	"whatlinkshere-page": "Арын:",
     	"linkshere": "Адаандагы арыннар бээр «'''[[:$1]]'''» шөлүдүп турарлар:",
     	"nolinkshere": "'''[[:$1]]''' деп арынче шөлүтткен арыннар чок.",
    @@ -863,9 +863,9 @@
     	"tooltip-n-portal": "Төлевилел дугайында, маңаа чүнү кылып болурул, ол ышкаш кайда чүү барыл",
     	"tooltip-n-currentevents": "Амгы болуушкуннар дугайында медээ",
     	"tooltip-n-recentchanges": "Викиниң сөөлгү өскерлиишкиннер даңзызы",
    -	"tooltip-n-randompage": "Дужа-келби таварышкан арынны көөр",
    +	"tooltip-n-randompage": "Душ бооп таваржып келген арынны ажыдып көөрү",
     	"tooltip-n-help": "Шынзылга ап болур чер",
    -	"tooltip-t-whatlinkshere": "Ук арынче шөлүлгелиг шупту арыннарның даңзызы",
    +	"tooltip-t-whatlinkshere": "Бо арын-биле аргыжып, тыртыжып алган хамык арыннар чизези",
     	"tooltip-t-recentchangeslinked": "Бо арындан шөлүлгелиг арыннарында сөөлгү өскерилгелер",
     	"tooltip-feed-rss": "Бо арының РСС медээ агымы",
     	"tooltip-feed-atom": "Бо арының Атом медээ агымы",
    diff --git a/languages/i18n/uk.json b/languages/i18n/uk.json
    index 56aa37b3a8..79a6f94459 100644
    --- a/languages/i18n/uk.json
    +++ b/languages/i18n/uk.json
    @@ -1286,8 +1286,8 @@
     	"rightslogtext": "Це протокол зміни прав користувачів.",
     	"action-read": "перегляд цієї сторінки",
     	"action-edit": "редагування цієї сторінки",
    -	"action-createpage": "створення сторінок",
    -	"action-createtalk": "створення сторінок обговорень",
    +	"action-createpage": "створити цю сторінку",
    +	"action-createtalk": "створити цю сторінку обговорення",
     	"action-createaccount": "створення цього облікового запису",
     	"action-autocreateaccount": "автоматичне створення цього зовнішнього облікового запису користувача",
     	"action-history": "переглядати історію цієї сторінки",
    @@ -1507,6 +1507,8 @@
     	"upload-http-error": "Відбулася помилка HTTP: $1",
     	"upload-copy-upload-invalid-domain": "З цього домену завантаження неможливе.",
     	"upload-foreign-cant-upload": "Ця вікі не налаштована на завантаження файлів у запитаний сторонній файловий репозиторій.",
    +	"upload-foreign-cant-load-config": "Завантаження конфігурації завантаження файлів на зовнішнє сховище файлів не вдалося.",
    +	"upload-dialog-disabled": "Завантаження файлів з допомогою цього діалогового вікна відключені у цій вікі.",
     	"upload-dialog-title": "Завантажити файл",
     	"upload-dialog-button-cancel": "Скасувати",
     	"upload-dialog-button-done": "Готово",
    @@ -2231,6 +2233,7 @@
     	"sp-contributions-username": "IP-адреса або ім'я користувача:",
     	"sp-contributions-toponly": "Показувати тільки редагування, що є останніми версіями",
     	"sp-contributions-newonly": "Показувати тільки редагування, які є створеннями сторінок",
    +	"sp-contributions-hideminor": "Приховати малі правки",
     	"sp-contributions-submit": "Пошук",
     	"whatlinkshere": "Посилання сюди",
     	"whatlinkshere-title": "Сторінки, що посилаються на «$1»",
    @@ -2838,7 +2841,7 @@
     	"exif-pixelydimension": "Висота зображення",
     	"exif-usercomment": "Додатковий коментар",
     	"exif-relatedsoundfile": "Файл звукового коментаря",
    -	"exif-datetimeoriginal": "Оригинальні дата й час",
    +	"exif-datetimeoriginal": "Оригінальні дата й час",
     	"exif-datetimedigitized": "Дата й час оцифровки",
     	"exif-subsectime": "Долі секунд часу редагування файлу",
     	"exif-subsectimeoriginal": "Долі секунд оригінального часу",
    @@ -3914,11 +3917,11 @@
     	"cannotauth-not-allowed-title": "Доступ заборонено",
     	"cannotauth-not-allowed": "Вам не дозволено використовувати цю сторінку",
     	"changecredentials": "Зміна облікових даних",
    -	"changecredentials-submit": "Змінити",
    +	"changecredentials-submit": "Змінити облікові дані",
     	"changecredentials-invalidsubpage": "«$1» не є коректним типом облікових даних.",
     	"changecredentials-success": "Ваші облікові дані змінено.",
     	"removecredentials": "Вилучити облікові дані",
    -	"removecredentials-submit": "Вилучити",
    +	"removecredentials-submit": "Вилучити облікові дані",
     	"removecredentials-invalidsubpage": "$1 не є коректним типом облікових даних.",
     	"removecredentials-success": "Ваші облікові дані вилучено.",
     	"credentialsform-provider": "Тип облікових даних:",
    @@ -3929,5 +3932,6 @@
     	"linkaccounts-success-text": "Обліковий запис було пов'язано.",
     	"linkaccounts-submit": "Пов'язати облікові записи",
     	"unlinkaccounts": "Відв'язати облікові записи",
    -	"unlinkaccounts-success": "Обліковий запис було відв'язано."
    +	"unlinkaccounts-success": "Обліковий запис було відв'язано.",
    +	"authenticationdatachange-ignored": "Неопрацьована зміна облікових даних. Можливо, жоден з провайдерів не був налаштований?"
     }
    diff --git a/languages/i18n/ur.json b/languages/i18n/ur.json
    index cf6f69d7c9..7ddfea59d9 100644
    --- a/languages/i18n/ur.json
    +++ b/languages/i18n/ur.json
    @@ -26,7 +26,9 @@
     			"Syedalinaqinaqvi",
     			"محمد افضل",
     			"Macofe",
    -			"Hindustanilanguage"
    +			"Hindustanilanguage",
    +			"امین اکبر",
    +			"Jdforrester"
     		]
     	},
     	"tog-underline": "ربط کی خط کشیدگی:",
    @@ -108,7 +110,7 @@
     	"april-gen": "اپريل",
     	"may-gen": "مئی",
     	"june-gen": "جون",
    -	"july-gen": "جولائ",
    +	"july-gen": "جولائی",
     	"august-gen": "اگست",
     	"september-gen": "ستمبر",
     	"october-gen": "اکتوبر",
    @@ -356,9 +358,9 @@
     	"protectedpagetext": "اس صفحہ کو تدوین سے محفوظ رکھنے کیلیے مقفل کر دیا گیا ہے۔",
     	"viewsourcetext": "آپ صرف مسودہ دیکھ سکتے ہیں اور اسکی نقل اتار سکتے ہیں۔",
     	"viewyourtext": "آپ اس مواد کو دیکھ سکتے ہیں اور اٹھا (کاپی) سکتے ہیں <strong>آپ کی ترامیم</strong> اس صفحہ پر۔",
    -	"protectedinterface": "یہ صفحہ سوفٹ وئیر کے لیے انٹرفیس متن فراہم کرتا ہے، اور ناجائزاستعمال کے سدِباب کے لیے اِسے مقفل کیا گیا ہے.",
    -	"editinginterface": "'''انتباہ: ''' آپ ایک ایسے صفحے میں ترمیم کر رہے ہیں جو سوفٹ ویئر کے لیے انٹرفیس متن فراہم کرتا ہے۔ اس صفحہ میں کی جانے والی ترمیم، دیگر صارفین کے لیے انٹرفیس کو تبدیل کردے گی۔\nبراہِ کرم، ترجمہ کے لیے [https://translatewiki.net/wiki/Main_Page?setlang=en '''ٹرانسلیٹ ویکی.نیٹ'''] (میڈیا ویکی دارالترجمہ) استعمال کریں۔",
    -	"translateinterface": "تمام ویکیوں میں تبدیلی یا شامل کرنے کے لیے، اسے استعمال کریں [https://translatewiki.net/ translatewiki.net]، میڈیا ویکی دارالترجمہ.",
    +	"protectedinterface": "{{fmbox \n| type = editnotice\n| image = [[File:Namespace MediaWiki.svg|45px]]\n| text = '''اس [[mw:Manual:System message|انٹرفیس پیغام]] یا [[ویکیپیڈیا:جلد|جلد]] کی دستاویز [[mw:Manual:Interface/{{PAGENAME}}|میڈیاویکی ڈاٹ آرگ]] یا [[translatewiki:MediaWiki:{{PAGENAME}}/qqq|ٹرانسلیٹ ویکی ڈاٹ نیٹ]] پر بنائی جا سکتی ہے۔''' <br /> چونکہ یہ صفحہ میڈیاویکی سوفٹویئر کے لیے انٹرفیس متن فراہم کرتا ہے، اس لیے اس میں محض [[ویکیپیڈیا:منتظمین|منتظمین]] ہی ترمیم کر سکتے ہیں۔ البتہ اگر آپ کو اس میں کسی قسم کی ترمیم مطلوب ہو تو ذیل میں موجود بٹن پر کلک کرکے اس پیغام میں ترمیم کی درخواست کر سکتے ہیں۔\n<div class=\"center\" style=\"margin-top: 4px;\">{{درخواست ترمیم روانہ کریں|type=full}}</div>\n}}{{editnotice load\n| notice action = view \n}}",
    +	"editinginterface": "<strong>انتباہ: </strong> آپ ایک ایسے صفحے میں ترمیم کر رہے ہیں جو سوفٹ ویئر کے لیے انٹرفیس متن فراہم کرتا ہے۔ اس صفحہ میں کی جانے والی تبدیلی سے اس ویکی پر دیگر صارفین کے لیے انٹرفیس متاثر ہوگی۔",
    +	"translateinterface": "تمام ویکیوں میں تبدیلی یا شامل کرنے کے لیے، [https://translatewiki.net/ translatewiki.net]کو استعمال کریں ، میڈیا ویکی دارالترجمہ.",
     	"namespaceprotected": "آپ کو '''$1''' فضائے نام میں صفحات تدوین کرنے کی اِجازت نہیں ہے.",
     	"mycustomcssprotected": "آپ اس سی ایس ایس (CSS) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
     	"mycustomjsprotected": "آپ اس جاوا اسکپرٹ (JavaScript) صفحہ میں ترمیم کرنے کا اختیار نہیں رکھتے۔",
    @@ -550,8 +552,8 @@
     	"newarticle": "(نیا)",
     	"newarticletext": "آپ نے ایک ایسے صفحے کے ربط کی پیروی کی ہے جو کہ ابھی موجود نہیں ہے.\nیہ صفحہ تخلیق کرنے کیلئے درج ذیل خانہ میں متن درج کیجئے (مزید معلومات کیلئے [$1 صفحۂ معاونت] ملاحظہ فرمائیے).\nاگر آپ یہاں غلطی سے پہنچے ہیں تو پچھلے صفحے پر واپس جانے کیلئے اپنے متصفح پر '''back''' کا بٹن ٹک کیجئے.",
     	"anontalkpagetext": "----''یہ صفحہ ایک ایسے صارف کا ہے جنہوں نے یا تو اب تک اپنا کھاتا نہیں بنایا یا پھر وہ اسے استعمال نہیں کر رہے/ رہی ہیں۔ لہٰذا ہمیں انکی شناخت کے لئے ایک عددی آئی پی پتہ استعمال کرنا پڑرہا ہے۔ اس قسم کا آئی پی پتہ ایک سے زائد صارفین کے لئے مشترک بھی ہوسکتا ہے۔ اگر آپکی موجودہ حیثیت ایک گمنام صارف کی ہے اور آپ محسوس کریں کہ اس صفحہ پر آپکی جانب منسوب یہ بیان غیرضروری ہے تو براہ کرم [[Special:CreateAccount|کھاتہ بنائیں]] یا [[Special:UserLogin|داخلِ نوشتہ]] ہوجائیے تاکہ مستقبل میں آپکو گمنام صارفین میں شمار کرنے سے پرہیز کیا جاسکے۔\"",
    -	"noarticletext": "اِس صفحہ میں فی الحال کوئی متن موجود نہیں ہے.\nآپ دیگں صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کیلئے تلاش کرسکتے ہیں]]، <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں],\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اِس صفحہ میں ترمیم کرسکتے ہیں]</span>",
    -	"noarticletext-nopermission": "اس صفحہ میں فی الحال کوئی متن موجود نہیں ہے.\nآپ دیگں صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کیلئے]] یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں]</span>",
    +	"noarticletext": "اِس صفحہ میں فی الحال کوئی متن موجود نہیں ہے۔\nآپ دیگر صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کے لیے تلاش کرسکتے ہیں]]، <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں]،\nیا [{{fullurl:{{FULLPAGENAME}}|action=edit}} اِس صفحہ میں ترمیم کرسکتے ہیں]</span>",
    +	"noarticletext-nopermission": "اس صفحہ میں فی الحال کوئی متن موجود نہیں ہے۔\nآپ دیگر صفحات میں [[Special:Search/{{PAGENAME}}|اِس صفحہ کے عنوان کے لیے]] یا <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} متعلقہ نوشتہ جات تلاش کرسکتے ہیں]</span>",
     	"userpage-userdoesnotexist-view": "صارف کھاتہ \"$1\" مندرج نہیں ہے۔",
     	"updated": "(اپ ڈیٹڈ)",
     	"note": "'''نوٹ:'''",
    @@ -671,7 +673,7 @@
     	"difference-multipage": "(فرق مابین صفحات)",
     	"lineno": "لکیر $1:",
     	"compareselectedversions": "منتخب متـن کا موازنہ",
    -	"editundo": "استرجع",
    +	"editundo": "رد ترمیم",
     	"diff-empty": "(کوئی فرق نہیں)",
     	"diff-multi-sameuser": "({{PLURAL: $1 | ایک متوسط نظرثانی | $1 کئی متوسط نظرثانیاں}}ایک ہی صارف کی جانب سے نہیں دکھائی گئی)",
     	"searchresults": "تلاش کا نتیجہ",
    @@ -926,6 +928,7 @@
     	"sourcefilename": "اسم ملف (فائل) کا منبع:",
     	"destfilename": "تعین شدہ اسم ملف:",
     	"watchthisupload": "یہ صفحہ زیر نظر کریں",
    +	"upload-dialog-disabled": "اس ویکی پر اس ڈائیلاگ سے فائل اپ لوڈز غیر فعال ہیںَ",
     	"upload-dialog-button-cancel": "منسوخ",
     	"upload-dialog-button-done": "مکمل",
     	"upload-dialog-button-save": "محفوظ",
    @@ -1135,12 +1138,14 @@
     	"wlshowlast": "دکھائیں آخری $1 گھنٹے $2 دن",
     	"watchlist-hide": "چھپائیں",
     	"watchlist-submit": "دکھائیں",
    +	"wlshowtime": "ظاہر ہونے کی مدت:",
     	"wlshowhideminor": "معمولی ترامیم",
     	"wlshowhidebots": "روبہ جات",
     	"wlshowhideliu": "مندرج صارفین",
     	"wlshowhideanons": "گمنام صارفین",
     	"wlshowhidepatr": "مراجعت شدہ ترامیم",
     	"wlshowhidemine": "میری ترامیم",
    +	"wlshowhidecategorization": "صفحاتی زمرہ بندی",
     	"watchlist-options": "اختیارات برائے زیرِنظرفہرست",
     	"enotif_reset": "جملہ صفحات کو بطور زیارت شدہ نشان زد کریں",
     	"enotif_subject_deleted": "{{SITENAME}} میں صفحہ $1 صارف $2 نے {{GENDER:$2|حذف کیا}}",
    @@ -1373,6 +1378,8 @@
     	"tooltip-summary": "مختصر خلاصہ درج کریں",
     	"anonymous": "{{SITENAME}} گمنام صارف",
     	"others": "دیگر",
    +	"pageinfo-visiting-watchers": "تعداد ناظرین جنہوں نے حالیہ ترامیم کا مشاہدہ کیا",
    +	"pageinfo-hidden-categories": "پوشیدہ {{PLURAL:$1|زمرہ|زمرہ جات}} ($1)",
     	"pageinfo-toolboxlink": "معلومات صفحہ",
     	"markaspatrolledtext": "اس صفحہ کو بطور مراجعت شدہ نشان زد کریں",
     	"deletedrevision": "حذف شدہ پرانی ترمیم $1۔",
    diff --git a/languages/i18n/vi.json b/languages/i18n/vi.json
    index 8d0cb673c2..f15aecef0a 100644
    --- a/languages/i18n/vi.json
    +++ b/languages/i18n/vi.json
    @@ -653,7 +653,9 @@
     	"minoredit": "Sửa đổi nhỏ",
     	"watchthis": "Theo dõi trang này",
     	"savearticle": "LÆ°u trang",
    +	"savechanges": "Lưu các thay đổi",
     	"publishpage": "Xuất bản trang",
    +	"publishchanges": "Xuất bản các thay đổi",
     	"preview": "Xem trước",
     	"showpreview": "Xem trước",
     	"showdiff": "Xem thay đổi",
    @@ -1246,8 +1248,8 @@
     	"rightslogtext": "Đây là nhật trình lưu những thay đổi đối với các quyền hạn thành viên.",
     	"action-read": "đọc trang này",
     	"action-edit": "sửa đổi trang này",
    -	"action-createpage": "tạo trang",
    -	"action-createtalk": "tạo trang thảo luận",
    +	"action-createpage": "tạo trang này",
    +	"action-createtalk": "tạo trang thảo luận này",
     	"action-createaccount": "mở tài khoản này",
     	"action-autocreateaccount": "tự động tạo tài khoản người dùng bên ngoài này",
     	"action-history": "xem lịch sử của trang này",
    @@ -1465,6 +1467,8 @@
     	"upload-http-error": "Xảy ra lỗi HTTP: $1",
     	"upload-copy-upload-invalid-domain": "Không có sẵn các bản sao tải lên tại tên miền này.",
     	"upload-foreign-cant-upload": "Wiki này không được thiết lập để tải tập tin lên kho tập tin chung bên ngoài được chỉ định.",
    +	"upload-foreign-cant-load-config": "Thất bại khi tải cấu hình cho tập tin tải lên kho tập tin bên ngoài.",
    +	"upload-dialog-disabled": "Chức năng tải lên tập tin qua hộp thoại này bị tắt trong wiki này.",
     	"upload-dialog-title": "Tải tập tin lên",
     	"upload-dialog-button-cancel": "Hủy bỏ",
     	"upload-dialog-button-done": "Xong",
    @@ -2184,6 +2188,7 @@
     	"sp-contributions-username": "Địa chỉ IP hay tên thành viên:",
     	"sp-contributions-toponly": "Chỉ hiện các phiên bản mới nhất",
     	"sp-contributions-newonly": "Chỉ hiện các sửa đổi tạo trang",
    +	"sp-contributions-hideminor": "Ẩn các sửa đổi nhỏ",
     	"sp-contributions-submit": "Tìm kiếm",
     	"whatlinkshere": "Các liên kết đến đây",
     	"whatlinkshere-title": "Các trang liên kết đến “$1”",
    @@ -2634,7 +2639,7 @@
     	"pageinfo-category-files": "Số tập tin",
     	"markaspatrolleddiff": "Đánh dấu tuần tra",
     	"markaspatrolledtext": "Đánh dấu tuần tra trang này",
    -	"markaspatrolledtext-file": "Đánh dấu phiên bản fiel này là đã kiểm tra",
    +	"markaspatrolledtext-file": "Đánh dấu đã tuần tra phiên bản file này",
     	"markedaspatrolled": "Đã đánh dấu tuần tra",
     	"markedaspatrolledtext": "Phiên bản được chọn của [[:$1]] đã được đánh dấu tuần tra.",
     	"rcpatroldisabled": "“Thay đổi gần đây” của các trang tuần tra không bật",
    @@ -3721,7 +3726,6 @@
     	"mw-widgets-dateinput-placeholder-month": "YYYY-MM (năm-tháng)",
     	"mw-widgets-titleinput-description-new-page": "trang này chưa tồn tại",
     	"mw-widgets-titleinput-description-redirect": "đổi hướng đến $1",
    -	"api-error-blacklisted": "Xin vui lòng chọn một tên khác miêu tả đầy đủ.",
     	"sessionmanager-tie": "Không thể kết hợp nhiều yêu cầu xác thực loại: $1.",
     	"sessionprovider-generic": "phiên $1",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "phiên dựa trên cookie",
    @@ -3846,5 +3850,6 @@
     	"linkaccounts-success-text": "Đã liên kết tài khoản.",
     	"linkaccounts-submit": "Liên kết tài khoản",
     	"unlinkaccounts": "Gỡ liên kết tài khoản",
    -	"unlinkaccounts-success": "Đã gỡ liên kết tài khoản."
    +	"unlinkaccounts-success": "Đã gỡ liên kết tài khoản.",
    +	"authenticationdatachange-ignored": "Tác vụ thay đổi dữ liệu xác thực không được xử lý. Có lẽ nhà cung cấp chưa được cấu hình?"
     }
    diff --git a/languages/i18n/wuu.json b/languages/i18n/wuu.json
    index a9d1e5a9ab..3c01f7e4c6 100644
    --- a/languages/i18n/wuu.json
    +++ b/languages/i18n/wuu.json
    @@ -50,7 +50,7 @@
     	"tog-enotifminoredits": "頁搭文件細編也用電子信通知我",
     	"tog-enotifrevealaddr": "電子信通知單裏顯示我個電子信地址",
     	"tog-shownumberswatching": "顯示關注人數",
    -	"tog-oldsig": "本生个签名:",
    +	"tog-oldsig": "原生个签名:",
     	"tog-fancysig": "拿签名当成维基文本(弗自动链接)",
     	"tog-uselivepreview": "使用实时预览",
     	"tog-forceeditsummary": "朆写编辑摘要个辰光提醒我",
    @@ -369,7 +369,7 @@
     	"protectedpagetext": "箇页锁牢定,防编搭各许操作。",
     	"viewsourcetext": "侬可以查看搭仔复制箇只页面个源码。",
     	"viewyourtext": "侬好望搭著复制<strong>侬编辑箇页后</strong>个源码。",
    -	"protectedinterface": "箇页为箇维基个软件提供界面文本,锁牢定防乱用。\n加改全部维基个译文,用[https://translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。",
    +	"protectedinterface": "本页为箇维基个软件提供界面文本,锁牢定防乱用。要增加或修改所有维基个译文,用[https://translatewiki.net/ translatewiki.net],MediaWiki软件个本地化计划。",
     	"editinginterface": "<strong>警告:</strong>侬来里编写个页面是畀软件用个界面文本。箇页变化会影响各许人个界面样子。",
     	"translateinterface": "要添加或者更改所有wiki个翻译,请侬访问MediaWiki本地化项目个网站[https://translatewiki.net/ translatewiki.net]。",
     	"cascadeprotected": "箇只页面畀保护拉许,因为渠已嵌入到下底已经标注“级联保护”个{{PLURAL:$1|一只|多只}}畀保护页面:\n$2",
    @@ -468,12 +468,12 @@
     	"password-name-match": "密码弗好搭户名一样。",
     	"password-login-forbidden": "用箇名字搭密码是弗准个。",
     	"mailmypassword": "重置密码",
    -	"passwordremindertitle": "{{SITENAME}} 个临时新密码",
    +	"passwordremindertitle": "{{SITENAME}}个新临时密码",
     	"passwordremindertext": "有人(作兴是侬,来自IP地址$1)已经请求{{SITENAME}}个新密码($4)。\n用户“$2”个一只新临时密码现在已经设置好为“$3”。\n假使箇只动作是侬发起个,侬需要立即登录并选择一只新个密码。\n侬个临时密码会得垃拉$5日里向过期。\n\n假使箇只请求弗是侬发起个,或者侬已经拿密码想起来外加弗准备改脱渠,\n侬可以忽略此消息并继续使用侬个旧密码。",
     	"noemail": "用户\"$1\"弗曾登记电子邮件地址。",
     	"noemailcreate": "侬要提供只有效个电子邮件地址",
     	"passwordsent": "用户\"$1\"个新密码已经寄往登记个电子邮件地址。\n请收着仔再登录。",
    -	"blocked-mailpassword": "侬个IP地址处于查封状态,弗允许编辑,为仔安全起见,密码恢复功能已经禁用。",
    +	"blocked-mailpassword": "侬个IP地址处于查封状态,弗允许编辑。为仔防止乱用,箇只IP地址个密码恢复功能已经禁用。",
     	"eauthentsent": "一封确认信已经发送到指定个电子邮箱地址。垃拉其他邮件发送到本账号之前,侬必须首先按照箇封信里向个指示,确认箇只邮箱真实有效。",
     	"throttled-mailpassword": "密码转设电子信徕最近$1个钟头里发畀你侬哉。保险点,密码转设电子信$1个钟头只一垡好发。",
     	"mailerror": "发送邮件错误:$1",
    @@ -544,8 +544,8 @@
     	"resettokens-resetbutton": "重置选中个密钥",
     	"bold_sample": "粗体文字",
     	"bold_tip": "粗体文字",
    -	"italic_sample": "斜体文本",
    -	"italic_tip": "斜体文本",
    +	"italic_sample": "斜体文字",
    +	"italic_tip": "斜体文字",
     	"link_sample": "链接标题",
     	"link_tip": "内部链接",
     	"extlink_sample": "http://www.example.com 链接标题",
    @@ -567,7 +567,7 @@
     	"showpreview": "显示预览",
     	"showdiff": "显示变化",
     	"blankarticle": "<strong>警告:</strong>侬要创建个页面是空白个。如果侬再次点击“{{int:savearticle}}”,一只呒不任何内容个页面会畀创建。",
    -	"anoneditwarning": "<strong>警告:</strong>侬弗曾登录。如果侬做仔啥编辑,箇么侬个IP地址会公开可见。如果侬<strong>[$1 登录]</strong>或<strong>[$2 创建一只账号]</strong>,侬个编辑会归功于侬用户名下底,而且会有其他优点。",
    +	"anoneditwarning": "<strong>警告:</strong>侬弗曾登录。如果侬做仔啥编辑,箇么侬个IP地址会公开可见。如果侬<strong>[$1 登录]</strong>或者<strong>[$2 建立只账号]</strong>,侬个编辑会归功到侬用户名下底,而且有其他优点。",
     	"anonpreviewwarning": "''侬弗曾登录。侬个IP位址会得记录拉此页个编辑历史里向。''",
     	"missingsummary": "'''提示:''' 侬弗曾提供编辑摘要。假使侬再次单击保存,侬个编辑将弗带编辑摘要保存。",
     	"selfredirect": "<strong>警告:</strong>侬来上拿本页面重定向到它自家。侬可能搞错著重定向个目标,或者侬来上编辑错个页面。如果侬再次点击“{{int:savearticle}}”,重定向弗管哪亨会畀创建。",
    @@ -575,7 +575,7 @@
     	"missingcommentheader": "<strong>提示:</strong>侬弗曾为此评论提供标题。如果侬再次单击“{{int:savearticle}}”,侬个编辑将弗带标题保存。",
     	"summary-preview": "摘要预览:",
     	"subject-preview": "主题预览:",
    -	"blockedtitle": "用户拨查封",
    +	"blockedtitle": "用户畀查封",
     	"blockedtext": "<strong>侬个用户名或IP地址已经畀查封。</strong>\n\n由$1查封。畀出个原因是<em>$2</em>。\n\n* 查封开始辰光:$8\n* 查封到期辰光:$6\n* 目标查封对象:$7\n\n侬可以联络$1或者其他个[[{{MediaWiki:Grouppage-sysop}}|管理员]],讨论箇趟查封。侬弗好使用“电邮联系箇位用户”功能,除非侬已经垃侬个[[Special:Preferences|账号设置]]里向指定仔一只有效个电邮地址并且朆畀禁止使用箇只功能。侬当前个IP地址是$3,而该查封ID是#$5。请垃拉侬个查询里向注明以上所有资料。",
     	"autoblockedtext": "侬个IP地址已经畀自动查封,因为之前另一位畀$1查封个用户搭侬用一样个IP地址。查封个原因是:\n\n:<em>$2</em>\n\n* 查封开始辰光:$8\n* 查封到期辰光:$6\n* 目标查封对象:$7\n\n侬可以联络$1或者其他个[[{{MediaWiki:Grouppage-sysop}}|管理员]],讨论箇趟查封。\n\n注意侬弗好使用“电邮联系箇位用户”功能,除非侬已经垃侬个[[Special:Preferences|账号设置]]里向指定仔一只有效个电邮地址并且朆畀禁止使用箇只功能。\n\n侬当前个IP地址是$3,而该查封ID是#$5。请垃拉侬个查询里向注明以上所有资料。",
     	"blockednoreason": "朆畀出原因",
    @@ -654,7 +654,7 @@
     	"postedit-confirmation-created": "页面已创建。",
     	"postedit-confirmation-restored": "页面已恢复。",
     	"postedit-confirmation-saved": "倷个编辑已保存。",
    -	"edit-already-exists": "弗好创建新页面。\n已经有垃许。",
    +	"edit-already-exists": "弗好创建新页面。已经有垃许。",
     	"defaultmessagetext": "默认消息文本",
     	"invalid-content-data": "无效内容数据",
     	"content-not-allowed-here": "[[$2]]页面上弗允许“$1”内容",
    @@ -686,7 +686,7 @@
     	"cantcreateaccount-text": "从箇只IP地址 (<b>$1</b>) 创建账户已经畀[[User:$3|$3]]禁止。\n\n$3封禁个原因是''$2''",
     	"viewpagelogs": "望箇页日志",
     	"nohistory": "该只页面呒不编辑历史。",
    -	"currentrev": "最后版本",
    +	"currentrev": "最新版本",
     	"currentrev-asof": "$1个最新修订版",
     	"revisionasof": "垃拉$1所作出个修订版",
     	"revision-info": "{{GENDER:$6|$2}}$1个版本$7",
    @@ -706,13 +706,13 @@
     	"historysize": "($1字节)",
     	"historyempty": "(空)",
     	"history-feed-title": "校订历史",
    -	"history-feed-description": "wiki里向本页个修订历史",
    +	"history-feed-description": "本wiki里向该只页面个修订历史",
     	"history-feed-item-nocomment": "$1垃拉$2",
     	"history-feed-empty": "请求个页面弗存在。渠作兴已畀删除或重命名。\n尝试[[Special:Search|搜索本站]]获得相关新建页面。",
     	"history-edit-tags": "编辑选中修订版本个标签",
    -	"rev-deleted-comment": "(编辑摘要畀删脱)",
    -	"rev-deleted-user": "(用户名已删除)",
    -	"rev-deleted-event": "(日志细节畀删脱)",
    +	"rev-deleted-comment": "(编辑摘要删脱哉)",
    +	"rev-deleted-user": "(用户名删脱哉)",
    +	"rev-deleted-event": "(日志细节删脱哉)",
     	"rev-deleted-user-contribs": "[用户名或IP地址已删除 - 垃贡献里向囥脱编辑]",
     	"rev-deleted-text-permission": "箇只页面版本已畀'''删除'''。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。",
     	"rev-deleted-text-unhide": "箇只页面修订已经畀<strong>删脱</strong>。\n垃拉[{{fullurl:{{#Special:Log}}/delete|page={{PAGENAMEE}}}} 删除日志]里向可以寻着详细信息。\n如果侬想继续个说话,侬仍旧好[$1 查看箇趟修订]。",
    @@ -1004,8 +1004,8 @@
     	"rightslog": "用户权限日志",
     	"action-read": "讀箇頁",
     	"action-edit": "编辑箇只页面",
    -	"action-createpage": "做新頁",
    -	"action-createtalk": "做討論頁",
    +	"action-createpage": "建立该只页面",
    +	"action-createtalk": "建立该只讨论页",
     	"action-minoredit": "標小編寫",
     	"action-move": "移箇頁",
     	"action-move-subpages": "移箇頁搭兒頁",
    @@ -1349,6 +1349,7 @@
     	"sp-contributions-talk": "讲张",
     	"sp-contributions-search": "寻贡献记录",
     	"sp-contributions-username": "IP地址要勿用户名:",
    +	"sp-contributions-toponly": "只显示阿末只版本个编辑",
     	"sp-contributions-submit": "搜寻",
     	"whatlinkshere": "有啥链到箇里",
     	"whatlinkshere-title": "链接到“$1”个页面",
    @@ -1588,6 +1589,7 @@
     	"logentry-upload-upload": "$1{{GENDER:$2|上传}}$3",
     	"rightsnone": "(呒)",
     	"revdelete-summary": "编辑摘要",
    +	"feedback-thanks-title": "谢谢侬!",
     	"searchsuggest-search": "搜寻",
     	"pagelang-language": "闲话"
     }
    diff --git a/languages/i18n/yi.json b/languages/i18n/yi.json
    index e00ae617e1..8f2c434057 100644
    --- a/languages/i18n/yi.json
    +++ b/languages/i18n/yi.json
    @@ -502,6 +502,7 @@
     	"createacct-another-realname-tip": "עכטער נאמען איז אפציאנאל.\nאויב איר וויילט אויס צוצושטעלן אים, וועט דאס גענוצט ווערן צו געבן אטריבוציע פאר זייער ארבעט.",
     	"pt-login": "אריינלאגירן",
     	"pt-login-button": "אַרײַנלאָגירן",
    +	"pt-login-continue-button": "פארטזעצן אריינלאגירן",
     	"pt-createaccount": "שאַפֿן אַ קאנטע",
     	"pt-userlogout": "אַרויסלאָגירן",
     	"php-mail-error-unknown": "אומבאַקאַנט טעות אין()mail פֿונקציע פֿון PHP.",
    @@ -531,6 +532,7 @@
     	"botpasswords-updated-body": "דאס באט פאסווארט פאר באט־נאמען \"$1\" פון באניצער \"$2\" איז דערהיינטיקט געווארן.",
     	"botpasswords-deleted-title": "באט פאסווארט אויסגעמעקט",
     	"resetpass_forbidden": "פאסווערטער קענען נישט ווערן געטוישט",
    +	"resetpass_forbidden-reason": "פאסווערטער קענען נישט ווערן געטוישט: $1",
     	"resetpass-no-info": "איר דארפֿט זיין אריינלאגירט צוצוקומען גלייך צו דעם דאזיגן בלאט.",
     	"resetpass-submit-loggedin": "טוישן פאסווארט",
     	"resetpass-submit-cancel": "אַנולירן",
    @@ -560,6 +562,8 @@
     	"passwordreset-emailsentusername": "טאמער איז פאראן אן ע־פאסט אדרעס פארקניפט מיט דעם באניצער־נאמען, וועט מען שיקן א פאסווארט צוריקשטעלן ע-פּאָסט.",
     	"passwordreset-emailsent-capture": "מען האט געשיקט א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן.",
     	"passwordreset-emailerror-capture": "מען האט געשאפן א פאסווארט צוריקשטעלן בליצבריוו, וואס ווערט געוויזן אונטן, אבער שיקן צום {{GENDER:$2|באניצער}}איז דורכגעפאלן: $1",
    +	"passwordreset-nocaller": "מען דארף פֿארזארגן א רופֿער",
    +	"passwordreset-invalideamil": "אומגילטיקער ע־פאסט אדרעס",
     	"changeemail": "ענדערן אדער אראפנעמען ע-פּאָסט אַדרעס",
     	"changeemail-header": "דערגאַנצט די פֿאָרעם צו ענדערן אייער ע-פּאָסט אַדרעס .\nטאמער ווילט איר אראפנעמען די צוארדנונג פון איינעם פון אייערע ע־פאסט אדרעסן פו אייער קאנטע, לאזט ליידיג דעם נייעם ע־פאסט אדרעס ווען איר גיט איין די פֿארעם.",
     	"changeemail-passwordrequired": "איר וועט דארפן איינגעבן אייער פאסווארט צו באשטעטיגן די ענדערונג.",
    @@ -1154,6 +1158,9 @@
     	"grant-group-file-interaction": "אינטעראגירן מיט מעדיע",
     	"grant-group-email": "שיקן ע־פאסט",
     	"grant-createaccount": "שאַפֿן קאנטעס",
    +	"grant-editmywatchlist": "רעדאקטירן אײַער אויפֿפאסונג ליסטע",
    +	"grant-editpage": "רעדאקטירן עקזיסטירנדע בלעטער",
    +	"grant-editprotected": "רעדאקטירן געשיצטע בלעטער",
     	"grant-uploadfile": "אַרויפֿלאָדן נייע טעקעס",
     	"grant-basic": "בעיסיק רעכטן",
     	"grant-viewmywatchlist": "קוקט אייער אויפפאסונג ליסטע",
    @@ -1163,8 +1170,8 @@
     	"rightslogtext": "דאָס איז אַ לאג פֿון ענדערונגען צו באַניצער רעכטן.",
     	"action-read": "ליינען דעם בלאַט",
     	"action-edit": "רעדאקטירן דעם בלאַט",
    -	"action-createpage": "שאַפֿן בלעטער",
    -	"action-createtalk": "שאַפֿן שמועס בלעטער",
    +	"action-createpage": "שאַפֿן דעם בלאַט",
    +	"action-createtalk": "שאַפֿן דעם שמועס בלאט",
     	"action-createaccount": "שאַפֿן די באַניצער קאנטע",
     	"action-history": "באקוקן רעדאקטירן היסטאריע פון דעם בלאט.",
     	"action-minoredit": "באַצייכענען די רעדאַקטירונג ווי מינערדיק",
    @@ -1988,6 +1995,7 @@
     	"sp-contributions-username": "באניצער נאמען אדער IP אדרעס:",
     	"sp-contributions-toponly": "בלויז ווײַזן רעדאַקטירונגען וואָס זענען די לעצטיקע רעוויזיעס",
     	"sp-contributions-newonly": "בלויז ווײַזן רעדאקטירונגען וואס זענען נײַ־געשאפענע בלעטער",
    +	"sp-contributions-hideminor": "באהאלטן מינערדיגע ענדערונגען",
     	"sp-contributions-submit": "זוכן",
     	"whatlinkshere": "װאָס פֿאַרבינדט אַהער",
     	"whatlinkshere-title": "בלעטער וואס פֿארבינדן צו $1",
    @@ -2124,7 +2132,7 @@
     	"move-page": "באַוועגן $1",
     	"move-page-legend": "באַוועגן בלאַט",
     	"movepagetext": "זיך באניצן מיט דעם פֿארעם וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירונג בלאט צום נייעם קעפל.\n\nאיר קענט דערהיינטיגן ווייטערפֿירונגען צום אלטן נאמען אויטאמאטיש.\n\nטאמער נישט, טוט פֿארזיכערן אז עס איז נישטא קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע ווייטערפֿירונגען]].\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צום געהעריגן ציל.\n\nדער בלאט וועט <strong> נישט</strong> ווערן אריבערגעפֿירט אויב עס איז שוין דא א בלאט אונטער דעם נייעם נאמען, אחוץ ווען ער איז א ווייטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרייבן אן עקסיסטירנדן בלאט.\n\n<strong>הערה:</strong>\n אזא ענדערונג קען זיין דראסטיש און נישט געווינטשען פאר א פאפולערן בלאט;\nביטע פֿארזיכערט אז איר פֿארשטייט די ווייטגרייכנדע קאנסקווענסן צו דער אקציע בעפֿאר איר פֿירט דאס אויס.",
    -	"movepagetext-noredirectfixer": "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\n\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירן בלאט צום נײַעם נאמען.\n\nטוט פֿארזיכערן אז עס בלײַבן נישט קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע]] ווייטערפֿירונגען.\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.\n\nאַכטונג: דער בלאַט וועט <strong>נישט</strong> ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.\n\n<strong>הערה:</strong> אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
    +	"movepagetext-noredirectfixer": "זיך באניצן מיט דעם פֿארעם אונטן וועט פֿארענדערן דעם נאמען פֿון דעם בלאט, און וועט אריבערפֿירן זיין געשיכטע צום נייעם נאמען.\n\nדאס אלטע קעפל וועט ווערן א ווייטערפֿירן בלאט צום נײַעם נאמען.\n\nטוט פֿארזיכערן אז עס בלײַבן נישט קיין [[Special:DoubleRedirects|געטאפלטע]] אדער [[Special:BrokenRedirects|צעבראכענע]] ווייטערפֿירונגען.\n\nאיר זענט פֿאראנטווארטלעך זיכער מאכן אז אלע פֿארבינדונגען ווערן געריכטעט צו דער געהעריגער ריכטונג.\n\nאַכטונג: דער בלאַט וועט <strong>נישט</strong> ווערן אַריבערגעפֿירט אויב עס איז שוין דאָ א בלאט אונטער דעם נײַעם נאמען, אחוץ ווען ער איז א ווײַטערפֿירונג בלאט, און ער האט נישט קיין געשיכטע פון ענדערונגען.\nפשט דערפֿון, אז איר קענט איבערקערן א ווייטערפֿירונג וואס איר האט אט געמאכט בטעות, און איר קענט נישט אריבערשרײַבן אַן עקסיסטירנדן בלאט.\n\n<strong>הערה:</strong> אזא ענדערונג קען זיין דראַסטיש און נישט געוואונטשן פֿאַר א פאפולערן בלאַט; ביטע פֿאַרזיכערט אז איר פֿאַרשטייט די ווײַטגרייכנדע קאנסעקווענסן צו דער אַקציע בעפֿאַר איר גייט ווײַטער.",
     	"movepagetalktext": "טאמער צייכנס איר דאס קעסטל, וועט דער אסאסיציאירטער רעדן בלאט ווערן באַוועגט אויטאמאֵטיש צום נײַעם קעפל, אחוץ ווען ס'איז שוין דא א נישט-ליידיגער רעדן־בלאט.\n\nאין דעם פֿאל, וועט איר דארפֿן באַוועגן אדער צונויפֿגיסן דעם בלאט האַנטלעך, ווען איר ווילט.",
     	"moveuserpage-warning": "'''ווארענונג:''' איר האלט ביי באוועגן א באניצער בלאט. ביטע באמערקט אז נאר דער בלאט ווערט באוועגט אבער דער באניצער נאמען ווערט ''נישט'' געענדערט.",
     	"movecategorypage-warning": "<strong>ווארענונג:</strong> איר האלט ביי באוועגן א קאטעגאריע בלאט. גיט אכט אז נאר דער בלאט וועט ווערן באוועגט, אבער די בלעטער אין דער אלטער קאטעגאריע וועט מען <em>נישט</em> be ארײַנשטעלן אין דער נייער קאטעגאריע.",
    @@ -3150,6 +3158,7 @@
     	"special-characters-title-endash": "ען טירע",
     	"special-characters-title-emdash": "עם טירע",
     	"special-characters-title-minus": "מינוס",
    +	"mw-widgets-titleinput-description-new-page": "דער בלאט עקזיסטירט נאך נישט",
     	"log-action-filter-upload": "טיפ ארויפֿלאד:",
     	"log-action-filter-all": "אַלע",
     	"log-action-filter-delete-delete": "אויסמעקן בלאט",
    diff --git a/languages/i18n/zh-hans.json b/languages/i18n/zh-hans.json
    index 3babdbe38e..118c72483c 100644
    --- a/languages/i18n/zh-hans.json
    +++ b/languages/i18n/zh-hans.json
    @@ -710,7 +710,9 @@
     	"minoredit": "标记为小编辑",
     	"watchthis": "监视本页",
     	"savearticle": "保存页面",
    +	"savechanges": "保存更改",
     	"publishpage": "发布页面",
    +	"publishchanges": "发布更改",
     	"preview": "预览",
     	"showpreview": "显示预览",
     	"showdiff": "显示更改",
    @@ -882,7 +884,7 @@
     	"rev-deleted-comment": "(编辑摘要被移除)",
     	"rev-deleted-user": "(用户名被删除)",
     	"rev-deleted-event": "(日志详情已移除)",
    -	"rev-deleted-user-contribs": "[用户名或IP地址被删除 - 编辑在贡献中隐藏]",
    +	"rev-deleted-user-contribs": "[用户名或IP地址被移除 - 编辑在贡献中隐藏]",
     	"rev-deleted-text-permission": "本页面版本已被<strong>删除</strong>。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。",
     	"rev-suppressed-text-permission": "此页面修订已经被<strong>监督隐藏</strong>。详细信息可在[{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} 监督日志]中找到。",
     	"rev-deleted-text-unhide": "本页面版本已被<strong>删除</strong>。详情请见[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 删除日志]。如果您想继续操作,您仍然可以[$1 查看本版本]。",
    @@ -1303,8 +1305,8 @@
     	"rightslogtext": "这是用户权限更改的日志。",
     	"action-read": "阅读本页",
     	"action-edit": "编辑本页",
    -	"action-createpage": "创建页面",
    -	"action-createtalk": "创建讨论页面",
    +	"action-createpage": "创建此页面",
    +	"action-createtalk": "创建此讨论页面",
     	"action-createaccount": "创建该用户账户",
     	"action-autocreateaccount": "自动创建该外部用户账户",
     	"action-history": "查看此页历史",
    @@ -1522,7 +1524,8 @@
     	"upload-http-error": "发生HTTP错误:$1",
     	"upload-copy-upload-invalid-domain": "不能从该域名上载文件副本。",
     	"upload-foreign-cant-upload": "此wiki未配置为上传文件至请求的外部文件存储库。",
    -	"upload-foreign-cant-load-config": "加载外部文件存储库的文件上传配置失败。",
    +	"upload-foreign-cant-load-config": "未能加载用于上传至外部文件存储库的文件配置。",
    +	"upload-dialog-disabled": "使用此对话框的文件上传在此wiki已禁用。",
     	"upload-dialog-title": "上传文件",
     	"upload-dialog-button-cancel": "取消",
     	"upload-dialog-button-done": "完成",
    @@ -2245,6 +2248,7 @@
     	"sp-contributions-username": "IP地址或用户名:",
     	"sp-contributions-toponly": "仅显示最后版本的编辑",
     	"sp-contributions-newonly": "仅显示创建页面的编辑",
    +	"sp-contributions-hideminor": "隐藏小编辑",
     	"sp-contributions-submit": "搜索",
     	"whatlinkshere": "链入页面",
     	"whatlinkshere-title": "链接至“$1”的页面",
    @@ -2390,8 +2394,8 @@
     	"lockedbyandtime": "(由 {{GENDER:$1|$1}} 于$2 $3执行)",
     	"move-page": "移动$1",
     	"move-page-legend": "移动页面",
    -	"movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将重定向更新到原条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也<strong>不会</strong>被移动,除非新页面无任何编辑历史或是重定向页。这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n<strong>注意:</strong>\n对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
    -	"movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。\n老的页面将成为新页面的重定向页。\n请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。\n您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将<strong>不会</strong>被移动,\n除非新页面无内容或是重定向页,而且没有版本历史。\n这意味着您再必要时可以在移动到新页面后再移回老的页面,\n同时您也无法覆盖现有页面。\n\n<strong>注意:</strong>\n对一个经常被访问的页面而言这可能是一个重大与唐突的更改;\n请在行动前先确定您了解其所可能带来的后果。",
    +	"movepagetext": "您可以使用下面的表单来重命名一个页面,同时将其版本历史移动到新页面。同时老的条目将会被重定向到新条目。您可以自动地将重定向更新到原条目。如果您不选择这样做的话,请检查[[Special:DoubleRedirects|双重]]或[[Special:BrokenRedirects|损坏重定向]]链接。您有责任确保链接会被正确指向他们应该被指向的地方。\n\n注意:即使新条目已经有对应页面,此页面也<strong>不会</strong>被移动,除非新页面无任何编辑历史或是重定向页。这意味着您可在误操作后将页面移回原处,同时,您也无法覆盖现有页面。\n\n<strong>注意:</strong>对这样一个经常被访问的页面而言这可能是一个重大且唐突的更改;请在行动前先了解您的修改可能带来的一切后果。",
    +	"movepagetext-noredirectfixer": "用下面的表单来重命名一个页面,并将其版本历史同时移动到新页面。老的页面将成为新页面的重定向页。请检查[[Special:DoubleRedirects|双重重定向]]或[[Special:BrokenRedirects|损坏重定向]]链接。您应当负责确定所有链接依然会链到指定的页面。\n\n注意如果新页面已经有内容的话,页面将<strong>不会</strong>被移动,除非新页面无内容或是重定向页,而且没有版本历史。这意味着您再必要时可以在移动到新页面后再移回老的页面,同时您也无法覆盖现有页面。\n\n<strong>注意:</strong>对一个经常被访问的页面而言这可能是一个重大与唐突的更改;请在行动前先确定您了解其所可能带来的后果。",
     	"movepagetalktext": "如果您勾选此框,相关联的讨论页将被自动移动到新的标题,除非这里已经有了一个非空讨论页。\n\n在这种情况下,如有需要,您将不得不手动移动或合并页面。",
     	"moveuserpage-warning": "'''警告:'''你将移动一个用户页面。请注意,只有该页面会被移动,该用户''不''会被更名。",
     	"movecategorypage-warning": "<strong>警告:</strong>您将移动分类页面。请注意只有此页面将会移动,旧有分类的任何页面将<em>不会</em>同步移动。",
    @@ -2718,7 +2722,7 @@
     	"filedelete-archive-read-only": "存档目录“$1”在网页服务器中不可写。",
     	"previousdiff": "←上一编辑",
     	"nextdiff": "下一编辑→",
    -	"mediawarning": "'''警告''':该文件类型可能含有恶意代码。执行后你的系统可能受损。",
    +	"mediawarning": "<strong>警告:</strong>该文件类型可能含有恶意代码。执行后您的系统可能受损。",
     	"imagemaxsize": "图像尺寸限制:<br />''(文件说明页面)''",
     	"thumbsize": "缩略图尺寸:",
     	"widthheightpage": "$1×$2,$3页",
    @@ -3707,7 +3711,6 @@
     	"mw-widgets-dateinput-no-date": "没有选定日期",
     	"mw-widgets-titleinput-description-new-page": "页面不存在",
     	"mw-widgets-titleinput-description-redirect": "重定向至$1",
    -	"api-error-blacklisted": "请选择其他描述性的标题。",
     	"sessionmanager-tie": "不能结合多个请求的身份验证类型:$1。",
     	"sessionprovider-generic": "$1会话",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "基于cookie的会话",
    @@ -3722,8 +3725,8 @@
     	"log-action-filter-newusers": "账户创建的类型:",
     	"log-action-filter-patrol": "巡查类型:",
     	"log-action-filter-protect": "保护类型:",
    -	"log-action-filter-rights": "权限更改的类型",
    -	"log-action-filter-suppress": "屏蔽的类型",
    +	"log-action-filter-rights": "权限更改的类型:",
    +	"log-action-filter-suppress": "屏蔽的类型:",
     	"log-action-filter-upload": "上传类型:",
     	"log-action-filter-all": "全部",
     	"log-action-filter-block-block": "封禁",
    diff --git a/languages/i18n/zh-hant.json b/languages/i18n/zh-hant.json
    index 13dfa09246..977955e3a6 100644
    --- a/languages/i18n/zh-hant.json
    +++ b/languages/i18n/zh-hant.json
    @@ -72,7 +72,8 @@
     			"Bbslam",
     			"Zerng07",
     			"Reke",
    -			"Kly"
    +			"Kly",
    +			"Cosine02"
     		]
     	},
     	"tog-underline": "底線標示連結:",
    @@ -690,7 +691,9 @@
     	"minoredit": "這是一個小修訂",
     	"watchthis": "監視此頁面",
     	"savearticle": "儲存頁面",
    +	"savechanges": "儲存變更",
     	"publishpage": "發佈頁面",
    +	"publishchanges": "發布變更",
     	"preview": "預覽",
     	"showpreview": "顯示預覽",
     	"showdiff": "顯示變更",
    @@ -1053,8 +1056,8 @@
     	"saveprefs": "儲存",
     	"restoreprefs": "還原所有預設設定 (所有項目)",
     	"prefs-editing": "編輯",
    -	"rows": "列數:",
    -	"columns": "欄數:",
    +	"rows": "橫行數:",
    +	"columns": "直行數:",
     	"searchresultshead": "搜尋",
     	"stub-threshold": "短頁面連結格式門檻值 ($1):",
     	"stub-threshold-sample-link": "樣本",
    @@ -1283,8 +1286,8 @@
     	"rightslogtext": "此為變更使用者權限的日誌。",
     	"action-read": "閱讀此頁面",
     	"action-edit": "編輯此頁面",
    -	"action-createpage": "建立頁面",
    -	"action-createtalk": "建立討論頁面",
    +	"action-createpage": "建立此頁面",
    +	"action-createtalk": "建立此討論頁面",
     	"action-createaccount": "建立此使用者帳號",
     	"action-autocreateaccount": "自動建立此外部使用者帳號",
     	"action-history": "檢視此頁面歷史",
    @@ -2222,6 +2225,7 @@
     	"sp-contributions-username": "IP 位址或使用者名稱:",
     	"sp-contributions-toponly": "只顯示最新修訂的編輯",
     	"sp-contributions-newonly": "只顯示建立頁面的編輯",
    +	"sp-contributions-hideminor": "隱藏小修訂",
     	"sp-contributions-submit": "搜尋",
     	"whatlinkshere": "連結至此的頁面",
     	"whatlinkshere-title": "連結至 \"$1\" 的頁面",
    @@ -3576,7 +3580,7 @@
     	"limitreport-cputime-value": "$1 秒",
     	"limitreport-walltime": "實際使用時間",
     	"limitreport-walltime-value": "$1 秒",
    -	"limitreport-ppvisitednodes": "預處理器已訪問節點計數",
    +	"limitreport-ppvisitednodes": "前置處理器造訪節點計數",
     	"limitreport-ppgeneratednodes": "預處理器產生節點次數",
     	"limitreport-postexpandincludesize": "展開後的引用大小",
     	"limitreport-postexpandincludesize-value": "$1/$2 個{{PLURAL:$2|位元組}}",
    @@ -3672,7 +3676,6 @@
     	"mw-widgets-dateinput-no-date": "未選擇日期",
     	"mw-widgets-titleinput-description-new-page": "頁面不存在",
     	"mw-widgets-titleinput-description-redirect": "重新導向至 $1",
    -	"api-error-blacklisted": "請選擇另一個更具描述性的標題。",
     	"sessionmanager-tie": "無法合併多個請求認証類型:$1。",
     	"sessionprovider-generic": "$1 連線階段",
     	"sessionprovider-mediawiki-session-cookiesessionprovider": "以 cookie 為基礎的連線階段",
    diff --git a/languages/messages/MessagesBan.php b/languages/messages/MessagesBan.php
    new file mode 100644
    index 0000000000..79d9d1c61a
    --- /dev/null
    +++ b/languages/messages/MessagesBan.php
    @@ -0,0 +1,12 @@
    +<?php
    +/** Basa Bali (Basa Bali)
    + *
    + * To improve a translation please visit https://translatewiki.net
    + *
    + * @ingroup Language
    + * @file
    + *
    + */
    +
    +$fallback = 'id';
    +
    diff --git a/languages/messages/MessagesGom_deva.php b/languages/messages/MessagesGom_deva.php
    index fc65e58607..1cf80cef72 100644
    --- a/languages/messages/MessagesGom_deva.php
    +++ b/languages/messages/MessagesGom_deva.php
    @@ -7,16 +7,17 @@
      * @file
      *
      * @author Darshan kandolkar
    + * @author The Discoverer
      */
     
     $fallback = 'hi';
     
     $namespaceNames = [
    -	NS_MEDIA            => 'मिडिया',
    +	NS_MEDIA            => 'माध्यम',
     	NS_SPECIAL          => 'विशेश',
     	NS_TALK             => 'चर्चा',
    -	NS_USER             => 'उपेगकर्तो',
    -	NS_USER_TALK        => 'उपेगकर्तो_चर्चा',
    +	NS_USER             => 'वापरपी',
    +	NS_USER_TALK        => 'वापरपी_चर्चा',
     	NS_PROJECT_TALK     => '$1_चर्चा',
     	NS_FILE             => 'फायल',
     	NS_FILE_TALK        => 'फायल_चर्चा',
    @@ -24,8 +25,18 @@ $namespaceNames = [
     	NS_MEDIAWIKI_TALK   => 'मिडियाविकी_चर्चा',
     	NS_TEMPLATE         => 'प्रारूप',
     	NS_TEMPLATE_TALK    => 'प्रारूप_चर्चा',
    -	NS_HELP             => 'मजत',
    -	NS_HELP_TALK        => 'मजत_चर्चा',
    -	NS_CATEGORY         => 'श्रेणी',
    -	NS_CATEGORY_TALK    => 'श्रेणी_चर्चा',
    +	NS_HELP             => 'आदार',
    +	NS_HELP_TALK        => 'आदार_चर्चा',
    +	NS_CATEGORY         => 'वर्ग',
    +	NS_CATEGORY_TALK    => 'वर्ग_चर्चा',
    +];
    +
    +$namespaceAliases = [
    +	'मजत' => NS_HELP,
    +	'मजत_चर्चा' => NS_HELP_TALK,
    +	'श्रेणी' => NS_CATEGORY,
    +	'श्रेणी_चर्चा' => NS_CATEGORY_TALK,
    +	'मिडिया' => NS_MEDIA,
    +	'उपेगकर्तो' => NS_USER,
    +	'उपेगकर्तो चर्चा' => NS_USER_TALK
     ];
    diff --git a/languages/messages/MessagesLt.php b/languages/messages/MessagesLt.php
    index a8e6c77f7e..b79f9d8c97 100644
    --- a/languages/messages/MessagesLt.php
    +++ b/languages/messages/MessagesLt.php
    @@ -183,3 +183,4 @@ $dateFormats = [
     	'ISO 8601 both' => 'xnY-xnm-xnd"T"xnH:xni:xns',
     ];
     
    +$linkTrail = '/^([a-ząčęėįšųūž]+)(.*)$/sDu';
    diff --git a/maintenance/Maintenance.php b/maintenance/Maintenance.php
    index a08297a647..27d816115e 100644
    --- a/maintenance/Maintenance.php
    +++ b/maintenance/Maintenance.php
    @@ -21,10 +21,8 @@
      */
     
     // Bail on old versions of PHP, or if composer has not been run yet to install
    -// dependencies. Using dirname( __FILE__ ) here because __DIR__ is PHP5.3+.
    -// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
    -require_once dirname( __FILE__ ) . '/../includes/PHPVersionCheck.php';
    -// @codingStandardsIgnoreEnd
    +// dependencies.
    +require_once __DIR__ . '/../includes/PHPVersionCheck.php';
     wfEntryPointCheck( 'cli' );
     
     /**
    diff --git a/maintenance/backup.inc b/maintenance/backup.inc
    index 3271fd63bf..db3af9263c 100644
    --- a/maintenance/backup.inc
    +++ b/maintenance/backup.inc
    @@ -41,6 +41,7 @@ class BackupDumper extends Maintenance {
     	public $revEndId = 0;
     	public $dumpUploads = false;
     	public $dumpUploadFileContents = false;
    +	public $orderRevs = false;
     
     	protected $reportingInterval = 100;
     	protected $pageCount = 0;
    @@ -271,7 +272,7 @@ class BackupDumper extends Maintenance {
     		} elseif ( is_null( $this->pages ) ) {
     			# Page dumps: all or by page ID range
     			if ( $this->startId || $this->endId ) {
    -				$exporter->pagesByRange( $this->startId, $this->endId );
    +				$exporter->pagesByRange( $this->startId, $this->endId, $this->orderRevs );
     			} elseif ( $this->revStartId || $this->revEndId ) {
     				$exporter->revsByRange( $this->revStartId, $this->revEndId );
     			} else {
    diff --git a/maintenance/copyFileBackend.php b/maintenance/copyFileBackend.php
    index 7b92f89449..4f625fc69a 100644
    --- a/maintenance/copyFileBackend.php
    +++ b/maintenance/copyFileBackend.php
    @@ -62,10 +62,6 @@ class CopyFileBackend extends Maintenance {
     
     		$rateFile = $this->getOption( 'ratefile' );
     
    -		if ( $this->hasOption( 'utf8only' ) && !extension_loaded( 'mbstring' ) ) {
    -			$this->error( "Cannot check for UTF-8, mbstring extension missing.", 1 ); // die
    -		}
    -
     		foreach ( $containers as $container ) {
     			if ( $subDir != '' ) {
     				$backendRel = "$container/$subDir";
    diff --git a/maintenance/dumpBackup.php b/maintenance/dumpBackup.php
    index d4255a0f2f..9bf1222121 100644
    --- a/maintenance/dumpBackup.php
    +++ b/maintenance/dumpBackup.php
    @@ -50,6 +50,8 @@ TEXT
     		$this->addOption( 'stable', 'Dump stable versions of pages' );
     		$this->addOption( 'revrange', 'Dump range of revisions specified by revstart and ' .
     			'revend parameters' );
    +		$this->addOption( 'orderrevs', 'Dump revisions in ascending revision order ' .
    +			'(implies dump of a range of pages)' );
     		$this->addOption( 'pagelist',
     			'Dump only pages included in the file', false, true );
     		// Options
    @@ -127,6 +129,7 @@ TEXT
     		$this->skipFooter = $this->hasOption( 'skip-footer' );
     		$this->dumpUploads = $this->hasOption( 'uploads' );
     		$this->dumpUploadFileContents = $this->hasOption( 'include-files' );
    +		$this->orderRevs = $this->hasOption( 'orderrevs' );
     	}
     }
     
    diff --git a/maintenance/dumpTextPass.php b/maintenance/dumpTextPass.php
    index 6d5a0e9d27..cfb59c6004 100644
    --- a/maintenance/dumpTextPass.php
    +++ b/maintenance/dumpTextPass.php
    @@ -74,6 +74,9 @@ class TextPassDumper extends BackupDumper {
     	 */
     	protected $spawnErr = false;
     
    +	/**
    +	 * @var bool|XmlDumpWriter
    +	 */
     	protected $xmlwriterobj = false;
     
     	protected $timeExceeded = false;
    diff --git a/maintenance/dumpUploads.php b/maintenance/dumpUploads.php
    index ec276c1a69..5b446d8347 100644
    --- a/maintenance/dumpUploads.php
    +++ b/maintenance/dumpUploads.php
    @@ -111,7 +111,7 @@ By default, outputs relative paths against the parent directory of $wgUploadDire
     	function outputItem( $name, $shared ) {
     		$file = wfFindFile( $name );
     		if ( $file && $this->filterItem( $file, $shared ) ) {
    -			$filename = $file->getPath();
    +			$filename = $file->getLocalRefPath();
     			$rel = wfRelativePath( $filename, $this->mBasePath );
     			$this->output( "$rel\n" );
     		} else {
    diff --git a/maintenance/fileOpPerfTest.php b/maintenance/fileOpPerfTest.php
    index 92547ca786..4b6c619414 100644
    --- a/maintenance/fileOpPerfTest.php
    +++ b/maintenance/fileOpPerfTest.php
    @@ -42,8 +42,6 @@ class TestFileOpPerformance extends Maintenance {
     	}
     
     	public function execute() {
    -		Profiler::setInstance( new ProfilerSimpleText( [] ) ); // clear
    -
     		$backend = FileBackendGroup::singleton()->get( $this->getOption( 'b1' ) );
     		$this->doPerfTest( $backend );
     
    @@ -51,9 +49,6 @@ class TestFileOpPerformance extends Maintenance {
     			$backend = FileBackendGroup::singleton()->get( $this->getOption( 'b2' ) );
     			$this->doPerfTest( $backend );
     		}
    -
    -		Profiler::instance()->setTemplated( true );
    -		// NOTE: as of MW1.21, $profiler->logData() is called implicitly by doMaintenance.php.
     	}
     
     	protected function doPerfTest( FileBackend $backend ) {
    diff --git a/maintenance/findHooks.php b/maintenance/findHooks.php
    index d44581cd34..c91d8247e5 100644
    --- a/maintenance/findHooks.php
    +++ b/maintenance/findHooks.php
    @@ -244,11 +244,11 @@ class FindHooks extends Maintenance {
     				// Comma for second argument
     				'(?:\s*(,))?' .
     				// Second argument must start with array to be processed
    -				'(?:\s*array\s*\(' .
    +				'(?:\s*(?:array\s*\(|\[)' .
     				// Matching inside array - allows one deep of brackets
    -				'((?:[^\(\)]|\([^\(\)]*\))*)' .
    +				'((?:[^\(\)\[\]]|\((?-1)\)|\[(?-1)\])*)' .
     				// End
    -				'\))?/',
    +				'[\)\]])?/',
     			$content,
     			$m,
     			PREG_SET_ORDER
    @@ -305,17 +305,16 @@ class FindHooks extends Maintenance {
     
     		if ( $recurse === self::FIND_RECURSIVE ) {
     			$iterator = new RecursiveIteratorIterator(
    -				new RecursiveDirectoryIterator( $dir ),
    -				RecursiveIteratorIterator::SELF_FIRST | RecursiveDirectoryIterator::SKIP_DOTS
    +				new RecursiveDirectoryIterator( $dir, RecursiveDirectoryIterator::SKIP_DOTS ),
    +				RecursiveIteratorIterator::SELF_FIRST
     			);
     		} else {
     			$iterator = new DirectoryIterator( $dir );
     		}
     
     		foreach ( $iterator as $info ) {
    -			// Ignore directories, ignore json (installer and api i18n),
    -			// ignore extension-less files like HISTORY
    -			if ( $info->isFile() && $info->getExtension() !== 'json' && $info->getExtension()
    +			// Ignore directories, work only on php files,
    +			if ( $info->isFile() && in_array( $info->getExtension(), [ 'php', 'inc' ] )
     				// Skip this file as it contains text that looks like a bad wfRunHooks() call
     				&& $info->getRealPath() !== __FILE__
     			) {
    @@ -328,15 +327,12 @@ class FindHooks extends Maintenance {
     	}
     
     	/**
    -	 * Nicely output the array
    +	 * Nicely sort an print an array
     	 * @param string $msg A message to show before the value
     	 * @param array $arr
    -	 * @param bool $sort Whether to sort the array (Default: true)
     	 */
    -	private function printArray( $msg, $arr, $sort = true ) {
    -		if ( $sort ) {
    -			asort( $arr );
    -		}
    +	private function printArray( $msg, $arr ) {
    +		asort( $arr );
     
     		foreach ( $arr as $v ) {
     			$this->output( "$msg: $v\n" );
    diff --git a/maintenance/importTextFiles.php b/maintenance/importTextFiles.php
    index e926cfd2b7..88ee9d7ecd 100644
    --- a/maintenance/importTextFiles.php
    +++ b/maintenance/importTextFiles.php
    @@ -56,7 +56,7 @@ class ImportTextFiles extends Maintenance {
     		$prefix = $this->getOption( 'prefix', '' );
     
     		// Get all the arguments. A loop is required since Maintenance doesn't
    -		// suppport an arbitrary number of arguments.
    +		// support an arbitrary number of arguments.
     		$files = [];
     		$i = 0;
     		while ( $arg = $this->getArg( $i++ ) ) {
    diff --git a/maintenance/install.php b/maintenance/install.php
    index ae3074a4c8..3e632f0661 100644
    --- a/maintenance/install.php
    +++ b/maintenance/install.php
    @@ -21,11 +21,7 @@
      * @ingroup Maintenance
      */
     
    -// Checking for old versions of PHP is done in Maintenance.php
    -// We need to use dirname( __FILE__ ) here cause __DIR__ is PHP5.3+
    -// @codingStandardsIgnoreStart MediaWiki.Usage.DirUsage.FunctionFound
    -require_once dirname( __FILE__ ) . '/Maintenance.php';
    -// @codingStandardsIgnoreEnd
    +require_once __DIR__ . '/Maintenance.php';
     
     define( 'MW_CONFIG_CALLBACK', 'Installer::overrideConfig' );
     define( 'MEDIAWIKI_INSTALL', true );
    diff --git a/maintenance/interwiki.list b/maintenance/interwiki.list
    index 4899143422..9104fd792f 100644
    --- a/maintenance/interwiki.list
    +++ b/maintenance/interwiki.list
    @@ -26,7 +26,7 @@ imdb|http://www.imdb.com/find?q=$1&tt=on|0|
     jargonfile|http://sunir.org/apps/meta.pl?wiki=JargonFile&redirect=$1|0|
     kmwiki|http://kmwiki.wikispaces.com/$1|0|
     linuxwiki|http://linuxwiki.de/$1|0|
    -lojban|http://www.lojban.org/tiki/tiki-index.php?page=$1|0|
    +lojban|http://mw.lojban.org/papri/$1|0|
     lqwiki|http://wiki.linuxquestions.org/wiki/$1|0|
     lugkr|http://www.lug-kr.de/wiki/$1|0|
     meatball|http://www.usemod.com/cgi-bin/mb.pl?$1|0|
    diff --git a/maintenance/invalidateUserSessions.php b/maintenance/invalidateUserSessions.php
    new file mode 100644
    index 0000000000..11e3372ce6
    --- /dev/null
    +++ b/maintenance/invalidateUserSessions.php
    @@ -0,0 +1,94 @@
    +<?php
    +/**
    + * Invalidate the sessions of certain users on the wiki.
    + * If you want to invalidate all sessions, use $wgAuthenticationTokenVersion instead.
    + *
    + * This program is free software; you can redistribute it and/or modify
    + * it under the terms of the GNU General Public License as published by
    + * the Free Software Foundation; either version 2 of the License, or
    + * (at your option) any later version.
    + *
    + * This program is distributed in the hope that it will be useful,
    + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    + * GNU General Public License for more details.
    + *
    + * You should have received a copy of the GNU General Public License along
    + * with this program; if not, write to the Free Software Foundation, Inc.,
    + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    + * http://www.gnu.org/copyleft/gpl.html
    + *
    + * @file
    + * @ingroup Maintenance
    + */
    +
    +use MediaWiki\MediaWikiServices;
    +use MediaWiki\Session\SessionManager;
    +
    +require_once __DIR__ . '/Maintenance.php';
    +
    +/**
    + * Invalidate the sessions of certain users on the wiki.
    + * If you want to invalidate all sessions, use $wgAuthenticationTokenVersion instead.
    + *
    + * @ingroup Maintenance
    + */
    +class InvalidateUserSesssions extends Maintenance {
    +	public function __construct() {
    +		parent::__construct();
    +		$this->addDescription(
    +			'Invalidate the sessions of certain users on the wiki.'
    +		);
    +		$this->addOption( 'user', 'Username', false, true, 'u' );
    +		$this->addOption( 'file', 'File with one username per line', false, true, 'f' );
    +		$this->setBatchSize( 1000 );
    +	}
    +
    +	public function execute() {
    +		$username = $this->getOption( 'user' );
    +		$file = $this->getOption( 'file' );
    +
    +		if ( $username === null && $file === null ) {
    +			$this->error( 'Either --user or --file is required', 1 );
    +		} elseif ( $username !== null && $file !== null ) {
    +			$this->error( 'Cannot use both --user and --file', 1 );
    +		}
    +
    +		if ( $username !== null ) {
    +			$usernames = [ $username ];
    +		} else {
    +			$usernames = is_readable( $file ) ?
    +				file( $file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES ) : false;
    +			if ( $usernames === false ) {
    +				$this->error( "Could not open $file", 2 );
    +			}
    +		}
    +
    +		$i = 0;
    +		$lbFactory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
    +		$sessionManager = SessionManager::singleton();
    +		foreach ( $usernames as $username ) {
    +			$i++;
    +			$user = User::newFromName( $username );
    +			try {
    +				$sessionManager->invalidateSessionsForUser( $user );
    +				if ( $user->getId() ) {
    +					$this->output( "Invalidated sessions for user $username\n" );
    +				} else {
    +					# session invalidation might still work if there is a central identity provider
    +					$this->output( "Could not find user $username, tried to invalidate anyway\n" );
    +				}
    +			} catch ( Exception $e ) {
    +				$this->output( "Failed to invalidate sessions for user $username | "
    +					. str_replace( [ "\r", "\n" ], ' ', $e->getMessage() ) . "\n" );
    +			}
    +
    +			if ( $i % $this->mBatchSize ) {
    +				$lbFactory->waitForReplication();
    +			}
    +		}
    +	}
    +}
    +
    +$maintClass = "InvalidateUserSesssions";
    +require_once RUN_MAINTENANCE_IF_MAIN;
    diff --git a/maintenance/jsduck/categories.json b/maintenance/jsduck/categories.json
    index d9e2c50e99..068ee8c960 100644
    --- a/maintenance/jsduck/categories.json
    +++ b/maintenance/jsduck/categories.json
    @@ -64,7 +64,8 @@
     					"mw.Feedback*",
     					"mw.Upload*",
     					"mw.ForeignUpload",
    -					"mw.ForeignStructuredUpload*"
    +					"mw.ForeignStructuredUpload*",
    +					"mw.GallerySlideshow"
     				]
     			},
     			{
    diff --git a/maintenance/language/zhtable/toCN.manual b/maintenance/language/zhtable/toCN.manual
    index 6cc3b68e81..a81422dca6 100644
    --- a/maintenance/language/zhtable/toCN.manual
    +++ b/maintenance/language/zhtable/toCN.manual
    @@ -64,6 +64,7 @@
     澈底	彻底
     仲介	中介
     卯足	铆足
    +保鑣	保镖
     逕庭	径庭
     逕到	径到
     逕取	径取
    @@ -2183,6 +2184,8 @@
     記錄著	记录着
     紀錄著	纪录着
     收錄著	收录着
    +促著	促着
    +咬著	咬着
     三十六著	三十六着
     走為上著	走为上着
     記憶體	内存
    @@ -2665,3 +2668,4 @@ A型肝炎	甲型肝炎
     行人路權	行人路权
     行人路权	行人路权
     塑膠袋	塑料袋
    +烏龍麵	乌冬面
    diff --git a/maintenance/language/zhtable/toHK.manual b/maintenance/language/zhtable/toHK.manual
    index ec9b3d7a7c..7bd993f8f4 100644
    --- a/maintenance/language/zhtable/toHK.manual
    +++ b/maintenance/language/zhtable/toHK.manual
    @@ -433,7 +433,8 @@
     暗沟里	暗溝裏
     暗里	暗裏
     会里	會裏
    -村里	村裏
    +村里的	村裏的
    +村里有	村裏有
     森林里	森林裏
     棺材里	棺材裏
     树林里	樹林裏
    @@ -2575,6 +2576,7 @@
     記錄著	記錄着
     紀錄著	紀錄着
     收錄著	收錄着
    +咬著	咬着
     三十六著	三十六着
     走為上著	走為上着
     鬧著	鬧着
    @@ -2583,6 +2585,7 @@
     包著	包着
     系着	繫着
     颳著	颳着
    +促著	促着
     榴莲	榴槤
     榴蓮	榴槤
     叱吒	叱咤
    @@ -2715,8 +2718,6 @@
     冰淇淋	雪糕
     賓士	平治
     捷豹	積架
    -雪铁龙	先進
    -雪鐵龍	先進
     沃尓沃	富豪
     马自达	萬事得
     馬自達	萬事得
    @@ -3026,3 +3027,4 @@ IP地址	IP位址
     獨立國家國協	獨立國家聯合體
     人行道	行人路
     塑料袋	膠袋
    +烏龍麵	烏冬麵
    diff --git a/maintenance/language/zhtable/toTW.manual b/maintenance/language/zhtable/toTW.manual
    index 2a72501f3d..b8404081c6 100644
    --- a/maintenance/language/zhtable/toTW.manual
    +++ b/maintenance/language/zhtable/toTW.manual
    @@ -175,6 +175,7 @@
     划着竹筏	划著竹筏
     划着独木舟	划著獨木舟
     着眼于	著眼於
    +桃金娘	桃金孃
     缺省	預設
     以太网	乙太網
     光盘	光碟
    @@ -777,5 +778,5 @@ IP地址	IP位址
     行人路權	行人路權
     行人路权	行人路權
     塑料袋	塑膠袋
    -桃金娘	桃金孃
     触摸屏	觸控螢幕
    +乌冬面	烏龍麵
    diff --git a/maintenance/language/zhtable/toTrad.manual b/maintenance/language/zhtable/toTrad.manual
    index a9e8f3bcc4..83a7a54a8e 100644
    --- a/maintenance/language/zhtable/toTrad.manual
    +++ b/maintenance/language/zhtable/toTrad.manual
    @@ -165,8 +165,8 @@
     楊雅筑	楊雅筑
     尸羅精舍	尸羅精舍
     騰格里	騰格里
    -村里長	村里長
     進制	進制
    +強制	強制
     總裁制	總裁制
     獨裁制	獨裁制
     模范三軍	模范三軍
    diff --git a/maintenance/language/zhtable/tradphrases.manual b/maintenance/language/zhtable/tradphrases.manual
    index 4d18ddae14..56a5e219e7 100644
    --- a/maintenance/language/zhtable/tradphrases.manual
    +++ b/maintenance/language/zhtable/tradphrases.manual
    @@ -587,7 +587,8 @@
     櫛髮工
     鬒髮
     人髮指
    -爆發指數
    +爆發 #分詞
    +引發
     開發
     剪其髮
     吐哺捉髮
    @@ -743,6 +744,10 @@
     曬穀
     臧穀亡羊
     種穀
    +陽穀
    +布穀鳥
    +穀祿
    +穀城縣
     颳雪
     广部
     亂鬨鬨
    @@ -781,7 +786,7 @@
     薑母
     薑湯
     薑桂
    -薑是老的辣
    +薑還是老的辣
     吃薑
     薑老辣
     野薑
    @@ -978,6 +983,8 @@
     麵製品
     乾脆麵
     磨麵
    +莜麵
    +雲吞麵
     冷面相
     糞穢衊面
     僕僕
    @@ -2820,7 +2827,7 @@
     心繫沈
     心繫唐
     心繫黃
    -心繫乔
    +心繫喬
     心繫阮
     心繫父
     心繫母
    @@ -3025,7 +3032,6 @@
     西西里
     騰格里
     阿里
    -村里長
     峇里海
     里海崖
     里海茨
    @@ -3088,6 +3094,8 @@
     電視裡
     公寓裡
     公寓里弄
    +村裡的
    +村裡有
     裏白 #植物常用名
     烏蘇里 #分詞用
     首發
    @@ -3326,9 +3334,9 @@
     會干擾
     高清愿
     瓷製
    +陶製
     竹製
     絲製
    -莜麵
     簡筑翎
     楊雅筑
     彭于晏
    @@ -3457,6 +3465,7 @@
     于寶軒
     于承惠
     于震
    +于建嶸
     於震前
     於震後
     於震中
    @@ -3563,7 +3572,6 @@
     沖天
     豐臺
     煙臺
    -陽穀
     太醜
     御製
     聖人曆
    @@ -3607,7 +3615,6 @@
     自誇
     誇稱
     誇讚
    -布穀鳥
     黎克特制
     筆桿
     袋桿
    @@ -3633,7 +3640,6 @@
     衝着
     確係
     乃係
    -穀祿
     製衣
     巨製
     不捲
    diff --git a/maintenance/language/zhtable/tradphrases_exclude.manual b/maintenance/language/zhtable/tradphrases_exclude.manual
    index 1ff3cae5d6..be6f68e930 100644
    --- a/maintenance/language/zhtable/tradphrases_exclude.manual
    +++ b/maintenance/language/zhtable/tradphrases_exclude.manual
    @@ -735,3 +735,6 @@
     洒洒
     洒脫
     瀟洒
    +村裡
    +振蕩
    +重摺
    diff --git a/maintenance/preprocessorFuzzTest.php b/maintenance/preprocessorFuzzTest.php
    index aa5d69d95d..d102e08c2d 100644
    --- a/maintenance/preprocessorFuzzTest.php
    +++ b/maintenance/preprocessorFuzzTest.php
    @@ -47,6 +47,9 @@ class PPFuzzTester {
     	public $entryPoints = [ 'testSrvus', 'testPst', 'testPreprocess' ];
     	public $verbose = false;
     
    +	/**
    +	 * @var bool|PPFuzzTest
    +	 */
     	private static $currentTest = false;
     
     	function execute() {
    diff --git a/maintenance/resetUserTokens.php b/maintenance/resetUserTokens.php
    index 837f304ddc..131a569d6c 100644
    --- a/maintenance/resetUserTokens.php
    +++ b/maintenance/resetUserTokens.php
    @@ -30,12 +30,14 @@ require_once __DIR__ . '/Maintenance.php';
      * Maintenance script to reset the user_token for all users on the wiki.
      *
      * @ingroup Maintenance
    + * @deprecated since 1.27, use $wgAuthenticationTokenVersion instead.
      */
     class ResetUserTokens extends Maintenance {
     	public function __construct() {
     		parent::__construct();
     		$this->addDescription(
    -			'Reset the user_token of all users on the wiki. Note that this may log some of them out.'
    +			"Reset the user_token of all users on the wiki. Note that this may log some of them out.\n"
    +			. "Deprecated, use \$wgAuthenticationTokenVersion instead."
     		);
     		$this->addOption( 'nowarn', "Hides the 5 seconds warning", false, false );
     		$this->addOption(
    diff --git a/maintenance/update.php b/maintenance/update.php
    index 775fa7bed4..b96e7eb871 100755
    --- a/maintenance/update.php
    +++ b/maintenance/update.php
    @@ -25,7 +25,6 @@
      * @ingroup Maintenance
      */
     
    -$wgUseMasterForMaintenance = true;
     require_once __DIR__ . '/Maintenance.php';
     
     /**
    @@ -83,13 +82,6 @@ class UpdateMediaWiki extends Maintenance {
     				"ABORTING (see https://bugs.php.net/bug.php?id=45996).\n",
     				true );
     		}
    -
    -		if ( !function_exists( 'mb_strlen' ) ) {
    -			$this->error(
    -				"MediaWiki now requires the mbstring PHP extension, your system doesn't have it.\n"
    -				. "ABORTING.\n",
    -				true );
    -		}
     	}
     
     	function execute() {
    diff --git a/mw-config/overrides/README b/mw-config/overrides/README
    index f2513301f8..68e0fad631 100644
    --- a/mw-config/overrides/README
    +++ b/mw-config/overrides/README
    @@ -4,7 +4,7 @@ you can override classes used by the installer.
     
     You can override 3 classes:
     * LocalSettingsGenerator - generates LocalSettings.php
    -* WebInstaller - web instller UI
    +* WebInstaller - web installer UI
     * CliInstaller - command line installer
     
     Example override:
    diff --git a/package.json b/package.json
    index 6fde2e043f..780e049052 100644
    --- a/package.json
    +++ b/package.json
    @@ -13,13 +13,13 @@
         "grunt-contrib-watch": "1.0.0",
         "grunt-jscs": "2.8.0",
         "grunt-jsonlint": "1.0.7",
    -    "grunt-karma": "0.12.2",
    -    "grunt-stylelint": "0.3.0",
    -    "karma": "0.13.22",
    -    "karma-chrome-launcher": "0.2.2",
    -    "karma-firefox-launcher": "0.1.7",
    -    "karma-qunit": "0.1.9",
    +    "grunt-karma": "2.0.0",
    +    "grunt-stylelint": "0.4.0",
    +    "karma": "1.1.0",
    +    "karma-chrome-launcher": "1.0.1",
    +    "karma-firefox-launcher": "1.0.0",
    +    "karma-qunit": "1.0.0",
         "qunitjs": "1.22.0",
    -    "stylelint-config-wikimedia": "0.1.0"
    +    "stylelint-config-wikimedia": "0.2.2"
       }
     }
    diff --git a/resources/Resources.php b/resources/Resources.php
    index 1e80c260fa..e35c3d76fa 100644
    --- a/resources/Resources.php
    +++ b/resources/Resources.php
    @@ -33,6 +33,7 @@ return [
     
     	// Scripts managed by the local wiki (stored in the MediaWiki namespace)
     	'site' => [ 'class' => 'ResourceLoaderSiteModule' ],
    +	'site.styles' => [ 'class' => 'ResourceLoaderSiteStylesModule' ],
     	'noscript' => [
     		'class' => 'ResourceLoaderWikiModule',
     		'styles' => [ 'MediaWiki:Noscript.css' ],
    @@ -840,7 +841,6 @@ return [
     		'class' => 'ResourceLoaderRawFileModule',
     		// Keep in sync with maintenance/jsduck/eg-iframe.html
     		'scripts' => [
    -			'resources/lib/phpjs-sha1/sha1.js',
     			'resources/src/mediawiki/mediawiki.js',
     			'resources/src/mediawiki/mediawiki.requestIdleCallback.js',
     			'resources/src/mediawiki/mediawiki.errorLogger.js',
    @@ -1183,6 +1183,7 @@ return [
     		],
     		'messages' => [
     			'uploaddisabledtext',
    +			'upload-dialog-disabled',
     			'upload-foreign-cant-upload',
     		]
     	],
    @@ -1296,7 +1297,6 @@ return [
     			'filename-thumb-name',
     			'badfilename',
     			'protectedpagetext',
    -			'api-error-blacklisted', // HACK
     		],
     	],
     	'mediawiki.ForeignStructuredUpload.BookletLayout' => [
    @@ -1406,12 +1406,16 @@ return [
     	/* MediaWiki Action */
     
     	'mediawiki.action.edit' => [
    -		'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.js',
    +		'scripts' => [
    +			'resources/src/mediawiki.action/mediawiki.action.edit.js',
    +			'resources/src/mediawiki.action/mediawiki.action.edit.stash.js',
    +		],
     		'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.css',
     		'dependencies' => [
     			'mediawiki.action.edit.styles',
     			'jquery.textSelection',
     			'jquery.byteLimit',
    +			'mediawiki.api',
     		],
     		'position' => 'top',
     	],
    @@ -1454,18 +1458,14 @@ return [
     			'previewerrortext',
     		],
     	],
    -	'mediawiki.action.edit.stash' => [
    -		'scripts' => 'resources/src/mediawiki.action/mediawiki.action.edit.stash.js',
    -		'dependencies' => [
    -			'jquery.getAttrs',
    -			'mediawiki.api',
    -		],
    -	],
     	'mediawiki.action.history' => [
    -		'position' => 'top',
     		'scripts' => 'resources/src/mediawiki.action/mediawiki.action.history.js',
     		'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.css',
     	],
    +	'mediawiki.action.history.styles' => [
    +		'position' => 'top',
    +		'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.styles.css',
    +	],
     	'mediawiki.action.history.diff' => [
     		'position' => 'top',
     		'styles' => [
    @@ -1655,6 +1655,18 @@ return [
     		'position' => 'top',
     		'targets' => [ 'desktop', 'mobile' ],
     	],
    +	'mediawiki.page.gallery.slideshow' => [
    +		'scripts' => 'resources/src/mediawiki/page/gallery-slideshow.js',
    +		'position' => 'top',
    +		'dependencies' => [
    +			'mediawiki.api',
    +			'mediawiki.Title',
    +			'oojs',
    +			'oojs-ui-core',
    +			'oojs-ui-widgets',
    +			'oojs-ui.styles.icons-media'
    +		]
    +	],
     	'mediawiki.page.ready' => [
     		'scripts' => 'resources/src/mediawiki/page/ready.js',
     		'dependencies' => [
    @@ -2350,7 +2362,5 @@ return [
     	],
     
     	/* OOjs UI */
    -	// WARNING: OOjs-UI is NOT TESTED with older browsers and is likely to break
    -	// if loaded in browsers that don't support ES5
     	// @see ResourcesOOUI.php
     ];
    diff --git a/resources/lib/oojs-ui/i18n/id.json b/resources/lib/oojs-ui/i18n/id.json
    index 400a432524..ac7f6c68f3 100644
    --- a/resources/lib/oojs-ui/i18n/id.json
    +++ b/resources/lib/oojs-ui/i18n/id.json
    @@ -8,7 +8,8 @@
     			"Kenrick95",
     			"McDutchie",
     			"Rv77ax",
    -			"William Surya Permana"
    +			"William Surya Permana",
    +			"Rachmat.Wahidi"
     		]
     	},
     	"ooui-outline-control-move-down": "Pindahkan butir ke bawah",
    @@ -23,6 +24,8 @@
     	"ooui-dialog-process-dismiss": "Tutup",
     	"ooui-dialog-process-retry": "Coba lagi",
     	"ooui-dialog-process-continue": "Lanjutkan",
    +	"ooui-selectfile-button-select": "Pilih berkas",
     	"ooui-selectfile-not-supported": "Peilihan berkas tidak didukung",
    -	"ooui-selectfile-placeholder": "Tidak ada berkas yang terpilih"
    +	"ooui-selectfile-placeholder": "Tidak ada berkas yang terpilih",
    +	"ooui-selectfile-dragdrop-placeholder": "Letakkan berkas di sini"
     }
    diff --git a/resources/lib/oojs-ui/i18n/inh.json b/resources/lib/oojs-ui/i18n/inh.json
    new file mode 100644
    index 0000000000..a897ed584f
    --- /dev/null
    +++ b/resources/lib/oojs-ui/i18n/inh.json
    @@ -0,0 +1,24 @@
    +{
    +	"@metadata": {
    +		"authors": [
    +			"Adam-Yourist",
    +			"ElizaMag"
    +		]
    +	},
    +	"ooui-outline-control-move-down": "Элемент Iолохеяккха",
    +	"ooui-outline-control-move-up": "Элемент Iолакхеяккха",
    +	"ooui-outline-control-remove": "ДIаяккха пункт",
    +	"ooui-toolbar-more": "Кхы а",
    +	"ooui-toolgroup-expand": "Дукха",
    +	"ooui-toolgroup-collapse": "КӀезига",
    +	"ooui-dialog-message-accept": "ОК",
    +	"ooui-dialog-message-reject": "Эшац",
    +	"ooui-dialog-process-error": "Харцахь хилар цхьа хIама",
    +	"ooui-dialog-process-dismiss": "ДIакъовла",
    +	"ooui-dialog-process-retry": "Кхы цкъа де гIорта",
    +	"ooui-dialog-process-continue": "ДIаьхде",
    +	"ooui-selectfile-button-select": "Файл хьахаржа",
    +	"ooui-selectfile-not-supported": "Файл харжа вIаштаь дац",
    +	"ooui-selectfile-placeholder": "Файл хержа яц",
    +	"ooui-selectfile-dragdrop-placeholder": "Хьадехьаяккха файл укхаз"
    +}
    diff --git a/resources/lib/oojs-ui/i18n/jv.json b/resources/lib/oojs-ui/i18n/jv.json
    index 1024d2ad02..8da8ef14e6 100644
    --- a/resources/lib/oojs-ui/i18n/jv.json
    +++ b/resources/lib/oojs-ui/i18n/jv.json
    @@ -8,18 +8,20 @@
     			"Meursault2004"
     		]
     	},
    -	"ooui-outline-control-move-down": "Pindhahaken butir mangandhap",
    -	"ooui-outline-control-move-up": "Pindhah kara menyang dhuwur",
    -	"ooui-outline-control-remove": "Busak kara",
    -	"ooui-toolbar-more": "Manèh",
    -	"ooui-toolgroup-expand": "Manèh",
    -	"ooui-toolgroup-collapse": "Suda",
    -	"ooui-dialog-message-accept": "Oké",
    -	"ooui-dialog-message-reject": "Batal",
    +	"ooui-outline-control-move-down": "Lih barang mangisor",
    +	"ooui-outline-control-move-up": "Lih barang mandhuwur",
    +	"ooui-outline-control-remove": "Buwang barang",
    +	"ooui-toolbar-more": "Liyané",
    +	"ooui-toolgroup-expand": "Liyané",
    +	"ooui-toolgroup-collapse": "Sacukupé",
    +	"ooui-dialog-message-accept": "Ha'a",
    +	"ooui-dialog-message-reject": "Wurungaké",
     	"ooui-dialog-process-error": "Ana sing klèru",
     	"ooui-dialog-process-dismiss": "Tutup",
     	"ooui-dialog-process-retry": "Jajal manèh",
    -	"ooui-dialog-process-continue": "Tutug",
    -	"ooui-selectfile-not-supported": "Pilihan berkas ora disokong",
    -	"ooui-selectfile-placeholder": "Ora ana berkas sing kapilih"
    +	"ooui-dialog-process-continue": "Banjuraké",
    +	"ooui-selectfile-button-select": "Pilih barkas",
    +	"ooui-selectfile-not-supported": "Barkas pilihan ora disengkuyung",
    +	"ooui-selectfile-placeholder": "Ora ana barkas sing dipilih",
    +	"ooui-selectfile-dragdrop-placeholder": "Dèkèk barkas ing kéné"
     }
    diff --git a/resources/lib/oojs-ui/i18n/ku-latn.json b/resources/lib/oojs-ui/i18n/ku-latn.json
    index 94b4687357..9954744933 100644
    --- a/resources/lib/oojs-ui/i18n/ku-latn.json
    +++ b/resources/lib/oojs-ui/i18n/ku-latn.json
    @@ -12,5 +12,6 @@
     	"ooui-dialog-message-reject": "Betal bike",
     	"ooui-dialog-process-retry": "Dîsa hewl bide",
     	"ooui-dialog-process-continue": "Bidomîne",
    +	"ooui-selectfile-button-select": "Dosyeyekê hilbijêre",
     	"ooui-selectfile-placeholder": "Ti dosye nehatiye hilbijartin"
     }
    diff --git a/resources/lib/oojs-ui/i18n/pnb.json b/resources/lib/oojs-ui/i18n/pnb.json
    new file mode 100644
    index 0000000000..8bd4be8b3b
    --- /dev/null
    +++ b/resources/lib/oojs-ui/i18n/pnb.json
    @@ -0,0 +1,21 @@
    +{
    +	"@metadata": {
    +		"authors": [
    +			"Saanvel"
    +		]
    +	},
    +	"ooui-outline-control-move-down": "شیہ تھلے کرو",
    +	"ooui-outline-control-move-up": "شیہ اتے کرو",
    +	"ooui-outline-control-remove": "شیہ مٹاؤ",
    +	"ooui-toolbar-more": "ہور",
    +	"ooui-toolgroup-expand": "ہور",
    +	"ooui-dialog-message-accept": "OK",
    +	"ooui-dialog-message-reject": "مکاؤ",
    +	"ooui-dialog-process-error": "کوئی رپھڑ پے گیا اے۔",
    +	"ooui-dialog-process-dismiss": "مکاؤ",
    +	"ooui-dialog-process-retry": "فیر کرو",
    +	"ooui-dialog-process-continue": "چلاؤ",
    +	"ooui-selectfile-button-select": "فائل چنو",
    +	"ooui-selectfile-placeholder": "کوئی فائل نئی چنی ہوئی",
    +	"ooui-selectfile-dragdrop-placeholder": "فائل ایتھے پاؤ"
    +}
    diff --git a/resources/lib/oojs-ui/i18n/sw.json b/resources/lib/oojs-ui/i18n/sw.json
    index 510e468d32..598acbcde5 100644
    --- a/resources/lib/oojs-ui/i18n/sw.json
    +++ b/resources/lib/oojs-ui/i18n/sw.json
    @@ -2,7 +2,8 @@
     	"@metadata": {
     		"authors": [
     			"Lloffiwr",
    -			"Muddyb Blast Producer"
    +			"Muddyb Blast Producer",
    +			"Muddyb"
     		]
     	},
     	"ooui-outline-control-move-down": "Sogeza kipengee chini",
    diff --git a/resources/lib/oojs-ui/oojs-ui-apex.js b/resources/lib/oojs-ui/oojs-ui-apex.js
    index 537a9d7406..026bbb3af9 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.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:52Z
    + * Date: 2016-06-29T13:27:08Z
      */
     ( function ( OO ) {
     
    diff --git a/resources/lib/oojs-ui/oojs-ui-core-apex.css b/resources/lib/oojs-ui/oojs-ui-core-apex.css
    index fdfd3e4f3c..fa5ec0af4c 100644
    --- a/resources/lib/oojs-ui/oojs-ui-core-apex.css
    +++ b/resources/lib/oojs-ui/oojs-ui-core-apex.css
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:56Z
    + * Date: 2016-06-29T13:27:11Z
      */
     .oo-ui-element-hidden {
     	display: none !important;
    @@ -784,13 +784,13 @@
     .oo-ui-textInputWidget textarea {
     	display: block;
     	width: 100%;
    -	resize: none;
     	-webkit-box-sizing: border-box;
     	   -moz-box-sizing: border-box;
     	        box-sizing: border-box;
     }
     .oo-ui-textInputWidget textarea {
     	overflow: auto;
    +	resize: none;
     }
     .oo-ui-textInputWidget [type="search"] {
     	-webkit-appearance: textfield;
    @@ -969,6 +969,7 @@
     	white-space: nowrap;
     	overflow: hidden;
     	text-overflow: ellipsis;
    +	cursor: default;
     	-webkit-touch-callout: none;
     	-webkit-user-select: none;
     	   -moz-user-select: none;
    @@ -982,13 +983,13 @@
     .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
     	position: absolute;
     }
    +.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
    +	cursor: pointer;
    +}
     .oo-ui-dropdownWidget > .oo-ui-menuSelectWidget {
     	z-index: 1;
     	width: 100%;
     }
    -.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
    -	cursor: pointer;
    -}
     .oo-ui-dropdownWidget:last-child {
     	margin-right: 0;
     }
    diff --git a/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
    index 05f383850e..03380b2468 100644
    --- a/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
    +++ b/resources/lib/oojs-ui/oojs-ui-core-mediawiki.css
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:56Z
    + * Date: 2016-06-29T13:27:11Z
      */
     .oo-ui-element-hidden {
     	display: none !important;
    @@ -67,7 +67,6 @@
     .oo-ui-buttonElement-frameless > input.oo-ui-buttonElement-button {
     	padding-left: 0.25em;
     	padding-right: 0.25em;
    -	color: #333333;
     }
     .oo-ui-buttonElement-frameless.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
     	box-shadow: inset 0 0 0 1px #347bff, 0 0 0 1px #347bff;
    @@ -270,7 +269,7 @@
     }
     .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-progressive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
     	border-color: #347bff;
    -	box-shadow: inset 0 0 0 1px #ffffff;
    +	box-shadow: inset 0 0 0 1px #347bff, inset 0 0 0 2px #ffffff;
     }
     .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive > .oo-ui-buttonElement-button {
     	color: #ffffff;
    @@ -294,7 +293,7 @@
     }
     .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-constructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
     	border-color: #347bff;
    -	box-shadow: inset 0 0 0 1px #ffffff;
    +	box-shadow: inset 0 0 0 1px #347bff, inset 0 0 0 2px #ffffff;
     }
     .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive > .oo-ui-buttonElement-button {
     	color: #ffffff;
    @@ -318,7 +317,7 @@
     }
     .oo-ui-buttonElement-framed.oo-ui-widget-enabled.oo-ui-flaggedElement-primary.oo-ui-flaggedElement-destructive.oo-ui-widget-enabled > .oo-ui-buttonElement-button:focus {
     	border-color: #d11d13;
    -	box-shadow: inset 0 0 0 1px #ffffff;
    +	box-shadow: inset 0 0 0 1px #d11d13, inset 0 0 0 2px #ffffff;
     }
     .oo-ui-clippableElement-clippable {
     	-webkit-box-sizing: border-box;
    @@ -1035,13 +1034,13 @@
     .oo-ui-textInputWidget textarea {
     	display: block;
     	width: 100%;
    -	resize: none;
     	-webkit-box-sizing: border-box;
     	   -moz-box-sizing: border-box;
     	        box-sizing: border-box;
     }
     .oo-ui-textInputWidget textarea {
     	overflow: auto;
    +	resize: none;
     }
     .oo-ui-textInputWidget [type="search"] {
     	-webkit-appearance: textfield;
    @@ -1095,7 +1094,6 @@
     .oo-ui-textInputWidget input,
     .oo-ui-textInputWidget textarea {
     	padding: 0.5em;
    -	line-height: 1.275em;
     	margin: 0;
     	font-size: inherit;
     	font-family: inherit;
    @@ -1103,9 +1101,9 @@
     	color: #000000;
     	border: 1px solid #cccccc;
     	border-radius: 2px;
    -	-webkit-box-sizing: border-box;
    -	   -moz-box-sizing: border-box;
    -	        box-sizing: border-box;
    +}
    +.oo-ui-textInputWidget textarea {
    +	line-height: 1.275em;
     }
     .oo-ui-textInputWidget .oo-ui-pendingElement-pending {
     	background-color: transparent;
    @@ -1249,6 +1247,7 @@
     	white-space: nowrap;
     	overflow: hidden;
     	text-overflow: ellipsis;
    +	cursor: default;
     	-webkit-touch-callout: none;
     	-webkit-user-select: none;
     	   -moz-user-select: none;
    @@ -1262,13 +1261,13 @@
     .oo-ui-dropdownWidget-handle .oo-ui-iconElement-icon {
     	position: absolute;
     }
    +.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
    +	cursor: pointer;
    +}
     .oo-ui-dropdownWidget > .oo-ui-menuSelectWidget {
     	z-index: 1;
     	width: 100%;
     }
    -.oo-ui-dropdownWidget.oo-ui-widget-enabled .oo-ui-dropdownWidget-handle {
    -	cursor: pointer;
    -}
     .oo-ui-dropdownWidget:last-child {
     	margin-right: 0;
     }
    diff --git a/resources/lib/oojs-ui/oojs-ui-core.js b/resources/lib/oojs-ui/oojs-ui-core.js
    index 6836553eee..e230a49aca 100644
    --- a/resources/lib/oojs-ui/oojs-ui-core.js
    +++ b/resources/lib/oojs-ui/oojs-ui-core.js
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:52Z
    + * Date: 2016-06-29T13:27:08Z
      */
     ( function ( OO ) {
     
    @@ -2219,7 +2219,7 @@ OO.ui.mixin.GroupElement.prototype.aggregate = function ( events ) {
      * @chainable
      */
     OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
    -	var i, len, item, event, events, currentIndex,
    +	var i, len, item, itemEvent, events, currentIndex,
     		itemElements = [];
     
     	for ( i = 0, len = items.length; i < len; i++ ) {
    @@ -2237,8 +2237,8 @@ OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
     		// Add the item
     		if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
     			events = {};
    -			for ( event in this.aggregateItemEvents ) {
    -				events[ event ] = [ 'emit', this.aggregateItemEvents[ event ], item ];
    +			for ( itemEvent in this.aggregateItemEvents ) {
    +				events[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
     			}
     			item.connect( this, events );
     		}
    @@ -2271,22 +2271,19 @@ OO.ui.mixin.GroupElement.prototype.addItems = function ( items, index ) {
      * @chainable
      */
     OO.ui.mixin.GroupElement.prototype.removeItems = function ( items ) {
    -	var i, len, item, index, remove, itemEvent;
    +	var i, len, item, index, events, itemEvent;
     
     	// Remove specific items
     	for ( i = 0, len = items.length; i < len; i++ ) {
     		item = items[ i ];
     		index = this.items.indexOf( item );
     		if ( index !== -1 ) {
    -			if (
    -				item.connect && item.disconnect &&
    -				!$.isEmptyObject( this.aggregateItemEvents )
    -			) {
    -				remove = {};
    -				if ( Object.prototype.hasOwnProperty.call( this.aggregateItemEvents, itemEvent ) ) {
    -					remove[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
    +			if ( item.connect && item.disconnect && !$.isEmptyObject( this.aggregateItemEvents ) ) {
    +				events = {};
    +				for ( itemEvent in this.aggregateItemEvents ) {
    +					events[ itemEvent ] = [ 'emit', this.aggregateItemEvents[ itemEvent ], item ];
     				}
    -				item.disconnect( this, remove );
    +				item.disconnect( this, events );
     			}
     			item.setElementGroup( null );
     			this.items.splice( index, 1 );
    diff --git a/resources/lib/oojs-ui/oojs-ui-mediawiki.js b/resources/lib/oojs-ui/oojs-ui-mediawiki.js
    index 750ab66704..15d4d44a51 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.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:52Z
    + * Date: 2016-06-29T13:27:08Z
      */
     ( function ( OO ) {
     
    diff --git a/resources/lib/oojs-ui/oojs-ui-toolbars-apex.css b/resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
    index 3f1910eb4f..cb5eedac56 100644
    --- a/resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
    +++ b/resources/lib/oojs-ui/oojs-ui-toolbars-apex.css
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:56Z
    + * Date: 2016-06-29T13:27:11Z
      */
     .oo-ui-popupTool .oo-ui-popupWidget-popup,
     .oo-ui-popupTool .oo-ui-popupWidget-anchor {
    diff --git a/resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
    index dd59a23faa..09730d4747 100644
    --- a/resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
    +++ b/resources/lib/oojs-ui/oojs-ui-toolbars-mediawiki.css
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:56Z
    + * Date: 2016-06-29T13:27:11Z
      */
     .oo-ui-popupTool .oo-ui-popupWidget-popup,
     .oo-ui-popupTool .oo-ui-popupWidget-anchor {
    diff --git a/resources/lib/oojs-ui/oojs-ui-toolbars.js b/resources/lib/oojs-ui/oojs-ui-toolbars.js
    index 3b1e15d65c..97a8fc9978 100644
    --- a/resources/lib/oojs-ui/oojs-ui-toolbars.js
    +++ b/resources/lib/oojs-ui/oojs-ui-toolbars.js
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:52Z
    + * Date: 2016-06-29T13:27:08Z
      */
     ( function ( OO ) {
     
    diff --git a/resources/lib/oojs-ui/oojs-ui-widgets-apex.css b/resources/lib/oojs-ui/oojs-ui-widgets-apex.css
    index 0767ab777d..68156c7564 100644
    --- a/resources/lib/oojs-ui/oojs-ui-widgets-apex.css
    +++ b/resources/lib/oojs-ui/oojs-ui-widgets-apex.css
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:56Z
    + * Date: 2016-06-29T13:27:11Z
      */
     .oo-ui-draggableElement-handle,
     .oo-ui-draggableElement-handle.oo-ui-widget {
    @@ -17,7 +17,6 @@
     	cursor:         grab;
     }
     .oo-ui-draggableElement-handle:active {
    -	cursor: move;
     	cursor: url(images/grabbing.cur );
     	cursor: -webkit-grabbing;
     	cursor:    -moz-grabbing;
    @@ -251,27 +250,16 @@
     	   -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:last-child {
     	margin-right: 0;
     }
     .oo-ui-toggleSwitchWidget.oo-ui-widget-disabled {
     	opacity: 0.5;
     }
    +.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
    +.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
    +	border-color: #aaaaaa;
    +}
     .oo-ui-toggleSwitchWidget-grip {
     	top: 0.25em;
     	left: 0.25em;
    @@ -291,11 +279,12 @@
     	background-image:         linear-gradient(to bottom, #ffffff 0, #dddddd 100%);
     	-ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffffffff', endColorstr='#ffdddddd' )";
     }
    -.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover,
    -.oo-ui-toggleSwitchWidget.oo-ui-widget-enabled:hover .oo-ui-toggleSwitchWidget-grip {
    -	border-color: #aaaaaa;
    -}
    -.oo-ui-toggleSwitchWidget .oo-ui-toggleSwitchWidget-glow {
    +.oo-ui-toggleSwitchWidget-glow {
    +	position: absolute;
    +	top: 0;
    +	bottom: 0;
    +	right: 0;
    +	left: 0;
     	border-radius: 1em;
     	box-shadow: inset 0 1px 4px 0 rgba(0, 0, 0, 0.07);
     	-webkit-transition: opacity 250ms ease;
    @@ -307,22 +296,26 @@
     	background-image:    -moz-linear-gradient(top, #b0d9ee 0, #eaf4fa 100%);
     	background-image:         linear-gradient(to bottom, #b0d9ee 0, #eaf4fa 100%);
     	-ms-filter: "progid:DXImageTransform.Microsoft.gradient( startColorstr='#ffb0d9ee', endColorstr='#ffeaf4fa' )";
    -}
    -.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
    -	opacity: 1;
    -}
    -.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
    -	left: 2.25em;
    -	margin-left: -2px;
    +	-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: block;
     	opacity: 0;
     }
     .oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
     	left: 0.25em;
     	margin-left: 0;
     }
    +.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-glow {
    +	opacity: 1;
    +}
    +.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
    +	left: 2.25em;
    +	margin-left: -2px;
    +}
     .oo-ui-progressBarWidget {
     	max-width: 50em;
     	background-color: #ffffff;
    @@ -435,6 +428,14 @@
     .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
     	position: absolute;
     }
    +.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
    +	cursor: default;
    +	-webkit-touch-callout: none;
    +	-webkit-user-select: none;
    +	   -moz-user-select: none;
    +	    -ms-user-select: none;
    +	        user-select: none;
    +}
     .oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
     	z-index: 2;
     }
    @@ -512,6 +513,14 @@
     	display: block;
     }
     .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
    +.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
    +	-webkit-touch-callout: none;
    +	-webkit-user-select: none;
    +	   -moz-user-select: none;
    +	    -ms-user-select: none;
    +	        user-select: none;
    +}
    +.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
     .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget,
     .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
     .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button {
    diff --git a/resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
    index 82d0b5ff92..048e732cb3 100644
    --- a/resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
    +++ b/resources/lib/oojs-ui/oojs-ui-widgets-mediawiki.css
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:56Z
    + * Date: 2016-06-29T13:27:11Z
      */
     .oo-ui-draggableElement-handle,
     .oo-ui-draggableElement-handle.oo-ui-widget {
    @@ -17,7 +17,6 @@
     	cursor:         grab;
     }
     .oo-ui-draggableElement-handle:active {
    -	cursor: move;
     	cursor: url(images/grabbing.cur );
     	cursor: -webkit-grabbing;
     	cursor:    -moz-grabbing;
    @@ -261,21 +260,6 @@
     	   -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:last-child {
     	margin-right: 0;
     }
    @@ -283,17 +267,22 @@
     	content: "";
     	display: block;
     	position: absolute;
    -	top: 0;
    -	left: 0;
    -	bottom: 0;
    -	right: 0;
    +	top: 1px;
    +	left: 1px;
    +	bottom: 1px;
    +	right: 1px;
     	border: 1px solid transparent;
     	border-radius: 1em;
     	z-index: 1;
    +	-webkit-transition: border-color 100ms;
    +	   -moz-transition: border-color 100ms;
    +	        transition: border-color 100ms;
     }
     .oo-ui-toggleSwitchWidget-grip {
     	top: 0.35em;
    +	min-width: 16px;
     	width: 1.2em;
    +	min-height: 16px;
     	height: 1.2em;
     	border-radius: 1.2em;
     	background-color: #555555;
    @@ -304,14 +293,14 @@
     .oo-ui-toggleSwitchWidget-glow {
     	display: none;
     }
    -.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
    -	left: 1.9em;
    -	margin-left: -2px;
    -}
     .oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-off .oo-ui-toggleSwitchWidget-grip {
     	left: 0.4em;
     	margin-left: 0;
     }
    +.oo-ui-toggleSwitchWidget.oo-ui-toggleWidget-on .oo-ui-toggleSwitchWidget-grip {
    +	left: 1.9em;
    +	margin-left: -2px;
    +}
     .oo-ui-toggleSwitchWidget.oo-ui-widget-enabled.oo-ui-toggleWidget-on {
     	background-color: #347bff;
     	border-color: #347bff;
    @@ -462,6 +451,14 @@
     .oo-ui-selectFileWidget-info > .oo-ui-selectFileWidget-clearButton {
     	position: absolute;
     }
    +.oo-ui-widget-disabled .oo-ui-selectFileWidget-info {
    +	cursor: default;
    +	-webkit-touch-callout: none;
    +	-webkit-user-select: none;
    +	   -moz-user-select: none;
    +	    -ms-user-select: none;
    +	        user-select: none;
    +}
     .oo-ui-selectFileWidget .oo-ui-selectFileWidget-clearButton {
     	z-index: 2;
     }
    @@ -539,6 +536,14 @@
     	display: block;
     }
     .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
    +.oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget {
    +	-webkit-touch-callout: none;
    +	-webkit-user-select: none;
    +	   -moz-user-select: none;
    +	    -ms-user-select: none;
    +	        user-select: none;
    +}
    +.oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget,
     .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget,
     .oo-ui-selectFileWidget-empty.oo-ui-widget-disabled .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button,
     .oo-ui-selectFileWidget-notsupported .oo-ui-selectFileWidget-dropTarget .oo-ui-buttonElement-button {
    diff --git a/resources/lib/oojs-ui/oojs-ui-widgets.js b/resources/lib/oojs-ui/oojs-ui-widgets.js
    index cc010a632e..c4486d3a99 100644
    --- a/resources/lib/oojs-ui/oojs-ui-widgets.js
    +++ b/resources/lib/oojs-ui/oojs-ui-widgets.js
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:52Z
    + * Date: 2016-06-29T13:27:08Z
      */
     ( function ( OO ) {
     
    @@ -374,18 +374,22 @@ OO.ui.mixin.DraggableGroupElement.prototype.reorder = function ( item, newIndex
      * @param {OO.ui.mixin.DraggableElement} item Dragged item
      */
     OO.ui.mixin.DraggableGroupElement.prototype.setDragItem = function ( item ) {
    -	this.dragItem = item;
    -	this.$element.on( 'dragover', this.onDragOver.bind( this ) );
    -	this.$element.addClass( 'oo-ui-draggableGroupElement-dragging' );
    +	if ( this.dragItem !== item ) {
    +		this.dragItem = item;
    +		this.$element.on( 'dragover', this.onDragOver.bind( this ) );
    +		this.$element.addClass( 'oo-ui-draggableGroupElement-dragging' );
    +	}
     };
     
     /**
      * Unset the current dragged item
      */
     OO.ui.mixin.DraggableGroupElement.prototype.unsetDragItem = function () {
    -	this.dragItem = null;
    -	this.$element.off( 'dragover' );
    -	this.$element.removeClass( 'oo-ui-draggableGroupElement-dragging' );
    +	if ( this.dragItem ) {
    +		this.dragItem = null;
    +		this.$element.off( 'dragover' );
    +		this.$element.removeClass( 'oo-ui-draggableGroupElement-dragging' );
    +	}
     };
     
     /**
    @@ -1770,11 +1774,13 @@ OO.ui.BookletLayout.prototype.onStackLayoutVisibleItemChange = function ( page )
     OO.ui.BookletLayout.prototype.onStackLayoutSet = function ( page ) {
     	var layout = this;
     	if ( !this.scrolling && page ) {
    -		page.scrollElementIntoView( { complete: function () {
    -			if ( layout.autoFocus ) {
    -				layout.focus();
    +		page.scrollElementIntoView( {
    +			complete: function () {
    +				if ( layout.autoFocus ) {
    +					layout.focus();
    +				}
     			}
    -		} } );
    +		} );
     	}
     };
     
    @@ -2278,11 +2284,13 @@ OO.ui.IndexLayout.prototype.onStackLayoutFocus = function ( e ) {
     OO.ui.IndexLayout.prototype.onStackLayoutSet = function ( card ) {
     	var layout = this;
     	if ( card ) {
    -		card.scrollElementIntoView( { complete: function () {
    -			if ( layout.autoFocus ) {
    -				layout.focus();
    +		card.scrollElementIntoView( {
    +			complete: function () {
    +				if ( layout.autoFocus ) {
    +					layout.focus();
    +				}
     			}
    -		} } );
    +		} );
     	}
     };
     
    diff --git a/resources/lib/oojs-ui/oojs-ui-windows-apex.css b/resources/lib/oojs-ui/oojs-ui-windows-apex.css
    index de80299e13..b55dd253e3 100644
    --- a/resources/lib/oojs-ui/oojs-ui-windows-apex.css
    +++ b/resources/lib/oojs-ui/oojs-ui-windows-apex.css
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:56Z
    + * Date: 2016-06-29T13:27:11Z
      */
     .oo-ui-actionWidget.oo-ui-pendingElement-pending {
     	background-image: /* @embed */ url(themes/apex/images/textures/pending.gif);
    @@ -64,8 +64,7 @@
     	bottom: 0;
     }
     .oo-ui-dialog-content > .oo-ui-window-foot {
    -	overflow: hidden;
    -	z-index: 1;
    +	z-index: 3;
     	bottom: 0;
     }
     .oo-ui-dialog-content > .oo-ui-window-body {
    diff --git a/resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css b/resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
    index 5aaedc1c25..727e87461f 100644
    --- a/resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
    +++ b/resources/lib/oojs-ui/oojs-ui-windows-mediawiki.css
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:56Z
    + * Date: 2016-06-29T13:27:11Z
      */
     .oo-ui-window {
     	background: transparent;
    @@ -60,13 +60,9 @@
     	bottom: 0;
     }
     .oo-ui-dialog-content > .oo-ui-window-foot {
    -	overflow: hidden;
    -	z-index: 1;
    +	z-index: 3;
     	bottom: 0;
     }
    -.oo-ui-dialog-content > .oo-ui-window-body {
    -	outline: 1px solid #aaaaaa;
    -}
     .oo-ui-messageDialog-actions-horizontal {
     	display: table;
     	table-layout: fixed;
    @@ -98,6 +94,9 @@
     	display: inline;
     	white-space: nowrap;
     }
    +.oo-ui-messageDialog-content > .oo-ui-window-foot {
    +	outline: 1px solid #aaaaaa;
    +}
     .oo-ui-messageDialog-title,
     .oo-ui-messageDialog-message {
     	display: block;
    @@ -137,7 +136,7 @@
     	border-bottom-width: 0;
     }
     .oo-ui-messageDialog-actions .oo-ui-actionWidget {
    -	height: 3.4em;
    +	min-height: 3.4em;
     	margin-right: 0;
     }
     .oo-ui-messageDialog-actions .oo-ui-actionWidget:last-child {
    @@ -145,7 +144,7 @@
     }
     .oo-ui-messageDialog-actions .oo-ui-actionWidget.oo-ui-labelElement .oo-ui-labelElement-label {
     	text-align: center;
    -	line-height: 3.4em;
    +	line-height: 3.4;
     }
     .oo-ui-messageDialog-actions .oo-ui-actionWidget:hover {
     	background-color: rgba(0, 0, 0, 0.05);
    diff --git a/resources/lib/oojs-ui/oojs-ui-windows.js b/resources/lib/oojs-ui/oojs-ui-windows.js
    index 17bab019c5..8234b6dec6 100644
    --- a/resources/lib/oojs-ui/oojs-ui-windows.js
    +++ b/resources/lib/oojs-ui/oojs-ui-windows.js
    @@ -1,12 +1,12 @@
     /*!
    - * OOjs UI v0.17.4
    + * OOjs UI v0.17.5
      * https://www.mediawiki.org/wiki/OOjs_UI
      *
      * Copyright 2011–2016 OOjs UI Team and other contributors.
      * Released under the MIT license
      * http://oojs.mit-license.org
      *
    - * Date: 2016-05-31T21:50:52Z
    + * Date: 2016-06-29T13:27:08Z
      */
     ( function ( OO ) {
     
    @@ -3114,7 +3114,11 @@ OO.ui.ProcessDialog.prototype.initialize = function () {
     		.append( this.$errors );
     	this.$navigation
     		.addClass( 'oo-ui-processDialog-navigation' )
    -		.append( this.$safeActions, this.$location, this.$primaryActions );
    +		// Note: Order of appends below is important. These are in the order
    +		// we want tab to go through them. Display-order is handled entirely
    +		// by CSS absolute-positioning. As such, primary actions like "done"
    +		// should go first.
    +		.append( this.$primaryActions, this.$location, this.$safeActions );
     	this.$head.append( this.$navigation );
     	this.$foot.append( this.$otherActions );
     };
    diff --git a/resources/lib/phpjs-sha1/sha1.js b/resources/lib/phpjs-sha1/sha1.js
    deleted file mode 100644
    index 93c533d7f8..0000000000
    --- a/resources/lib/phpjs-sha1/sha1.js
    +++ /dev/null
    @@ -1,147 +0,0 @@
    -function sha1(str) {
    -  //  discuss at: http://phpjs.org/functions/sha1/
    -  // original by: Webtoolkit.info (http://www.webtoolkit.info/)
    -  // improved by: Michael White (http://getsprink.com)
    -  // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    -  //    input by: Brett Zamir (http://brett-zamir.me)
    -  //   example 1: sha1('Kevin van Zonneveld');
    -  //   returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
    -
    -  var rotate_left = function (n, s) {
    -    var t4 = (n << s) | (n >>> (32 - s));
    -    return t4;
    -  };
    -
    -  /*var lsb_hex = function (val) {
    -   // Not in use; needed?
    -    var str="";
    -    var i;
    -    var vh;
    -    var vl;
    -
    -    for ( i=0; i<=6; i+=2 ) {
    -      vh = (val>>>(i*4+4))&0x0f;
    -      vl = (val>>>(i*4))&0x0f;
    -      str += vh.toString(16) + vl.toString(16);
    -    }
    -    return str;
    -  };*/
    -
    -  var cvt_hex = function (val) {
    -    var str = '';
    -    var i;
    -    var v;
    -
    -    for (i = 7; i >= 0; i--) {
    -      v = (val >>> (i * 4)) & 0x0f;
    -      str += v.toString(16);
    -    }
    -    return str;
    -  };
    -
    -  var blockstart;
    -  var i, j;
    -  var W = new Array(80);
    -  var H0 = 0x67452301;
    -  var H1 = 0xEFCDAB89;
    -  var H2 = 0x98BADCFE;
    -  var H3 = 0x10325476;
    -  var H4 = 0xC3D2E1F0;
    -  var A, B, C, D, E;
    -  var temp;
    -
    -  // utf8_encode
    -  str = unescape(encodeURIComponent(str));
    -  var str_len = str.length;
    -
    -  var word_array = [];
    -  for (i = 0; i < str_len - 3; i += 4) {
    -    j = str.charCodeAt(i) << 24 | str.charCodeAt(i + 1) << 16 | str.charCodeAt(i + 2) << 8 | str.charCodeAt(i + 3);
    -    word_array.push(j);
    -  }
    -
    -  switch (str_len % 4) {
    -  case 0:
    -    i = 0x080000000;
    -    break;
    -  case 1:
    -    i = str.charCodeAt(str_len - 1) << 24 | 0x0800000;
    -    break;
    -  case 2:
    -    i = str.charCodeAt(str_len - 2) << 24 | str.charCodeAt(str_len - 1) << 16 | 0x08000;
    -    break;
    -  case 3:
    -    i = str.charCodeAt(str_len - 3) << 24 | str.charCodeAt(str_len - 2) << 16 | str.charCodeAt(str_len - 1) <<
    -      8 | 0x80;
    -    break;
    -  }
    -
    -  word_array.push(i);
    -
    -  while ((word_array.length % 16) != 14) {
    -    word_array.push(0);
    -  }
    -
    -  word_array.push(str_len >>> 29);
    -  word_array.push((str_len << 3) & 0x0ffffffff);
    -
    -  for (blockstart = 0; blockstart < word_array.length; blockstart += 16) {
    -    for (i = 0; i < 16; i++) {
    -      W[i] = word_array[blockstart + i];
    -    }
    -    for (i = 16; i <= 79; i++) {
    -      W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1);
    -    }
    -
    -    A = H0;
    -    B = H1;
    -    C = H2;
    -    D = H3;
    -    E = H4;
    -
    -    for (i = 0; i <= 19; i++) {
    -      temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff;
    -      E = D;
    -      D = C;
    -      C = rotate_left(B, 30);
    -      B = A;
    -      A = temp;
    -    }
    -
    -    for (i = 20; i <= 39; i++) {
    -      temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff;
    -      E = D;
    -      D = C;
    -      C = rotate_left(B, 30);
    -      B = A;
    -      A = temp;
    -    }
    -
    -    for (i = 40; i <= 59; i++) {
    -      temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff;
    -      E = D;
    -      D = C;
    -      C = rotate_left(B, 30);
    -      B = A;
    -      A = temp;
    -    }
    -
    -    for (i = 60; i <= 79; i++) {
    -      temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff;
    -      E = D;
    -      D = C;
    -      C = rotate_left(B, 30);
    -      B = A;
    -      A = temp;
    -    }
    -
    -    H0 = (H0 + A) & 0x0ffffffff;
    -    H1 = (H1 + B) & 0x0ffffffff;
    -    H2 = (H2 + C) & 0x0ffffffff;
    -    H3 = (H3 + D) & 0x0ffffffff;
    -    H4 = (H4 + E) & 0x0ffffffff;
    -  }
    -
    -  temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4);
    -  return temp.toLowerCase();
    -}
    diff --git a/resources/src/jquery/jquery.accessKeyLabel.js b/resources/src/jquery/jquery.accessKeyLabel.js
    index 519e39bc8e..6ff2e01810 100644
    --- a/resources/src/jquery/jquery.accessKeyLabel.js
    +++ b/resources/src/jquery/jquery.accessKeyLabel.js
    @@ -113,18 +113,19 @@ function getAccessKeyLabel( element ) {
      * @param {HTMLElement} titleElement Element with the title to update (may be the same as `element`)
      */
     function updateTooltipOnElement( element, titleElement ) {
    -	var array = ( mw.msg( 'word-separator' ) + mw.msg( 'brackets' ) ).split( '$1' ),
    -		regexp = new RegExp( $.map( array, mw.RegExp.escape ).join( '.*?' ) + '$' ),
    -		oldTitle = titleElement.title,
    -		rawTitle = oldTitle.replace( regexp, '' ),
    -		newTitle = rawTitle,
    -		accessKeyLabel = getAccessKeyLabel( element );
    -
    -	// don't add a title if the element didn't have one before
    +	var oldTitle, parts, regexp, newTitle, accessKeyLabel;
    +
    +	oldTitle = titleElement.title;
     	if ( !oldTitle ) {
    +		// don't add a title if the element didn't have one before
     		return;
     	}
     
    +	parts = ( mw.msg( 'word-separator' ) + mw.msg( 'brackets' ) ).split( '$1' );
    +	regexp = new RegExp( $.map( parts, mw.RegExp.escape ).join( '.*?' ) + '$' );
    +	newTitle = oldTitle.replace( regexp, '' );
    +	accessKeyLabel = getAccessKeyLabel( element );
    +
     	if ( accessKeyLabel ) {
     		// Should be build the same as in Linker::titleAttrib
     		newTitle += mw.msg( 'word-separator' ) + mw.msg( 'brackets', accessKeyLabel );
    diff --git a/resources/src/jquery/jquery.makeCollapsible.js b/resources/src/jquery/jquery.makeCollapsible.js
    index bdb5ce8af3..501e898ebd 100644
    --- a/resources/src/jquery/jquery.makeCollapsible.js
    +++ b/resources/src/jquery/jquery.makeCollapsible.js
    @@ -314,6 +314,7 @@
     				// If this is not a custom case, do the default: wrap the
     				// contents and add the toggle link. Different elements are
     				// treated differently.
    +
     				if ( $collapsible.is( 'table' ) ) {
     
     					// If the table has a caption, collapse to the caption
    @@ -345,6 +346,12 @@
     						}
     					}
     
    +				} else if ( $collapsible.parent().is( 'li' ) &&
    +					$collapsible.parent().children( '.mw-collapsible' ).size() === 1
    +				) {
    +					// special case of one collapsible in <li> tag
    +					$toggleLink = buildDefaultToggleLink();
    +					$collapsible.before( $toggleLink );
     				} else if ( $collapsible.is( 'ul' ) || $collapsible.is( 'ol' ) ) {
     					// The toggle-link will be in the first list-item
     					$firstItem = $collapsible.find( 'li:first' );
    diff --git a/resources/src/jquery/jquery.suggestions.js b/resources/src/jquery/jquery.suggestions.js
    index 38e5a1f6b4..884ecb6e96 100644
    --- a/resources/src/jquery/jquery.suggestions.js
    +++ b/resources/src/jquery/jquery.suggestions.js
    @@ -555,14 +555,14 @@
     					} else if ( selected.is( '.suggestions-special' ) ) {
     						if ( typeof context.config.special.select === 'function' ) {
     							// Allow the callback to decide whether to prevent default or not
    -							if ( context.config.special.select.call( selected, context.data.$textbox ) === true ) {
    +							if ( context.config.special.select.call( selected, context.data.$textbox, 'keyboard' ) === true ) {
     								preventDefault = false;
     							}
     						}
     					} else {
     						if ( typeof context.config.result.select === 'function' ) {
     							// Allow the callback to decide whether to prevent default or not
    -							if ( context.config.result.select.call( selected, context.data.$textbox ) === true ) {
    +							if ( context.config.result.select.call( selected, context.data.$textbox, 'keyboard' ) === true ) {
     								preventDefault = false;
     							}
     						}
    @@ -675,12 +675,12 @@
     								if ( $result.get( 0 ) !== $other.get( 0 ) ) {
     									return;
     								}
    +								$.suggestions.highlight( context, $result, true );
    +								if ( typeof context.config.result.select === 'function' ) {
    +									context.config.result.select.call( $result, context.data.$textbox, 'mouse' );
    +								}
     								// Don't interfere with special clicks (e.g. to open in new tab)
     								if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
    -									$.suggestions.highlight( context, $result, true );
    -									if ( typeof context.config.result.select === 'function' ) {
    -										context.config.result.select.call( $result, context.data.$textbox );
    -									}
     									// This will hide the link we're just clicking on, which causes problems
     									// when done synchronously in at least Firefox 3.6 (bug 62858).
     									setTimeout( function () {
    @@ -708,11 +708,11 @@
     								if ( $special.get( 0 ) !== $other.get( 0 ) ) {
     									return;
     								}
    +								if ( typeof context.config.special.select === 'function' ) {
    +									context.config.special.select.call( $special, context.data.$textbox, 'mouse' );
    +								}
     								// Don't interfere with special clicks (e.g. to open in new tab)
     								if ( !( e.which !== 1 || e.altKey || e.ctrlKey || e.shiftKey || e.metaKey ) ) {
    -									if ( typeof context.config.special.select === 'function' ) {
    -										context.config.special.select.call( $special, context.data.$textbox );
    -									}
     									// This will hide the link we're just clicking on, which causes problems
     									// when done synchronously in at least Firefox 3.6 (bug 62858).
     									setTimeout( function () {
    @@ -745,9 +745,23 @@
     						$.suggestions.keypress( e, context, context.data.keypressed );
     					} )
     					.keyup( function ( e ) {
    -						// Some browsers won't throw keypress() for arrow keys. If we got a keydown and a keyup without a
    -						// keypress in between, solve it
    -						if ( context.data.keypressedCount === 0 ) {
    +						// The keypress event is fired when a key is pressed down and that key normally
    +						// produces a character value. We also want to handle some keys that don't
    +						// produce a character value so we also attach to the keydown/keyup events.
    +						// List of codes sourced from
    +						// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/keyCode
    +						var allowed = [
    +							40, // up arrow
    +							38, // down arrow
    +							27, // escape
    +							13, // enter
    +							46, // delete
    +							8   // backspace
    +						];
    +						if ( context.data.keypressedCount === 0
    +							&& e.which === context.data.keypressed
    +							&& $.inArray( e.which, allowed ) !== -1
    +						) {
     							$.suggestions.keypress( e, context, context.data.keypressed );
     						}
     					} )
    diff --git a/resources/src/mediawiki.action/mediawiki.action.edit.stash.js b/resources/src/mediawiki.action/mediawiki.action.edit.stash.js
    index 20bfa0eaee..07c7d762bc 100644
    --- a/resources/src/mediawiki.action/mediawiki.action.edit.stash.js
    +++ b/resources/src/mediawiki.action/mediawiki.action.edit.stash.js
    @@ -2,65 +2,91 @@
      * Scripts for pre-emptive edit preparing on action=edit
      */
     ( function ( mw, $ ) {
    +	if ( !mw.config.get( 'wgAjaxEditStash' ) ) {
    +		return;
    +	}
    +
     	$( function () {
     		var idleTimeout = 3000,
     			api = new mw.Api(),
     			pending = null,
     			$form = $( '#editform' ),
     			$text = $form.find( '#wpTextbox1' ),
    -			data = {},
    +			$summary = $form.find( '#wpSummary' ),
    +			section = $form.find( '[name=wpSection]' ).val(),
    +			model = $form.find( '[name=model]' ).val(),
    +			format = $form.find( '[name=format]' ).val(),
    +			revId = $form.find( '[name=parentRevId]' ).val(),
    +			lastText = $text.textSelection( 'getContents' ),
     			timer = null;
     
    -		function stashEdit( token ) {
    -			data = $form.serializeObject();
    +		// Send a request to stash the edit to the API.
    +		// If a request is in progress, abort it since its payload is stale and the API
    +		// may limit concurrent stash parses.
    +		function stashEdit() {
    +			if ( pending ) {
    +				pending.abort();
    +			}
     
    -			pending = api.post( {
    -				action: 'stashedit',
    -				token: token,
    -				title: mw.config.get( 'wgPageName' ),
    -				section: data.wpSection,
    -				sectiontitle: '',
    -				text: data.wpTextbox1,
    -				contentmodel: data.model,
    -				contentformat: data.format,
    -				baserevid: data.parentRevId
    +			api.getToken( 'csrf' ).then( function ( token ) {
    +				lastText = $text.textSelection( 'getContents' );
    +
    +				pending = api.post( {
    +					action: 'stashedit',
    +					token: token,
    +					title: mw.config.get( 'wgPageName' ),
    +					section: section,
    +					sectiontitle: '',
    +					text: lastText,
    +					summary: $summary.textSelection( 'getContents' ),
    +					contentmodel: model,
    +					contentformat: format,
    +					baserevid: revId
    +				} );
     			} );
     		}
     
    -		/* Has the edit body text changed since the last stashEdit() call? */
    +		// Check if edit body text changed since the last stashEdit() call or if no edit
    +		// stash calls have yet been made
     		function isChanged() {
    -			// Normalize line endings to CRLF, like $.fn.serializeObject does.
    -			var newText = $text.val().replace( /\r?\n/g, '\r\n' );
    -			return newText !== data.wpTextbox1;
    +			var newText = $text.textSelection( 'getContents' );
    +			return newText !== lastText;
     		}
     
    -		function onEditChanged() {
    +		function onEditorIdle() {
     			if ( !isChanged() ) {
     				return;
     			}
     
    -			// If a request is in progress, abort it; its payload is stale.
    -			if ( pending ) {
    -				pending.abort();
    -			}
    -
    -			api.getToken( 'csrf' ).then( stashEdit );
    +			stashEdit();
     		}
     
    -		function onKeyPress( e ) {
    +		function onTextKeyUp( e ) {
     			// Ignore keystrokes that don't modify text, like cursor movements.
    -			// See <http://stackoverflow.com/q/2284844>.
    -			if ( e.which === 0 ) {
    +			// See <http://www.javascripter.net/faq/keycodes.htm> and
    +			// <http://www.quirksmode.org/js/keys.html>. We don't have to be exhaustive,
    +			// because the cost of misfiring is low.
    +			// * Key code 33-40: Page Up/Down, End, Home, arrow keys.
    +			// * Key code 16-18: Shift, Ctrl, Alt.
    +			if ( ( e.which >= 33 && e.which <= 40 ) || ( e.which >= 16 && e.which <= 18 ) ) {
     				return;
     			}
     
     			clearTimeout( timer );
    +			timer = setTimeout( onEditorIdle, idleTimeout );
    +		}
     
    -			if ( pending ) {
    -				pending.abort();
    +		function onFormLoaded() {
    +			if (
    +				// Reverts may involve use (undo) links; stash as they review the diff.
    +				// Since the form has a pre-filled summary, stash the edit immediately.
    +				mw.util.getParamValue( 'undo' ) !== null
    +				// Pressing "show changes" and "preview" also signify that the user will
    +				// probably save the page soon
    +				|| $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
    +			) {
    +				stashEdit();
     			}
    -
    -			timer = setTimeout( onEditChanged, idleTimeout );
     		}
     
     		// We don't attempt to stash new section edits because in such cases
    @@ -70,7 +96,9 @@
     			return;
     		}
     
    -		$text.on( { change: onEditChanged, keypress: onKeyPress } );
    +		$text.on( { change: onEditorIdle, keyup: onTextKeyUp } );
    +		$summary.on( { focus: onEditorIdle } );
    +		onFormLoaded();
     
     	} );
     }( mediaWiki, jQuery ) );
    diff --git a/resources/src/mediawiki.action/mediawiki.action.history.css b/resources/src/mediawiki.action/mediawiki.action.history.css
    index 95e92ae374..fd5dbc97d6 100644
    --- a/resources/src/mediawiki.action/mediawiki.action.history.css
    +++ b/resources/src/mediawiki.action/mediawiki.action.history.css
    @@ -1,8 +1,6 @@
    +/* Styles for the JavaScript enhancements of the history page */
    +
     #pagehistory li.before input[name="oldid"],
     #pagehistory li.after input[name="diff"] {
     	visibility: hidden;
     }
    -
    -.updatedmarker {
    -	background-color: #b7f430;
    -}
    diff --git a/resources/src/mediawiki.action/mediawiki.action.history.diff.css b/resources/src/mediawiki.action/mediawiki.action.history.diff.css
    index 9db6777af0..327c9c8dd0 100644
    --- a/resources/src/mediawiki.action/mediawiki.action.history.diff.css
    +++ b/resources/src/mediawiki.action/mediawiki.action.history.diff.css
    @@ -93,3 +93,28 @@ td.diff-addedline .diffchange {
     td.diff-deletedline .diffchange {
     	background: #feeec8;
     }
    +
    +/* Correct user & content directionality when viewing a diff */
    +.diff-currentversion-title,
    +.diff {
    +	direction: ltr;
    +	unicode-bidi: embed;
    +}
    +
    +/* @noflip */ .diff-contentalign-right td {
    +	direction: rtl;
    +	unicode-bidi: embed;
    +}
    +
    +/* @noflip */ .diff-contentalign-left td {
    +	direction: ltr;
    +	unicode-bidi: embed;
    +}
    +
    +.diff-multi,
    +.diff-otitle,
    +.diff-ntitle,
    +.diff-lineno {
    +	direction: ltr !important;
    +	unicode-bidi: embed;
    +}
    diff --git a/resources/src/mediawiki.action/mediawiki.action.history.styles.css b/resources/src/mediawiki.action/mediawiki.action.history.styles.css
    new file mode 100644
    index 0000000000..5b08f95ae5
    --- /dev/null
    +++ b/resources/src/mediawiki.action/mediawiki.action.history.styles.css
    @@ -0,0 +1,23 @@
    +/* Basic styles for the history page */
    +
    +#pagehistory .history-user {
    +	margin-left: 0.4em;
    +	margin-right: 0.2em;
    +}
    +
    +#pagehistory li {
    +	border: 1px solid #fff;
    +}
    +
    +#pagehistory li.selected {
    +	background-color: #f9f9f9;
    +	border: 1px dashed #aaa;
    +}
    +
    +.mw-history-revisionactions {
    +	float: right;
    +}
    +
    +.updatedmarker {
    +	background-color: #b7f430;
    +}
    diff --git a/resources/src/mediawiki.action/mediawiki.action.view.filepage.css b/resources/src/mediawiki.action/mediawiki.action.view.filepage.css
    index 99982e365f..d5520a1f97 100644
    --- a/resources/src/mediawiki.action/mediawiki.action.view.filepage.css
    +++ b/resources/src/mediawiki.action/mediawiki.action.view.filepage.css
    @@ -2,32 +2,32 @@
      * File description page
      */
     
    -div.mw-filepage-resolutioninfo {
    +.mw-filepage-resolutioninfo {
     	font-size: smaller;
     }
     
     /*
      * File histories
      */
    -h2#filehistory {
    +#filehistory {
     	clear: both;
     }
     
    -table.filehistory th,
    -table.filehistory td {
    +.filehistory th,
    +.filehistory td {
     	vertical-align: top;
     }
     
    -table.filehistory th {
    +.filehistory th {
     	text-align: left;
     }
     
    -table.filehistory td.mw-imagepage-filesize,
    -table.filehistory th.mw-imagepage-filesize {
    +.filehistory td.mw-imagepage-filesize,
    +.filehistory th.mw-imagepage-filesize {
     	white-space: nowrap;
     }
     
    -table.filehistory td.filehistory-selected {
    +.filehistory td.filehistory-selected {
     	font-weight: bold;
     }
     
    @@ -44,7 +44,7 @@ table.filehistory td.filehistory-selected {
     /*
      * filetoc
      */
    -ul#filetoc {
    +#filetoc {
     	text-align: center;
     	border: 1px solid #aaa;
     	background-color: #f9f9f9;
    @@ -68,3 +68,54 @@ ul#filetoc {
     #shared-image-conflict {
     	font-style: italic;
     }
    +
    +/*
    + * Classes for Exif data display
    + */
    +.mw_metadata {
    +	font-size: 0.8em;
    +	margin-left: 0.5em;
    +	margin-bottom: 0.5em;
    +	width: 400px;
    +}
    +
    +.mw_metadata caption {
    +	font-weight: bold;
    +}
    +
    +.mw_metadata th {
    +	font-weight: normal;
    +	text-align: center;
    +}
    +
    +.mw_metadata td {
    +	padding: 0.1em;
    +}
    +
    +.mw_metadata {
    +	border: none;
    +	border-collapse: collapse;
    +}
    +
    +.mw_metadata td,
    +.mw_metadata th {
    +	border: 1px solid #aaa;
    +	padding-left: 5px;
    +	padding-right: 5px;
    +}
    +
    +.mw_metadata th {
    +	background-color: #f9f9f9;
    +}
    +
    +.mw_metadata td {
    +	background-color: #fcfcfc;
    +}
    +
    +.mw_metadata ul.metadata-langlist {
    +	list-style-type: none;
    +	list-style-image: none;
    +	padding-right: 5px;
    +	padding-left: 5px;
    +	margin: 0;
    +}
    diff --git a/resources/src/mediawiki.legacy/shared.css b/resources/src/mediawiki.legacy/shared.css
    index 4ff403a2ef..fc163776ca 100644
    --- a/resources/src/mediawiki.legacy/shared.css
    +++ b/resources/src/mediawiki.legacy/shared.css
    @@ -91,30 +91,6 @@ abbr[title],
     	}
     }
     
    -/* Colored watchlist and recent changes numbers */
    -.mw-plusminus-pos {
    -	color: #006400; /* dark green */
    -}
    -
    -.mw-plusminus-neg {
    -	color: #8b0000; /* dark red */
    -}
    -
    -.mw-plusminus-null {
    -	color: #aaa; /* gray */
    -}
    -
    -/*
    - * Bidi-isolate these numbers.
    - * See https://phabricator.wikimedia.org/T93484
    - */
    -.mw-plusminus-pos,
    -.mw-plusminus-neg,
    -.mw-plusminus-null {
    -	unicode-bidi: -moz-isolate;
    -	unicode-bidi: isolate;
    -}
    -
     /* Comment portions of RC entries */
     span.comment {
     	font-style: italic;
    @@ -284,31 +260,11 @@ p.mw-delete-editreasons {
     	text-align: right;
     }
     
    -/* Page history styling */
    -
     /* The auto-generated edit comments */
     .autocomment {
     	color: #808080;
     }
     
    -#pagehistory .history-user {
    -	margin-left: 0.4em;
    -	margin-right: 0.2em;
    -}
    -
    -#pagehistory li {
    -	border: 1px solid #fff;
    -}
    -
    -#pagehistory li.selected {
    -	background-color: #f9f9f9;
    -	border: 1px dashed #aaa;
    -}
    -
    -.mw-history-revisionactions {
    -	float: right;
    -}
    -
     /** Generic minor/bot/newpage styling (recent changes) */
     .newpage,
     .minoredit,
    @@ -520,55 +476,6 @@ table.wikitable > caption {
     	background-color: #eef;
     }
     
    -/* Classes for Exif data display */
    -table.mw_metadata {
    -	font-size: 0.8em;
    -	margin-left: 0.5em;
    -	margin-bottom: 0.5em;
    -	width: 400px;
    -}
    -
    -table.mw_metadata caption {
    -	font-weight: bold;
    -}
    -
    -table.mw_metadata th {
    -	font-weight: normal;
    -	text-align: center;
    -}
    -
    -table.mw_metadata td {
    -	padding: 0.1em;
    -}
    -
    -table.mw_metadata {
    -	border: none;
    -	border-collapse: collapse;
    -}
    -
    -table.mw_metadata td,
    -table.mw_metadata th {
    -	border: 1px solid #aaa;
    -	padding-left: 5px;
    -	padding-right: 5px;
    -}
    -
    -table.mw_metadata th {
    -	background-color: #f9f9f9;
    -}
    -
    -table.mw_metadata td {
    -	background-color: #fcfcfc;
    -}
    -
    -table.mw_metadata ul.metadata-langlist {
    -	list-style-type: none;
    -	list-style-image: none;
    -	padding-right: 5px;
    -	padding-left: 5px;
    -	margin: 0;
    -}
    -
     /* Correct directionality when page dir is different from site/user dir */
     .mw-content-ltr ul,
     .mw-content-rtl .mw-content-ltr ul {
    @@ -793,31 +700,6 @@ ol:lang(or) li {
     	unicode-bidi: embed;
     }
     
    -/* Correct user & content directionality when viewing a diff */
    -.diff-currentversion-title,
    -.diff {
    -	direction: ltr;
    -	unicode-bidi: embed;
    -}
    -
    -/* @noflip */ .diff-contentalign-right td {
    -	direction: rtl;
    -	unicode-bidi: embed;
    -}
    -
    -/* @noflip */ .diff-contentalign-left td {
    -	direction: ltr;
    -	unicode-bidi: embed;
    -}
    -
    -.diff-multi,
    -.diff-otitle,
    -.diff-ntitle,
    -.diff-lineno {
    -	direction: ltr !important;
    -	unicode-bidi: embed;
    -}
    -
     #mw-revision-info,
     #mw-revision-info-current,
     #mw-revision-nav {
    diff --git a/resources/src/mediawiki.less/mediawiki.ui/mixins.less b/resources/src/mediawiki.less/mediawiki.ui/mixins.less
    index 12825dee72..f29897c598 100644
    --- a/resources/src/mediawiki.less/mediawiki.ui/mixins.less
    +++ b/resources/src/mediawiki.less/mediawiki.ui/mixins.less
    @@ -15,7 +15,6 @@
     	cursor: pointer;
     	vertical-align: bottom;
     	line-height: normal;
    -
     	font-weight: normal;
     
     	& > input[type="checkbox"],
    @@ -37,25 +36,25 @@
     	background: @bgColor;
     
     	&:hover {
    -		// The inner bottom bevel should match the active background color.
     		background-color: @highlightColor;
     	}
     
     	&:focus {
     		border-color: @colorWhite;
    -		box-shadow: 0 0 0 1px @highlightColor;
    +		box-shadow: inset 0 0 0 1px @bgColor, inset 0 0 0 2px @colorWhite;
    +		outline-width: 0;
     
    -		outline: none;
    -		// remove outline in Firefox
    +		// Remove the inner border and padding in Firefox.
     		&::-moz-focus-inner {
     			border-color: transparent;
    +			padding: 0;
     		}
     	}
     
     	&:active,
     	&.is-on,
     	&.mw-ui-checked {
    -		background: @activeColor;
    +		background-color: @activeColor;
     		box-shadow: none;
     	}
     }
    @@ -95,7 +94,7 @@
     	text-shadow: 0 1px rgba(0, 0, 0, .1);
     
     	&:disabled {
    -		background: @colorGray13;
    +		background-color: @colorGray13;
     		border-color: @colorGray13;
     
     		// make sure disabled buttons don't have hover and active states
    @@ -114,7 +113,7 @@
     
     	&:hover,
     	&:focus {
    -		background: transparent;
    +		background-color: transparent;
     		color: @textColor;
     	}
     
    diff --git a/resources/src/mediawiki.special/mediawiki.special.changeslist.css b/resources/src/mediawiki.special/mediawiki.special.changeslist.css
    index bdae0dd276..a06aa95ca4 100644
    --- a/resources/src/mediawiki.special/mediawiki.special.changeslist.css
    +++ b/resources/src/mediawiki.special/mediawiki.special.changeslist.css
    @@ -15,3 +15,27 @@
     .mw-changeslist .mw-title {
     	unicode-bidi: embed;
     }
    +
    +/* Colored watchlist and recent changes numbers */
    +.mw-plusminus-pos {
    +	color: #006400; /* dark green */
    +}
    +
    +.mw-plusminus-neg {
    +	color: #8b0000; /* dark red */
    +}
    +
    +.mw-plusminus-null {
    +	color: #aaa; /* gray */
    +}
    +
    +/*
    + * Bidi-isolate these numbers.
    + * See https://phabricator.wikimedia.org/T93484
    + */
    +.mw-plusminus-pos,
    +.mw-plusminus-neg,
    +.mw-plusminus-null {
    +	unicode-bidi: -moz-isolate;
    +	unicode-bidi: isolate;
    +}
    diff --git a/resources/src/mediawiki.special/mediawiki.special.search.styles.css b/resources/src/mediawiki.special/mediawiki.special.search.styles.css
    index 26c500d068..e7a586519f 100644
    --- a/resources/src/mediawiki.special/mediawiki.special.search.styles.css
    +++ b/resources/src/mediawiki.special/mediawiki.special.search.styles.css
    @@ -18,16 +18,18 @@
     	margin: 1em 0 1em .4em;
     }
     /* needs extra specificity to override `.mw-body p` selector */
    -.mw-body p.mw-search-nonefound {
    +.mw-body .mw-search-nonefound {
     	margin: 0;
     }
    -.mw-search-interwiki-header {
    +.mw-search-interwiki-header,
    +.searchdidyoumean em,
    +.searchmatch {
     	font-weight: bold;
     }
     .mw-search-nonefound + .mw-search-interwiki-header {
     	margin-top: 0;
     }
    -div.searchresult {
    +.searchresult {
     	font-size: 95%;
     	width: 38em;
     }
    @@ -35,6 +37,9 @@ div.searchresult {
     	margin-left: 0;
     	float: left;
     }
    +.mw-search-interwiki-header {
    +	clear: both;
    +}
     .mw-search-results li {
     	padding-bottom: 1.2em;
     	list-style: none;
    @@ -52,32 +57,32 @@ div.searchresult {
     	margin-top: 1em;
     	border: 1px solid #c0c0c0;
     }
    -.mw-search-profile-tabs div.search-types {
    +.search-types {
     	float: left;
     	padding-left: 0.25em;
     }
    -.mw-search-profile-tabs div.search-types ul {
    +.search-types ul {
     	margin: 0;
     	padding: 0;
     	list-style: none;
     }
    -.mw-search-profile-tabs div.search-types ul li {
    +.search-types li {
     	float: left;
     	margin: 0;
     	padding: 0;
     }
    -.mw-search-profile-tabs div.search-types ul li a {
    +.search-types a {
     	display: block;
     	padding: 0.5em;
     }
    -.mw-search-profile-tabs div.search-types ul li.current a {
    +.search-types .current a {
     	color: #333;
     	cursor: default;
     }
    -.mw-search-profile-tabs div.search-types ul li.current a:hover {
    +.search-types .current a:hover {
     	text-decoration: none;
     }
    -#mw-search-top-table div.results-info {
    +.results-info {
     	float: right;
     	padding: 0.5em;
     	padding-right: 0.75em;
    @@ -86,56 +91,57 @@ div.searchresult {
     }
     #mw-search-top-table div.oo-ui-actionFieldLayout {
     	float: left;
    +	width: 100%;
     }
    -fieldset#mw-searchoptions {
    +#mw-searchoptions {
     	margin: 0;
     	padding: 0.5em 0.75em 0.75em 0.75em;
    -	border: none;
     	background-color: #f9f9f9;
     	border: 1px solid #c0c0c0;
     	border-top-width: 0;
     }
    -fieldset#mw-searchoptions legend {
    +#mw-searchoptions legend {
     	display: none;
     }
    -fieldset#mw-searchoptions h4 {
    +#mw-searchoptions h4 {
     	padding: 0;
     	margin: 0;
     	float: left;
     }
    -fieldset#mw-searchoptions table {
    +#mw-searchoptions table {
     	float: left;
     	margin-right: 3em;
     	border-collapse: collapse;
     }
    -fieldset#mw-searchoptions table td {
    +#mw-searchoptions table td {
     	padding: 0 1em 0 0;
     	white-space: nowrap;
     }
    -fieldset#mw-searchoptions div.divider {
    +#mw-searchoptions .divider {
     	clear: both;
     	border-bottom: 1px solid #ddd;
     	padding-top: 0.5em;
     	margin-bottom: 0.5em;
     }
    -td#mw-search-menu {
    +#mw-search-menu {
     	padding-left: 6em;
     	font-size: 85%;
     }
    -div#mw-search-interwiki {
    +#mw-search-interwiki {
     	float: right;
     	width: 18em;
     	border: 1px solid #aaa;
     	margin-top: 2ex;
     }
    -div#mw-search-interwiki li {
    +.searchalttitle,
    +#mw-search-interwiki li {
     	font-size: 95%;
     }
     .mw-search-interwiki-more {
     	float: right;
     	font-size: 90%;
     }
    -div#mw-search-interwiki-caption {
    +#mw-search-interwiki-caption {
     	text-align: center;
     	font-weight: bold;
     	font-size: 95%;
    @@ -147,18 +153,9 @@ div#mw-search-interwiki-caption {
     	background-color: #ececec;
     	border-top: 1px solid #bbb;
     }
    -span.searchalttitle {
    -	font-size: 95%;
    -}
    -div.searchdidyoumean {
    +.searchdidyoumean {
     	font-size: 127%;
     	margin-top: 0.8em;
     	/* Note that this color won't affect the link, as desired. */
     	color: #c00;
     }
    -div.searchdidyoumean em {
    -	font-weight: bold;
    -}
    -.searchmatch {
    -	font-weight: bold;
    -}
    diff --git a/resources/src/mediawiki.ui/components/inputs.less b/resources/src/mediawiki.ui/components/inputs.less
    index 579bd5f9f0..76fee23e21 100644
    --- a/resources/src/mediawiki.ui/components/inputs.less
    +++ b/resources/src/mediawiki.ui/components/inputs.less
    @@ -61,10 +61,8 @@
     	}
     
     	&:focus {
    -		box-shadow: inset 0 0 0 2px @colorProgressive;
    -		// Color being used to match inset shadow, not semantic reasons
     		border-color: @colorProgressive;
    -		// Remove focus glow on input[type="search"]
    +		box-shadow: inset 0 0 0 1px @colorProgressive;
     		outline: 0;
     	}
     
    @@ -108,6 +106,9 @@ input[type="number"],
     .mw-ui-input-inline {
     	display: inline-block;
     	width: auto;
    +	// Make sure we limit `width` to parent element because
    +	// in case of text `input` fields, `width: auto;` equals `size` attribute.
    +	max-width: 100%;
     }
     
     // mw-ui-input-large
    diff --git a/resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js b/resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
    index df03679980..d816335e72 100755
    --- a/resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
    +++ b/resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
    @@ -22,6 +22,12 @@
     	 *  used (header or content).
     	 */
     	mw.widgets.SearchInputWidget = function MwWidgetsSearchInputWidget( config ) {
    +		// The parent constructors will detach this from the DOM, and won't
    +		// be reattached until after this function is completed. As such
    +		// grab a handle here. If no config.$input is passed tracking of
    +		// form submissions won't work.
    +		var $form = config.$input ? config.$input.closest( 'form' ) : $();
    +
     		config = $.extend( {
     			type: 'search',
     			icon: 'search',
    @@ -36,6 +42,7 @@
     		// Initialization
     		this.$element.addClass( 'mw-widget-searchInputWidget' );
     		this.lookupMenu.$element.addClass( 'mw-widget-searchWidget-menu' );
    +		this.lastLookupItems = [];
     		if ( !config.pushPending ) {
     			this.pushPending = false;
     		}
    @@ -46,6 +53,18 @@
     			this.performSearchOnClick = config.performSearchOnClick;
     		}
     		this.setLookupsDisabled( !this.suggestions );
    +
    +		$form.on( 'submit', function () {
    +			mw.track( 'mw.widgets.SearchInputWidget', {
    +				action: 'submit-form',
    +				numberOfResults: this.lastLookupItems.length,
    +				$form: $form,
    +				inputLocation: this.dataLocation || 'header',
    +				index: this.lastLookupItems.indexOf(
    +					this.$input.val()
    +				)
    +			} );
    +		}.bind( this ) );
     	};
     
     	/* Setup */
    @@ -146,23 +165,27 @@
     	/**
     	 * @inheritdoc
     	 */
    -	mw.widgets.SearchInputWidget.prototype.onLookupMenuItemChoose = function ( item ) {
    -		var items;
    -
    -		// get items which was suggested before the input changes
    -		items = this.lookupMenu.items;
    -
    +	mw.widgets.SearchInputWidget.prototype.onLookupMenuItemChoose = function () {
     		mw.widgets.SearchInputWidget.parent.prototype.onLookupMenuItemChoose.apply( this, arguments );
     
    -		mw.track( 'mw.widgets.SearchInputWidget', {
    -			action: 'click-result',
    -			numberOfResults: items.length,
    -			clickIndex: items.indexOf( item ) + 1
    -		} );
    -
     		if ( this.performSearchOnClick ) {
     			this.$element.closest( 'form' ).submit();
     		}
     	};
     
    +	/**
    +	 * @inheritdoc
    +	 */
    +	mw.widgets.SearchInputWidget.prototype.getLookupMenuOptionsFromData = function () {
    +		var items = mw.widgets.SearchInputWidget.parent.prototype.getLookupMenuOptionsFromData.apply(
    +			this, arguments
    +		);
    +
    +		this.lastLookupItems = items.map( function ( item ) {
    +			return item.data;
    +		} );
    +
    +		return items;
    +	};
    +
     }( jQuery, mediaWiki ) );
    diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
    index 84533aa957..37e6e1afa2 100644
    --- a/resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
    +++ b/resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
    @@ -51,6 +51,11 @@
     		this.$label.attr( 'href', config.url );
     		this.$element.addClass( 'mw-widget-titleOptionWidget' );
     
    +		// OOUI OptionWidgets make an effort to not be tab accessible, but
    +		// adding a link inside them would undo that. So, explicitly make it
    +		// not tabbable.
    +		this.$label.attr( 'tabindex', '-1' );
    +
     		// Allow opening the link in new tab, but not regular navigation.
     		this.$label.on( 'click', function ( e ) {
     			// Don't interfere with special clicks (e.g. to open in new tab)
    diff --git a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
    index fdd4a8ae60..17324076c3 100644
    --- a/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
    +++ b/resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
    @@ -96,6 +96,8 @@
     	/**
     	 * Get a promise which resolves with an API repsonse for suggested
     	 * links for the current query.
    +	 *
    +	 * @return {jQuery.Promise} Suggestions promise
     	 */
     	mw.widgets.TitleWidget.prototype.getSuggestionsPromise = function () {
     		var req,
    diff --git a/resources/src/mediawiki/api.js b/resources/src/mediawiki/api.js
    index 3e010d0d45..a8ee4c7a82 100644
    --- a/resources/src/mediawiki/api.js
    +++ b/resources/src/mediawiki/api.js
    @@ -289,10 +289,20 @@
     		 */
     		postWithToken: function ( tokenType, params, ajaxOptions ) {
     			var api = this,
    -				abortable;
    +				abortedPromise = $.Deferred().reject( 'http',
    +					{ textStatus: 'abort', exception: 'abort' } ).promise(),
    +				abortable,
    +				aborted;
     
    -			return ( abortable = api.getToken( tokenType, params.assert ) ).then( function ( token ) {
    +			return api.getToken( tokenType, params.assert ).then( function ( token ) {
     				params.token = token;
    +				// Request was aborted while token request was running, but we
    +				// don't want to unnecessarily abort token requests, so abort
    +				// a fake request instead
    +				if ( aborted ) {
    +					return abortedPromise;
    +				}
    +
     				return ( abortable = api.post( params, ajaxOptions ) ).then(
     					// If no error, return to caller as-is
     					null,
    @@ -302,9 +312,14 @@
     							api.badToken( tokenType );
     							// Try again, once
     							params.token = undefined;
    -							return ( abortable = api.getToken( tokenType, params.assert ) ).then( function ( token ) {
    +							abortable = null;
    +							return api.getToken( tokenType, params.assert ).then( function ( token ) {
     								params.token = token;
    -								return ( abortable = api.post( params, ajaxOptions ) ).promise();
    +								if ( aborted ) {
    +									return abortedPromise;
    +								}
    +
    +								return ( abortable = api.post( params, ajaxOptions ) );
     							} );
     						}
     
    @@ -313,7 +328,11 @@
     					}
     				);
     			} ).promise( { abort: function () {
    -				abortable.abort();
    +				if ( abortable ) {
    +					abortable.abort();
    +				} else {
    +					aborted = true;
    +				}
     			} } );
     		},
     
    diff --git a/resources/src/mediawiki/api/edit.js b/resources/src/mediawiki/api/edit.js
    index 60276cd0bc..bb3a913f06 100644
    --- a/resources/src/mediawiki/api/edit.js
    +++ b/resources/src/mediawiki/api/edit.js
    @@ -21,14 +21,149 @@
     		/**
     		 * API helper to grab a csrf token.
     		 *
    -		 * @return {jQuery.Promise}
    -		 * @return {Function} return.done
    -		 * @return {string} return.done.token Received token.
    +		 * @return {jQuery.Promise} Received token.
     		 */
     		getEditToken: function () {
     			return this.getToken( 'csrf' );
     		},
     
    +		/**
    +		 * Create a new page.
    +		 *
    +		 * Example:
    +		 *
    +		 *     new mw.Api().create( 'Sandbox',
    +		 *         { summary: 'Load sand particles.' },
    +		 *         'Sand.'
    +		 *     );
    +		 *
    +		 * @since 1.28
    +		 * @param {mw.Title|string} title Page title
    +		 * @param {Object} params Edit API parameters
    +		 * @param {string} params.summary Edit summary
    +		 * @param {string} content
    +		 * @return {jQuery.Promise} API response
    +		 */
    +		create: function ( title, params, content ) {
    +			return this.postWithEditToken( $.extend( {
    +				action: 'edit',
    +				title: String( title ),
    +				text: content,
    +				formatversion: '2',
    +
    +				// Protect against errors and conflicts
    +				assert: mw.user.isAnon() ? undefined : 'user',
    +				createonly: true
    +			}, params ) ).then( function ( data ) {
    +				return data.edit;
    +			} );
    +		},
    +
    +		/**
    +		 * Edit an existing page.
    +		 *
    +		 * To create a new page, use #create() instead.
    +		 *
    +		 * Simple transformation:
    +		 *
    +		 *     new mw.Api()
    +		 *         .edit( 'Sandbox', function ( revision ) {
    +		 *             return revision.content.replace( 'foo', 'bar' );
    +		 *         } )
    +		 *         .then( function () {
    +		 *             console.log( 'Saved! ');
    +		 *         } );
    +		 *
    +		 * Set save parameters by returning an object instead of a string:
    +		 *
    +		 *     new mw.Api().edit(
    +		 *         'Sandbox',
    +		 *         function ( revision ) {
    +		 *             return {
    +		 *                 text: revision.content.replace( 'foo', 'bar' ),
    +		 *                 summary: 'Replace "foo" with "bar".',
    +		 *                 assert: 'bot',
    +		 *                 minor: true
    +		 *             };
    +		 *         }
    +		 *     )
    +		 *     .then( function () {
    +		 *         console.log( 'Saved! ');
    +		 *     } );
    +		 *
    +		 * Transform asynchronously by returning a promise.
    +		 *
    +		 *     new mw.Api()
    +		 *         .edit( 'Sandbox', function ( revision ) {
    +		 *             return Spelling
    +		 *                 .corrections( revision.content )
    +		 *                 .then( function ( report ) {
    +		 *                     return {
    +		 *                         text: report.output,
    +		 *                         summary: report.changelog
    +		 *                     };
    +		 *                 } );
    +		 *         } )
    +		 *         .then( function () {
    +		 *             console.log( 'Saved! ');
    +		 *         } );
    +		 *
    +		 * @since 1.28
    +		 * @param {mw.Title|string} title Page title
    +		 * @param {Function} transform Callback that prepares the edit
    +		 * @param {Object} transform.revision Current revision
    +		 * @param {string} transform.revision.content Current revision content
    +		 * @param {string|Object|jQuery.Promise} transform.return New content, object with edit
    +		 *  API parameters, or promise providing one of those.
    +		 * @return {jQuery.Promise} Edit API response
    +		 */
    +		edit: function ( title, transform ) {
    +			var basetimestamp, curtimestamp,
    +				api = this;
    +			return api.get( {
    +					action: 'query',
    +					prop: 'revisions',
    +					rvprop: [ 'content', 'timestamp' ],
    +					titles: String( title ),
    +					formatversion: '2',
    +					curtimestamp: true
    +				} )
    +				.then( function ( data ) {
    +					var page, revision;
    +					if ( !data.query || !data.query.pages ) {
    +						return $.Deferred().reject( 'unknown' );
    +					}
    +					page = data.query.pages[ 0 ];
    +					if ( !page || page.missing ) {
    +						return $.Deferred().reject( 'nocreate-missing' );
    +					}
    +					revision = page.revisions[ 0 ];
    +					basetimestamp = revision.timestamp;
    +					curtimestamp = data.curtimestamp;
    +					return transform( {
    +						timestamp: revision.timestamp,
    +						content: revision.content
    +					} );
    +				} )
    +				.then( function ( params ) {
    +					var editParams = typeof params === 'object' ? params : { text: String( params ) };
    +					return api.postWithEditToken( $.extend( {
    +						action: 'edit',
    +						title: title,
    +						formatversion: '2',
    +
    +						// Protect against errors and conflicts
    +						assert: mw.user.isAnon() ? undefined : 'user',
    +						basetimestamp: basetimestamp,
    +						starttimestamp: curtimestamp,
    +						nocreate: true
    +					}, editParams ) );
    +				} )
    +				.then( function ( data ) {
    +					return data.edit;
    +				} );
    +		},
    +
     		/**
     		 * Post a new section to the page.
     		 *
    diff --git a/resources/src/mediawiki/api/messages.js b/resources/src/mediawiki/api/messages.js
    index df21eb2812..9ba562e266 100644
    --- a/resources/src/mediawiki/api/messages.js
    +++ b/resources/src/mediawiki/api/messages.js
    @@ -44,6 +44,25 @@
     		 */
     		loadMessages: function ( messages ) {
     			return this.getMessages( messages ).then( $.proxy( mw.messages, 'set' ) );
    +		},
    +
    +		/**
    +		 * Loads a set of mesages and add them to mw.messages. Only messages that are not already known
    +		 * are loaded. If all messages are known, the returned promise is resolved immediately.
    +		 *
    +		 * @param {Array} messages Messages to retrieve
    +		 * @return {jQuery.Promise}
    +		 */
    +		loadMessagesIfMissing: function ( messages ) {
    +			var missing = messages.filter( function ( msg ) {
    +				return !mw.message( msg ).exists();
    +			} );
    +
    +			if ( missing.length === 0 ) {
    +				return $.Deferred().resolve();
    +			}
    +
    +			return this.getMessages( missing ).then( $.proxy( mw.messages, 'set' ) );
     		}
     	} );
     
    diff --git a/resources/src/mediawiki/mediawiki.ForeignUpload.js b/resources/src/mediawiki/mediawiki.ForeignUpload.js
    index eeeab68510..781c1dfe26 100644
    --- a/resources/src/mediawiki/mediawiki.ForeignUpload.js
    +++ b/resources/src/mediawiki/mediawiki.ForeignUpload.js
    @@ -43,7 +43,9 @@
     		// However, if the target is a remote wiki, we must check the API
     		// to confirm that the target is one that this site is configured to
     		// support.
    -		if ( this.target === 'local' ) {
    +		if ( validTargets.length === 0 ) {
    +			this.apiPromise = $.Deferred().reject( 'upload-dialog-disabled' );
    +		} else if ( this.target === 'local' ) {
     			// If local uploads were requested, but they are disabled, fail.
     			if ( !mw.config.get( 'wgEnableUploads' ) ) {
     				this.apiPromise = $.Deferred().reject( 'uploaddisabledtext' );
    diff --git a/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js b/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
    index bbd0f1b74e..31e4492d3a 100644
    --- a/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
    +++ b/resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
    @@ -260,10 +260,9 @@
     			layout.emit( 'fileUploaded' );
     		}, function () {
     			// These errors will be thrown while the user is on the info page.
    -			// Pretty sure it's impossible to get a warning other than 'stashfailed' here, which should
    -			// really be an error...
    -			var errorMessage = layout.getErrorMessageForStateDetails();
    -			deferred.reject( errorMessage );
    +			layout.getErrorMessageForStateDetails().then( function ( errorMessage ) {
    +				deferred.reject( errorMessage );
    +			} );
     		}, function ( progress ) {
     			var elapsedTime = new Date() - startTime,
     				estimatedTotalTime = ( 1 / progress ) * elapsedTime,
    @@ -309,8 +308,9 @@
     				deferred.resolve();
     				layout.emit( 'fileSaved', layout.upload.getImageInfo() );
     			}, function () {
    -				var errorMessage = layout.getErrorMessageForStateDetails();
    -				deferred.reject( errorMessage );
    +				layout.getErrorMessageForStateDetails().then( function ( errorMessage ) {
    +					deferred.reject( errorMessage );
    +				} );
     			} );
     		} );
     
    @@ -322,7 +322,7 @@
     	 * state and state details.
     	 *
     	 * @protected
    -	 * @return {OO.ui.Error} Error to display for given state and details.
    +	 * @return {jQuery.Promise} A Promise that will be resolved with an OO.ui.Error.
     	 */
     	mw.Upload.BookletLayout.prototype.getErrorMessageForStateDetails = function () {
     		var message,
    @@ -334,21 +334,34 @@
     		if ( state === mw.Upload.State.ERROR ) {
     			if ( !error ) {
     				// If there's an 'exception' key, this might be a timeout, or other connection problem
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
     					{ recoverable: false }
    -				);
    +				) );
     			}
     
    -			// HACK We should either have a hook here to allow TitleBlacklist to handle this, or just have
    -			// TitleBlacklist produce sane error messages that can be displayed without arcane knowledge
    -			if ( error.info === 'TitleBlacklist prevents this title from being created' ) {
    -				// HACK Apparently the only reliable way to determine whether TitleBlacklist was involved
    -				return new OO.ui.Error(
    -					// HACK TitleBlacklist doesn't have a sensible message, this one is from UploadWizard
    -					$( '<p>' ).msg( 'api-error-blacklisted' ),
    -					{ recoverable: false }
    -				);
    +			// Errors in this format are produced by TitleBlacklist and AbuseFilter. Perhaps other
    +			// extensions will follow this format in the future.
    +			if ( error.message ) {
    +				return this.upload.getApi()
    +					.then( function ( api ) {
    +						return api.loadMessagesIfMissing( [ error.message.key ] ).then( function () {
    +							if ( !mw.message( error.message.key ).exists() ) {
    +								return $.Deferred().reject();
    +							}
    +							return new OO.ui.Error(
    +								$( '<p>' ).msg( error.message.key, error.message.params || [] ),
    +								{ recoverable: false }
    +							);
    +						} );
    +					} )
    +					.then( null, function () {
    +						// We failed when loading the error message, or it doesn't actually exist, fall back
    +						return $.Deferred().resolve( new OO.ui.Error(
    +							$( '<p>' ).msg( 'api-error-unknownerror', JSON.stringify( stateDetails ) ),
    +							{ recoverable: false }
    +						) );
    +					} );
     			}
     
     			if ( error.code === 'protectedpage' ) {
    @@ -359,10 +372,10 @@
     					message = mw.message( 'api-error-unknownerror', JSON.stringify( stateDetails ) );
     				}
     			}
    -			return new OO.ui.Error(
    +			return $.Deferred().resolve( new OO.ui.Error(
     				$( '<p>' ).append( message.parseDom() ),
     				{ recoverable: false }
    -			);
    +			) );
     		}
     
     		if ( state === mw.Upload.State.WARNING ) {
    @@ -370,63 +383,63 @@
     			// of importance. For example fixing the thumbnail like file name
     			// won't help the fact that the file already exists.
     			if ( warnings.stashfailed !== undefined ) {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'api-error-stashfailed' ),
     					{ recoverable: false }
    -				);
    +				) );
     			} else if ( warnings.exists !== undefined ) {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'fileexists', 'File:' + warnings.exists ),
     					{ recoverable: false }
    -				);
    +				) );
     			} else if ( warnings[ 'exists-normalized' ] !== undefined ) {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'fileexists', 'File:' + warnings[ 'exists-normalized' ] ),
     					{ recoverable: false }
    -				);
    +				) );
     			} else if ( warnings[ 'page-exists' ] !== undefined ) {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'filepageexists', 'File:' + warnings[ 'page-exists' ] ),
     					{ recoverable: false }
    -				);
    +				) );
     			} else if ( warnings.duplicate !== undefined ) {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'api-error-duplicate', warnings.duplicate.length ),
     					{ recoverable: false }
    -				);
    +				) );
     			} else if ( warnings[ 'thumb-name' ] !== undefined ) {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'filename-thumb-name' ),
     					{ recoverable: false }
    -				);
    +				) );
     			} else if ( warnings[ 'bad-prefix' ] !== undefined ) {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'filename-bad-prefix', warnings[ 'bad-prefix' ] ),
     					{ recoverable: false }
    -				);
    +				) );
     			} else if ( warnings[ 'duplicate-archive' ] !== undefined ) {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'api-error-duplicate-archive', 1 ),
     					{ recoverable: false }
    -				);
    +				) );
     			} else if ( warnings[ 'was-deleted' ] !== undefined ) {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'api-error-was-deleted' ),
     					{ recoverable: false }
    -				);
    +				) );
     			} else if ( warnings.badfilename !== undefined ) {
     				// Change the name if the current name isn't acceptable
     				// TODO This might not really be the best place to do this
     				this.setFilename( warnings.badfilename );
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					$( '<p>' ).msg( 'badfilename', warnings.badfilename )
    -				);
    +				) );
     			} else {
    -				return new OO.ui.Error(
    +				return $.Deferred().resolve( new OO.ui.Error(
     					// Let's get all the help we can if we can't pin point the error
     					$( '<p>' ).msg( 'api-error-unknown-warning', JSON.stringify( stateDetails ) ),
     					{ recoverable: false }
    -				);
    +				) );
     			}
     		}
     	};
    diff --git a/resources/src/mediawiki/mediawiki.checkboxtoggle.js b/resources/src/mediawiki/mediawiki.checkboxtoggle.js
    index 62760d2f63..ab7a74e943 100644
    --- a/resources/src/mediawiki/mediawiki.checkboxtoggle.js
    +++ b/resources/src/mediawiki/mediawiki.checkboxtoggle.js
    @@ -13,25 +13,27 @@
     	'use strict';
     
     	$( function () {
    -		var $checkboxes = $( 'li input[type=checkbox]' );
    +		// FIXME: This shouldn't be a global selector to avoid conflicts
    +		// with unrelated content on the same page. (T131318)
    +		var $checkboxes = $( 'li input[type="checkbox"]' );
     
     		function selectAll( check ) {
     			$checkboxes.prop( 'checked', check );
     		}
     
     		$( '.mw-checkbox-all' ).click( function ( e ) {
    -			selectAll( true );
     			e.preventDefault();
    +			selectAll( true );
     		} );
     		$( '.mw-checkbox-none' ).click( function ( e ) {
    -			selectAll( false );
     			e.preventDefault();
    +			selectAll( false );
     		} );
     		$( '.mw-checkbox-invert' ).click( function ( e ) {
    -			$checkboxes.each( function () {
    -				$( this ).prop( 'checked', !$( this ).is( ':checked' ) );
    -			} );
     			e.preventDefault();
    +			$checkboxes.prop( 'checked', function ( i, val ) {
    +				return !val;
    +			} );
     		} );
     
     	} );
    diff --git a/resources/src/mediawiki/mediawiki.jqueryMsg.js b/resources/src/mediawiki/mediawiki.jqueryMsg.js
    index 50fef14ec6..44b9117799 100644
    --- a/resources/src/mediawiki/mediawiki.jqueryMsg.js
    +++ b/resources/src/mediawiki/mediawiki.jqueryMsg.js
    @@ -15,6 +15,8 @@
     		slice = Array.prototype.slice,
     		parserDefaults = {
     			magic: {
    +				PAGENAME: mw.config.get( 'wgPageName' ),
    +				PAGENAMEE: mw.util.wikiUrlencode( mw.config.get( 'wgPageName' ) ),
     				SITENAME: mw.config.get( 'wgSiteName' )
     			},
     			// Whitelist for allowed HTML elements in wikitext.
    diff --git a/resources/src/mediawiki/mediawiki.js b/resources/src/mediawiki/mediawiki.js
    index 1203b6a8f7..942f4aebfa 100644
    --- a/resources/src/mediawiki/mediawiki.js
    +++ b/resources/src/mediawiki/mediawiki.js
    @@ -8,7 +8,6 @@
      * @singleton
      */
     /*jshint latedef:false */
    -/*global sha1 */
     ( function ( $ ) {
     	'use strict';
     
    @@ -19,6 +18,36 @@
     		trackHandlers = [],
     		trackQueue = [];
     
    +	/**
    +	 * FNV132 hash function
    +	 *
    +	 * This function implements the 32-bit version of FNV-1.
    +	 * It is equivalent to hash( 'fnv132', ... ) in PHP, except
    +	 * its output is base 36 rather than hex.
    +	 * See <https://en.wikipedia.org/wiki/FNV_hash_function>
    +	 *
    +	 * @private
    +	 * @param {string} str String to hash
    +	 * @return {string} hash as an seven-character base 36 string
    +	 */
    +	function fnv132( str ) {
    +		/*jshint bitwise:false */
    +		var hash = 0x811C9DC5,
    +			i;
    +
    +		for ( i = 0; i < str.length; i++ ) {
    +			hash += ( hash << 1 ) + ( hash << 4 ) + ( hash << 7 ) + ( hash << 8 ) + ( hash << 24 );
    +			hash ^= str.charCodeAt( i );
    +		}
    +
    +		hash = ( hash >>> 0 ).toString( 36 );
    +		while ( hash.length < 7 ) {
    +			hash = '0' + hash;
    +		}
    +
    +		return hash;
    +	}
    +
     	/**
     	 * Create an object that can be read from or written to from methods that allow
     	 * interaction both with single and multiple properties at once.
    @@ -277,7 +306,7 @@
     		},
     
     		/**
    -		 * Add (does not replace) parameters for `N$` placeholder values.
    +		 * Add (does not replace) parameters for `$N` placeholder values.
     		 *
     		 * @param {Array} parameters
     		 * @chainable
    @@ -803,7 +832,6 @@
     				cssBuffer = '',
     				cssBufferTimer = null,
     				cssCallbacks = $.Callbacks(),
    -				isIEto9 = 'documentMode' in document && document.documentMode <= 9,
     				isIE9 = document.documentMode === 9;
     
     			function getMarker() {
    @@ -829,21 +857,14 @@
     			 */
     			function newStyleTag( text, nextNode ) {
     				var s = document.createElement( 'style' );
    -				// Support: IE
    -				// Must attach style element to the document before setting cssText (T35305)
    +
    +				s.appendChild( document.createTextNode( text ) );
     				if ( nextNode && nextNode.parentNode ) {
     					nextNode.parentNode.insertBefore( s, nextNode );
     				} else {
     					document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
     				}
    -				if ( s.styleSheet ) {
    -					// Support: IE6-10
    -					// Old IE ignores appended text nodes, access stylesheet directly.
    -					s.styleSheet.cssText = text;
    -				} else {
    -					// Standard behaviour
    -					s.appendChild( document.createTextNode( text ) );
    -				}
    +
     				return s;
     			}
     
    @@ -858,7 +879,7 @@
     			 * @param {Function} [callback]
     			 */
     			function addEmbeddedCSS( cssText, callback ) {
    -				var $style, styleEl, newCssText;
    +				var $style, styleEl;
     
     				function fireCallbacks() {
     					var oldCallbacks = cssCallbacks;
    @@ -908,32 +929,13 @@
     				//
     				// Support: IE 6-9
     				// Try to re-use existing <style> tags due to the IE stylesheet limit (T33676).
    -				if ( isIEto9 ) {
    +				if ( isIE9 ) {
     					$style = $( getMarker() ).prev();
     					// Verify that the element before the marker actually is a <style> tag created
     					// by mw.loader (not some other style tag, or e.g. a <meta> tag).
     					if ( $style.data( 'ResourceLoaderDynamicStyleTag' ) ) {
     						styleEl = $style[ 0 ];
    -						// Support: IE 6-10
    -						if ( styleEl.styleSheet ) {
    -							try {
    -								// Support: IE 9
    -								// We can't do styleSheet.cssText += cssText in IE9 because it mangles cssText on
    -								// write (removes @media queries). If we read it and used its value, we'd
    -								// accidentally apply @media-specific styles to all media. (T108727)
    -								if ( isIE9 ) {
    -									newCssText = $style.data( 'ResourceLoaderDynamicStyleTag' ) + cssText;
    -									styleEl.styleSheet.cssText = newCssText;
    -									$style.data( 'ResourceLoaderDynamicStyleTag', newCssText );
    -								} else {
    -									styleEl.styleSheet.cssText += cssText;
    -								}
    -							} catch ( e ) {
    -								mw.track( 'resourceloader.exception', { exception: e, source: 'stylesheet' } );
    -							}
    -						} else {
    -							styleEl.appendChild( document.createTextNode( cssText ) );
    -						}
    +						styleEl.appendChild( document.createTextNode( cssText ) );
     						fireCallbacks();
     						return;
     					}
    @@ -942,12 +944,8 @@
     
     				$style = $( newStyleTag( cssText, getMarker() ) );
     
    -				if ( isIEto9 ) {
    -					if ( isIE9 ) {
    -						$style.data( 'ResourceLoaderDynamicStyleTag', cssText );
    -					} else {
    -						$style.data( 'ResourceLoaderDynamicStyleTag', true );
    -					}
    +				if ( isIE9 ) {
    +					$style.data( 'ResourceLoaderDynamicStyleTag', true );
     				}
     
     				fireCallbacks();
    @@ -962,10 +960,7 @@
     				var hashes = $.map( modules, function ( module ) {
     					return registry[ module ].version;
     				} );
    -				// Trim for consistency with server-side ResourceLoader::makeHash. It also helps
    -				// save precious space in the limited query string. Otherwise modules are more
    -				// likely to require multiple HTTP requests.
    -				return sha1( hashes.join( '' ) ).slice( 0, 12 );
    +				return fnv132( hashes.join( '' ) );
     			}
     
     			/**
    @@ -1224,9 +1219,7 @@
     			 */
     			function addLink( media, url ) {
     				var el = document.createElement( 'link' );
    -				// Support: IE
    -				// Insert in document *before* setting href
    -				$( getMarker() ).before( el );
    +
     				el.rel = 'stylesheet';
     				if ( media && media !== 'all' ) {
     					el.media = media;
    @@ -1234,6 +1227,8 @@
     				// If you end up here from an IE exception "SCRIPT: Invalid property value.",
     				// see #addEmbeddedCSS, bug 31676, and bug 47277 for details.
     				el.href = url;
    +
    +				$( getMarker() ).before( el );
     			}
     
     			/**
    @@ -1775,10 +1770,6 @@
     						}
     						return;
     					}
    -					// Validate input
    -					if ( typeof module !== 'string' ) {
    -						throw new Error( 'module must be a string, not a ' + typeof module );
    -					}
     					if ( hasOwn.call( registry, module ) ) {
     						throw new Error( 'module already registered: ' + module );
     					}
    @@ -1832,22 +1823,6 @@
     				 * @param {Object} [templates] List of key/value pairs to be added to mw#templates.
     				 */
     				implement: function ( module, script, style, messages, templates ) {
    -					// Validate input
    -					if ( typeof module !== 'string' ) {
    -						throw new Error( 'module must be of type string, not ' + typeof module );
    -					}
    -					if ( script && !$.isFunction( script ) && !$.isArray( script ) && typeof script !== 'string' ) {
    -						throw new Error( 'script must be of type function, array, or script; not ' + typeof script );
    -					}
    -					if ( style && !$.isPlainObject( style ) ) {
    -						throw new Error( 'style must be of type object, not ' + typeof style );
    -					}
    -					if ( messages && !$.isPlainObject( messages ) ) {
    -						throw new Error( 'messages must be of type object, not a ' + typeof messages );
    -					}
    -					if ( templates && !$.isPlainObject( templates ) ) {
    -						throw new Error( 'templates must be of type object, not a ' + typeof templates );
    -					}
     					// Automatically register module
     					if ( !hasOwn.call( registry, module ) ) {
     						mw.loader.register( module );
    @@ -1879,8 +1854,8 @@
     				 *         OO.compare( [ 1 ], [ 1 ] );
     				 *     } );
     				 *
    -				 * @param {string|Array} dependencies Module name or array of modules names the callback
    -				 *  dependends on to be ready before executing
    +				 * @param {string|Array} dependencies Module name or array of modules names the
    +				 *  callback depends on to be ready before executing
     				 * @param {Function} [ready] Callback to execute when all dependencies are ready
     				 * @param {Function} [error] Callback to execute if one or more dependencies failed
     				 * @return {jQuery.Promise}
    @@ -1892,9 +1867,6 @@
     					// Allow calling with a single dependency as a string
     					if ( typeof dependencies === 'string' ) {
     						dependencies = [ dependencies ];
    -					} else if ( !$.isArray( dependencies ) ) {
    -						// Invalid input
    -						throw new Error( 'Dependencies must be a string or an array' );
     					}
     
     					if ( ready ) {
    @@ -1935,10 +1907,6 @@
     				load: function ( modules, type ) {
     					var filtered, l;
     
    -					// Validate input
    -					if ( typeof modules !== 'object' && typeof modules !== 'string' ) {
    -						throw new Error( 'modules must be a string or an array, not a ' + typeof modules );
    -					}
     					// Allow calling with a url or single dependency as a string
     					if ( typeof modules === 'string' ) {
     						// "https://example.org/x.js", "http://example.org/x.js", "//example.org/x.js", "/x.js"
    @@ -2067,7 +2035,7 @@
     				require: function ( moduleName ) {
     					var state = mw.loader.getState( moduleName );
     
    -					// Only ready mudules can be required
    +					// Only ready modules can be required
     					if ( state !== 'ready' ) {
     						// Module may've forgotten to declare a dependency
     						throw new Error( 'Module "' + moduleName + '" is not loaded.' );
    diff --git a/resources/src/mediawiki/mediawiki.searchSuggest.js b/resources/src/mediawiki/mediawiki.searchSuggest.js
    index 2d603bf8d4..7c7aca39fa 100644
    --- a/resources/src/mediawiki/mediawiki.searchSuggest.js
    +++ b/resources/src/mediawiki/mediawiki.searchSuggest.js
    @@ -138,7 +138,7 @@
     			mw.track( 'mediawiki.searchSuggest', {
     				action: 'render-one',
     				formData: formData,
    -				index: context.config.suggestions.indexOf( text ) + 1
    +				index: context.config.suggestions.indexOf( text )
     			} );
     
     			// this is the container <div>, jQueryfied
    @@ -156,15 +156,19 @@
     		}
     
     		// The function used when the user makes a selection
    -		function selectFunction( $input ) {
    +		function selectFunction( $input, source ) {
     			var context = $input.data( 'suggestionsContext' ),
     				text = $input.val();
     
    -			mw.track( 'mediawiki.searchSuggest', {
    -				action: 'click-result',
    -				numberOfResults: context.config.suggestions.length,
    -				clickIndex: context.config.suggestions.indexOf( text ) + 1
    -			} );
    +			// Selecting via keyboard triggers a form submission. That will fire
    +			// the submit-form event in addition to this click-result event.
    +			if ( source !== 'keyboard' ) {
    +				mw.track( 'mediawiki.searchSuggest', {
    +					action: 'click-result',
    +					numberOfResults: context.config.suggestions.length,
    +					index: context.config.suggestions.indexOf( text )
    +				} );
    +			}
     
     			// allow the form to be submitted
     			return true;
    @@ -177,6 +181,12 @@
     			// linkParams object is modified and reused
     			formData.linkParams[ formData.textParam ] = query;
     
    +			mw.track( 'mediawiki.searchSuggest', {
    +				action: 'render-one',
    +				formData: formData,
    +				index: context.config.suggestions.indexOf( query )
    +			} );
    +
     			if ( $el.children().length === 0 ) {
     				$el
     					.append(
    @@ -280,9 +290,20 @@
     			},
     			special: {
     				render: specialRenderFunction,
    -				select: function ( $input ) {
    -					$input.closest( 'form' )
    -						.append( $( '<input type="hidden" name="fulltext" value="1"/>' ) );
    +				select: function ( $input, source ) {
    +					var context = $input.data( 'suggestionsContext' ),
    +						text = $input.val();
    +					if ( source === 'mouse' ) {
    +						// mouse click won't trigger form submission, so we need to send a click event
    +						mw.track( 'mediawiki.searchSuggest', {
    +							action: 'click-result',
    +							numberOfResults: context.config.suggestions.length,
    +							index: context.config.suggestions.indexOf( text )
    +						} );
    +					} else {
    +						$input.closest( 'form' )
    +							.append( $( '<input type="hidden" name="fulltext" value="1"/>' ) );
    +					}
     					return true; // allow the form to be submitted
     				}
     			},
    @@ -297,7 +318,10 @@
     					action: 'submit-form',
     					numberOfResults: context.config.suggestions.length,
     					$form: context.config.$region.closest( 'form' ),
    -					inputLocation: getInputLocation( context )
    +					inputLocation: getInputLocation( context ),
    +					index: context.config.suggestions.indexOf(
    +						context.data.$textbox.val()
    +					)
     				} );
     			} )
     			// If the form includes any fallback fulltext search buttons, remove them
    diff --git a/resources/src/mediawiki/page/gallery-slideshow.js b/resources/src/mediawiki/page/gallery-slideshow.js
    new file mode 100644
    index 0000000000..85ded4443e
    --- /dev/null
    +++ b/resources/src/mediawiki/page/gallery-slideshow.js
    @@ -0,0 +1,453 @@
    +/*!
    + * mw.GallerySlideshow: Interface controls for the slideshow gallery
    + */
    +( function ( mw, $, OO ) {
    +	/**
    +	 * mw.GallerySlideshow encapsulates the user interface of the slideshow
    +	 * galleries. An object is instantiated for each `.mw-gallery-slideshow`
    +	 * element.
    +	 *
    +	 * @class mw.GallerySlideshow
    +	 * @uses mw.Title
    +	 * @uses mw.Api
    +	 * @param {jQuery} gallery The `<ul>` element of the gallery.
    +	 */
    +	mw.GallerySlideshow = function ( gallery ) {
    +		// Properties
    +		this.$gallery = $( gallery );
    +		this.$galleryCaption = this.$gallery.find( '.gallerycaption' );
    +		this.$galleryBox = this.$gallery.find( '.gallerybox' );
    +		this.$currentImage = null;
    +		this.imageInfoCache = {};
    +		if ( this.$gallery.parent().attr( 'id' ) !== 'mw-content-text' ) {
    +			this.$container = this.$gallery.parent();
    +		}
    +
    +		// Initialize
    +		this.drawCarousel();
    +		this.setSizeRequirement();
    +		this.toggleThumbnails( false );
    +		this.showCurrentImage();
    +
    +		// Events
    +		$( window ).on(
    +			'resize',
    +			OO.ui.debounce(
    +				this.setSizeRequirement.bind( this ),
    +				100
    +			)
    +		);
    +
    +		// Disable thumbnails' link, instead show the image in the carousel
    +		this.$galleryBox.on( 'click', function ( e ) {
    +			this.$currentImage = $( e.currentTarget );
    +			this.showCurrentImage();
    +			return false;
    +		}.bind( this ) );
    +	};
    +
    +	/* Properties */
    +	/**
    +	 * @property {jQuery} $gallery The `<ul>` element of the gallery.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $galleryCaption The `<li>` that has the gallery caption.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $galleryBox Selection of `<li>` elements that have thumbnails.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $carousel The `<li>` elements that contains the carousel.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $interface The `<div>` elements that contains the interface buttons.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $img The `<img>` element that'll display the current image.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $imgLink The `<a>` element that links to the image's File page.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $imgCaption The `<p>` element that holds the image caption.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $imgContainer The `<div>` element that contains the image.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $currentImage The `<li>` element of the current image.
    +	 */
    +
    +	/**
    +	 * @property {jQuery} $container If the gallery contained in an element that is
    +	 * 	not the main content element, then it stores that element.
    +	 */
    +
    +	/**
    +	 * @property {Object} imageInfoCache A key value pair of thumbnail URLs and image info.
    +	 */
    +
    +	/**
    +	 * @property {number} imageWidth Width of the image based on viewport size
    +	 */
    +
    +	/**
    +	 * @property {number} imageHeight Height of the image based on viewport size
    +	 * 	the URLs in the required size.
    +	 */
    +
    +	/* Setup */
    +	OO.initClass( mw.GallerySlideshow );
    +
    +	/* Methods */
    +	/**
    +	 * Draws the carousel and the interface around it.
    +	 */
    +	mw.GallerySlideshow.prototype.drawCarousel = function () {
    +		var next, prev, toggle,	interfaceElements, carouselStack;
    +
    +		this.$carousel = $( '<li>' ).addClass( 'gallerycarousel' );
    +
    +		// Buttons for the interface
    +		prev = new OO.ui.ButtonWidget( {
    +			framed: false,
    +			icon: 'previous'
    +		} ).on( 'click', this.prevImage.bind( this ) );
    +
    +		next = new OO.ui.ButtonWidget( {
    +			framed: false,
    +			icon: 'next'
    +		} ).on( 'click', this.nextImage.bind( this ) );
    +
    +		toggle = new OO.ui.ButtonWidget( {
    +			framed: false,
    +			icon: 'imageGallery'
    +		} ).on( 'click', this.toggleThumbnails.bind( this ) );
    +
    +		interfaceElements = new OO.ui.PanelLayout( {
    +			expanded: false,
    +			classes: [ 'mw-gallery-slideshow-buttons' ],
    +			$content: $( '<div>' ).append(
    +				prev.$element,
    +				toggle.$element,
    +				next.$element
    +			)
    +		} );
    +		this.$interface = interfaceElements.$element;
    +
    +		// Containers for the current image, caption etc.
    +		this.$img = $( '<img>' );
    +		this.$imgLink = $( '<a>' ).append( this.$img );
    +		this.$imgCaption = $( '<p>' ).attr( 'class', 'mw-gallery-slideshow-caption' );
    +		this.$imgContainer = $( '<div>' )
    +			.attr( 'class', 'mw-gallery-slideshow-img-container' )
    +			.append( this.$imgLink );
    +
    +		carouselStack = new OO.ui.StackLayout( {
    +			continuous: true,
    +			expanded: false,
    +			items: [
    +				interfaceElements,
    +				new OO.ui.PanelLayout( {
    +					expanded: false,
    +					$content: this.$imgContainer
    +				} ),
    +				new OO.ui.PanelLayout( {
    +					expanded: false,
    +					$content: this.$imgCaption
    +				} )
    +			]
    +		} );
    +		this.$carousel.append( carouselStack.$element );
    +
    +		// Append below the caption or as the first element in the gallery
    +		if ( this.$galleryCaption.length !== 0 ) {
    +			this.$galleryCaption.after( this.$carousel );
    +		} else {
    +			this.$gallery.prepend( this.$carousel );
    +		}
    +	};
    +
    +	/**
    +	 * Sets the {@link #imageWidth} and {@link #imageHeight} properties
    +	 * based on the size of the window. Also flushes the
    +	 * {@link #imageInfoCache} as we'll now need URLs for a different
    +	 * size.
    +	 */
    +	mw.GallerySlideshow.prototype.setSizeRequirement = function () {
    +		var w, h;
    +
    +		if ( this.$container !== undefined ) {
    +			w = this.$container.width() * 0.9;
    +			h = ( this.$container.height() - this.getChromeHeight() ) * 0.9;
    +		} else {
    +			w = this.$imgContainer.width();
    +			h = Math.min( $( window ).height() * ( 3 / 4 ), this.$imgContainer.width() ) - this.getChromeHeight();
    +		}
    +
    +		// Only update and flush the cache if the size changed
    +		if ( w !== this.imageWidth || h !== this.imageHeight ) {
    +			this.imageWidth = w;
    +			this.imageHeight = h;
    +			this.imageInfoCache = {};
    +			this.setImageSize();
    +		}
    +	};
    +
    +	/**
    +	 * Gets the height of the interface elements and the
    +	 * gallery's caption.
    +	 */
    +	mw.GallerySlideshow.prototype.getChromeHeight = function () {
    +		return this.$interface.outerHeight() + this.$galleryCaption.outerHeight();
    +	};
    +
    +	/**
    +	 * Sets the height and width of {@link #$img} based on the
    +	 * proportion of the image and the values generated by
    +	 * {@link #setSizeRequirement}.
    +	 *
    +	 * @return {boolean} Whether or not the image was sized.
    +	 */
    +	mw.GallerySlideshow.prototype.setImageSize = function () {
    +		if ( this.$img === undefined || this.$thumbnail === undefined ) {
    +			return false;
    +		}
    +
    +		// Reset height and width
    +		this.$img
    +			.removeAttr( 'width' )
    +			.removeAttr( 'height' );
    +
    +		// Stretch image to take up the required size
    +		if ( this.$thumbnail.width() > this.$thumbnail.height() ) {
    +			this.$img.attr( 'width', this.imageWidth + 'px' );
    +		} else {
    +			this.$img.attr( 'height', this.imageHeight + 'px' );
    +		}
    +
    +		// Make the image smaller in case the current image
    +		// size is larger than the original file size.
    +		this.getImageInfo( this.$thumbnail ).done( function ( info ) {
    +			// NOTE: There will be a jump when resizing the window
    +			// because the cache is cleared and this a new network request.
    +			if (
    +				info.thumbwidth < this.$img.width() ||
    +				info.thumbheight < this.$img.height()
    +			) {
    +				this.$img.attr( 'width', info.thumbwidth + 'px' );
    +				this.$img.attr( 'height', info.thumbheight + 'px' );
    +			}
    +		}.bind( this ) );
    +
    +		return true;
    +	};
    +
    +	/**
    +	 * Displays the image set as {@link #$currentImage} in the carousel.
    +	 */
    +	mw.GallerySlideshow.prototype.showCurrentImage = function () {
    +		var imageLi = this.getCurrentImage(),
    +			caption = imageLi.find( '.gallerytext' );
    +
    +		// Highlight current thumbnail
    +		this.$gallery
    +			.find( '.gallerybox.slideshow-current' )
    +			.removeClass( 'slideshow-current' );
    +		imageLi.addClass( 'slideshow-current' );
    +
    +		// Show thumbnail stretched to the right size while the image loads
    +		this.$thumbnail = imageLi.find( 'img' );
    +		this.$img.attr( 'src', this.$thumbnail.attr( 'src' ) );
    +		this.$imgLink.attr( 'href', imageLi.find( 'a' ).eq( 0 ).attr( 'href' ) );
    +		this.setImageSize();
    +
    +		// Copy caption
    +		this.$imgCaption
    +			.empty()
    +			.append( caption.clone() );
    +
    +		// Load image at the required size
    +		this.loadImage( this.$thumbnail ).done( function ( info, $img ) {
    +			// Show this image to the user only if its still the current one
    +			if ( this.$thumbnail.attr( 'src' ) === $img.attr( 'src' ) ) {
    +				this.$img.attr( 'src', info.thumburl );
    +				this.setImageSize();
    +
    +				// Keep the next image ready
    +				this.loadImage( this.getNextImage().find( 'img' ) );
    +			}
    +		}.bind( this ) );
    +	};
    +
    +	/**
    +	 * Loads the full image given the `<img>` element of the thumbnail.
    +	 *
    +	 * @param {Object} $img
    +	 * @return {jQuery.Promise} Resolves with the images URL and original
    +	 *	element once the image has loaded.
    +	 */
    +	mw.GallerySlideshow.prototype.loadImage = function ( $img ) {
    +		var img, d = $.Deferred();
    +
    +		this.getImageInfo( $img ).done( function ( info ) {
    +			img = new Image();
    +			img.src = info.thumburl;
    +			img.onload = function () {
    +				d.resolve( info, $img );
    +			};
    +			img.onerror = function () {
    +				d.reject();
    +			};
    +		} ).fail( function () {
    +			d.reject();
    +		} );
    +
    +		return d.promise();
    +	};
    +
    +	/**
    +	 * Gets the image's info given an `<img>` element.
    +	 *
    +	 * @param {Object} $img
    +	 * @return {jQuery.Promise} Resolves with the image's info.
    +	 */
    +	mw.GallerySlideshow.prototype.getImageInfo = function ( $img ) {
    +		var api, title, params,
    +			imageSrc = $img.attr( 'src' );
    +
    +		if ( this.imageInfoCache[ imageSrc ] === undefined ) {
    +			api = new mw.Api();
    +			// TODO: This supports only gallery of images
    +			title = new mw.Title.newFromImg( $img );
    +			params = {
    +				action: 'query',
    +				formatversion: 2,
    +				titles: title.toString(),
    +				prop: 'imageinfo',
    +				iiprop: 'url'
    +			};
    +
    +			// Check which dimension we need to request, based on
    +			// image and container proportions.
    +			if ( this.getDimensionToRequest( $img ) === 'height' ) {
    +				params.iiurlheight = this.imageHeight;
    +			} else {
    +				params.iiurlwidth = this.imageWidth;
    +			}
    +
    +			this.imageInfoCache[ imageSrc ] = api.get( params ).then( function ( data ) {
    +				if ( OO.getProp( data, 'query', 'pages', 0, 'imageinfo', 0, 'thumburl' ) !== undefined ) {
    +					return data.query.pages[ 0 ].imageinfo[ 0 ];
    +				} else {
    +					return $.Deferred().reject();
    +				}
    +			} );
    +		}
    +
    +		return this.imageInfoCache[ imageSrc ];
    +	};
    +
    +	/**
    +	 * Given an image, the method checks whether to use the height
    +	 * or the width to request the larger image.
    +	 *
    +	 * @param {jQuery} $img
    +	 * @return {string}
    +	 */
    +	mw.GallerySlideshow.prototype.getDimensionToRequest = function ( $img ) {
    +		var ratio = $img.width() / $img.height();
    +
    +		if ( this.imageHeight * ratio <= this.imageWidth ) {
    +			return 'height';
    +		} else {
    +			return 'width';
    +		}
    +	};
    +
    +	/**
    +	 * Toggles visibility of the thumbnails.
    +	 *
    +	 * @param {boolean} show Optional argument to control the state
    +	 */
    +	mw.GallerySlideshow.prototype.toggleThumbnails = function ( show ) {
    +		this.$galleryBox.toggle( show );
    +		this.$carousel.toggleClass( 'mw-gallery-slideshow-thumbnails-toggled', show );
    +	};
    +
    +	/**
    +	 * Getter method for {@link #$currentImage}
    +	 *
    +	 * @return {jQuery}
    +	 */
    +	mw.GallerySlideshow.prototype.getCurrentImage = function () {
    +		this.$currentImage = this.$currentImage || this.$galleryBox.eq( 0 );
    +		return this.$currentImage;
    +	};
    +
    +	/**
    +	 * Gets the image after the current one. Returns the first image if
    +	 * the current one is the last.
    +	 *
    +	 * @return {jQuery}
    +	 */
    +	mw.GallerySlideshow.prototype.getNextImage = function () {
    +		// Not the last image in the gallery
    +		if ( this.$currentImage.next( '.gallerybox' )[ 0 ] !== undefined ) {
    +			return this.$currentImage.next( '.gallerybox' );
    +		} else {
    +			return this.$galleryBox.eq( 0 );
    +		}
    +	};
    +
    +	/**
    +	 * Gets the image before the current one. Returns the last image if
    +	 * the current one is the first.
    +	 *
    +	 * @return {jQuery}
    +	 */
    +	mw.GallerySlideshow.prototype.getPrevImage = function () {
    +		// Not the first image in the gallery
    +		if ( this.$currentImage.prev( '.gallerybox' )[ 0 ] !== undefined ) {
    +			return this.$currentImage.prev( '.gallerybox' );
    +		} else {
    +			return this.$galleryBox.last();
    +		}
    +	};
    +
    +	/**
    +	 * Sets the {@link #$currentImage} to the next one and shows
    +	 * it in the carousel
    +	 */
    +	mw.GallerySlideshow.prototype.nextImage = function () {
    +		this.$currentImage = this.getNextImage();
    +		this.showCurrentImage();
    +	};
    +
    +	/**
    +	 * Sets the {@link #$currentImage} to the previous one and shows
    +	 * it in the carousel
    +	 */
    +	mw.GallerySlideshow.prototype.prevImage = function () {
    +		this.$currentImage = this.getPrevImage();
    +		this.showCurrentImage();
    +	};
    +
    +	// Bootstrap all slideshow galleries
    +	$( function () {
    +		$( '.mw-gallery-slideshow' ).each( function () {
    +			/*jshint -W031 */
    +			new mw.GallerySlideshow( this );
    +			/*jshint +W031 */
    +		} );
    +	} );
    +}( mediaWiki, jQuery, OO ) );
    diff --git a/resources/src/mediawiki/page/gallery.css b/resources/src/mediawiki/page/gallery.css
    index 4d43e6af83..26463fd18c 100644
    --- a/resources/src/mediawiki/page/gallery.css
    +++ b/resources/src/mediawiki/page/gallery.css
    @@ -90,12 +90,83 @@ ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapp
     	bottom: 0;
     	left: 0; /* Needed for IE */
     	height: auto;
    +	max-height: 40%;
    +	overflow: hidden;
     	font-weight: bold;
     	margin: 2px; /* correspond to style on div.thumb */
     }
     
    +ul.mw-gallery-packed-hover li.gallerybox:hover div.gallerytextwrapper p,
    +ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper p,
    +ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper p {
    +	text-overflow: ellipsis;
    +	white-space: nowrap;
    +	overflow: hidden;
    +}
    +
    +ul.mw-gallery-packed-hover li.gallerybox div.gallerytextwrapper:hover,
    +ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper:hover,
    +ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper:hover {
    +	overflow: visible;
    +	max-height: none;
    +}
    +
    +ul.mw-gallery-packed-hover li.gallerybox div.gallerytextwrapper:hover p,
    +ul.mw-gallery-packed-overlay li.gallerybox div.gallerytextwrapper:hover p,
    +ul.mw-gallery-packed-hover li.gallerybox.mw-gallery-focused div.gallerytextwrapper:hover p {
    +	text-overflow: clip;
    +	white-space: normal;
    +	overflow: visible;
    +}
    +
     ul.mw-gallery-packed-hover,
     ul.mw-gallery-packed-overlay,
     ul.mw-gallery-packed {
     	text-align: center;
     }
    +
    +/* Slideshow */
    +ul.gallery.mw-gallery-slideshow {
    +	display: block;
    +	margin: 4em 0;
    +}
    +
    +ul.gallery.mw-gallery-slideshow .gallerycaption {
    +	font-size: 1.3em;
    +	margin: 0;
    +}
    +
    +ul.gallery.mw-gallery-slideshow .gallerycarousel.mw-gallery-slideshow-thumbnails-toggled {
    +	margin-bottom: 1.3em;
    +}
    +
    +ul.gallery.mw-gallery-slideshow .mw-gallery-slideshow-buttons {
    +	opacity: 0.5;
    +	padding: 1.3em 0;
    +}
    +
    +ul.gallery.mw-gallery-slideshow .mw-gallery-slideshow-buttons .oo-ui-buttonElement {
    +	margin: 0 2em;
    +}
    +
    +.mw-gallery-slideshow li.gallerybox.slideshow-current {
    +	background: #efefef;
    +}
    +
    +.mw-gallery-slideshow .gallerybox > div {
    +	max-width: 120px;
    +}
    +
    +ul.mw-gallery-slideshow li.gallerybox div.thumb {
    +	border: none;
    +	background: transparent;
    +}
    +
    +ul.mw-gallery-slideshow li.gallerycarousel {
    +	display: block;
    +	text-align: center;
    +}
    +
    +.mw-gallery-slideshow-img-container a {
    +	display: block;
    +}
    \ No newline at end of file
    diff --git a/resources/src/startup.js b/resources/src/startup.js
    index 312e745698..62ee94ea16 100644
    --- a/resources/src/startup.js
    +++ b/resources/src/startup.js
    @@ -3,7 +3,7 @@
      *
      * This file is where we decide whether to initialise the modern run-time.
      */
    -/*jshint unused: false, evil: true */
    +/*jshint unused: false */
     /*globals mw, RLQ: true, NORLQ: true, $VARS, $CODE, performance */
     
     var mediaWikiLoadStart = ( new Date() ).getTime(),
    diff --git a/tests/TestsAutoLoader.php b/tests/TestsAutoLoader.php
    index 8b100a23e1..2bb1d2ef21 100644
    --- a/tests/TestsAutoLoader.php
    +++ b/tests/TestsAutoLoader.php
    @@ -143,6 +143,7 @@ $wgAutoloadClasses += [
     	'NewParserTest' => "$testDir/phpunit/includes/parser/NewParserTest.php",
     	'MediaWikiParserTest' => "$testDir/phpunit/includes/parser/MediaWikiParserTest.php",
     	'ParserTest' => "$testDir/parser/parserTest.inc",
    +	'ParserTestResultNormalizer' => "$testDir/parser/parserTest.inc",
     	'ParserTestParserHook' => "$testDir/parser/parserTestsParserHook.php",
     
     	# tests/phpunit/includes/site
    diff --git a/tests/browser/features/step_definitions/create_account_steps.rb b/tests/browser/features/step_definitions/create_account_steps.rb
    index fa0570c62b..d9b4f52a91 100644
    --- a/tests/browser/features/step_definitions/create_account_steps.rb
    +++ b/tests/browser/features/step_definitions/create_account_steps.rb
    @@ -11,5 +11,5 @@ When(/^I submit the form$/) do
     end
     
     Then(/^an error message is displayed$/) do
    -  expect(on(CreateAccountPage).error_message_element.class_name).to eq 'errorbox'
    +  expect(on(CreateAccountPage).error_message_element).to exist
     end
    diff --git a/tests/browser/features/step_definitions/login_steps.rb b/tests/browser/features/step_definitions/login_steps.rb
    index bda0faac1e..9b35e998c5 100644
    --- a/tests/browser/features/step_definitions/login_steps.rb
    +++ b/tests/browser/features/step_definitions/login_steps.rb
    @@ -23,11 +23,11 @@ When(/^I log in without entering password$/) do
     end
     
     Then(/^error box should be visible$/) do
    -  expect(on(LoginErrorPage).error_box_element).to be_visible
    +  expect(on(LoginPage).error_message_element).to exist
     end
     
     Then(/^error box should not be visible$/) do
    -  expect(on(LoginErrorPage).error_box_element).not_to be_visible
    +  expect(on(LoginPage).error_message_element).not_to exist
     end
     
     Then(/^feedback should be (.+)$/) do |feedback|
    diff --git a/tests/browser/features/support/pages/create_account_page.rb b/tests/browser/features/support/pages/create_account_page.rb
    index 9c1c3ba5bf..20e274425c 100644
    --- a/tests/browser/features/support/pages/create_account_page.rb
    +++ b/tests/browser/features/support/pages/create_account_page.rb
    @@ -4,5 +4,5 @@ class CreateAccountPage
       page_url '<%=params[:page_title]%>'
     
       button(:create_account, id: 'wpCreateaccount')
    -  div(:error_message, id: 'mw-createacct-status-area')
    +  element(:error_message, css: 'div#userloginForm div.error')
     end
    diff --git a/tests/browser/features/support/pages/login_error_page.rb b/tests/browser/features/support/pages/login_error_page.rb
    deleted file mode 100644
    index 9a1805f377..0000000000
    --- a/tests/browser/features/support/pages/login_error_page.rb
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -class LoginErrorPage
    -  include PageObject
    -
    -  div(:error_box, class: 'errorbox')
    -end
    diff --git a/tests/browser/features/support/pages/login_page.rb b/tests/browser/features/support/pages/login_page.rb
    index 8ef1e44cd3..47273188b7 100644
    --- a/tests/browser/features/support/pages/login_page.rb
    +++ b/tests/browser/features/support/pages/login_page.rb
    @@ -5,6 +5,7 @@ class LoginPage
     
       page_url 'Special:UserLogin'
     
    +  element(:error_message, css: 'div#userloginForm div.error')
       div(:feedback, class: 'errorbox')
       button(:login, id: 'wpLoginAttempt')
       li(:logout, id: 'pt-logout')
    diff --git a/tests/parser/parserTest.inc b/tests/parser/parserTest.inc
    index 132743f32d..d602194b0e 100644
    --- a/tests/parser/parserTest.inc
    +++ b/tests/parser/parserTest.inc
    @@ -82,6 +82,9 @@ class ParserTest {
     
     	public $regex = "";
     	private $savedGlobals = [];
    +	private $useDwdiff = false;
    +	private $markWhitespace = false;
    +	private $normalizationFunctions = [];
     
     	/**
     	 * Sets terminal colorization and diff/quick modes depending on OS and
    @@ -116,6 +119,18 @@ class ParserTest {
     				|| isset( $options['compare'] ) ) ); // redundant output
     
     		$this->showOutput = isset( $options['show-output'] );
    +		$this->useDwdiff = isset( $options['dwdiff'] );
    +		$this->markWhitespace = isset( $options['mark-ws'] );
    +
    +		if ( isset( $options['norm'] ) ) {
    +			foreach ( explode( ',', $options['norm'] ) as $func ) {
    +				if ( in_array( $func, [ 'removeTbody', 'trimWhitespace' ] ) ) {
    +					$this->normalizationFunctions[] = $func;
    +				} else {
    +					echo "Warning: unknown normalization option \"$func\"\n";
    +				}
    +			}
    +		}
     
     		if ( isset( $options['filter'] ) ) {
     			$options['regex'] = $options['filter'];
    @@ -700,6 +715,11 @@ class ParserTest {
     
     		$this->teardownGlobals();
     
    +		if ( count( $this->normalizationFunctions ) ) {
    +			$result = ParserTestResultNormalizer::normalize( $result, $this->normalizationFunctions );
    +			$out = ParserTestResultNormalizer::normalize( $out, $this->normalizationFunctions );
    +		}
    +
     		$testResult = new ParserTestResult( $desc );
     		$testResult->expected = $result;
     		$testResult->actual = $out;
    @@ -1137,6 +1157,19 @@ class ParserTest {
     			'fileExists' => true
     		], $this->db->timestamp( '20010115123500' ), $user );
     
    +		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Audio.oga' ) );
    +		$image->recordUpload2( '', 'An awesome hitsong', 'Will it play', [
    +			'size' => 12345,
    +			'width' => 0,
    +			'height' => 0,
    +			'bits' => 0,
    +			'media_type' => MEDIATYPE_AUDIO,
    +			'mime' => 'application/ogg',
    +			'metadata' => serialize( [] ),
    +			'sha1' => Wikimedia\base_convert( '', 16, 36, 31 ),
    +			'fileExists' => true
    +		], $this->db->timestamp( '20010115123500' ), $user );
    +
     		# A DjVu file
     		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'LoremIpsum.djvu' ) );
     		$image->recordUpload2( '', 'Upload a DjVu', 'A DjVu', [
    @@ -1252,6 +1285,8 @@ class ParserTest {
     		copy( "$IP/tests/phpunit/data/parser/LoremIpsum.djvu", "$dir/5/5f/LoremIpsum.djvu" );
     		wfMkdirParents( $dir . '/0/00', null, __METHOD__ );
     		copy( "$IP/tests/phpunit/data/parser/320x240.ogv", "$dir/0/00/Video.ogv" );
    +		wfMkdirParents( $dir . '/4/41', null, __METHOD__ );
    +		copy( "$IP/tests/phpunit/data/media/say-test.ogg", "$dir/4/41/Audio.oga" );
     
     		return;
     	}
    @@ -1301,6 +1336,7 @@ class ParserTest {
     				"$dir/thumb/0/00/Video.ogv/270px--Video.ogv.jpg",
     				"$dir/thumb/0/00/Video.ogv/320px-seek=2-Video.ogv.jpg",
     				"$dir/thumb/0/00/Video.ogv/320px-seek=3.3666666666667-Video.ogv.jpg",
    +				"$dir/4/41/Audio.oga",
     			]
     		);
     
    @@ -1330,6 +1366,8 @@ class ParserTest {
     				"$dir/thumb/5/5f",
     				"$dir/thumb/5",
     				"$dir/thumb",
    +				"$dir/4/41",
    +				"$dir/4",
     				"$dir/math/f/a/5",
     				"$dir/math/f/a",
     				"$dir/math/f",
    @@ -1451,6 +1489,16 @@ class ParserTest {
     	protected function quickDiff( $input, $output,
     		$inFileTail = 'expected', $outFileTail = 'actual'
     	) {
    +		if ( $this->markWhitespace ) {
    +			$pairs = [
    +				"\n" => '¶',
    +				' ' => '·',
    +				"\t" => '→'
    +			];
    +			$input = strtr( $input, $pairs );
    +			$output = strtr( $output, $pairs );
    +		}
    +
     		# Windows, or at least the fc utility, is retarded
     		$slash = wfIsWindows() ? '\\' : '/';
     		$prefix = wfTempDir() . "{$slash}mwParser-" . mt_rand();
    @@ -1466,14 +1514,22 @@ class ParserTest {
     
     		global $wgDiff3;
     		// we assume that people with diff3 also have usual diff
    -		$shellCommand = ( wfIsWindows() && !$wgDiff3 ) ? 'fc' : 'diff -au';
    +		if ( $this->useDwdiff ) {
    +			$shellCommand = 'dwdiff -Pc';
    +		} else {
    +			$shellCommand = ( wfIsWindows() && !$wgDiff3 ) ? 'fc' : 'diff -au';
    +		}
     
     		$diff = wfShellExec( "$shellCommand $shellInfile $shellOutfile" );
     
     		unlink( $infile );
     		unlink( $outfile );
     
    -		return $this->colorDiff( $diff );
    +		if ( $this->useDwdiff ) {
    +			return $diff;
    +		} else {
    +			return $this->colorDiff( $diff );
    +		}
     	}
     
     	/**
    @@ -1681,3 +1737,84 @@ class ParserTest {
     		return true;
     	}
     }
    +
    +class ParserTestResultNormalizer {
    +	protected $doc, $xpath, $invalid;
    +
    +	public static function normalize( $text, $funcs ) {
    +		$norm = new self( $text );
    +		if ( $norm->invalid ) {
    +			return $text;
    +		}
    +		foreach ( $funcs as $func ) {
    +			$norm->$func();
    +		}
    +		return $norm->serialize();
    +	}
    +
    +	protected function __construct( $text ) {
    +		$this->doc = new DOMDocument( '1.0', 'utf-8' );
    +
    +		// Note: parsing a supposedly XHTML document with an XML parser is not
    +		// guaranteed to give accurate results. For example, it may introduce
    +		// differences in the number of line breaks in <pre> tags.
    +
    +		MediaWiki\suppressWarnings();
    +		if ( !$this->doc->loadXML( '<html><body>' . $text . '</body></html>' ) ) {
    +			$this->invalid = true;
    +		}
    +		MediaWiki\restoreWarnings();
    +		$this->xpath = new DOMXPath( $this->doc );
    +		$this->body = $this->xpath->query( '//body' )->item( 0 );
    +	}
    +
    +	protected function removeTbody() {
    +		foreach ( $this->xpath->query( '//tbody' ) as $tbody ) {
    +			while ( $tbody->firstChild ) {
    +				$child = $tbody->firstChild;
    +				$tbody->removeChild( $child );
    +				$tbody->parentNode->insertBefore( $child, $tbody );
    +			}
    +			$tbody->parentNode->removeChild( $tbody );
    +		}
    +	}
    +
    +	/**
    +	 * The point of this function is to produce a normalized DOM in which
    +	 * Tidy's output matches the output of html5depurate. Tidy both trims
    +	 * and pretty-prints, so this requires fairly aggressive treatment.
    +	 *
    +	 * In particular, note that Tidy converts <pre>x</pre> to <pre>\nx\n</pre>,
    +	 * which theoretically affects display since the second line break is not
    +	 * ignored by compliant HTML parsers.
    +	 *
    +	 * This function also removes empty elements, as does Tidy.
    +	 */
    +	protected function trimWhitespace() {
    +		foreach ( $this->xpath->query( '//text()' ) as $child ) {
    +			if ( strtolower( $child->parentNode->nodeName ) === 'pre' ) {
    +				// Just trim one line break from the start and end
    +				if ( substr_compare( $child->data, "\n", 0 ) === 0 ) {
    +					$child->data = substr( $child->data, 1 );
    +				}
    +				if ( substr_compare( $child->data, "\n", -1 ) === 0 ) {
    +					$child->data = substr( $child->data, 0, -1 );
    +				}
    +			} else {
    +				// Trim all whitespace
    +				$child->data = trim( $child->data );
    +			}
    +			if ( $child->data === '' ) {
    +				$child->parentNode->removeChild( $child );
    +			}
    +		}
    +	}
    +
    +	/**
    +	 * Serialize the XML DOM for comparison purposes. This does not generate HTML.
    +	 */
    +	protected function serialize() {
    +		return strtr( $this->doc->saveXML( $this->body ),
    +			[ '<body>' => '', '</body>' => '' ] );
    +	}
    +}
    diff --git a/tests/parser/parserTests.txt b/tests/parser/parserTests.txt
    index 1f1d53b393..f45c666bf0 100644
    --- a/tests/parser/parserTests.txt
    +++ b/tests/parser/parserTests.txt
    @@ -6572,13 +6572,15 @@ T107652: <ref>s in templates that also generate table cell attributes should be
     
     !! test
     Table with row followed by newlines and table heading
    +!! options
    +parsoid=wt2html,html2html
     !! wikitext
     {|
     |-
     
     ! foo
     |}
    -!! html
    +!! html/*
     <table>
     
     
    @@ -6590,13 +6592,15 @@ Table with row followed by newlines and table heading
     
     !! test
     Table with empty line following the start tag
    +!! options
    +parsoid=wt2html,html2html
     !! wikitext
     {|
     
     |-
     | foo
     |}
    -!! html
    +!! html/*
     <table>
     
     
    @@ -7082,12 +7086,14 @@ parsoid=wt2html
     </tbody></table>
     !! end
     
    +# T137406: Whitespace in the HTML
     !! test
    -Strip unsupported table tags
    +1. Generate correct wikitext for tables with thead/tbody/tfoot
     !! options
     parsoid=html2wt
     !! html/parsoid
     <table>
    +<caption>Test</caption>
     <thead>
     <tr>
     <th>Month</th>
    @@ -7113,20 +7119,53 @@ parsoid=html2wt
     </table>
     !! wikitext
     {|
    -
    +|+Test
     !Month
     !Savings
    -
    +|-
     |January
     |$100
    -
     |-
     |February
     |$80
    -
    +|-
     |Sum
     |$180
    +|}
    +!! html/php+tidy
    +<table>
    +<caption>Test</caption>
    +<tr>
    +<th>Month</th>
    +<th>Savings</th>
    +</tr>
    +<tr>
    +<td>January</td>
    +<td>$100</td>
    +</tr>
    +<tr>
    +<td>February</td>
    +<td>$80</td>
    +</tr>
    +<tr>
    +<td>Sum</td>
    +<td>$180</td>
    +</tr>
    +</table>
    +!! end
     
    +# T137406: No whitespace in the HTML
    +!! test
    +2. Generate correct wikitext for tables with thead/tbody/tfoot
    +!! options
    +parsoid=html2wt
    +!! html/parsoid
    +<table><thead><tr><th>heading</th></tr></thead><tbody><tr><td>foo</td></tr></tbody></table>
    +!! wikitext
    +{|
    +!heading
    +|-
    +|foo
     |}
     !! end
     
    @@ -7243,6 +7282,56 @@ parsoid=html2wt
     </table>
     !! end
     
    +!! test
    +Serialize wikitext list items as HTML list items when embedded in a HTML list
    +!! options
    +parsoid=html2wt
    +!! html
    +<ul data-parsoid='{"stx": "html"}'>
    +<li data-parsoid='{}'>a</li>
    +<li>b</li>
    +</ul>
    +!! wikitext
    +<ul>
    +<li>a</li>
    +<li>b</li>
    +</ul>
    +!! end
    +
    +# SSS FIXME: Is this actually a good thing given the
    +# odd nested list output that is generated by MW?
    +# <ul><li>foo<ul>..</ul></li></ul> instead of
    +# <ul><li>foo</li><ul>..</ul></ul>
    +!! test
    +Wikitext lists can be nested inside HTML lists
    +!! options
    +parsoid=html2wt
    +!! html
    +<ul data-parsoid='{"stx": "html"}'>
    +<li data-parsoid='{"stx": "html"}'>a
    +<ul><li>b</li></ul>
    +</li>
    +</ul>
    +
    +<ul data-parsoid='{"stx": "html"}'>
    +<li>x
    +<ul><li>y</li></ul>
    +</li>
    +</ul>
    +!! wikitext
    +<ul>
    +<li>a
    +* b
    +</li>
    +</ul>
    +
    +<ul>
    +<li>x
    +* y
    +</li>
    +</ul>
    +!! end
    +
     ###
     ### Internal links
     ###
    @@ -8261,8 +8350,6 @@ parsoid=wt2html,wt2wt,html2html
     
     !! test
     Interlanguage link
    -!! options
    -parsoid=wt2html,wt2wt,html2html
     !! wikitext
     Blah blah blah
     [[zh:Chinese]]
    @@ -8291,8 +8378,6 @@ Blah blah blah
     
     !! test
     Double interlanguage link
    -!! options
    -parsoid=wt2html,wt2wt,html2html
     !! wikitext
     Blah blah blah
     [[es:Spanish]]
    @@ -9870,7 +9955,7 @@ Magic Word: {{NUMBEROFFILES}}
     !! wikitext
     {{NUMBEROFFILES}}
     !! html
    -<p>6
    +<p>7
     </p>
     !! end
     
    @@ -10939,7 +11024,7 @@ int keyword - non-existing message
     !! wikitext
     {{int:var}}
     !! html
    -<p>&lt;var&gt;
    +<p>⧼var⧽
     </p>
     !! end
     
    @@ -23091,14 +23176,12 @@ Tables: 2c. Nested in td -- no escaping needed
     parsoid=html2wt
     !! html/*
     <table>
    -
     <tr>
     <td>foo!!bar
     </td></tr></table>
     
     !! wikitext
     {|
    -
     |foo!!bar
     |}
     !! end
    @@ -23109,14 +23192,12 @@ Tables: 3a. Nested in th
     parsoid=html2wt
     !! html/*
     <table>
    -
     <tr>
     <th>foo!bar
     </th></tr></table>
     
     !! wikitext
     {|
    -
     !foo!bar
     |}
     !! end
    @@ -23183,7 +23264,6 @@ Tables: 4a. Escape -
     parsoid=html2wt
     !! html/*
     <table>
    -
     <tr>
     <th>-bar
     </th></tr>
    @@ -23193,9 +23273,7 @@ parsoid=html2wt
     
     !! wikitext
     {|
    -
     !-bar
    -
     |-
     |<nowiki>-bar</nowiki>
     |}
    @@ -23207,7 +23285,6 @@ Tables: 4b. Escape +
     parsoid=html2wt
     !! html/*
     <table>
    -
     <tr>
     <th>+bar
     </th></tr>
    @@ -23217,9 +23294,7 @@ parsoid=html2wt
     
     !! wikitext
     {|
    -
     !+bar
    -
     |-
     |<nowiki>+bar</nowiki>
     |}
    diff --git a/tests/parserTests.php b/tests/parserTests.php
    index b3cb89ae02..5e15694c4c 100644
    --- a/tests/parserTests.php
    +++ b/tests/parserTests.php
    @@ -27,8 +27,8 @@
     define( 'MW_PARSER_TEST', true );
     
     $options = [ 'quick', 'color', 'quiet', 'help', 'show-output',
    -	'record', 'run-disabled', 'run-parsoid' ];
    -$optionsWithArgs = [ 'regex', 'filter', 'seed', 'setversion', 'file' ];
    +	'record', 'run-disabled', 'run-parsoid', 'dwdiff', 'mark-ws' ];
    +$optionsWithArgs = [ 'regex', 'filter', 'seed', 'setversion', 'file', 'norm' ];
     
     require_once __DIR__ . '/../maintenance/commandLine.inc';
     require_once __DIR__ . '/TestsAutoLoader.php';
    @@ -54,9 +54,16 @@ Options:
       --keep-uploads   Re-use the same upload directory for each test, don't delete it
       --fuzz           Do a fuzz test instead of a normal test
       --seed <n>       Start the fuzz test from the specified seed
    -  --help           Show this help message
       --run-disabled   run disabled tests
       --run-parsoid    run parsoid tests (normally disabled)
    +  --dwdiff         Use dwdiff to display diff output
    +  --mark-ws        Mark whitespace in diffs by replacing it with symbols
    +  --norm=<funcs>   Apply a comma-separated list of normalization functions to
    +                   both the expected and actual output in order to resolve
    +                   irrelevant differences. The accepted normalization functions
    +                   are: removeTbody to remove <tbody> tags; and trimWhitespace
    +                   to trim whitespace from the start and end of text nodes.
    +  --help           Show this help message
     
     ENDS;
     	exit( 0 );
    diff --git a/tests/phpunit/includes/ExportTest.php b/tests/phpunit/includes/ExportTest.php
    index a2bb97a2bc..c07708158b 100644
    --- a/tests/phpunit/includes/ExportTest.php
    +++ b/tests/phpunit/includes/ExportTest.php
    @@ -30,11 +30,12 @@ class ExportTest extends MediaWikiLangTestCase {
     
     		$title = Title::newFromText( $pageTitle );
     
    -		ob_start();
    +		$sink = new DumpStringOutput;
    +		$exporter->setOutputSink( $sink );
     		$exporter->openStream();
     		$exporter->pageByTitle( $title );
     		$exporter->closeStream();
    -		$xmlString = ob_get_clean();
    +		$xmlString = $sink->getOutput();
     
     		// This throws error if invalid xml output
     		$xmlObject = simplexml_load_string( $xmlString );
    diff --git a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php b/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
    index 9f2fdfe51d..1d48d08b1d 100644
    --- a/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
    +++ b/tests/phpunit/includes/GlobalFunctions/GlobalTest.php
    @@ -413,8 +413,8 @@ class GlobalTest extends MediaWikiTestCase {
     		);
     	}
     
    -	/** array( shorthand, expected integer ) */
     	public static function provideShorthand() {
    +		// Syntax: [ shorthand, expected integer ]
     		return [
     			# Null, empty ...
     			[ '', -1 ],
    diff --git a/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php b/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
    index 082fe222c0..c76666d36d 100644
    --- a/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
    +++ b/tests/phpunit/includes/GlobalFunctions/wfBCP47Test.php
    @@ -97,7 +97,7 @@ class WfBCP47Test extends MediaWikiTestCase {
     			 *  az-Arab-x-AZE-derbend
     			 * AZE being private, it should be lower case, hence the test above
     			 * should probably be:
    -			 *  array( 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ),
    +			 * [ 'az-arab-x-aze-derbend', 'az-Arab-x-AZE-derbend' ],
     			 */
     
     			# Private use registry values:
    diff --git a/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php b/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
    index 1f1c9beaf1..cbe2e2f533 100644
    --- a/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
    +++ b/tests/phpunit/includes/GlobalFunctions/wfUrlencodeTest.php
    @@ -80,12 +80,12 @@ class WfUrlencodeTest extends MediaWikiTestCase {
     
     	/**
     	 * Format is either:
    -	 *   array( 'input', 'expected' );
    +	 *   [ 'input', 'expected' ];
     	 * Or:
    -	 *   array( 'input',
    -	 *       array( 'Apache', 'expected' ),
    -	 *       array( 'Microsoft-IIS/7', 'expected' ),
    -	 *    ),
    +	 *   [ 'input',
    +	 *       [ 'Apache', 'expected' ],
    +	 *       [ 'Microsoft-IIS/7', 'expected' ],
    +	 *   ],
     	 * If you want to add other HTTP server name, you will have to add a new
     	 * testing method much like the testEncodingUrlWith() method above.
     	 */
    diff --git a/tests/phpunit/includes/HttpTest.php b/tests/phpunit/includes/HttpTest.php
    index 4c2e02be25..ae0b4bee8b 100644
    --- a/tests/phpunit/includes/HttpTest.php
    +++ b/tests/phpunit/includes/HttpTest.php
    @@ -106,8 +106,8 @@ class HttpTest extends MediaWikiTestCase {
     			# (\S+) - host part is made of anything not whitespaces
     			// commented these out in order to remove @group Broken
     			// @todo are these valid tests? if so, fix Http::isValidURI so it can handle them
    -			// array( false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ),
    -			// array( false, 'http://exam:ple.org/', 'hostname can not use colons!' ),
    +			// [ false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ],
    +			// [ false, 'http://exam:ple.org/', 'hostname can not use colons!' ],
     
     			# (:[0-9]+)? - port number
     			[ true, 'http://example.org:80/' ],
    @@ -212,11 +212,11 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLAUTH_DIGEST' ],
     			[ 'CURLAUTH_GSSNEGOTIATE' ],
     			[ 'CURLAUTH_NTLM' ],
    -			// array( 'CURLCLOSEPOLICY_CALLBACK' ), // removed in PHP 5.6.0
    -			// array( 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ), // removed in PHP 5.6.0
    -			// array( 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ), // removed in PHP 5.6.0
    -			// array( 'CURLCLOSEPOLICY_OLDEST' ), // removed in PHP 5.6.0
    -			// array( 'CURLCLOSEPOLICY_SLOWEST' ), // removed in PHP 5.6.0
    +			// [ 'CURLCLOSEPOLICY_CALLBACK' ], // removed in PHP 5.6.0
    +			// [ 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ], // removed in PHP 5.6.0
    +			// [ 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ], // removed in PHP 5.6.0
    +			// [ 'CURLCLOSEPOLICY_OLDEST' ], // removed in PHP 5.6.0
    +			// [ 'CURLCLOSEPOLICY_SLOWEST' ], // removed in PHP 5.6.0
     			[ 'CURLE_ABORTED_BY_CALLBACK' ],
     			[ 'CURLE_BAD_CALLING_ORDER' ],
     			[ 'CURLE_BAD_CONTENT_ENCODING' ],
    @@ -268,7 +268,7 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLE_RECV_ERROR' ],
     			[ 'CURLE_SEND_ERROR' ],
     			[ 'CURLE_SHARE_IN_USE' ],
    -			// array( 'CURLE_SSH' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLE_SSH' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLE_SSL_CACERT' ],
     			[ 'CURLE_SSL_CERTPROBLEM' ],
     			[ 'CURLE_SSL_CIPHER' ],
    @@ -286,14 +286,14 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLFTPAUTH_DEFAULT' ],
     			[ 'CURLFTPAUTH_SSL' ],
     			[ 'CURLFTPAUTH_TLS' ],
    -			// array( 'CURLFTPMETHOD_MULTICWD' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLFTPMETHOD_NOCWD' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLFTPMETHOD_SINGLECWD' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLFTPMETHOD_MULTICWD' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLFTPMETHOD_NOCWD' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLFTPMETHOD_SINGLECWD' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLFTPSSL_ALL' ],
     			[ 'CURLFTPSSL_CONTROL' ],
     			[ 'CURLFTPSSL_NONE' ],
     			[ 'CURLFTPSSL_TRY' ],
    -			// array( 'CURLINFO_CERTINFO' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLINFO_CERTINFO' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLINFO_CONNECT_TIME' ],
     			[ 'CURLINFO_CONTENT_LENGTH_DOWNLOAD' ],
     			[ 'CURLINFO_CONTENT_LENGTH_UPLOAD' ],
    @@ -308,7 +308,7 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLINFO_PRIVATE' ],
     			[ 'CURLINFO_REDIRECT_COUNT' ],
     			[ 'CURLINFO_REDIRECT_TIME' ],
    -			// array( 'CURLINFO_REDIRECT_URL' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLINFO_REDIRECT_URL' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLINFO_REQUEST_SIZE' ],
     			[ 'CURLINFO_SIZE_DOWNLOAD' ],
     			[ 'CURLINFO_SIZE_UPLOAD' ],
    @@ -329,8 +329,8 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLOPT_BUFFERSIZE' ],
     			[ 'CURLOPT_CAINFO' ],
     			[ 'CURLOPT_CAPATH' ],
    -			// array( 'CURLOPT_CERTINFO' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLOPT_CLOSEPOLICY' ), // removed in PHP 5.6.0
    +			// [ 'CURLOPT_CERTINFO' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_CLOSEPOLICY' ], // removed in PHP 5.6.0
     			[ 'CURLOPT_CONNECTTIMEOUT' ],
     			[ 'CURLOPT_CONNECTTIMEOUT_MS' ],
     			[ 'CURLOPT_COOKIE' ],
    @@ -354,8 +354,8 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLOPT_FTPPORT' ],
     			[ 'CURLOPT_FTPSSLAUTH' ],
     			[ 'CURLOPT_FTP_CREATE_MISSING_DIRS' ],
    -			// array( 'CURLOPT_FTP_FILEMETHOD' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLOPT_FTP_SKIP_PASV_IP' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_FTP_FILEMETHOD' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_FTP_SKIP_PASV_IP' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLOPT_FTP_SSL' ],
     			[ 'CURLOPT_FTP_USE_EPRT' ],
     			[ 'CURLOPT_FTP_USE_EPSV' ],
    @@ -371,14 +371,14 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLOPT_INFILESIZE' ],
     			[ 'CURLOPT_INTERFACE' ],
     			[ 'CURLOPT_IPRESOLVE' ],
    -			// array( 'CURLOPT_KEYPASSWD' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_KEYPASSWD' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLOPT_KRB4LEVEL' ],
     			[ 'CURLOPT_LOW_SPEED_LIMIT' ],
     			[ 'CURLOPT_LOW_SPEED_TIME' ],
     			[ 'CURLOPT_MAXCONNECTS' ],
     			[ 'CURLOPT_MAXREDIRS' ],
    -			// array( 'CURLOPT_MAX_RECV_SPEED_LARGE' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLOPT_MAX_SEND_SPEED_LARGE' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_MAX_RECV_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_MAX_SEND_SPEED_LARGE' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLOPT_NETRC' ],
     			[ 'CURLOPT_NOBODY' ],
     			[ 'CURLOPT_NOPROGRESS' ],
    @@ -390,7 +390,7 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLOPT_POSTREDIR' ],
     			[ 'CURLOPT_PRIVATE' ],
     			[ 'CURLOPT_PROGRESSFUNCTION' ],
    -			// array( 'CURLOPT_PROTOCOLS' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLOPT_PROXY' ],
     			[ 'CURLOPT_PROXYAUTH' ],
     			[ 'CURLOPT_PROXYPORT' ],
    @@ -402,14 +402,14 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLOPT_RANGE' ],
     			[ 'CURLOPT_READDATA' ],
     			[ 'CURLOPT_READFUNCTION' ],
    -			// array( 'CURLOPT_REDIR_PROTOCOLS' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_REDIR_PROTOCOLS' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLOPT_REFERER' ],
     			[ 'CURLOPT_RESUME_FROM' ],
     			[ 'CURLOPT_RETURNTRANSFER' ],
    -			// array( 'CURLOPT_SSH_AUTH_TYPES' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLOPT_SSH_PRIVATE_KEYFILE' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLOPT_SSH_PUBLIC_KEYFILE' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_SSH_AUTH_TYPES' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_SSH_PRIVATE_KEYFILE' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLOPT_SSH_PUBLIC_KEYFILE' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLOPT_SSLCERT' ],
     			[ 'CURLOPT_SSLCERTPASSWD' ],
     			[ 'CURLOPT_SSLCERTTYPE' ],
    @@ -437,28 +437,28 @@ class HttpTest extends MediaWikiTestCase {
     			[ 'CURLOPT_VERBOSE' ],
     			[ 'CURLOPT_WRITEFUNCTION' ],
     			[ 'CURLOPT_WRITEHEADER' ],
    -			// array( 'CURLPROTO_ALL' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_DICT' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_FILE' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_FTP' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_FTPS' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_HTTP' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_HTTPS' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_LDAP' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_LDAPS' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_SCP' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_SFTP' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_TELNET' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLPROTO_TFTP' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_ALL' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_DICT' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_FILE' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_FTP' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_FTPS' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_HTTP' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_HTTPS' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_LDAP' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_LDAPS' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_SCP' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_SFTP' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_TELNET' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROTO_TFTP' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLPROXY_HTTP' ],
    -			// array( 'CURLPROXY_SOCKS4' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLPROXY_SOCKS4' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLPROXY_SOCKS5' ],
    -			// array( 'CURLSSH_AUTH_DEFAULT' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLSSH_AUTH_HOST' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLSSH_AUTH_KEYBOARD' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLSSH_AUTH_NONE' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLSSH_AUTH_PASSWORD' ), // not present in HHVM 3.3.0-dev
    -			// array( 'CURLSSH_AUTH_PUBLICKEY' ), // not present in HHVM 3.3.0-dev
    +			// [ 'CURLSSH_AUTH_DEFAULT' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLSSH_AUTH_HOST' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLSSH_AUTH_KEYBOARD' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLSSH_AUTH_NONE' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLSSH_AUTH_PASSWORD' ], // not present in HHVM 3.3.0-dev
    +			// [ 'CURLSSH_AUTH_PUBLICKEY' ], // not present in HHVM 3.3.0-dev
     			[ 'CURLVERSION_NOW' ],
     			[ 'CURL_HTTP_VERSION_1_0' ],
     			[ 'CURL_HTTP_VERSION_1_1' ],
    diff --git a/tests/phpunit/includes/MWNamespaceTest.php b/tests/phpunit/includes/MWNamespaceTest.php
    index ca01aef682..24db44581e 100644
    --- a/tests/phpunit/includes/MWNamespaceTest.php
    +++ b/tests/phpunit/includes/MWNamespaceTest.php
    @@ -387,7 +387,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
     		$wgContentNamespaces = 5;
     		$this->assertEquals( [ NS_MAIN ], MWNamespace::getContentNamespaces() );
     
    -		# test $wgContentNamespaces === array()
    +		# test $wgContentNamespaces === []
     		$wgContentNamespaces = [];
     		$this->assertEquals( [ NS_MAIN ], MWNamespace::getContentNamespaces() );
     
    @@ -474,7 +474,7 @@ class MWNamespaceTest extends MediaWikiTestCase {
     	 * global $wgCapitalLink setting to have extended coverage.
     	 *
     	 * MWNamespace::isCapitalized() rely on two global settings:
    -	 *   $wgCapitalLinkOverrides = array(); by default
    +	 *   $wgCapitalLinkOverrides = []; by default
     	 *   $wgCapitalLinks = true; by default
     	 * This function test $wgCapitalLinks
     	 *
    diff --git a/tests/phpunit/includes/MWTimestampTest.php b/tests/phpunit/includes/MWTimestampTest.php
    index bca39824b7..70e4aeab4a 100644
    --- a/tests/phpunit/includes/MWTimestampTest.php
    +++ b/tests/phpunit/includes/MWTimestampTest.php
    @@ -102,7 +102,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
     
     	/**
     	 * Returns a list of valid timestamps in the format:
    -	 * array( type, timestamp_of_type, timestamp_in_MW )
    +	 * [ type, timestamp_of_type, timestamp_in_MW ]
     	 */
     	public static function provideValidTimestamps() {
     		return [
    @@ -124,7 +124,7 @@ class MWTimestampTest extends MediaWikiLangTestCase {
     
     	/**
     	 * Returns a list of out of range timestamps in the format:
    -	 * array( type, timestamp_of_type )
    +	 * [ type, timestamp_of_type ]
     	 */
     	public static function provideOutOfRangeTimestamps() {
     		return [
    diff --git a/tests/phpunit/includes/MediaWikiServicesTest.php b/tests/phpunit/includes/MediaWikiServicesTest.php
    index 0e13721a54..d20344dc33 100644
    --- a/tests/phpunit/includes/MediaWikiServicesTest.php
    +++ b/tests/phpunit/includes/MediaWikiServicesTest.php
    @@ -315,6 +315,7 @@ class MediaWikiServicesTest extends MediaWikiTestCase {
     			'DBLoadBalancerFactory' => [ 'DBLoadBalancerFactory', 'LBFactory' ],
     			'DBLoadBalancer' => [ 'DBLoadBalancer', 'LoadBalancer' ],
     			'WatchedItemStore' => [ 'WatchedItemStore', WatchedItemStore::class ],
    +			'WatchedItemQueryService' => [ 'WatchedItemQueryService', WatchedItemQueryService::class ],
     			'GenderCache' => [ 'GenderCache', GenderCache::class ],
     			'LinkCache' => [ 'LinkCache', LinkCache::class ],
     			'LinkRenderer' => [ 'LinkRenderer', LinkRenderer::class ],
    diff --git a/tests/phpunit/includes/MessageTest.php b/tests/phpunit/includes/MessageTest.php
    index 8aa136144d..4c689abb04 100644
    --- a/tests/phpunit/includes/MessageTest.php
    +++ b/tests/phpunit/includes/MessageTest.php
    @@ -223,13 +223,13 @@ class MessageTest extends MediaWikiLangTestCase {
     	 */
     	public function testToStringKey() {
     		$this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->text() );
    -		$this->assertEquals( '<i-dont-exist-evar>', wfMessage( 'i-dont-exist-evar' )->text() );
    -		$this->assertEquals( '<i<dont>exist-evar>', wfMessage( 'i<dont>exist-evar' )->text() );
    -		$this->assertEquals( '<i-dont-exist-evar>', wfMessage( 'i-dont-exist-evar' )->plain() );
    -		$this->assertEquals( '<i<dont>exist-evar>', wfMessage( 'i<dont>exist-evar' )->plain() );
    -		$this->assertEquals( '&lt;i-dont-exist-evar&gt;', wfMessage( 'i-dont-exist-evar' )->escaped() );
    +		$this->assertEquals( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->text() );
    +		$this->assertEquals( '⧼i&lt;dont&gt;exist-evar⧽', wfMessage( 'i<dont>exist-evar' )->text() );
    +		$this->assertEquals( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->plain() );
    +		$this->assertEquals( '⧼i&lt;dont&gt;exist-evar⧽', wfMessage( 'i<dont>exist-evar' )->plain() );
    +		$this->assertEquals( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->escaped() );
     		$this->assertEquals(
    -			'&lt;i&lt;dont&gt;exist-evar&gt;',
    +			'⧼i&lt;dont&gt;exist-evar⧽',
     			wfMessage( 'i<dont>exist-evar' )->escaped()
     		);
     	}
    @@ -237,8 +237,10 @@ class MessageTest extends MediaWikiLangTestCase {
     	public static function provideToString() {
     		return [
     			[ 'mainpage', 'Main Page' ],
    -			[ 'i-dont-exist-evar', '<i-dont-exist-evar>' ],
    -			[ 'i-dont-exist-evar', '&lt;i-dont-exist-evar&gt;', 'escaped' ],
    +			[ 'i-dont-exist-evar', '⧼i-dont-exist-evar⧽' ],
    +			[ 'i-dont-exist-evar', '⧼i-dont-exist-evar⧽', 'escaped' ],
    +			[ 'script>alert(1)</script', '⧼script&gt;alert(1)&lt;/script⧽', 'escaped' ],
    +			[ 'script>alert(1)</script', '⧼script&gt;alert(1)&lt;/script⧽' ],
     		];
     	}
     
    @@ -589,6 +591,10 @@ class MessageTest extends MediaWikiLangTestCase {
     	public function testNewFromSpecifier( $value, $expectedText ) {
     		$message = Message::newFromSpecifier( $value );
     		$this->assertInstanceOf( Message::class, $message );
    +		if ( $value instanceof Message ) {
    +			$this->assertInstanceOf( get_class( $value ), $message );
    +			$this->assertEquals( $value, $message );
    +		}
     		$this->assertSame( $expectedText, $message->text() );
     	}
     
    @@ -602,6 +608,7 @@ class MessageTest extends MediaWikiLangTestCase {
     			'array' => [ [ 'youhavenewmessages', 'foo', 'bar' ], 'You have foo (bar).' ],
     			'Message' => [ new Message( 'youhavenewmessages', [ 'foo', 'bar' ] ), 'You have foo (bar).' ],
     			'RawMessage' => [ new RawMessage( 'foo ($1)', [ 'bar' ] ), 'foo (bar)' ],
    +			'ApiMessage' => [ new ApiMessage( [ 'mainpage' ], 'code', [ 'data' ] ), 'Main Page' ],
     			'MessageSpecifier' => [ $messageSpecifier, 'Main Page' ],
     			'nested RawMessage' => [ [ new RawMessage( 'foo ($1)', [ 'bar' ] ) ], 'foo (bar)' ],
     		];
    diff --git a/tests/phpunit/includes/SanitizerTest.php b/tests/phpunit/includes/SanitizerTest.php
    index 72d71667b2..26529e871c 100644
    --- a/tests/phpunit/includes/SanitizerTest.php
    +++ b/tests/phpunit/includes/SanitizerTest.php
    @@ -248,7 +248,7 @@ class SanitizerTest extends MediaWikiTestCase {
     	}
     
     	public static function provideDeprecatedAttributes() {
    -		/** array( <attribute>, <element>, [message] ) */
    +		/** [ <attribute>, <element>, [message] ] */
     		return [
     			[ 'clear="left"', 'br' ],
     			[ 'clear="all"', 'br' ],
    @@ -276,7 +276,7 @@ class SanitizerTest extends MediaWikiTestCase {
     	}
     
     	public static function provideCssCommentsFixtures() {
    -		/** array( <expected>, <css>, [message] ) */
    +		/** [ <expected>, <css>, [message] ] */
     		return [
     			// Valid comments spanning entire input
     			[ '/**/', '/**/' ],
    @@ -353,7 +353,7 @@ class SanitizerTest extends MediaWikiTestCase {
     	}
     
     	public static function provideEscapeIdReferenceList() {
    -		/** array( <reference list>, <individual id 1>, <individual id 2> ) */
    +		/** [ <reference list>, <individual id 1>, <individual id 2> ] */
     		return [
     			[ 'foo bar', 'foo', 'bar' ],
     			[ '#1 #2', '#1', '#2' ],
    diff --git a/tests/phpunit/includes/StatusTest.php b/tests/phpunit/includes/StatusTest.php
    index 782fab0c6b..474a481a6e 100644
    --- a/tests/phpunit/includes/StatusTest.php
    +++ b/tests/phpunit/includes/StatusTest.php
    @@ -376,9 +376,9 @@ class StatusTest extends MediaWikiLangTestCase {
     		$status->warning( 'fooBar!' );
     		$testCases['1StringWarning'] = [
     			$status,
    -			"<fooBar!>",
    +			"⧼fooBar!⧽",
     			"(wrap-short: (fooBar!))",
    -			"<p>&lt;fooBar!&gt;\n</p>",
    +			"<p>⧼fooBar!⧽\n</p>",
     			"<p>(wrap-short: (fooBar!))\n</p>",
     		];
     
    @@ -387,9 +387,9 @@ class StatusTest extends MediaWikiLangTestCase {
     		$status->warning( 'fooBar2!' );
     		$testCases['2StringWarnings'] = [
     			$status,
    -			"* <fooBar!>\n* <fooBar2!>\n",
    +			"* ⧼fooBar!⧽\n* ⧼fooBar2!⧽\n",
     			"(wrap-long: * (fooBar!)\n* (fooBar2!)\n)",
    -			"<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
    +			"<ul><li> ⧼fooBar!⧽</li>\n<li> ⧼fooBar2!⧽</li></ul>\n",
     			"<p>(wrap-long: * (fooBar!)\n</p>\n<ul><li> (fooBar2!)</li></ul>\n<p>)\n</p>",
     		];
     
    @@ -397,9 +397,9 @@ class StatusTest extends MediaWikiLangTestCase {
     		$status->warning( new Message( 'fooBar!', [ 'foo', 'bar' ] ) );
     		$testCases['1MessageWarning'] = [
     			$status,
    -			"<fooBar!>",
    +			"⧼fooBar!⧽",
     			"(wrap-short: (fooBar!: foo, bar))",
    -			"<p>&lt;fooBar!&gt;\n</p>",
    +			"<p>⧼fooBar!⧽\n</p>",
     			"<p>(wrap-short: (fooBar!: foo, bar))\n</p>",
     		];
     
    @@ -408,9 +408,9 @@ class StatusTest extends MediaWikiLangTestCase {
     		$status->warning( new Message( 'fooBar2!' ) );
     		$testCases['2MessageWarnings'] = [
     			$status,
    -			"* <fooBar!>\n* <fooBar2!>\n",
    +			"* ⧼fooBar!⧽\n* ⧼fooBar2!⧽\n",
     			"(wrap-long: * (fooBar!: foo, bar)\n* (fooBar2!)\n)",
    -			"<ul><li> &lt;fooBar!&gt;</li>\n<li> &lt;fooBar2!&gt;</li></ul>\n",
    +			"<ul><li> ⧼fooBar!⧽</li>\n<li> ⧼fooBar2!⧽</li></ul>\n",
     			"<p>(wrap-long: * (fooBar!: foo, bar)\n</p>\n<ul><li> (fooBar2!)</li></ul>\n<p>)\n</p>",
     		];
     
    diff --git a/tests/phpunit/includes/TestUser.php b/tests/phpunit/includes/TestUser.php
    index 8b8cbcd4d9..86f4ae789d 100644
    --- a/tests/phpunit/includes/TestUser.php
    +++ b/tests/phpunit/includes/TestUser.php
    @@ -6,25 +6,19 @@
      */
     class TestUser {
     	/**
    -	 * @deprecated Since 1.25. Use TestUser::getUser()->getName()
    -	 * @private
     	 * @var string
     	 */
    -	public $username;
    +	private $username;
     
     	/**
    -	 * @deprecated Since 1.25. Use TestUser::getPassword()
    -	 * @private
     	 * @var string
     	 */
    -	public $password;
    +	private $password;
     
     	/**
    -	 * @deprecated Since 1.25. Use TestUser::getUser()
    -	 * @private
     	 * @var User
     	 */
    -	public $user;
    +	private $user;
     
     	private function assertNotReal() {
     		global $wgDBprefix;
    diff --git a/tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php b/tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php
    new file mode 100644
    index 0000000000..1d232fee8e
    --- /dev/null
    +++ b/tests/phpunit/includes/WatchedItemQueryServiceUnitTest.php
    @@ -0,0 +1,1312 @@
    +<?php
    +
    +/**
    + * @covers WatchedItemQueryService
    + */
    +class WatchedItemQueryServiceUnitTest extends PHPUnit_Framework_TestCase {
    +
    +	/**
    +	 * @return PHPUnit_Framework_MockObject_MockObject|DatabaseBase
    +	 */
    +	private function getMockDb() {
    +		$mock = $this->getMockBuilder( DatabaseBase::class )
    +			->disableOriginalConstructor()
    +			->getMock();
    +
    +		$mock->expects( $this->any() )
    +			->method( 'makeList' )
    +			->with(
    +				$this->isType( 'array' ),
    +				$this->isType( 'int' )
    +			)
    +			->will( $this->returnCallback( function( $a, $conj ) {
    +				$sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
    +				return join( $sqlConj, array_map( function( $s ) {
    +					return '(' . $s . ')';
    +				}, $a
    +				) );
    +			} ) );
    +
    +		$mock->expects( $this->any() )
    +			->method( 'addQuotes' )
    +			->will( $this->returnCallback( function( $value ) {
    +				return "'$value'";
    +			} ) );
    +
    +		$mock->expects( $this->any() )
    +			->method( 'timestamp' )
    +			->will( $this->returnArgument( 0 ) );
    +
    +		$mock->expects( $this->any() )
    +			->method( 'bitAnd' )
    +			->willReturnCallback( function( $a, $b ) {
    +				return "($a & $b)";
    +			} );
    +
    +		return $mock;
    +	}
    +
    +	/**
    +	 * @param $mockDb
    +	 * @return PHPUnit_Framework_MockObject_MockObject|LoadBalancer
    +	 */
    +	private function getMockLoadBalancer( $mockDb ) {
    +		$mock = $this->getMockBuilder( LoadBalancer::class )
    +			->disableOriginalConstructor()
    +			->getMock();
    +		$mock->expects( $this->any() )
    +			->method( 'getConnection' )
    +			->with( DB_SLAVE )
    +			->will( $this->returnValue( $mockDb ) );
    +		return $mock;
    +	}
    +
    +	/**
    +	 * @param int $id
    +	 * @return PHPUnit_Framework_MockObject_MockObject|User
    +	 */
    +	private function getMockNonAnonUserWithId( $id ) {
    +		$mock = $this->getMock( User::class );
    +		$mock->expects( $this->any() )
    +			->method( 'isAnon' )
    +			->will( $this->returnValue( false ) );
    +		$mock->expects( $this->any() )
    +			->method( 'getId' )
    +			->will( $this->returnValue( $id ) );
    +		return $mock;
    +	}
    +
    +	/**
    +	 * @param int $id
    +	 * @return PHPUnit_Framework_MockObject_MockObject|User
    +	 */
    +	private function getMockUnrestrictedNonAnonUserWithId( $id ) {
    +		$mock = $this->getMockNonAnonUserWithId( $id );
    +		$mock->expects( $this->any() )
    +			->method( 'isAllowed' )
    +			->will( $this->returnValue( true ) );
    +		$mock->expects( $this->any() )
    +			->method( 'isAllowedAny' )
    +			->will( $this->returnValue( true ) );
    +		$mock->expects( $this->any() )
    +			->method( 'useRCPatrol' )
    +			->will( $this->returnValue( true ) );
    +		return $mock;
    +	}
    +
    +	/**
    +	 * @param int $id
    +	 * @param string $notAllowedAction
    +	 * @return PHPUnit_Framework_MockObject_MockObject|User
    +	 */
    +	private function getMockNonAnonUserWithIdAndRestrictedPermissions( $id, $notAllowedAction ) {
    +		$mock = $this->getMockNonAnonUserWithId( $id );
    +
    +		$mock->expects( $this->any() )
    +			->method( 'isAllowed' )
    +			->will( $this->returnCallback( function( $action ) use ( $notAllowedAction ) {
    +				return $action !== $notAllowedAction;
    +			} ) );
    +		$mock->expects( $this->any() )
    +			->method( 'isAllowedAny' )
    +			->will( $this->returnCallback( function() use ( $notAllowedAction ) {
    +				$actions = func_get_args();
    +				return !in_array( $notAllowedAction, $actions );
    +			} ) );
    +
    +		return $mock;
    +	}
    +
    +	/**
    +	 * @param int $id
    +	 * @return PHPUnit_Framework_MockObject_MockObject|User
    +	 */
    +	private function getMockNonAnonUserWithIdAndNoPatrolRights( $id ) {
    +		$mock = $this->getMockNonAnonUserWithId( $id );
    +
    +		$mock->expects( $this->any() )
    +			->method( 'isAllowed' )
    +			->will( $this->returnValue( true ) );
    +		$mock->expects( $this->any() )
    +			->method( 'isAllowedAny' )
    +			->will( $this->returnValue( true ) );
    +
    +		$mock->expects( $this->any() )
    +			->method( 'useRCPatrol' )
    +			->will( $this->returnValue( false ) );
    +		$mock->expects( $this->any() )
    +			->method( 'useNPPatrol' )
    +			->will( $this->returnValue( false ) );
    +
    +		return $mock;
    +	}
    +
    +	private function getMockAnonUser() {
    +		$mock = $this->getMock( User::class );
    +		$mock->expects( $this->any() )
    +			->method( 'isAnon' )
    +			->will( $this->returnValue( true ) );
    +		return $mock;
    +	}
    +
    +	private function getFakeRow( array $rowValues ) {
    +		$fakeRow = new stdClass();
    +		foreach ( $rowValues as $valueName => $value ) {
    +			$fakeRow->$valueName = $value;
    +		}
    +		return $fakeRow;
    +	}
    +
    +	public function testGetWatchedItemsWithRecentChangeInfo() {
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				[ 'recentchanges', 'watchlist', 'page' ],
    +				[
    +					'rc_id',
    +					'rc_namespace',
    +					'rc_title',
    +					'rc_timestamp',
    +					'rc_type',
    +					'rc_deleted',
    +					'wl_notificationtimestamp',
    +					'rc_cur_id',
    +					'rc_this_oldid',
    +					'rc_last_oldid',
    +				],
    +				[
    +					'wl_user' => 1,
    +					'(rc_this_oldid=page_latest) OR (rc_type=3)',
    +				],
    +				$this->isType( 'string' ),
    +				[],
    +				[
    +					'watchlist' => [
    +						'INNER JOIN',
    +						[
    +							'wl_namespace=rc_namespace',
    +							'wl_title=rc_title'
    +						]
    +					],
    +					'page' => [
    +						'LEFT JOIN',
    +						'rc_cur_id=page_id',
    +					],
    +				]
    +			)
    +			->will( $this->returnValue( [
    +				$this->getFakeRow( [
    +					'rc_id' => 1,
    +					'rc_namespace' => 0,
    +					'rc_title' => 'Foo1',
    +					'rc_timestamp' => '20151212010101',
    +					'rc_type' => RC_NEW,
    +					'rc_deleted' => 0,
    +					'wl_notificationtimestamp' => '20151212010101',
    +				] ),
    +				$this->getFakeRow( [
    +					'rc_id' => 2,
    +					'rc_namespace' => 1,
    +					'rc_title' => 'Foo2',
    +					'rc_timestamp' => '20151212010102',
    +					'rc_type' => RC_NEW,
    +					'rc_deleted' => 0,
    +					'wl_notificationtimestamp' => null,
    +				] ),
    +			] ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
    +
    +		$items = $queryService->getWatchedItemsWithRecentChangeInfo( $user );
    +
    +		$this->assertInternalType( 'array', $items );
    +		$this->assertCount( 2, $items );
    +
    +		foreach ( $items as list( $watchedItem, $recentChangeInfo ) ) {
    +			$this->assertInstanceOf( WatchedItem::class, $watchedItem );
    +			$this->assertInternalType( 'array', $recentChangeInfo );
    +		}
    +
    +		$this->assertEquals(
    +			new WatchedItem( $user, new TitleValue( 0, 'Foo1' ), '20151212010101' ),
    +			$items[0][0]
    +		);
    +		$this->assertEquals(
    +			[
    +				'rc_id' => 1,
    +				'rc_namespace' => 0,
    +				'rc_title' => 'Foo1',
    +				'rc_timestamp' => '20151212010101',
    +				'rc_type' => RC_NEW,
    +				'rc_deleted' => 0,
    +			],
    +			$items[0][1]
    +		);
    +
    +		$this->assertEquals(
    +			new WatchedItem( $user, new TitleValue( 1, 'Foo2' ), null ),
    +			$items[1][0]
    +		);
    +		$this->assertEquals(
    +			[
    +				'rc_id' => 2,
    +				'rc_namespace' => 1,
    +				'rc_title' => 'Foo2',
    +				'rc_timestamp' => '20151212010102',
    +				'rc_type' => RC_NEW,
    +				'rc_deleted' => 0,
    +			],
    +			$items[1][1]
    +		);
    +	}
    +
    +	public function getWatchedItemsWithRecentChangeInfoOptionsProvider() {
    +		return [
    +			[
    +				[ 'includeFields' => [ WatchedItemQueryService::INCLUDE_FLAGS ] ],
    +				[ 'rc_type', 'rc_minor', 'rc_bot' ],
    +				[],
    +				[],
    +			],
    +			[
    +				[ 'includeFields' => [ WatchedItemQueryService::INCLUDE_USER ] ],
    +				[ 'rc_user_text' ],
    +				[],
    +				[],
    +			],
    +			[
    +				[ 'includeFields' => [ WatchedItemQueryService::INCLUDE_USER_ID ] ],
    +				[ 'rc_user' ],
    +				[],
    +				[],
    +			],
    +			[
    +				[ 'includeFields' => [ WatchedItemQueryService::INCLUDE_COMMENT ] ],
    +				[ 'rc_comment' ],
    +				[],
    +				[],
    +			],
    +			[
    +				[ 'includeFields' => [ WatchedItemQueryService::INCLUDE_PATROL_INFO ] ],
    +				[ 'rc_patrolled', 'rc_log_type' ],
    +				[],
    +				[],
    +			],
    +			[
    +				[ 'includeFields' => [ WatchedItemQueryService::INCLUDE_SIZES ] ],
    +				[ 'rc_old_len', 'rc_new_len' ],
    +				[],
    +				[],
    +			],
    +			[
    +				[ 'includeFields' => [ WatchedItemQueryService::INCLUDE_LOG_INFO ] ],
    +				[ 'rc_logid', 'rc_log_type', 'rc_log_action', 'rc_params' ],
    +				[],
    +				[],
    +			],
    +			[
    +				[ 'namespaceIds' => [ 0, 1 ] ],
    +				[],
    +				[ 'wl_namespace' => [ 0, 1 ] ],
    +				[],
    +			],
    +			[
    +				[ 'namespaceIds' => [ 0, "1; DROP TABLE watchlist;\n--" ] ],
    +				[],
    +				[ 'wl_namespace' => [ 0, 1 ] ],
    +				[],
    +			],
    +			[
    +				[ 'rcTypes' => [ RC_EDIT, RC_NEW ] ],
    +				[],
    +				[ 'rc_type' => [ RC_EDIT, RC_NEW ] ],
    +				[],
    +			],
    +			[
    +				[ 'dir' => WatchedItemQueryService::DIR_OLDER ],
    +				[],
    +				[],
    +				[ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
    +			],
    +			[
    +				[ 'dir' => WatchedItemQueryService::DIR_NEWER ],
    +				[],
    +				[],
    +				[ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
    +			],
    +			[
    +				[ 'dir' => WatchedItemQueryService::DIR_OLDER, 'start' => '20151212010101' ],
    +				[],
    +				[ "rc_timestamp <= '20151212010101'" ],
    +				[ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
    +			],
    +			[
    +				[ 'dir' => WatchedItemQueryService::DIR_OLDER, 'end' => '20151212010101' ],
    +				[],
    +				[ "rc_timestamp >= '20151212010101'" ],
    +				[ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
    +			],
    +			[
    +				[
    +					'dir' => WatchedItemQueryService::DIR_OLDER,
    +					'start' => '20151212020101',
    +					'end' => '20151212010101'
    +				],
    +				[],
    +				[ "rc_timestamp <= '20151212020101'", "rc_timestamp >= '20151212010101'" ],
    +				[ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ]
    +			],
    +			[
    +				[ 'dir' => WatchedItemQueryService::DIR_NEWER, 'start' => '20151212010101' ],
    +				[],
    +				[ "rc_timestamp >= '20151212010101'" ],
    +				[ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
    +			],
    +			[
    +				[ 'dir' => WatchedItemQueryService::DIR_NEWER, 'end' => '20151212010101' ],
    +				[],
    +				[ "rc_timestamp <= '20151212010101'" ],
    +				[ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
    +			],
    +			[
    +				[
    +					'dir' => WatchedItemQueryService::DIR_NEWER,
    +					'start' => '20151212010101',
    +					'end' => '20151212020101'
    +				],
    +				[],
    +				[ "rc_timestamp >= '20151212010101'", "rc_timestamp <= '20151212020101'" ],
    +				[ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ]
    +			],
    +			[
    +				[ 'limit' => 10 ],
    +				[],
    +				[],
    +				[ 'LIMIT' => 10 ],
    +			],
    +			[
    +				[ 'limit' => "10; DROP TABLE watchlist;\n--" ],
    +				[],
    +				[],
    +				[ 'LIMIT' => 10 ],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_MINOR ] ],
    +				[],
    +				[ 'rc_minor != 0' ],
    +				[],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_NOT_MINOR ] ],
    +				[],
    +				[ 'rc_minor = 0' ],
    +				[],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_BOT ] ],
    +				[],
    +				[ 'rc_bot != 0' ],
    +				[],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_NOT_BOT ] ],
    +				[],
    +				[ 'rc_bot = 0' ],
    +				[],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_ANON ] ],
    +				[],
    +				[ 'rc_user = 0' ],
    +				[],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_NOT_ANON ] ],
    +				[],
    +				[ 'rc_user != 0' ],
    +				[],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_PATROLLED ] ],
    +				[],
    +				[ 'rc_patrolled != 0' ],
    +				[],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_NOT_PATROLLED ] ],
    +				[],
    +				[ 'rc_patrolled = 0' ],
    +				[],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_UNREAD ] ],
    +				[],
    +				[ 'rc_timestamp >= wl_notificationtimestamp' ],
    +				[],
    +			],
    +			[
    +				[ 'filters' => [ WatchedItemQueryService::FILTER_NOT_UNREAD ] ],
    +				[],
    +				[ 'wl_notificationtimestamp IS NULL OR rc_timestamp < wl_notificationtimestamp' ],
    +				[],
    +			],
    +			[
    +				[ 'onlyByUser' => 'SomeOtherUser' ],
    +				[],
    +				[ 'rc_user_text' => 'SomeOtherUser' ],
    +				[],
    +			],
    +			[
    +				[ 'notByUser' => 'SomeOtherUser' ],
    +				[],
    +				[ "rc_user_text != 'SomeOtherUser'" ],
    +				[],
    +			],
    +			[
    +				[ 'startFrom' => [ '20151212010101', 123 ], 'dir' => WatchedItemQueryService::DIR_OLDER ],
    +				[],
    +				[
    +					"(rc_timestamp < '20151212010101') OR ((rc_timestamp = '20151212010101') AND (rc_id <= 123))"
    +				],
    +				[ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ],
    +			],
    +			[
    +				[ 'startFrom' => [ '20151212010101', 123 ], 'dir' => WatchedItemQueryService::DIR_NEWER ],
    +				[],
    +				[
    +					"(rc_timestamp > '20151212010101') OR ((rc_timestamp = '20151212010101') AND (rc_id >= 123))"
    +				],
    +				[ 'ORDER BY' => [ 'rc_timestamp', 'rc_id' ] ],
    +			],
    +			[
    +				[
    +					'startFrom' => [ '20151212010101', "123; DROP TABLE watchlist;\n--" ],
    +					'dir' => WatchedItemQueryService::DIR_OLDER
    +				],
    +				[],
    +				[
    +					"(rc_timestamp < '20151212010101') OR ((rc_timestamp = '20151212010101') AND (rc_id <= 123))"
    +				],
    +				[ 'ORDER BY' => [ 'rc_timestamp DESC', 'rc_id DESC' ] ],
    +			],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider getWatchedItemsWithRecentChangeInfoOptionsProvider
    +	 */
    +	public function testGetWatchedItemsWithRecentChangeInfo_optionsAndEmptyResult(
    +		array $options,
    +		array $expectedExtraFields,
    +		array $expectedExtraConds,
    +		array $expectedDbOptions
    +	) {
    +		$expectedFields = array_merge(
    +			[
    +				'rc_id',
    +				'rc_namespace',
    +				'rc_title',
    +				'rc_timestamp',
    +				'rc_type',
    +				'rc_deleted',
    +				'wl_notificationtimestamp',
    +
    +				'rc_cur_id',
    +				'rc_this_oldid',
    +				'rc_last_oldid',
    +			],
    +			$expectedExtraFields
    +		);
    +		$expectedConds = array_merge(
    +			[ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)', ],
    +			$expectedExtraConds
    +		);
    +
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				[ 'recentchanges', 'watchlist', 'page' ],
    +				$expectedFields,
    +				$expectedConds,
    +				$this->isType( 'string' ),
    +				$expectedDbOptions,
    +				[
    +					'watchlist' => [
    +						'INNER JOIN',
    +						[
    +							'wl_namespace=rc_namespace',
    +							'wl_title=rc_title'
    +						]
    +					],
    +					'page' => [
    +						'LEFT JOIN',
    +						'rc_cur_id=page_id',
    +					],
    +				]
    +			)
    +			->will( $this->returnValue( [] ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
    +
    +		$items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
    +
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function filterPatrolledOptionProvider() {
    +		return [
    +			[ WatchedItemQueryService::FILTER_PATROLLED ],
    +			[ WatchedItemQueryService::FILTER_NOT_PATROLLED ],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider filterPatrolledOptionProvider
    +	 */
    +	public function testGetWatchedItemsWithRecentChangeInfo_filterPatrolledAndUserWithNoPatrolRights(
    +		$filtersOption
    +	) {
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				[ 'recentchanges', 'watchlist', 'page' ],
    +				$this->isType( 'array' ),
    +				[ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)' ],
    +				$this->isType( 'string' ),
    +				$this->isType( 'array' ),
    +				$this->isType( 'array' )
    +			)
    +			->will( $this->returnValue( [] ) );
    +
    +		$user = $this->getMockNonAnonUserWithIdAndNoPatrolRights( 1 );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$items = $queryService->getWatchedItemsWithRecentChangeInfo(
    +			$user,
    +			[ 'filters' => [ $filtersOption ] ]
    +		);
    +
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function mysqlIndexOptimizationProvider() {
    +		return [
    +			[
    +				'mysql',
    +				[],
    +				[ "rc_timestamp > ''" ],
    +			],
    +			[
    +				'mysql',
    +				[ 'start' => '20151212010101', 'dir' => WatchedItemQueryService::DIR_OLDER ],
    +				[ "rc_timestamp <= '20151212010101'" ],
    +			],
    +			[
    +				'mysql',
    +				[ 'end' => '20151212010101', 'dir' => WatchedItemQueryService::DIR_OLDER ],
    +				[ "rc_timestamp >= '20151212010101'" ],
    +			],
    +			[
    +				'postgres',
    +				[],
    +				[],
    +			],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider mysqlIndexOptimizationProvider
    +	 */
    +	public function testGetWatchedItemsWithRecentChangeInfo_mysqlIndexOptimization(
    +		$dbType,
    +		array $options,
    +		array $expectedExtraConds
    +	) {
    +		$commonConds = [ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)' ];
    +		$conds = array_merge( $commonConds, $expectedExtraConds );
    +
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				[ 'recentchanges', 'watchlist', 'page' ],
    +				$this->isType( 'array' ),
    +				$conds,
    +				$this->isType( 'string' ),
    +				$this->isType( 'array' ),
    +				$this->isType( 'array' )
    +			)
    +			->will( $this->returnValue( [] ) );
    +		$mockDb->expects( $this->any() )
    +			->method( 'getType' )
    +			->will( $this->returnValue( $dbType ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
    +
    +		$items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
    +
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function userPermissionRelatedExtraChecksProvider() {
    +		return [
    +			[
    +				[],
    +				'deletedhistory',
    +				[
    +					'(rc_type != ' . RC_LOG . ') OR ((rc_deleted & ' . LogPage::DELETED_ACTION . ') != ' .
    +						LogPage::DELETED_ACTION . ')'
    +				],
    +			],
    +			[
    +				[],
    +				'suppressrevision',
    +				[
    +					'(rc_type != ' . RC_LOG . ') OR (' .
    +						'(rc_deleted & ' . ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ') != ' .
    +						( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ')'
    +				],
    +			],
    +			[
    +				[],
    +				'viewsuppressed',
    +				[
    +					'(rc_type != ' . RC_LOG . ') OR (' .
    +						'(rc_deleted & ' . ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ') != ' .
    +						( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ')'
    +				],
    +			],
    +			[
    +				[ 'onlyByUser' => 'SomeOtherUser' ],
    +				'deletedhistory',
    +				[
    +					'rc_user_text' => 'SomeOtherUser',
    +					'(rc_deleted & ' . Revision::DELETED_USER . ') != ' . Revision::DELETED_USER,
    +					'(rc_type != ' . RC_LOG . ') OR ((rc_deleted & ' . LogPage::DELETED_ACTION . ') != ' .
    +						LogPage::DELETED_ACTION . ')'
    +				],
    +			],
    +			[
    +				[ 'onlyByUser' => 'SomeOtherUser' ],
    +				'suppressrevision',
    +				[
    +					'rc_user_text' => 'SomeOtherUser',
    +					'(rc_deleted & ' . ( Revision::DELETED_USER | Revision::DELETED_RESTRICTED ) . ') != ' .
    +						( Revision::DELETED_USER | Revision::DELETED_RESTRICTED ),
    +					'(rc_type != ' . RC_LOG . ') OR (' .
    +						'(rc_deleted & ' . ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ') != ' .
    +						( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ')'
    +				],
    +			],
    +			[
    +				[ 'onlyByUser' => 'SomeOtherUser' ],
    +				'viewsuppressed',
    +				[
    +					'rc_user_text' => 'SomeOtherUser',
    +					'(rc_deleted & ' . ( Revision::DELETED_USER | Revision::DELETED_RESTRICTED ) . ') != ' .
    +						( Revision::DELETED_USER | Revision::DELETED_RESTRICTED ),
    +					'(rc_type != ' . RC_LOG . ') OR (' .
    +						'(rc_deleted & ' . ( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ') != ' .
    +						( LogPage::DELETED_ACTION | LogPage::DELETED_RESTRICTED ) . ')'
    +				],
    +			],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider userPermissionRelatedExtraChecksProvider
    +	 */
    +	public function testGetWatchedItemsWithRecentChangeInfo_userPermissionRelatedExtraChecks(
    +		array $options,
    +		$notAllowedAction,
    +		array $expectedExtraConds
    +	) {
    +		$commonConds = [ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)' ];
    +		$conds = array_merge( $commonConds, $expectedExtraConds );
    +
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				[ 'recentchanges', 'watchlist', 'page' ],
    +				$this->isType( 'array' ),
    +				$conds,
    +				$this->isType( 'string' ),
    +				$this->isType( 'array' ),
    +				$this->isType( 'array' )
    +			)
    +			->will( $this->returnValue( [] ) );
    +
    +		$user = $this->getMockNonAnonUserWithIdAndRestrictedPermissions( 1, $notAllowedAction );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
    +
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function testGetWatchedItemsWithRecentChangeInfo_allRevisionsOptionAndEmptyResult() {
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				[ 'recentchanges', 'watchlist' ],
    +				[
    +					'rc_id',
    +					'rc_namespace',
    +					'rc_title',
    +					'rc_timestamp',
    +					'rc_type',
    +					'rc_deleted',
    +					'wl_notificationtimestamp',
    +
    +					'rc_cur_id',
    +					'rc_this_oldid',
    +					'rc_last_oldid',
    +				],
    +				[ 'wl_user' => 1, ],
    +				$this->isType( 'string' ),
    +				[],
    +				[
    +					'watchlist' => [
    +						'INNER JOIN',
    +						[
    +							'wl_namespace=rc_namespace',
    +							'wl_title=rc_title'
    +						]
    +					],
    +				]
    +			)
    +			->will( $this->returnValue( [] ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
    +
    +		$items = $queryService->getWatchedItemsWithRecentChangeInfo( $user, [ 'allRevisions' => true ] );
    +
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function getWatchedItemsWithRecentChangeInfoInvalidOptionsProvider() {
    +		return [
    +			[
    +				[ 'rcTypes' => [ 1337 ] ],
    +				'Bad value for parameter $options[\'rcTypes\']',
    +			],
    +			[
    +				[ 'rcTypes' => [ 'edit' ] ],
    +				'Bad value for parameter $options[\'rcTypes\']',
    +			],
    +			[
    +				[ 'rcTypes' => [ RC_EDIT, 1337 ] ],
    +				'Bad value for parameter $options[\'rcTypes\']',
    +			],
    +			[
    +				[ 'dir' => 'foo' ],
    +				'Bad value for parameter $options[\'dir\']',
    +			],
    +			[
    +				[ 'start' => '20151212010101' ],
    +				'Bad value for parameter $options[\'dir\']: must be provided',
    +			],
    +			[
    +				[ 'end' => '20151212010101' ],
    +				'Bad value for parameter $options[\'dir\']: must be provided',
    +			],
    +			[
    +				[ 'startFrom' => [ '20151212010101', 123 ] ],
    +				'Bad value for parameter $options[\'dir\']: must be provided',
    +			],
    +			[
    +				[ 'dir' => WatchedItemQueryService::DIR_OLDER, 'startFrom' => '20151212010101' ],
    +				'Bad value for parameter $options[\'startFrom\']: must be a two-element array',
    +			],
    +			[
    +				[ 'dir' => WatchedItemQueryService::DIR_OLDER, 'startFrom' => [ '20151212010101' ] ],
    +				'Bad value for parameter $options[\'startFrom\']: must be a two-element array',
    +			],
    +			[
    +				[
    +					'dir' => WatchedItemQueryService::DIR_OLDER,
    +					'startFrom' => [ '20151212010101', 123, 'foo' ]
    +				],
    +				'Bad value for parameter $options[\'startFrom\']: must be a two-element array',
    +			],
    +			[
    +				[ 'watchlistOwner' => $this->getMockUnrestrictedNonAnonUserWithId( 2 ) ],
    +				'Bad value for parameter $options[\'watchlistOwnerToken\']',
    +			],
    +			[
    +				[ 'watchlistOwner' => 'Other User', 'watchlistOwnerToken' => 'some-token' ],
    +				'Bad value for parameter $options[\'watchlistOwner\']',
    +			],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider getWatchedItemsWithRecentChangeInfoInvalidOptionsProvider
    +	 */
    +	public function testGetWatchedItemsWithRecentChangeInfo_invalidOptions(
    +		array $options,
    +		$expectedInExceptionMessage
    +	) {
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->never() )
    +			->method( $this->anything() );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
    +
    +		$this->setExpectedException( InvalidArgumentException::class, $expectedInExceptionMessage );
    +		$queryService->getWatchedItemsWithRecentChangeInfo( $user, $options );
    +	}
    +
    +	public function testGetWatchedItemsWithRecentChangeInfo_usedInGeneratorOptionAndEmptyResult() {
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				[ 'recentchanges', 'watchlist', 'page' ],
    +				[
    +					'rc_id',
    +					'rc_namespace',
    +					'rc_title',
    +					'rc_timestamp',
    +					'rc_type',
    +					'rc_deleted',
    +					'wl_notificationtimestamp',
    +					'rc_cur_id',
    +				],
    +				[ 'wl_user' => 1, '(rc_this_oldid=page_latest) OR (rc_type=3)' ],
    +				$this->isType( 'string' ),
    +				[],
    +				[
    +					'watchlist' => [
    +						'INNER JOIN',
    +						[
    +							'wl_namespace=rc_namespace',
    +							'wl_title=rc_title'
    +						]
    +					],
    +					'page' => [
    +						'LEFT JOIN',
    +						'rc_cur_id=page_id',
    +					],
    +				]
    +			)
    +			->will( $this->returnValue( [] ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
    +
    +		$items = $queryService->getWatchedItemsWithRecentChangeInfo(
    +			$user,
    +			[ 'usedInGenerator' => true ]
    +		);
    +
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function testGetWatchedItemsWithRecentChangeInfo_usedInGeneratorAllRevisionsOptions() {
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				[ 'recentchanges', 'watchlist' ],
    +				[
    +					'rc_id',
    +					'rc_namespace',
    +					'rc_title',
    +					'rc_timestamp',
    +					'rc_type',
    +					'rc_deleted',
    +					'wl_notificationtimestamp',
    +					'rc_this_oldid',
    +				],
    +				[ 'wl_user' => 1 ],
    +				$this->isType( 'string' ),
    +				[],
    +				[
    +					'watchlist' => [
    +						'INNER JOIN',
    +						[
    +							'wl_namespace=rc_namespace',
    +							'wl_title=rc_title'
    +						]
    +					],
    +				]
    +			)
    +			->will( $this->returnValue( [] ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
    +
    +		$items = $queryService->getWatchedItemsWithRecentChangeInfo(
    +			$user,
    +			[ 'usedInGenerator' => true, 'allRevisions' => true, ]
    +		);
    +
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function testGetWatchedItemsWithRecentChangeInfo_watchlistOwnerOptionAndEmptyResult() {
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				$this->isType( 'array' ),
    +				$this->isType( 'array' ),
    +				[
    +					'wl_user' => 2,
    +					'(rc_this_oldid=page_latest) OR (rc_type=3)',
    +				],
    +				$this->isType( 'string' ),
    +				$this->isType( 'array' ),
    +				$this->isType( 'array' )
    +			)
    +			->will( $this->returnValue( [] ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
    +		$otherUser = $this->getMockUnrestrictedNonAnonUserWithId( 2 );
    +		$otherUser->expects( $this->once() )
    +			->method( 'getOption' )
    +			->with( 'watchlisttoken' )
    +			->willReturn( '0123456789abcdef' );
    +
    +		$items = $queryService->getWatchedItemsWithRecentChangeInfo(
    +			$user,
    +			[ 'watchlistOwner' => $otherUser, 'watchlistOwnerToken' => '0123456789abcdef' ]
    +		);
    +
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function invalidWatchlistTokenProvider() {
    +		return [
    +			[ 'wrongToken' ],
    +			[ '' ],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider invalidWatchlistTokenProvider
    +	 */
    +	public function testGetWatchedItemsWithRecentChangeInfo_watchlistOwnerAndInvalidToken( $token ) {
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->never() )
    +			->method( $this->anything() );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockUnrestrictedNonAnonUserWithId( 1 );
    +		$otherUser = $this->getMockUnrestrictedNonAnonUserWithId( 2 );
    +		$otherUser->expects( $this->once() )
    +			->method( 'getOption' )
    +			->with( 'watchlisttoken' )
    +			->willReturn( '0123456789abcdef' );
    +
    +		$this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
    +		$queryService->getWatchedItemsWithRecentChangeInfo(
    +			$user,
    +			[ 'watchlistOwner' => $otherUser, 'watchlistOwnerToken' => $token ]
    +		);
    +	}
    +
    +	public function testGetWatchedItemsForUser() {
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				'watchlist',
    +				[ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ],
    +				[ 'wl_user' => 1 ]
    +			)
    +			->will( $this->returnValue( [
    +				$this->getFakeRow( [
    +					'wl_namespace' => 0,
    +					'wl_title' => 'Foo1',
    +					'wl_notificationtimestamp' => '20151212010101',
    +				] ),
    +				$this->getFakeRow( [
    +					'wl_namespace' => 1,
    +					'wl_title' => 'Foo2',
    +					'wl_notificationtimestamp' => null,
    +				] ),
    +			] ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +		$user = $this->getMockNonAnonUserWithId( 1 );
    +
    +		$items = $queryService->getWatchedItemsForUser( $user );
    +
    +		$this->assertInternalType( 'array', $items );
    +		$this->assertCount( 2, $items );
    +		$this->assertContainsOnlyInstancesOf( WatchedItem::class, $items );
    +		$this->assertEquals(
    +			new WatchedItem( $user, new TitleValue( 0, 'Foo1' ), '20151212010101' ),
    +			$items[0]
    +		);
    +		$this->assertEquals(
    +			new WatchedItem( $user, new TitleValue( 1, 'Foo2' ), null ),
    +			$items[1]
    +		);
    +	}
    +
    +	public function provideGetWatchedItemsForUserOptions() {
    +		return [
    +			[
    +				[ 'namespaceIds' => [ 0, 1 ], ],
    +				[ 'wl_namespace' => [ 0, 1 ], ],
    +				[]
    +			],
    +			[
    +				[ 'sort' => WatchedItemQueryService::SORT_ASC, ],
    +				[],
    +				[ 'ORDER BY' => [ 'wl_namespace ASC', 'wl_title ASC' ] ]
    +			],
    +			[
    +				[
    +					'namespaceIds' => [ 0 ],
    +					'sort' => WatchedItemQueryService::SORT_ASC,
    +				],
    +				[ 'wl_namespace' => [ 0 ], ],
    +				[ 'ORDER BY' => 'wl_title ASC' ]
    +			],
    +			[
    +				[ 'limit' => 10 ],
    +				[],
    +				[ 'LIMIT' => 10 ]
    +			],
    +			[
    +				[
    +					'namespaceIds' => [ 0, "1; DROP TABLE watchlist;\n--" ],
    +					'limit' => "10; DROP TABLE watchlist;\n--",
    +				],
    +				[ 'wl_namespace' => [ 0, 1 ], ],
    +				[ 'LIMIT' => 10 ]
    +			],
    +			[
    +				[ 'filter' => WatchedItemQueryService::FILTER_CHANGED ],
    +				[ 'wl_notificationtimestamp IS NOT NULL' ],
    +				[]
    +			],
    +			[
    +				[ 'filter' => WatchedItemQueryService::FILTER_NOT_CHANGED ],
    +				[ 'wl_notificationtimestamp IS NULL' ],
    +				[]
    +			],
    +			[
    +				[ 'sort' => WatchedItemQueryService::SORT_DESC, ],
    +				[],
    +				[ 'ORDER BY' => [ 'wl_namespace DESC', 'wl_title DESC' ] ]
    +			],
    +			[
    +				[
    +					'namespaceIds' => [ 0 ],
    +					'sort' => WatchedItemQueryService::SORT_DESC,
    +				],
    +				[ 'wl_namespace' => [ 0 ], ],
    +				[ 'ORDER BY' => 'wl_title DESC' ]
    +			],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider provideGetWatchedItemsForUserOptions
    +	 */
    +	public function testGetWatchedItemsForUser_optionsAndEmptyResult(
    +		array $options,
    +		array $expectedConds,
    +		array $expectedDbOptions
    +	) {
    +		$mockDb = $this->getMockDb();
    +		$user = $this->getMockNonAnonUserWithId( 1 );
    +
    +		$expectedConds = array_merge( [ 'wl_user' => 1 ], $expectedConds );
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				'watchlist',
    +				[ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ],
    +				$expectedConds,
    +				$this->isType( 'string' ),
    +				$expectedDbOptions
    +			)
    +			->will( $this->returnValue( [] ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +
    +		$items = $queryService->getWatchedItemsForUser( $user, $options );
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function provideGetWatchedItemsForUser_fromUntilStartFromOptions() {
    +		return [
    +			[
    +				[
    +					'from' => new TitleValue( 0, 'SomeDbKey' ),
    +					'sort' => WatchedItemQueryService::SORT_ASC
    +				],
    +				[ "(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'SomeDbKey'))", ],
    +				[ 'ORDER BY' => [ 'wl_namespace ASC', 'wl_title ASC' ] ]
    +			],
    +			[
    +				[
    +					'from' => new TitleValue( 0, 'SomeDbKey' ),
    +					'sort' => WatchedItemQueryService::SORT_DESC,
    +				],
    +				[ "(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeDbKey'))", ],
    +				[ 'ORDER BY' => [ 'wl_namespace DESC', 'wl_title DESC' ] ]
    +			],
    +			[
    +				[
    +					'until' => new TitleValue( 0, 'SomeDbKey' ),
    +					'sort' => WatchedItemQueryService::SORT_ASC
    +				],
    +				[ "(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeDbKey'))", ],
    +				[ 'ORDER BY' => [ 'wl_namespace ASC', 'wl_title ASC' ] ]
    +			],
    +			[
    +				[
    +					'until' => new TitleValue( 0, 'SomeDbKey' ),
    +					'sort' => WatchedItemQueryService::SORT_DESC
    +				],
    +				[ "(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'SomeDbKey'))", ],
    +				[ 'ORDER BY' => [ 'wl_namespace DESC', 'wl_title DESC' ] ]
    +			],
    +			[
    +				[
    +					'from' => new TitleValue( 0, 'AnotherDbKey' ),
    +					'until' => new TitleValue( 0, 'SomeOtherDbKey' ),
    +					'startFrom' => new TitleValue( 0, 'SomeDbKey' ),
    +					'sort' => WatchedItemQueryService::SORT_ASC
    +				],
    +				[
    +					"(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'AnotherDbKey'))",
    +					"(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeOtherDbKey'))",
    +					"(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'SomeDbKey'))",
    +				],
    +				[ 'ORDER BY' => [ 'wl_namespace ASC', 'wl_title ASC' ] ]
    +			],
    +			[
    +				[
    +					'from' => new TitleValue( 0, 'SomeOtherDbKey' ),
    +					'until' => new TitleValue( 0, 'AnotherDbKey' ),
    +					'startFrom' => new TitleValue( 0, 'SomeDbKey' ),
    +					'sort' => WatchedItemQueryService::SORT_DESC
    +				],
    +				[
    +					"(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeOtherDbKey'))",
    +					"(wl_namespace > 0) OR ((wl_namespace = 0) AND (wl_title >= 'AnotherDbKey'))",
    +					"(wl_namespace < 0) OR ((wl_namespace = 0) AND (wl_title <= 'SomeDbKey'))",
    +				],
    +				[ 'ORDER BY' => [ 'wl_namespace DESC', 'wl_title DESC' ] ]
    +			],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider provideGetWatchedItemsForUser_fromUntilStartFromOptions
    +	 */
    +	public function testGetWatchedItemsForUser_fromUntilStartFromOptions(
    +		array $options,
    +		array $expectedConds,
    +		array $expectedDbOptions
    +	) {
    +		$user = $this->getMockNonAnonUserWithId( 1 );
    +
    +		$expectedConds = array_merge( [ 'wl_user' => 1 ], $expectedConds );
    +
    +		$mockDb = $this->getMockDb();
    +		$mockDb->expects( $this->any() )
    +			->method( 'addQuotes' )
    +			->will( $this->returnCallback( function( $value ) {
    +				return "'$value'";
    +			} ) );
    +		$mockDb->expects( $this->any() )
    +			->method( 'makeList' )
    +			->with(
    +				$this->isType( 'array' ),
    +				$this->isType( 'int' )
    +			)
    +			->will( $this->returnCallback( function( $a, $conj ) {
    +				$sqlConj = $conj === LIST_AND ? ' AND ' : ' OR ';
    +				return join( $sqlConj, array_map( function( $s ) {
    +					return '(' . $s . ')';
    +				}, $a
    +				) );
    +			} ) );
    +		$mockDb->expects( $this->once() )
    +			->method( 'select' )
    +			->with(
    +				'watchlist',
    +				[ 'wl_namespace', 'wl_title', 'wl_notificationtimestamp' ],
    +				$expectedConds,
    +				$this->isType( 'string' ),
    +				$expectedDbOptions
    +			)
    +			->will( $this->returnValue( [] ) );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +
    +		$items = $queryService->getWatchedItemsForUser( $user, $options );
    +		$this->assertEmpty( $items );
    +	}
    +
    +	public function getWatchedItemsForUserInvalidOptionsProvider() {
    +		return [
    +			[
    +				[ 'sort' => 'foo' ],
    +				'Bad value for parameter $options[\'sort\']'
    +			],
    +			[
    +				[ 'filter' => 'foo' ],
    +				'Bad value for parameter $options[\'filter\']'
    +			],
    +			[
    +				[ 'from' => new TitleValue( 0, 'SomeDbKey' ), ],
    +				'Bad value for parameter $options[\'sort\']: must be provided'
    +			],
    +			[
    +				[ 'until' => new TitleValue( 0, 'SomeDbKey' ), ],
    +				'Bad value for parameter $options[\'sort\']: must be provided'
    +			],
    +			[
    +				[ 'startFrom' => new TitleValue( 0, 'SomeDbKey' ), ],
    +				'Bad value for parameter $options[\'sort\']: must be provided'
    +			],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider getWatchedItemsForUserInvalidOptionsProvider
    +	 */
    +	public function testGetWatchedItemsForUser_invalidOptionThrowsException(
    +		array $options,
    +		$expectedInExceptionMessage
    +	) {
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $this->getMockDb() ) );
    +
    +		$this->setExpectedException( InvalidArgumentException::class, $expectedInExceptionMessage );
    +		$queryService->getWatchedItemsForUser( $this->getMockNonAnonUserWithId( 1 ), $options );
    +	}
    +
    +	public function testGetWatchedItemsForUser_userNotAllowedToViewWatchlist() {
    +		$mockDb = $this->getMockDb();
    +
    +		$mockDb->expects( $this->never() )
    +			->method( $this->anything() );
    +
    +		$queryService = new WatchedItemQueryService( $this->getMockLoadBalancer( $mockDb ) );
    +
    +		$items = $queryService->getWatchedItemsForUser( $this->getMockAnonUser() );
    +		$this->assertEmpty( $items );
    +	}
    +
    +}
    diff --git a/tests/phpunit/includes/api/ApiLoginTest.php b/tests/phpunit/includes/api/ApiLoginTest.php
    index 2f8ffcc353..155a9dd982 100644
    --- a/tests/phpunit/includes/api/ApiLoginTest.php
    +++ b/tests/phpunit/includes/api/ApiLoginTest.php
    @@ -19,7 +19,7 @@ class ApiLoginTest extends ApiTestCase {
     			'wsTokenSecrets' => [ 'login' => 'foobar' ],
     		];
     		$data = $this->doApiRequest( [ 'action' => 'login',
    -			'lgname' => '', 'lgpassword' => self::$users['sysop']->password,
    +			'lgname' => '', 'lgpassword' => self::$users['sysop']->getPassword(),
     			'lgtoken' => (string)( new MediaWiki\Session\Token( 'foobar', '' ) )
     		], $session );
     		$this->assertEquals( $wgDisableAuthManager ? 'NoName' : 'Failed', $data[0]['login']['result'] );
    @@ -29,6 +29,7 @@ class ApiLoginTest extends ApiTestCase {
     		global $wgServer, $wgDisableAuthManager;
     
     		$user = self::$users['sysop'];
    +		$userName = $user->getUser()->getName();
     		$user->getUser()->logout();
     
     		if ( !isset( $wgServer ) ) {
    @@ -36,7 +37,7 @@ class ApiLoginTest extends ApiTestCase {
     		}
     		$ret = $this->doApiRequest( [
     			"action" => "login",
    -			"lgname" => $user->username,
    +			"lgname" => $userName,
     			"lgpassword" => "bad",
     		] );
     
    @@ -52,7 +53,7 @@ class ApiLoginTest extends ApiTestCase {
     			[
     				"action" => "login",
     				"lgtoken" => $token,
    -				"lgname" => $user->username,
    +				"lgname" => $userName,
     				"lgpassword" => "badnowayinhell",
     			],
     			$ret[2]
    @@ -74,12 +75,14 @@ class ApiLoginTest extends ApiTestCase {
     		}
     
     		$user = self::$users['sysop'];
    +		$userName = $user->getUser()->getName();
    +		$password = $user->getPassword();
     		$user->getUser()->logout();
     
     		$ret = $this->doApiRequest( [
     				"action" => "login",
    -				"lgname" => $user->username,
    -				"lgpassword" => $user->password,
    +				"lgname" => $userName,
    +				"lgpassword" => $password,
     			]
     		);
     
    @@ -95,8 +98,8 @@ class ApiLoginTest extends ApiTestCase {
     			[
     				"action" => "login",
     				"lgtoken" => $token,
    -				"lgname" => $user->username,
    -				"lgpassword" => $user->password,
    +				"lgname" => $userName,
    +				"lgpassword" => $password,
     			],
     			$ret[2]
     		);
    @@ -122,12 +125,14 @@ class ApiLoginTest extends ApiTestCase {
     			$this->markTestIncomplete( 'This test needs $wgServer to be set in LocalSettings.php' );
     		}
     		$user = self::$users['sysop'];
    +		$userName = $user->getUser()->getName();
    +		$password = $user->getPassword();
     
     		$req = MWHttpRequest::factory( self::$apiUrl . "?action=login&format=xml",
     			[ "method" => "POST",
     				"postData" => [
    -					"lgname" => $user->username,
    -					"lgpassword" => $user->password
    +					"lgname" => $userName,
    +					"lgpassword" => $password
     				]
     			],
     			__METHOD__
    @@ -146,8 +151,8 @@ class ApiLoginTest extends ApiTestCase {
     
     		$req->setData( [
     			"lgtoken" => $token,
    -			"lgname" => $user->username,
    -			"lgpassword" => $user->password ] );
    +			"lgname" => $userName,
    +			"lgpassword" => $password ] );
     		$req->execute();
     
     		$cj = $req->getCookieJar();
    @@ -162,11 +167,14 @@ class ApiLoginTest extends ApiTestCase {
     	}
     
     	public function testRunLogin() {
    -		$sysopUser = self::$users['sysop'];
    +		$user = self::$users['sysop'];
    +		$userName = $user->getUser()->getName();
    +		$password = $user->getPassword();
    +
     		$data = $this->doApiRequest( [
     			'action' => 'login',
    -			'lgname' => $sysopUser->username,
    -			'lgpassword' => $sysopUser->password ] );
    +			'lgname' => $userName,
    +			'lgpassword' => $password ] );
     
     		$this->assertArrayHasKey( "login", $data[0] );
     		$this->assertArrayHasKey( "result", $data[0]['login'] );
    @@ -176,8 +184,8 @@ class ApiLoginTest extends ApiTestCase {
     		$data = $this->doApiRequest( [
     			'action' => 'login',
     			"lgtoken" => $token,
    -			"lgname" => $sysopUser->username,
    -			"lgpassword" => $sysopUser->password ], $data[2] );
    +			"lgname" => $userName,
    +			"lgpassword" => $password ], $data[2] );
     
     		$this->assertArrayHasKey( "login", $data[0] );
     		$this->assertArrayHasKey( "result", $data[0]['login'] );
    @@ -244,7 +252,7 @@ class ApiLoginTest extends ApiTestCase {
     			__METHOD__
     		);
     
    -		$lgName = $user->username . BotPassword::getSeparator() . 'foo';
    +		$lgName = $user->getUser()->getName() . BotPassword::getSeparator() . 'foo';
     
     		$ret = $this->doApiRequest( [
     			'action' => 'login',
    diff --git a/tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php b/tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
    index def9c5d8a2..eaeb3ae925 100644
    --- a/tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
    +++ b/tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
    @@ -229,7 +229,10 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
     	}
     
     	private function getTitleFormatter() {
    -		return new MediaWikiTitleCodec( Language::factory( 'en' ), GenderCache::singleton() );
    +		return new MediaWikiTitleCodec(
    +			Language::factory( 'en' ),
    +			MediaWikiServices::getInstance()->getGenderCache()
    +		);
     	}
     
     	private function getPrefixedText( LinkTarget $target ) {
    @@ -818,8 +821,13 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
     		);
     		$this->watchPages( $user, [ $target ] );
     
    -		$resultMinor = $this->doListWatchlistRequest( [ 'wlshow' => 'minor', 'wlprop' => 'flags' ] );
    -		$resultNotMinor = $this->doListWatchlistRequest( [ 'wlshow' => '!minor', 'wlprop' => 'flags' ] );
    +		$resultMinor = $this->doListWatchlistRequest( [
    +			'wlshow' => WatchedItemQueryService::FILTER_MINOR,
    +			'wlprop' => 'flags'
    +		] );
    +		$resultNotMinor = $this->doListWatchlistRequest( [
    +			'wlshow' => WatchedItemQueryService::FILTER_NOT_MINOR, 'wlprop' => 'flags'
    +		] );
     
     		$this->assertArraySubsetsEqual(
     			$this->getItemsFromApiResponse( $resultMinor ),
    @@ -842,8 +850,12 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
     		);
     		$this->watchPages( $user, [ $target ] );
     
    -		$resultBot = $this->doListWatchlistRequest( [ 'wlshow' => 'bot' ] );
    -		$resultNotBot = $this->doListWatchlistRequest( [ 'wlshow' => '!bot' ] );
    +		$resultBot = $this->doListWatchlistRequest( [
    +			'wlshow' => WatchedItemQueryService::FILTER_BOT
    +		] );
    +		$resultNotBot = $this->doListWatchlistRequest( [
    +			'wlshow' => WatchedItemQueryService::FILTER_NOT_BOT
    +		] );
     
     		$this->assertArraySubsetsEqual(
     			$this->getItemsFromApiResponse( $resultBot ),
    @@ -867,11 +879,11 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
     
     		$resultAnon = $this->doListWatchlistRequest( [
     			'wlprop' => 'user',
    -			'wlshow' => 'anon'
    +			'wlshow' => WatchedItemQueryService::FILTER_ANON
     		] );
     		$resultNotAnon = $this->doListWatchlistRequest( [
     			'wlprop' => 'user',
    -			'wlshow' => '!anon'
    +			'wlshow' => WatchedItemQueryService::FILTER_NOT_ANON
     		] );
     
     		$this->assertArraySubsetsEqual(
    @@ -911,11 +923,11 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
     
     		$resultUnread = $this->doListWatchlistRequest( [
     			'wlprop' => 'notificationtimestamp|title',
    -			'wlshow' => 'unread'
    +			'wlshow' => WatchedItemQueryService::FILTER_UNREAD
     		] );
     		$resultNotUnread = $this->doListWatchlistRequest( [
     			'wlprop' => 'notificationtimestamp|title',
    -			'wlshow' => '!unread'
    +			'wlshow' => WatchedItemQueryService::FILTER_NOT_UNREAD
     		] );
     
     		$this->assertEquals(
    @@ -948,11 +960,11 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
     
     		$resultPatrolled = $this->doListWatchlistRequest( [
     			'wlprop' => 'patrol',
    -			'wlshow' => 'patrolled'
    +			'wlshow' => WatchedItemQueryService::FILTER_PATROLLED
     		], $user );
     		$resultNotPatrolled = $this->doListWatchlistRequest( [
     			'wlprop' => 'patrol',
    -			'wlshow' => '!patrolled'
    +			'wlshow' => WatchedItemQueryService::FILTER_NOT_PATROLLED
     		], $user );
     
     		$this->assertEquals(
    diff --git a/tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php b/tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php
    new file mode 100644
    index 0000000000..582c0769a2
    --- /dev/null
    +++ b/tests/phpunit/includes/api/ApiQueryWatchlistRawIntegrationTest.php
    @@ -0,0 +1,542 @@
    +<?php
    +
    +use MediaWiki\MediaWikiServices;
    +
    +/**
    + * @group API
    + * @group Database
    + * @group medium
    + *
    + * @covers ApiQueryWatchlistRaw
    + */
    +class ApiQueryWatchlistRawIntegrationTest extends ApiTestCase {
    +
    +	protected function setUp() {
    +		parent::setUp();
    +		self::$users['ApiQueryWatchlistRawIntegrationTestUser']
    +			= $this->getMutableTestUser();
    +		self::$users['ApiQueryWatchlistRawIntegrationTestUser2']
    +			= $this->getMutableTestUser();
    +		$this->doLogin( 'ApiQueryWatchlistRawIntegrationTestUser' );
    +	}
    +
    +	private function getLoggedInTestUser() {
    +		return self::$users['ApiQueryWatchlistRawIntegrationTestUser']->getUser();
    +	}
    +
    +	private function getNotLoggedInTestUser() {
    +		return self::$users['ApiQueryWatchlistRawIntegrationTestUser2']->getUser();
    +	}
    +
    +	private function getWatchedItemStore() {
    +		return MediaWikiServices::getInstance()->getWatchedItemStore();
    +	}
    +
    +	private function doListWatchlistRawRequest( array $params = [] ) {
    +		return $this->doApiRequest( array_merge(
    +			[ 'action' => 'query', 'list' => 'watchlistraw' ],
    +			$params
    +		) );
    +	}
    +
    +	private function doGeneratorWatchlistRawRequest( array $params = [] ) {
    +		return $this->doApiRequest( array_merge(
    +			[ 'action' => 'query', 'generator' => 'watchlistraw' ],
    +			$params
    +		) );
    +	}
    +
    +	private function getItemsFromApiResponse( array $response ) {
    +		return $response[0]['watchlistraw'];
    +	}
    +
    +	public function testListWatchlistRaw_returnsWatchedItems() {
    +		$store = $this->getWatchedItemStore();
    +		$store->addWatch(
    +			$this->getLoggedInTestUser(),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' )
    +		);
    +
    +		$result = $this->doListWatchlistRawRequest();
    +
    +		$this->assertArrayHasKey( 'watchlistraw', $result[0] );
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $result )
    +		);
    +	}
    +
    +	public function testPropChanged_addsNotificationTimestamp() {
    +		$target = new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' );
    +		$otherUser = $this->getNotLoggedInTestUser();
    +
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatch( $this->getLoggedInTestUser(), $target );
    +		$store->updateNotificationTimestamp(
    +			$otherUser,
    +			$target,
    +			'20151212010101'
    +		);
    +
    +		$result = $this->doListWatchlistRawRequest( [ 'wrprop' => 'changed' ] );
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage',
    +					'changed' => '2015-12-12T01:01:01Z',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $result )
    +		);
    +	}
    +
    +	public function testNamespaceParam() {
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' ),
    +			new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage' ),
    +		] );
    +
    +		$result = $this->doListWatchlistRawRequest( [ 'wrnamespace' => '0' ] );
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $result )
    +		);
    +	}
    +
    +	public function testShowChangedParams() {
    +		$subjectTarget = new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' );
    +		$talkTarget = new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage' );
    +		$otherUser = $this->getNotLoggedInTestUser();
    +
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			$subjectTarget,
    +			$talkTarget,
    +		] );
    +		$store->updateNotificationTimestamp(
    +			$otherUser,
    +			$subjectTarget,
    +			'20151212010101'
    +		);
    +
    +		$resultChanged = $this->doListWatchlistRawRequest(
    +			[ 'wrprop' => 'changed', 'wrshow' => WatchedItemQueryService::FILTER_CHANGED ]
    +		);
    +		$resultNotChanged = $this->doListWatchlistRawRequest(
    +			[ 'wrprop' => 'changed', 'wrshow' => WatchedItemQueryService::FILTER_NOT_CHANGED ]
    +		);
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage',
    +					'changed' => '2015-12-12T01:01:01Z',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $resultChanged )
    +		);
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 1,
    +					'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $resultNotChanged )
    +		);
    +	}
    +
    +	public function testLimitParam() {
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
    +		] );
    +
    +		$resultWithoutLimit = $this->doListWatchlistRawRequest();
    +		$resultWithLimit = $this->doListWatchlistRawRequest( [ 'wrlimit' => 2 ] );
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +				],
    +				[
    +					'ns' => 1,
    +					'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $resultWithoutLimit )
    +		);
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $resultWithLimit )
    +		);
    +
    +		$this->assertArrayNotHasKey( 'continue', $resultWithoutLimit[0] );
    +		$this->assertArrayHasKey( 'continue', $resultWithLimit[0] );
    +		$this->assertArrayHasKey( 'wrcontinue', $resultWithLimit[0]['continue'] );
    +	}
    +
    +	public function testDirParams() {
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
    +		] );
    +
    +		$resultDirAsc = $this->doListWatchlistRawRequest( [ 'wrdir' => 'ascending' ] );
    +		$resultDirDesc = $this->doListWatchlistRawRequest( [ 'wrdir' => 'descending' ] );
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +				],
    +				[
    +					'ns' => 1,
    +					'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $resultDirAsc )
    +		);
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 1,
    +					'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +				],
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $resultDirDesc )
    +		);
    +	}
    +
    +	public function testAscendingIsDefaultOrder() {
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
    +		] );
    +
    +		$resultNoDir = $this->doListWatchlistRawRequest();
    +		$resultAscDir = $this->doListWatchlistRawRequest( [ 'wrdir' => 'ascending' ] );
    +
    +		$this->assertEquals(
    +			$this->getItemsFromApiResponse( $resultNoDir ),
    +			$this->getItemsFromApiResponse( $resultAscDir )
    +		);
    +	}
    +
    +	public function testFromTitleParam() {
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage3' ),
    +		] );
    +
    +		$result = $this->doListWatchlistRawRequest( [
    +			'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +		] );
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +				],
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage3',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $result )
    +		);
    +	}
    +
    +	public function testToTitleParam() {
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage3' ),
    +		] );
    +
    +		$result = $this->doListWatchlistRawRequest( [
    +			'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +		] );
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $result )
    +		);
    +	}
    +
    +	public function testContinueParam() {
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage3' ),
    +		] );
    +
    +		$firstResult = $this->doListWatchlistRawRequest( [ 'wrlimit' => 2 ] );
    +		$continuationParam = $firstResult[0]['continue']['wrcontinue'];
    +
    +		$this->assertEquals( '0|ApiQueryWatchlistRawIntegrationTestPage3', $continuationParam );
    +
    +		$continuedResult = $this->doListWatchlistRawRequest( [ 'wrcontinue' => $continuationParam ] );
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage3',
    +				]
    +			],
    +			$this->getItemsFromApiResponse( $continuedResult )
    +		);
    +	}
    +
    +	public function fromTitleToTitleContinueComboProvider() {
    +		return [
    +			[
    +				[
    +					'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +					'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +				],
    +				[
    +					[ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage1' ],
    +					[ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage2' ],
    +				],
    +			],
    +			[
    +				[
    +					'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +					'wrcontinue' => '0|ApiQueryWatchlistRawIntegrationTestPage3',
    +				],
    +				[
    +					[ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage3' ],
    +				],
    +			],
    +			[
    +				[
    +					'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage3',
    +					'wrcontinue' => '0|ApiQueryWatchlistRawIntegrationTestPage2',
    +				],
    +				[
    +					[ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage2' ],
    +					[ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage3' ],
    +				],
    +			],
    +			[
    +				[
    +					'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +					'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage3',
    +					'wrcontinue' => '0|ApiQueryWatchlistRawIntegrationTestPage3',
    +				],
    +				[
    +					[ 'ns' => 0, 'title' => 'ApiQueryWatchlistRawIntegrationTestPage3' ],
    +				],
    +			],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider fromTitleToTitleContinueComboProvider
    +	 */
    +	public function testFromTitleToTitleContinueCombo( array $params, array $expectedItems ) {
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage3' ),
    +		] );
    +
    +		$result = $this->doListWatchlistRawRequest( $params );
    +
    +		$this->assertEquals( $expectedItems, $this->getItemsFromApiResponse( $result ) );
    +	}
    +
    +	public function fromTitleToTitleContinueSelfContradictoryComboProvider() {
    +		return [
    +			[
    +				[
    +					'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +					'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +				]
    +			],
    +			[
    +				[
    +					'wrfromtitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +					'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage2',
    +					'wrdir' => 'descending',
    +				]
    +			],
    +			[
    +				[
    +					'wrtotitle' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +					'wrcontinue' => '0|ApiQueryWatchlistRawIntegrationTestPage2',
    +				]
    +			],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider fromTitleToTitleContinueSelfContradictoryComboProvider
    +	 */
    +	public function testFromTitleToTitleContinueSelfContradictoryCombo( array $params ) {
    +		$store = $this->getWatchedItemStore();
    +
    +		$store->addWatchBatchForUser( $this->getLoggedInTestUser(), [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage2' ),
    +		] );
    +
    +		$result = $this->doListWatchlistRawRequest( $params );
    +
    +		$this->assertEmpty( $this->getItemsFromApiResponse( $result ) );
    +		$this->assertArrayNotHasKey( 'continue', $result[0] );
    +	}
    +
    +	public function testOwnerAndTokenParams() {
    +		$otherUser = $this->getNotLoggedInTestUser();
    +		$otherUser->setOption( 'watchlisttoken', '1234567890' );
    +		$otherUser->saveSettings();
    +
    +		$store = $this->getWatchedItemStore();
    +		$store->addWatchBatchForUser( $otherUser, [
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +			new TitleValue( 1, 'ApiQueryWatchlistRawIntegrationTestPage1' ),
    +		] );
    +
    +		$result = $this->doListWatchlistRawRequest( [
    +			'wrowner' => $otherUser->getName(),
    +			'wrtoken' => '1234567890',
    +		] );
    +
    +		$this->assertEquals(
    +			[
    +				[
    +					'ns' => 0,
    +					'title' => 'ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +				[
    +					'ns' => 1,
    +					'title' => 'Talk:ApiQueryWatchlistRawIntegrationTestPage1',
    +				],
    +			],
    +			$this->getItemsFromApiResponse( $result )
    +		);
    +	}
    +
    +	public function testOwnerAndTokenParams_wrongToken() {
    +		$otherUser = $this->getNotLoggedInTestUser();
    +		$otherUser->setOption( 'watchlisttoken', '1234567890' );
    +		$otherUser->saveSettings();
    +
    +		$this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
    +
    +		$this->doListWatchlistRawRequest( [
    +			'wrowner' => $otherUser->getName(),
    +			'wrtoken' => 'wrong-token',
    +		] );
    +	}
    +
    +	public function testOwnerAndTokenParams_userHasNoWatchlistToken() {
    +		$this->setExpectedException( UsageException::class, 'Incorrect watchlist token provided' );
    +
    +		$this->doListWatchlistRawRequest( [
    +			'wrowner' => $this->getNotLoggedInTestUser()->getName(),
    +			'wrtoken' => 'some-watchlist-token',
    +		] );
    +	}
    +
    +	public function testGeneratorWatchlistRawPropInfo_returnsWatchedItems() {
    +		$store = $this->getWatchedItemStore();
    +		$store->addWatch(
    +			$this->getLoggedInTestUser(),
    +			new TitleValue( 0, 'ApiQueryWatchlistRawIntegrationTestPage' )
    +		);
    +
    +		$result = $this->doGeneratorWatchlistRawRequest( [ 'prop' => 'info' ] );
    +
    +		$this->assertArrayHasKey( 'query', $result[0] );
    +		$this->assertArrayHasKey( 'pages', $result[0]['query'] );
    +		$this->assertCount( 1, $result[0]['query']['pages'] );
    +
    +		// $result[0]['query']['pages'] uses page ids as keys
    +		$item = array_values( $result[0]['query']['pages'] )[0];
    +
    +		$this->assertEquals( 0, $item['ns'] );
    +		$this->assertEquals( 'ApiQueryWatchlistRawIntegrationTestPage', $item['title'] );
    +	}
    +
    +}
    diff --git a/tests/phpunit/includes/api/ApiStashEditTest.php b/tests/phpunit/includes/api/ApiStashEditTest.php
    new file mode 100644
    index 0000000000..e2462c6138
    --- /dev/null
    +++ b/tests/phpunit/includes/api/ApiStashEditTest.php
    @@ -0,0 +1,28 @@
    +<?php
    +
    +/**
    + * @covers ApiStashEdit
    + * @group API
    + * @group medium
    + * @group Database
    + */
    +class ApiStashEditTest extends ApiTestCase {
    +
    +	public function testBasicEdit() {
    +		$this->doLogin();
    +		$apiResult = $this->doApiRequestWithToken(
    +			[
    +				'action' => 'stashedit',
    +				'title' => 'ApistashEdit_Page',
    +				'contentmodel' => 'wikitext',
    +				'contentformat' => 'text/x-wiki',
    +				'text' => 'Text for ' . __METHOD__ . ' page',
    +				'baserevid' => 0,
    +			]
    +		);
    +		$apiResult = $apiResult[0];
    +		$this->assertArrayHasKey( 'stashedit', $apiResult );
    +		$this->assertEquals( 'stashed', $apiResult['stashedit']['status'] );
    +	}
    +
    +}
    diff --git a/tests/phpunit/includes/api/ApiTestCase.php b/tests/phpunit/includes/api/ApiTestCase.php
    index e90b46faa3..ac4d2c92ca 100644
    --- a/tests/phpunit/includes/api/ApiTestCase.php
    +++ b/tests/phpunit/includes/api/ApiTestCase.php
    @@ -24,7 +24,7 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
     		$this->setMwGlobals( [
     			'wgAuth' => $wgDisableAuthManager ? new AuthPlugin : new MediaWiki\Auth\AuthManagerAuthPlugin,
     			'wgRequest' => new FauxRequest( [] ),
    -			'wgUser' => self::$users['sysop']->user,
    +			'wgUser' => self::$users['sysop']->getUser(),
     		] );
     
     		$this->apiContext = new ApiTestContext();
    @@ -158,8 +158,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
     
     		$data = $this->doApiRequest( [
     			'action' => 'login',
    -			'lgname' => $testUser->username,
    -			'lgpassword' => $testUser->password ] );
    +			'lgname' => $testUser->getUser()->getName(),
    +			'lgpassword' => $testUser->getPassword() ] );
     
     		$token = $data[0]['login']['token'];
     
    @@ -167,8 +167,8 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
     			[
     				'action' => 'login',
     				'lgtoken' => $token,
    -				'lgname' => $testUser->username,
    -				'lgpassword' => $testUser->password,
    +				'lgname' => $testUser->getUser()->getName(),
    +				'lgpassword' => $testUser->getPassword(),
     			],
     			$data[2]
     		);
    @@ -183,11 +183,11 @@ abstract class ApiTestCase extends MediaWikiLangTestCase {
     		return $data;
     	}
     
    -	protected function getTokenList( $user, $session = null ) {
    +	protected function getTokenList( TestUser $user, $session = null ) {
     		$data = $this->doApiRequest( [
     			'action' => 'tokens',
     			'type' => 'edit|delete|protect|move|block|unblock|watch'
    -		], $session, false, $user->user );
    +		], $session, false, $user->getUser() );
     
     		if ( !array_key_exists( 'tokens', $data[0] ) ) {
     			throw new MWException( 'Api failed to return a token list' );
    diff --git a/tests/phpunit/includes/api/ApiTokensTest.php b/tests/phpunit/includes/api/ApiTokensTest.php
    index fbe97893d8..1f7c00b0a8 100644
    --- a/tests/phpunit/includes/api/ApiTokensTest.php
    +++ b/tests/phpunit/includes/api/ApiTokensTest.php
    @@ -15,10 +15,10 @@ class ApiTokensTest extends ApiTestCase {
     		}
     	}
     
    -	protected function runTokenTest( $user ) {
    +	protected function runTokenTest( TestUser $user ) {
     		$tokens = $this->getTokenList( $user );
     
    -		$rights = $user->user->getRights();
    +		$rights = $user->getUser()->getRights();
     
     		$this->assertArrayHasKey( 'edittoken', $tokens );
     		$this->assertArrayHasKey( 'movetoken', $tokens );
    diff --git a/tests/phpunit/includes/api/ApiUploadTest.php b/tests/phpunit/includes/api/ApiUploadTest.php
    index 873917e8ec..de2b56bde3 100644
    --- a/tests/phpunit/includes/api/ApiUploadTest.php
    +++ b/tests/phpunit/includes/api/ApiUploadTest.php
    @@ -27,11 +27,13 @@ class ApiUploadTest extends ApiTestCaseUpload {
     	 */
     	public function testLogin() {
     		$user = self::$users['uploader'];
    +		$userName = $user->getUser()->getName();
    +		$password = $user->getPassword();
     
     		$params = [
     			'action' => 'login',
    -			'lgname' => $user->username,
    -			'lgpassword' => $user->password
    +			'lgname' => $userName,
    +			'lgpassword' => $password
     		];
     		list( $result, , $session ) = $this->doApiRequest( $params );
     		$this->assertArrayHasKey( "login", $result );
    @@ -42,8 +44,8 @@ class ApiUploadTest extends ApiTestCaseUpload {
     		$params = [
     			'action' => 'login',
     			'lgtoken' => $token,
    -			'lgname' => $user->username,
    -			'lgpassword' => $user->password
    +			'lgname' => $userName,
    +			'lgpassword' => $password
     		];
     		list( $result, , $session ) = $this->doApiRequest( $params, $session );
     		$this->assertArrayHasKey( "login", $result );
    diff --git a/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php b/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
    index edee6fc1e9..3548002682 100644
    --- a/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
    +++ b/tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
    @@ -334,22 +334,23 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
     	 * @param string|null $failMsg
     	 */
     	public function testTestUserForCreation( $error, $failMsg ) {
    +		$testUser = self::getTestUser()->getUser();
    +		$provider = $this->getProvider();
    +		$options = [ 'flags' => \User::READ_LOCKING, 'creating' => true ];
    +
     		$this->hook( 'AbortNewAccount', $this->never() );
     		$this->hook( 'AbortAutoAccount', $this->once() )
    -			->will( $this->returnCallback( function ( $user, &$abortError ) use ( $error ) {
    +			->will( $this->returnCallback( function ( $user, &$abortError ) use ( $testUser, $error ) {
     				$this->assertInstanceOf( 'User', $user );
    -				$this->assertSame( 'UTSysop', $user->getName() );
    +				$this->assertSame( $testUser->getName(), $user->getName() );
     				$abortError = $error;
     				return $error === null;
     			} ) );
    -
    -		$status = $this->getProvider()->testUserForCreation(
    -			\User::newFromName( 'UTSysop' ), AuthManager::AUTOCREATE_SOURCE_SESSION
    +		$status = $provider->testUserForCreation(
    +			$testUser, AuthManager::AUTOCREATE_SOURCE_SESSION, $options
     		);
    -
     		$this->unhook( 'AbortNewAccount' );
     		$this->unhook( 'AbortAutoAccount' );
    -
     		if ( $failMsg === null ) {
     			$this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
     		} else {
    @@ -360,54 +361,11 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
     		}
     
     		$this->hook( 'AbortAutoAccount', $this->never() );
    -		$this->hook( 'AbortNewAccount', $this->once() )
    -			->will( $this->returnCallback(
    -				function ( $user, &$abortError, &$abortStatus ) use ( $error ) {
    -					$this->assertInstanceOf( 'User', $user );
    -					$this->assertSame( 'UTSysop', $user->getName() );
    -					$abortError = $error;
    -					return $error === null;
    -				}
    -			) );
    -		$status = $this->getProvider()->testUserForCreation( \User::newFromName( 'UTSysop' ), false );
    +		$this->hook( 'AbortNewAccount', $this->never() );
    +		$status = $provider->testUserForCreation( $testUser, false, $options );
     		$this->unhook( 'AbortNewAccount' );
     		$this->unhook( 'AbortAutoAccount' );
    -		if ( $failMsg === null ) {
    -			$this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
    -		} else {
    -			$this->assertInstanceOf( 'StatusValue', $status, 'should fail (type)' );
    -			$this->assertFalse( $status->isOk(), 'should fail (ok)' );
    -			$errors = $status->getErrors();
    -			$msg = $errors[0]['message'];
    -			$this->assertInstanceOf( \Message::class, $msg );
    -			$this->assertEquals(
    -				'createaccount-hook-aborted', $msg->getKey(), 'should fail (message)'
    -			);
    -		}
    -
    -		if ( $error !== false ) {
    -			$this->hook( 'AbortAutoAccount', $this->never() );
    -			$this->hook( 'AbortNewAccount', $this->once() )
    -				->will( $this->returnCallback(
    -					function ( $user, &$abortError, &$abortStatus ) use ( $error ) {
    -						$this->assertInstanceOf( 'User', $user );
    -						$this->assertSame( 'UTSysop', $user->getName() );
    -						$abortStatus = $error ? \Status::newFatal( $error ) : \Status::newGood();
    -						return $error === null;
    -					}
    -			) );
    -			$status = $this->getProvider()->testUserForCreation( \User::newFromName( 'UTSysop' ), false );
    -			$this->unhook( 'AbortNewAccount' );
    -			$this->unhook( 'AbortAutoAccount' );
    -			if ( $failMsg === null ) {
    -				$this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
    -			} else {
    -				$this->assertInstanceOf( 'StatusValue', $status, 'should fail (type)' );
    -				$this->assertFalse( $status->isOk(), 'should fail (ok)' );
    -				$errors = $status->getErrors();
    -				$this->assertEquals( $failMsg, $errors[0]['message'], 'should fail (message)' );
    -			}
    -		}
    +		$this->assertEquals( \StatusValue::newGood(), $status, 'should succeed' );
     	}
     
     	public static function provideTestUserForCreation() {
    diff --git a/tests/phpunit/includes/content/CssContentTest.php b/tests/phpunit/includes/content/CssContentTest.php
    index a2aef35f5e..d2078d7a23 100644
    --- a/tests/phpunit/includes/content/CssContentTest.php
    +++ b/tests/phpunit/includes/content/CssContentTest.php
    @@ -101,15 +101,15 @@ class CssContentTest extends JavaScriptContentTest {
     	 */
     	public static function provideGetRedirectTarget() {
     		// @codingStandardsIgnoreStart Generic.Files.LineLength
    -		return array(
    -			array( 'MediaWiki:MonoBook.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=MediaWiki:MonoBook.css&action=raw&ctype=text/css);" ),
    -			array( 'User:FooBar/common.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=User:FooBar/common.css&action=raw&ctype=text/css);" ),
    -			array( 'Gadget:FooBaz.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
    +		return [
    +			[ 'MediaWiki:MonoBook.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=MediaWiki:MonoBook.css&action=raw&ctype=text/css);" ],
    +			[ 'User:FooBar/common.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=User:FooBar/common.css&action=raw&ctype=text/css);" ],
    +			[ 'Gadget:FooBaz.css', "/* #REDIRECT */@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ],
     			# No #REDIRECT comment
    -			array( null, "@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
    +			[ null, "@import url(//example.org/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ],
     			# Wrong domain
    -			array( null, "/* #REDIRECT */@import url(//example.com/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ),
    -		);
    +			[ null, "/* #REDIRECT */@import url(//example.com/w/index.php?title=Gadget:FooBaz.css&action=raw&ctype=text/css);" ],
    +		];
     		// @codingStandardsIgnoreEnd
     	}
     
    diff --git a/tests/phpunit/includes/content/TextContentHandlerTest.php b/tests/phpunit/includes/content/TextContentHandlerTest.php
    index 492fec6b68..e8681c7658 100644
    --- a/tests/phpunit/includes/content/TextContentHandlerTest.php
    +++ b/tests/phpunit/includes/content/TextContentHandlerTest.php
    @@ -9,4 +9,45 @@ class TextContentHandlerTest extends MediaWikiLangTestCase {
     		$this->assertTrue( $handler->supportsDirectEditing(), 'direct editing is supported' );
     	}
     
    +	/**
    +	 * @covers SearchEngine::makeSearchFieldMapping
    +	 * @covers ContentHandler::getFieldsForSearchIndex
    +	 */
    +	public function testFieldsForIndex() {
    +		$handler = new TextContentHandler();
    +
    +		$mockEngine = $this->getMock( 'SearchEngine' );
    +
    +		$mockEngine->expects( $this->atLeastOnce() )
    +			->method( 'makeSearchFieldMapping' )
    +			->willReturnCallback( function ( $name, $type ) {
    +				$mockField =
    +					$this->getMockBuilder( 'SearchIndexFieldDefinition' )
    +						->setConstructorArgs( [ $name, $type ] )
    +						->getMock();
    +				$mockField->expects( $this->atLeastOnce() )->method( 'getMapping' )->willReturn( [
    +						'testData' => 'test',
    +						'name' => $name,
    +						'type' => $type,
    +					] );
    +				return $mockField;
    +			} );
    +
    +		/**
    +		 * @var $mockEngine SearchEngine
    +		 */
    +		$fields = $handler->getFieldsForSearchIndex( $mockEngine );
    +		$mappedFields = [];
    +		foreach ( $fields as $name => $field ) {
    +			$this->assertInstanceOf( 'SearchIndexField', $field );
    +			/**
    +			 * @var $field SearchIndexField
    +			 */
    +			$mappedFields[$name] = $field->getMapping( $mockEngine );
    +		}
    +		$this->assertArrayHasKey( 'language', $mappedFields );
    +		$this->assertEquals( 'test', $mappedFields['language']['testData'] );
    +		$this->assertEquals( 'language', $mappedFields['language']['name'] );
    +	}
    +
     }
    diff --git a/tests/phpunit/includes/db/DatabaseTest.php b/tests/phpunit/includes/db/DatabaseTest.php
    index 0730529bd6..723f1c319e 100644
    --- a/tests/phpunit/includes/db/DatabaseTest.php
    +++ b/tests/phpunit/includes/db/DatabaseTest.php
    @@ -239,12 +239,15 @@ class DatabaseTest extends MediaWikiTestCase {
     		$db = $this->db;
     
     		$db->setFlag( DBO_TRX );
    +		$called = false;
     		$flagSet = null;
    -		$db->onTransactionIdle( function() use ( $db, &$flagSet ) {
    +		$db->onTransactionIdle( function() use ( $db, &$flagSet, &$called ) {
    +			$called = true;
     			$flagSet = $db->getFlag( DBO_TRX );
     		} );
     		$this->assertFalse( $flagSet, 'DBO_TRX off in callback' );
     		$this->assertTrue( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
    +		$this->assertTrue( $called, 'Callback reached' );
     
     		$db->clearFlag( DBO_TRX );
     		$flagSet = null;
    @@ -260,4 +263,30 @@ class DatabaseTest extends MediaWikiTestCase {
     		} );
     		$this->assertFalse( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
     	}
    +
    +	public function testTransactionResolution() {
    +		$db = $this->db;
    +
    +		$db->clearFlag( DBO_TRX );
    +		$db->begin( __METHOD__ );
    +		$called = false;
    +		$db->onTransactionResolution( function() use ( $db, &$called ) {
    +			$called = true;
    +			$db->setFlag( DBO_TRX );
    +		} );
    +		$db->commit( __METHOD__ );
    +		$this->assertFalse( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
    +		$this->assertTrue( $called, 'Callback reached' );
    +
    +		$db->clearFlag( DBO_TRX );
    +		$db->begin( __METHOD__ );
    +		$called = false;
    +		$db->onTransactionResolution( function() use ( $db, &$called ) {
    +			$called = true;
    +			$db->setFlag( DBO_TRX );
    +		} );
    +		$db->rollback( __METHOD__ );
    +		$this->assertFalse( $db->getFlag( DBO_TRX ), 'DBO_TRX restored to default' );
    +		$this->assertTrue( $called, 'Callback reached' );
    +	}
     }
    diff --git a/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php b/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
    index e29d2071c5..d6249bba46 100644
    --- a/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
    +++ b/tests/phpunit/includes/debug/logger/monolog/KafkaHandlerTest.php
    @@ -23,9 +23,6 @@ namespace MediaWiki\Logger\Monolog;
     use MediaWikiTestCase;
     use Monolog\Logger;
     
    -// not available in the version of phpunit mw uses, so copied into repo
    -require_once __DIR__ . '/../../../phpunit/ConsecutiveParametersMatcher.php';
    -
     class KafkaHandlerTest extends MediaWikiTestCase {
     
     	protected function setUp() {
    @@ -58,6 +55,9 @@ class KafkaHandlerTest extends MediaWikiTestCase {
     		$produce->expects( $this->once() )
     			->method( 'setMessages' )
     			->with( $expect, $this->anything(), $this->anything() );
    +		$produce->expects( $this->any() )
    +			->method( 'send' )
    +			->will( $this->returnValue( true ) );
     
     		$handler = new KafkaHandler( $produce, $options );
     		$handler->handle( [
    @@ -89,6 +89,9 @@ class KafkaHandlerTest extends MediaWikiTestCase {
     		$produce->expects( $this->any() )
     			->method( 'getAvailablePartitions' )
     			->will( $this->throwException( new \Kafka\Exception ) );
    +		$produce->expects( $this->any() )
    +			->method( 'send' )
    +			->will( $this->returnValue( true ) );
     
     		if ( $expectException ) {
     			$this->setExpectedException( 'Kafka\Exception' );
    @@ -147,6 +150,9 @@ class KafkaHandlerTest extends MediaWikiTestCase {
     			->will( $this->returnValue( [ 'A' ] ) );
     		$mockMethod = $produce->expects( $this->exactly( 2 ) )
     			->method( 'setMessages' );
    +		$produce->expects( $this->any() )
    +			->method( 'send' )
    +			->will( $this->returnValue( true ) );
     		// evil hax
     		\TestingAccessWrapper::newFromObject( $mockMethod )->matcher->parametersMatcher =
     			new \PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters( [
    @@ -181,6 +187,9 @@ class KafkaHandlerTest extends MediaWikiTestCase {
     		$produce->expects( $this->once() )
     			->method( 'setMessages' )
     			->with( $this->anything(), $this->anything(), [ 'words', 'lines' ] );
    +		$produce->expects( $this->any() )
    +			->method( 'send' )
    +			->will( $this->returnValue( true ) );
     
     		$formatter = $this->getMock( 'Monolog\Formatter\FormatterInterface' );
     		$formatter->expects( $this->any() )
    diff --git a/tests/phpunit/includes/filebackend/FileBackendTest.php b/tests/phpunit/includes/filebackend/FileBackendTest.php
    index 4aeddc6b6f..af5d3ac88f 100644
    --- a/tests/phpunit/includes/filebackend/FileBackendTest.php
    +++ b/tests/phpunit/includes/filebackend/FileBackendTest.php
    @@ -1516,7 +1516,7 @@ class FileBackendTest extends MediaWikiTestCase {
     			[ "$base/unittest-cont1/e/a/z/some_file1.txt", true ],
     			[ "$base/unittest-cont2/a/z/some_file2.txt", true ],
     			# Specific to FS backend with no basePath field set
    -			# array( "$base/unittest-cont3/a/z/some_file3.txt", false ),
    +			# [ "$base/unittest-cont3/a/z/some_file3.txt", false ],
     		];
     	}
     
    diff --git a/tests/phpunit/includes/installer/DatabaseUpdaterTest.php b/tests/phpunit/includes/installer/DatabaseUpdaterTest.php
    index 5e5e921ae6..09d31fcb32 100644
    --- a/tests/phpunit/includes/installer/DatabaseUpdaterTest.php
    +++ b/tests/phpunit/includes/installer/DatabaseUpdaterTest.php
    @@ -124,7 +124,7 @@ class FakeDatabase extends DatabaseBase {
     	 *
     	 * Example:
     	 * $id = $dbw->nextSequenceValue( 'page_page_id_seq' );
    -	 * $dbw->insert( 'page', array( 'page_id' => $id ) );
    +	 * $dbw->insert( 'page', [ 'page_id' => $id ] );
     	 * $id = $dbw->insertId();
     	 *
     	 * @return int
    diff --git a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
    index 3a4aab487f..5bc1c8dbea 100644
    --- a/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
    +++ b/tests/phpunit/includes/libs/objectcache/WANObjectCacheTest.php
    @@ -217,9 +217,23 @@ class WANObjectCacheTest extends MediaWikiTestCase {
     
     		// Acquire a lock to verify that getWithSetCallback uses lockTSE properly
     		$this->internalCache->lock( $key, 0 );
    -		$ret = $cache->getWithSetCallback( $key, 30, $func, [ 'lockTSE' => 5 ] );
    +
    +		$checkKeys = [ wfRandomString() ]; // new check keys => force misses
    +		$ret = $cache->getWithSetCallback( $key, 30, $func,
    +			[ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] );
     		$this->assertEquals( $value, $ret );
     		$this->assertEquals( 1, $calls, 'Callback was not used' );
    +
    +		$cache->delete( $key );
    +		$ret = $cache->getWithSetCallback( $key, 30, $func,
    +			[ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] ); // should use interim value
    +		$this->assertEquals( $value, $ret );
    +		$this->assertEquals( 2, $calls, 'Callback was used' );
    +
    +		$ret = $cache->getWithSetCallback( $key, 30, $func,
    +			[ 'lockTSE' => 5, 'checkKeys' => $checkKeys ] );
    +		$this->assertEquals( $value, $ret );
    +		$this->assertEquals( 2, $calls, 'Callback was not used; used interim' );
     	}
     
     	/**
    diff --git a/tests/phpunit/includes/objectcache/RESTBagOStuffTest.php b/tests/phpunit/includes/objectcache/RESTBagOStuffTest.php
    new file mode 100644
    index 0000000000..ebeb1092a6
    --- /dev/null
    +++ b/tests/phpunit/includes/objectcache/RESTBagOStuffTest.php
    @@ -0,0 +1,88 @@
    +<?php
    +/**
    + * @group BagOStuff
    + */
    +class RESTBagOStuffTest extends MediaWikiTestCase {
    +
    +	/**
    +	 * @var MultiHttpClient
    +	 */
    +	private $client;
    +	/**
    +	 * @var RESTBagOStuff
    +	 */
    +	private $bag;
    +
    +	public function setUp() {
    +		parent::setUp();
    +		$this->client =
    +			$this->getMockBuilder( 'MultiHttpClient' )
    +				->setConstructorArgs( [ [] ] )
    +				->setMethods( [ 'run' ] )
    +				->getMock();
    +		$this->bag = new RESTBagOStuff( [ 'client' => $this->client, 'url' => 'http://test/rest/' ] );
    +	}
    +
    +	public function testGet() {
    +		$this->client->expects( $this->once() )->method( 'run' )->with( [
    +			'method' => 'GET',
    +			'url' => 'http://test/rest/42xyz42'
    +		    // list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
    +		] )->willReturn( [ 200, 'OK', [], 's:8:"somedata";', 0 ] );
    +		$result = $this->bag->get( '42xyz42' );
    +		$this->assertEquals( 'somedata', $result );
    +	}
    +
    +	public function testGetNotExist() {
    +		$this->client->expects( $this->once() )->method( 'run' )->with( [
    +			'method' => 'GET',
    +			'url' => 'http://test/rest/42xyz42'
    +			// list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
    +		] )->willReturn( [ 404, 'Not found', [], 'Nothing to see here', 0 ] );
    +		$result = $this->bag->get( '42xyz42' );
    +		$this->assertFalse( $result );
    +	}
    +
    +	public function testGetBadClient() {
    +		$this->client->expects( $this->once() )->method( 'run' )->with( [
    +			'method' => 'GET',
    +			'url' => 'http://test/rest/42xyz42'
    +			// list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
    +		] )->willReturn( [ 0, '', [], '', 'cURL has failed you today' ] );
    +		$result = $this->bag->get( '42xyz42' );
    +		$this->assertFalse( $result );
    +		$this->assertEquals( BagOStuff::ERR_UNREACHABLE, $this->bag->getLastError() );
    +	}
    +
    +	public function testGetBadServer() {
    +		$this->client->expects( $this->once() )->method( 'run' )->with( [
    +			'method' => 'GET',
    +			'url' => 'http://test/rest/42xyz42'
    +			// list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
    +		] )->willReturn( [ 500, 'Too busy', [], 'Server is too busy', '' ] );
    +		$result = $this->bag->get( '42xyz42' );
    +		$this->assertFalse( $result );
    +		$this->assertEquals( BagOStuff::ERR_UNEXPECTED, $this->bag->getLastError() );
    +	}
    +
    +	public function testPut() {
    +		$this->client->expects( $this->once() )->method( 'run' )->with( [
    +			'method' => 'PUT',
    +			'url' => 'http://test/rest/42xyz42',
    +		    'body' => 's:8:"postdata";'
    +			// list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
    +		] )->willReturn( [ 200, 'OK', [], 'Done', 0 ] );
    +		$result = $this->bag->set( '42xyz42', 'postdata' );
    +		$this->assertTrue( $result );
    +	}
    +
    +	public function testDelete() {
    +		$this->client->expects( $this->once() )->method( 'run' )->with( [
    +			'method' => 'DELETE',
    +			'url' => 'http://test/rest/42xyz42',
    +			// list( $rcode, $rdesc, $rhdrs, $rbody, $rerr )
    +		] )->willReturn( [ 200, 'OK', [], 'Done', 0 ] );
    +		$result = $this->bag->delete( '42xyz42' );
    +		$this->assertTrue( $result );
    +	}
    +}
    diff --git a/tests/phpunit/includes/parser/NewParserTest.php b/tests/phpunit/includes/parser/NewParserTest.php
    index 354ddd4fc6..8512572a25 100644
    --- a/tests/phpunit/includes/parser/NewParserTest.php
    +++ b/tests/phpunit/includes/parser/NewParserTest.php
    @@ -324,7 +324,21 @@ class NewParserTest extends MediaWikiTestCase {
     			], $this->db->timestamp( '20010115123500' ), $user );
     		}
     
    -		# A DjVu file
    +		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'Audio.oga' ) );
    +		if ( !$this->db->selectField( 'image', '1', [ 'img_name' => $image->getName() ] ) ) {
    +			$image->recordUpload2( '', 'An awesome hitsong ', 'Will it play', [
    +					'size'        => 12345,
    +					'width'       => 0,
    +					'height'      => 0,
    +					'bits'        => 0,
    +					'media_type'  => MEDIATYPE_AUDIO,
    +					'mime'        => 'application/ogg',
    +					'metadata'    => serialize( [] ),
    +					'sha1'        => Wikimedia\base_convert( '', 16, 36, 32 ),
    +					'fileExists'  => true
    +			], $this->db->timestamp( '20010115123500' ), $user );
    +		}
    +
     		# A DjVu file
     		$image = wfLocalFile( Title::makeTitle( NS_FILE, 'LoremIpsum.djvu' ) );
     		if ( !$this->db->selectField( 'image', '1', [ 'img_name' => $image->getName() ] ) ) {
    diff --git a/tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php b/tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php
    deleted file mode 100644
    index 8de467fee4..0000000000
    --- a/tests/phpunit/includes/phpunit/ConsecutiveParametersMatcher.php
    +++ /dev/null
    @@ -1,124 +0,0 @@
    -<?php
    -// @codingStandardsIgnoreFile
    -/*
    - * This file is part of the PHPUnit_MockObject package.
    - *
    - * (c) Sebastian Bergmann <sebastian@phpunit.de>
    - *
    - * For the full copyright and license information, please view the LICENSE
    - * file that was distributed with this source code.
    - */
    -
    -/**
    - * Invocation matcher which looks for sets of specific parameters in the invocations.
    - *
    - * Checks the parameters of the incoming invocations, the parameter list is
    - * checked against the defined constraints in $parameters. If the constraint
    - * is met it will return true in matches().
    - *
    - * It takes a list of match groups and and increases a call index after each invocation.
    - * So the first invocation uses the first group of constraints, the second the next and so on.
    - */
    -class PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters extends PHPUnit_Framework_MockObject_Matcher_StatelessInvocation
    -{
    -    /**
    -     * @var array
    -     */
    -    private $_parameterGroups = array();
    -
    -    /**
    -     * @var array
    -     */
    -    private $_invocations = array();
    -
    -    /**
    -     * @param array $parameterGroups
    -     */
    -    public function __construct(array $parameterGroups)
    -    {
    -        foreach ($parameterGroups as $index => $parameters) {
    -            foreach ($parameters as $parameter) {
    -                if (!($parameter instanceof \PHPUnit_Framework_Constraint)) {
    -                    $parameter = new \PHPUnit_Framework_Constraint_IsEqual($parameter);
    -                }
    -                $this->_parameterGroups[$index][] = $parameter;
    -            }
    -        }
    -    }
    -
    -    /**
    -     * @return string
    -     */
    -    public function toString()
    -    {
    -        $text = 'with consecutive parameters';
    -
    -        return $text;
    -    }
    -
    -    /**
    -     * @param  PHPUnit_Framework_MockObject_Invocation $invocation
    -     * @return bool
    -     */
    -    public function matches(PHPUnit_Framework_MockObject_Invocation $invocation)
    -    {
    -        $this->_invocations[] = $invocation;
    -        $callIndex            = count($this->_invocations) - 1;
    -        $this->verifyInvocation($invocation, $callIndex);
    -
    -        return false;
    -    }
    -
    -    public function verify()
    -    {
    -        foreach ($this->_invocations as $callIndex => $invocation) {
    -            $this->verifyInvocation($invocation, $callIndex);
    -        }
    -    }
    -
    -    /**
    -     * Verify a single invocation
    -     *
    -     * @param  PHPUnit_Framework_MockObject_Invocation      $invocation
    -     * @param  int                                          $callIndex
    -     * @throws PHPUnit_Framework_ExpectationFailedException
    -     */
    -    private function verifyInvocation(PHPUnit_Framework_MockObject_Invocation $invocation, $callIndex)
    -    {
    -
    -        if (isset($this->_parameterGroups[$callIndex])) {
    -            $parameters = $this->_parameterGroups[$callIndex];
    -        } else {
    -          // no parameter assertion for this call index
    -            return;
    -        }
    -
    -        if ($invocation === null) {
    -            throw new PHPUnit_Framework_ExpectationFailedException(
    -                'Mocked method does not exist.'
    -            );
    -        }
    -
    -        if (count($invocation->parameters) < count($parameters)) {
    -            throw new PHPUnit_Framework_ExpectationFailedException(
    -                sprintf(
    -                    'Parameter count for invocation %s is too low.',
    -                    $invocation->toString()
    -                )
    -            );
    -        }
    -
    -        foreach ($parameters as $i => $parameter) {
    -            $parameter->evaluate(
    -                $invocation->parameters[$i],
    -                sprintf(
    -                    'Parameter %s for invocation #%d %s does not match expected ' .
    -                    'value.',
    -                    $i,
    -                    $callIndex,
    -                    $invocation->toString()
    -                )
    -            );
    -        }
    -    }
    -}
    diff --git a/tests/phpunit/includes/phpunit/LICENSE b/tests/phpunit/includes/phpunit/LICENSE
    deleted file mode 100644
    index fe178b0835..0000000000
    --- a/tests/phpunit/includes/phpunit/LICENSE
    +++ /dev/null
    @@ -1,33 +0,0 @@
    -PHPUnit
    -
    -Copyright (c) 2001-2014, Sebastian Bergmann <sebastian@phpunit.de>.
    -All rights reserved.
    -
    -Redistribution and use in source and binary forms, with or without
    -modification, are permitted provided that the following conditions
    -are met:
    -
    - * Redistributions of source code must retain the above copyright
    -   notice, this list of conditions and the following disclaimer.
    -
    - * Redistributions in binary form must reproduce the above copyright
    -   notice, this list of conditions and the following disclaimer in
    -   the documentation and/or other materials provided with the
    -   distribution.
    -
    - * Neither the name of Sebastian Bergmann nor the names of his
    -   contributors may be used to endorse or promote products derived
    -   from this software without specific prior written permission.
    -
    -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
    -FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
    -COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
    -INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
    -BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
    -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
    -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    -LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
    -ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
    -POSSIBILITY OF SUCH DAMAGE.
    diff --git a/tests/phpunit/includes/phpunit/README b/tests/phpunit/includes/phpunit/README
    deleted file mode 100644
    index 3ec3fd9274..0000000000
    --- a/tests/phpunit/includes/phpunit/README
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -This directory contains classes duplicated from new versions of phpunit
    -that also work in the older php 3.7.37 used by wmf CI servers.
    diff --git a/tests/phpunit/includes/registration/CoreVersionCheckerTest.php b/tests/phpunit/includes/registration/CoreVersionCheckerTest.php
    index 4aa4f41524..1dfcd82226 100644
    --- a/tests/phpunit/includes/registration/CoreVersionCheckerTest.php
    +++ b/tests/phpunit/includes/registration/CoreVersionCheckerTest.php
    @@ -14,7 +14,7 @@ class CoreVersionCheckerTest extends PHPUnit_Framework_TestCase {
     
     	public static function provideCheck() {
     		return [
    -			// array( $wgVersion, constraint, expected )
    +			// [ $wgVersion, constraint, expected ]
     			[ '1.25alpha', '>= 1.26', false ],
     			[ '1.25.0', '>= 1.26', false ],
     			[ '1.26alpha', '>= 1.26', true ],
    diff --git a/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php b/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
    index 72ea495999..ea775ae43c 100644
    --- a/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
    +++ b/tests/phpunit/includes/resourceloader/ResourceLoaderStartUpModuleTest.php
    @@ -5,7 +5,7 @@ class ResourceLoaderStartUpModuleTest extends ResourceLoaderTestCase {
     	// Version hash for a blank file module.
     	// Result of ResourceLoader::makeHash(), ResourceLoaderTestModule
     	// and ResourceLoaderFileModule::getDefinitionSummary().
    -	protected static $blankVersion = 'GqV9IPpY';
    +	protected static $blankVersion = '0a56zyi';
     
     	protected static function expandPlaceholders( $text ) {
     		return strtr( $text, [
    diff --git a/tests/phpunit/includes/search/SearchEngineTest.php b/tests/phpunit/includes/search/SearchEngineTest.php
    index 055e982377..f084c6461c 100644
    --- a/tests/phpunit/includes/search/SearchEngineTest.php
    +++ b/tests/phpunit/includes/search/SearchEngineTest.php
    @@ -50,6 +50,10 @@ class SearchEngineTest extends MediaWikiLangTestCase {
     			return;
     		}
     
    +		// Reset the search type back to default - some extensions may have
    +		// overridden it.
    +		$this->setMwGlobals( [ 'wgSearchType' => null ] );
    +
     		$this->insertPage( 'Not_Main_Page', 'This is not a main page' );
     		$this->insertPage(
     			'Talk:Not_Main_Page',
    @@ -153,4 +157,49 @@ class SearchEngineTest extends MediaWikiLangTestCase {
     			"Title power search failed" );
     	}
     
    +	/**
    +	 * @covers SearchEngine::getSearchIndexFields
    +	 */
    +	public function testSearchIndexFields() {
    +		/**
    +		 * @var $mockEngine SearchEngine
    +		 */
    +		$mockEngine = $this->getMock( 'SearchEngine', [ 'makeSearchFieldMapping' ] );
    +
    +		$mockFieldBuilder = function ( $name, $type ) {
    +			$mockField =
    +				$this->getMockBuilder( 'SearchIndexFieldDefinition' )->setConstructorArgs( [
    +					$name,
    +					$type
    +				] )->getMock();
    +			$mockField->expects( $this->any() )->method( 'getMapping' )->willReturn( [
    +				'testData' => 'test',
    +				'name' => $name,
    +				'type' => $type,
    +			] );
    +			return $mockField;
    +		};
    +
    +		$mockEngine->expects( $this->atLeastOnce() )
    +			->method( 'makeSearchFieldMapping' )
    +			->willReturnCallback( $mockFieldBuilder );
    +
    +		// Not using mock since PHPUnit mocks do not work properly with references in params
    +		$this->mergeMwGlobalArrayValue( 'wgHooks',
    +			[ 'SearchIndexFields' => [ [ $this, 'hookSearchIndexFields', $mockFieldBuilder ] ] ] );
    +
    +		$fields = $mockEngine->getSearchIndexFields();
    +		$this->assertArrayHasKey( 'language', $fields );
    +		$this->assertArrayHasKey( 'category', $fields );
    +		$this->assertInstanceOf( 'SearchIndexField', $fields['testField'] );
    +
    +		$mapping = $fields['testField']->getMapping( $mockEngine );
    +		$this->assertArrayHasKey( 'testData', $mapping );
    +		$this->assertEquals( 'test', $mapping['testData'] );
    +	}
    +
    +	public function hookSearchIndexFields( $mockFieldBuilder, &$fields, SearchEngine $engine ) {
    +		$fields['testField'] = $mockFieldBuilder( "testField", SearchIndexField::INDEX_TYPE_TEXT );
    +		return true;
    +	}
     }
    diff --git a/tests/phpunit/includes/search/SearchIndexFieldTest.php b/tests/phpunit/includes/search/SearchIndexFieldTest.php
    new file mode 100644
    index 0000000000..ec046a767f
    --- /dev/null
    +++ b/tests/phpunit/includes/search/SearchIndexFieldTest.php
    @@ -0,0 +1,39 @@
    +<?php
    +
    +/**
    + * @group Search
    + * @covers SearchIndexFieldDefinition
    + */
    +class SearchIndexFieldTest extends MediaWikiTestCase {
    +
    +	public function getMergeCases() {
    +		return [
    +			[ 0, 'test', 0, 'test', true ],
    +			[ SearchIndexField::INDEX_TYPE_NESTED, 'test',
    +			  SearchIndexField::INDEX_TYPE_NESTED, 'test', false ],
    +			[ 0, 'test', 0, 'test2', true ],
    +			[ 0, 'test', 1, 'test', false ],
    +		];
    +	}
    +
    +	/**
    +	 * @dataProvider getMergeCases
    +	 */
    +	public function testMerge( $t1, $n1, $t2, $n2, $result ) {
    +		$field1 = $this->getMockBuilder( 'SearchIndexFieldDefinition' )
    +			->setMethods( [ 'getMapping' ] )
    +			->setConstructorArgs( [ $n1, $t1 ] )->getMock();
    +		$field2 = $this->getMockBuilder( 'SearchIndexFieldDefinition' )
    +			->setMethods( [ 'getMapping' ] )
    +			->setConstructorArgs( [ $n2, $t2 ] )->getMock();
    +
    +		if ( $result ) {
    +			$this->assertNotFalse( $field1->merge( $field2 ) );
    +		} else {
    +			$this->assertFalse( $field1->merge( $field2 ) );
    +		}
    +
    +		$field1->setFlag( 0xFF );
    +		$this->assertFalse( $field1->merge( $field2 ) );
    +	}
    +}
    diff --git a/tests/phpunit/includes/session/CookieSessionProviderTest.php b/tests/phpunit/includes/session/CookieSessionProviderTest.php
    index b35b6850df..da4b06ec83 100644
    --- a/tests/phpunit/includes/session/CookieSessionProviderTest.php
    +++ b/tests/phpunit/includes/session/CookieSessionProviderTest.php
    @@ -22,7 +22,6 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
     			'CookieHttpOnly' => true,
     			'SessionName' => false,
     			'CookieExpiration' => 100,
    -			'ExtendedLoginCookies' => [ 'UserID', 'Token' ],
     			'ExtendedLoginCookieExpiration' => 200,
     		] );
     	}
    @@ -148,6 +147,14 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
     		$this->assertTrue( $provider->persistsSessionId() );
     		$this->assertTrue( $provider->canChangeUser() );
     
    +		$extendedCookies = [ 'UserID', 'UserName', 'Token' ];
    +
    +		$this->assertEquals(
    +			$extendedCookies,
    +			\TestingAccessWrapper::newFromObject( $provider )->getExtendedLoginCookies(),
    +			'List of extended cookies (subclasses can add values, but we\'re calling the core one here)'
    +		);
    +
     		$msg = $provider->whyNoSession();
     		$this->assertInstanceOf( 'Message', $msg );
     		$this->assertSame( 'sessionprovider-nocookies', $msg->getKey() );
    @@ -506,10 +513,10 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
     			'httpOnly' => $config->get( 'CookieHttpOnly' ),
     			'raw' => false,
     		];
    +
    +		$normalExpiry = $config->get( 'CookieExpiration' );
     		$extendedExpiry = $config->get( 'ExtendedLoginCookieExpiration' );
     		$extendedExpiry = (int)( $extendedExpiry === null ? 0 : $extendedExpiry );
    -		$this->assertEquals( [ 'UserID', 'Token' ], $config->get( 'ExtendedLoginCookies' ),
    -			'sanity check' );
     		$expect = [
     			'MySessionName' => [
     				'value' => (string)$sessionId,
    @@ -517,10 +524,11 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
     			] + $defaults,
     			'xUserID' => [
     				'value' => (string)$user->getId(),
    -				'expire' => $extendedExpiry,
    +				'expire' => $remember ? $extendedExpiry : $normalExpiry,
     			] + $defaults,
     			'xUserName' => [
     				'value' => $user->getName(),
    +				'expire' => $remember ? $extendedExpiry : $normalExpiry
     			] + $defaults,
     			'xToken' => [
     				'value' => $remember ? $user->getToken() : '',
    @@ -807,12 +815,20 @@ class CookieSessionProviderTest extends MediaWikiTestCase {
     		$provider->setConfig( $config );
     		$provider->setManager( SessionManager::singleton() );
     
    -		$this->assertSame( 200, $provider->getLoginCookieExpiration( 'Token' ) );
    -		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'User' ) );
    +		// First cookie is an extended cookie, remember me true
    +		$this->assertSame( 200, $provider->getLoginCookieExpiration( 'Token', true ) );
    +		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'User', true ) );
    +
    +		// First cookie is an extended cookie, remember me false
    +		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'UserID', false ) );
    +		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'User', false ) );
     
     		$config->set( 'ExtendedLoginCookieExpiration', null );
     
    -		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'Token' ) );
    -		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'User' ) );
    +		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'Token', true ) );
    +		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'User', true ) );
    +
    +		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'Token', false ) );
    +		$this->assertSame( 100, $provider->getLoginCookieExpiration( 'User', false ) );
     	}
     }
    diff --git a/tests/phpunit/includes/site/DBSiteStoreTest.php b/tests/phpunit/includes/site/DBSiteStoreTest.php
    index 316fd89076..32dd7f282c 100644
    --- a/tests/phpunit/includes/site/DBSiteStoreTest.php
    +++ b/tests/phpunit/includes/site/DBSiteStoreTest.php
    @@ -67,20 +67,6 @@ class DBSiteStoreTest extends MediaWikiTestCase {
     		}
     	}
     
    -	/**
    -	 * @covers DBSiteStore::getSites
    -	 * @covers DBSiteStore::setLanguageCodeMapping
    -	 */
    -	public function testLanguageCodeMapping() {
    -		TestSites::insertIntoDb();
    -
    -		$store = $this->newDBSiteStore();
    -		$store->setLanguageCodeMapping( [ 'no' => 'nb' ] );
    -
    -		$site = $store->getSite( 'nowiki' );
    -		$this->assertEquals( $site->getLanguageCode(), 'nb' );
    -	}
    -
     	/**
     	 * @covers DBSiteStore::saveSites
     	 */
    diff --git a/tests/phpunit/includes/site/FileBasedSiteLookupTest.php b/tests/phpunit/includes/site/FileBasedSiteLookupTest.php
    index bebda79c68..7984795b99 100644
    --- a/tests/phpunit/includes/site/FileBasedSiteLookupTest.php
    +++ b/tests/phpunit/includes/site/FileBasedSiteLookupTest.php
    @@ -98,15 +98,4 @@ class FileBasedSiteLookupTest extends PHPUnit_Framework_TestCase {
     		return tempnam( sys_get_temp_dir(), 'mw-test-sitelist' );
     	}
     
    -	public function testLanguageCodeMapping() {
    -		$sites = $this->getSites();
    -		$cacheBuilder = $this->newSitesCacheFileBuilder( $sites );
    -		$cacheBuilder->build();
    -
    -		$cache = new FileBasedSiteLookup( $this->cacheFile );
    -		$cache->setLanguageCodeMapping( [ 'en' => 'fa' ] );
    -
    -		$this->assertEquals( $cache->getSite( 'enwiktionary' )->getLanguageCode(), 'fa' );
    -	}
    -
     }
    diff --git a/tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php b/tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php
    index 3f67b2b315..64cdbaa915 100644
    --- a/tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php
    +++ b/tests/phpunit/includes/site/MediaWikiPageNameNormalizerTest.php
    @@ -29,36 +29,15 @@ use MediaWiki\Site\MediaWikiPageNameNormalizer;
      */
     class MediaWikiPageNameNormalizerTest extends PHPUnit_Framework_TestCase {
     
    -	protected function setUp() {
    -		parent::setUp();
    -
    -		static $connectivity = null;
    -
    -		if ( $connectivity === null ) {
    -			// Check whether we have (reasonable fast) connectivity
    -			$res = Http::get(
    -				'https://www.wikidata.org/w/api.php?action=query&meta=siteinfo&format=json',
    -				[ 'timeout' => 3 ],
    -				__METHOD__
    -			);
    -
    -			if ( $res === false || strpos( $res, '"sitename":"Wikidata"' ) === false ) {
    -				$connectivity = false;
    -			} else {
    -				$connectivity = true;
    -			}
    -		}
    -
    -		if ( !$connectivity ) {
    -			$this->markTestSkipped( 'MediaWikiPageNameNormalizerTest needs internet connectivity.' );
    -		}
    -	}
    -
     	/**
     	 * @dataProvider normalizePageTitleProvider
     	 */
    -	public function testNormalizePageTitle( $expected, $pageName ) {
    -		$normalizer = new MediaWikiPageNameNormalizer();
    +	public function testNormalizePageTitle( $expected, $pageName, $getResponse ) {
    +		MediaWikiPageNameNormalizerTestMockHttp::$response = $getResponse;
    +
    +		$normalizer = new MediaWikiPageNameNormalizer(
    +			new MediaWikiPageNameNormalizerTestMockHttp()
    +		);
     
     		$this->assertSame(
     			$expected,
    @@ -67,19 +46,70 @@ class MediaWikiPageNameNormalizerTest extends PHPUnit_Framework_TestCase {
     	}
     
     	public function normalizePageTitleProvider() {
    -		// Note: This makes (very conservative) assumptions about pages on Wikidata
    -		// existing or not.
    +		// Response are taken from wikidata and kkwiki using the following API request
    +		// api.php?action=query&prop=info&redirects=1&converttitles=1&format=json&titles=…
     		return [
     			'universe (Q1)' => [
    -				'Q1', 'Q1'
    +				'Q1',
    +				'Q1',
    +				'{"batchcomplete":"","query":{"pages":{"129":{"pageid":129,"ns":0,'
    +				. '"title":"Q1","contentmodel":"wikibase-item","pagelanguage":"en",'
    +				. '"pagelanguagehtmlcode":"en","pagelanguagedir":"ltr",'
    +				. '"touched":"2016-06-23T05:11:21Z","lastrevid":350004448,"length":58001}}}}'
     			],
     			'Q404 redirects to Q395' => [
    -				'Q395', 'Q404'
    +				'Q395',
    +				'Q404',
    +				'{"batchcomplete":"","query":{"redirects":[{"from":"Q404","to":"Q395"}],"pages"'
    +				. ':{"601":{"pageid":601,"ns":0,"title":"Q395","contentmodel":"wikibase-item",'
    +				. '"pagelanguage":"en","pagelanguagehtmlcode":"en","pagelanguagedir":"ltr",'
    +				. '"touched":"2016-06-23T08:00:20Z","lastrevid":350021914,"length":60108}}}}'
    +			],
    +			'D converted to Д (Latin to Cyrillic) (taken from kkwiki)' => [
    +				'Д',
    +				'D',
    +				'{"batchcomplete":"","query":{"converted":[{"from":"D","to":"\u0414"}],'
    +				. '"pages":{"510541":{"pageid":510541,"ns":0,"title":"\u0414",'
    +				. '"contentmodel":"wikitext","pagelanguage":"kk","pagelanguagehtmlcode":"kk",'
    +				. '"pagelanguagedir":"ltr","touched":"2015-11-22T09:16:18Z",'
    +				. '"lastrevid":2373618,"length":3501}}}}'
     			],
     			'there is no Q0' => [
    -				false, 'Q0'
    -			]
    +				false,
    +				'Q0',
    +				'{"batchcomplete":"","query":{"pages":{"-1":{"ns":0,"title":"Q0",'
    +				. '"missing":"","contentmodel":"wikibase-item","pagelanguage":"en",'
    +				. '"pagelanguagehtmlcode":"en","pagelanguagedir":"ltr"}}}}'
    +			],
    +			'invalid title' => [
    +				false,
    +				'{{',
    +				'{"batchcomplete":"","query":{"pages":{"-1":{"title":"{{",'
    +				. '"invalidreason":"The requested page title contains invalid '
    +				. 'characters: \"{\".","invalid":""}}}}'
    +			],
    +			'error on get' => [ false, 'ABC', false ]
     		];
     	}
     
     }
    +
    +/**
    + * @private
    + * @see Http
    + */
    +class MediaWikiPageNameNormalizerTestMockHttp extends Http {
    +
    +	/**
    +	 * @var mixed
    +	 */
    +	public static $response;
    +
    +	public static function get( $url, $options = [], $caller = __METHOD__ ) {
    +		PHPUnit_Framework_Assert::assertInternalType( 'string', $url );
    +		PHPUnit_Framework_Assert::assertInternalType( 'array', $options );
    +		PHPUnit_Framework_Assert::assertInternalType( 'string', $caller );
    +
    +		return self::$response;
    +	}
    +}
    diff --git a/tests/phpunit/includes/specials/SpecialSearchTest.php b/tests/phpunit/includes/specials/SpecialSearchTest.php
    index 4ea9686680..3fa8a9f8ed 100644
    --- a/tests/phpunit/includes/specials/SpecialSearchTest.php
    +++ b/tests/phpunit/includes/specials/SpecialSearchTest.php
    @@ -29,10 +29,10 @@ class SpecialSearchTest extends MediaWikiTestCase {
     			$this->newUserWithSearchNS( $userOptions )
     		);
     		/*
    -		$context->setRequest( new FauxRequest( array(
    +		$context->setRequest( new FauxRequest( [
     			'ns5'=>true,
     			'ns6'=>true,
    -		) ));
    +		] ));
     		 */
     		$context->setRequest( new FauxRequest( $requested ) );
     		$search = new SpecialSearch();
    diff --git a/tests/phpunit/includes/tidy/BalancerTest.php b/tests/phpunit/includes/tidy/BalancerTest.php
    new file mode 100644
    index 0000000000..7b94e40417
    --- /dev/null
    +++ b/tests/phpunit/includes/tidy/BalancerTest.php
    @@ -0,0 +1,148 @@
    +<?php
    +
    +class BalancerTest extends MediaWikiTestCase {
    +	private $balancer;
    +
    +	/**
    +	 * Anything that needs to happen before your tests should go here.
    +	 */
    +	protected function setUp() {
    +		// Be sure to do call the parent setup and teardown functions.
    +		// This makes sure that all the various cleanup and restorations
    +		// happen as they should (including the restoration for setMwGlobals).
    +		parent::setUp();
    +		$this->balancer = new MediaWiki\Tidy\Balancer( [
    +			'strict' => false, /* not strict */
    +			'allowedHtmlElements' => null, /* no sanitization */
    +			'tidyCompat' => false, /* standard parser */
    +		] );
    +	}
    +
    +	/**
    +	 * Anything cleanup you need to do should go here.
    +	 */
    +	protected function tearDown() {
    +		parent::tearDown();
    +	}
    +
    +	/**
    +	 * @covers Balancer::balance
    +	 * @dataProvider provideBalancerTests
    +	 */
    +	public function testBalancer( $description, $input, $expected ) {
    +		$output = $this->balancer->balance( $input );
    +
    +		// Ignore self-closing tags
    +		$output = preg_replace( '/\s*\/>/', '>', $output );
    +
    +		$this->assertEquals( $expected, $output, $description );
    +	}
    +
    +	public static function provideBalancerTests() {
    +		// Get the tests from html5lib-tests.json
    +		$json = json_decode( file_get_contents(
    +			__DIR__ . '/html5lib-tests.json'
    +		), true );
    +		// Munge this slightly into the format phpunit expects
    +		// for providers, and filter out HTML constructs which
    +		// the balancer doesn't support.
    +		$tests = [];
    +		$start = '<html><head></head><body>';
    +		$end = '</body></html>';
    +		foreach ( $json as $filename => $cases ) {
    +			foreach ( $cases as $case ) {
    +				$html = $case['document']['html'];
    +				if (
    +					substr( $html, 0, strlen( $start ) ) !== $start ||
    +					substr( $html, -strlen( $end ) ) !== $end
    +				) {
    +					// Skip tests which involve stuff in the <head> or
    +					// weird doctypes.
    +					continue;
    +				}
    +				// We used to do this:
    +				//   $html = substr( $html, strlen( $start ), -strlen( $end ) );
    +				// But now we use a different field in the test case,
    +				// which reports how domino would parse this case in a
    +				// no-quirks <body> context.  (The original test case may
    +				// have had a different context, or relied on quirks mode.)
    +				$html = $case['document']['noQuirksBodyHtml'];
    +				// Normalize case of SVG attributes.
    +				$html = str_replace( 'foreignObject', 'foreignobject', $html );
    +
    +				if ( isset( $case['document']['props']['comment'] ) ) {
    +					// Skip tests which include HTML comments, which
    +					// the balancer requires to have been stripped.
    +					continue;
    +				}
    +				if ( strpos( $case['data'], '<![CDATA[' ) !== false ) {
    +					// Skip tests involving <![CDATA[ ]]> quoting.
    +					continue;
    +				}
    +				if ( stripos( $case['data'], '<!DOCTYPE' ) !== false ) {
    +					// Skip tests involving doctypes.
    +					continue;
    +				}
    +				if ( preg_match( ',</?(html|head|body|frame|plaintext)>|<rdar:,i', $case['data'] ) ) {
    +					// Skip tests involving some literal tags, which are
    +					// unsupported but don't show up in the expected output.
    +					continue;
    +				}
    +				if (
    +					isset( $case['document']['props']['tags']['form'] ) ||
    +					isset( $case['document']['props']['tags']['iframe'] ) ||
    +					isset( $case['document']['props']['tags']['noembed'] ) ||
    +					isset( $case['document']['props']['tags']['noscript'] ) ||
    +					isset( $case['document']['props']['tags']['script'] ) ||
    +					isset( $case['document']['props']['tags']['select'] ) ||
    +					isset( $case['document']['props']['tags']['svg script'] ) ||
    +					isset( $case['document']['props']['tags']['svg title'] ) ||
    +					isset( $case['document']['props']['tags']['textarea'] ) ||
    +					isset( $case['document']['props']['tags']['title'] ) ||
    +					isset( $case['document']['props']['tags']['xmp'] )
    +				) {
    +					// Skip tests with unsupported tags which *do* show
    +					// up in the expected output.
    +					continue;
    +				}
    +				if (
    +					$filename === 'entities01.dat' ||
    +					$filename === 'entities02.dat' ||
    +					preg_match( '/&([a-z]+|#x[0-9A-F]+);/i', $case['data'] ) ||
    +					preg_match( '/^(&|&#|&#X|&#x|&#45|&x-test|&AMP)$/', $case['data'] )
    +				) {
    +					// Skip tests involving entity encoding.
    +					continue;
    +				}
    +				if (
    +					isset( $case['document']['props']['tagWithLt'] ) ||
    +					isset( $case['document']['props']['attrWithFunnyChar'] ) ||
    +					preg_match( ':^(</b test|<di|<foo bar=qux/>)$:', $case['data'] ) ||
    +					preg_match( ':</p<p>:', $case['data'] )
    +				) {
    +					// Skip tests with funny tag or attribute names,
    +					// which are really tests of the HTML tokenizer, not
    +					// the tree builder.
    +					continue;
    +				}
    +				if (
    +					stripos( $case['data'], 'encoding=" text/html "' ) !== false
    +				) {
    +					// The Sanitizer normalizes whitespace in attribute
    +					// values, which makes this test case invalid.
    +					continue;
    +				}
    +				if ( $filename === 'plain-text-unsafe.dat' ) {
    +					// Skip tests with ASCII null, etc.
    +					continue;
    +				}
    +				$tests[] = [
    +					$filename, # use better description?
    +					$case['data'],
    +					$html
    +				];
    +			}
    +		}
    +		return $tests;
    +	}
    +}
    diff --git a/tests/phpunit/includes/tidy/html5lib-tests.json b/tests/phpunit/includes/tidy/html5lib-tests.json
    new file mode 100644
    index 0000000000..beb36598dd
    --- /dev/null
    +++ b/tests/phpunit/includes/tidy/html5lib-tests.json
    @@ -0,0 +1,78905 @@
    +{
    +  "adoption01.dat": [
    +    {
    +      "data": "<a><p></a></p>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,10): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a></a><p><a></a></p></body></html>",
    +        "noQuirksBodyHtml": "<a></a><p><a></a></p>"
    +      }
    +    },
    +    {
    +      "data": "<a>1<p>2</a>3</p>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,12): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "3"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a>1</a><p><a>2</a>3</p></body></html>",
    +        "noQuirksBodyHtml": "<a>1</a><p><a>2</a>3</p>"
    +      }
    +    },
    +    {
    +      "data": "<a>1<button>2</a>3</button>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,17): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "button": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "button",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "3"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a>1</a><button><a>2</a>3</button></body></html>",
    +        "noQuirksBodyHtml": "<a>1</a><button><a>2</a>3</button>"
    +      }
    +    },
    +    {
    +      "data": "<a>1<b>2</a>3</b>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,12): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "3"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a>1<b>2</b></a><b>3</b></body></html>",
    +        "noQuirksBodyHtml": "<a>1<b>2</b></a><b>3</b>"
    +      }
    +    },
    +    {
    +      "data": "<a>1<div>2<div>3</a>4</div>5</div>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,20): adoption-agency-1.3",
    +        "(1,20): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "a",
    +                            "children": [
    +                              {
    +                                "text": "3"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": "4"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "5"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a>1</a><div><a>2</a><div><a>3</a>4</div>5</div></body></html>",
    +        "noQuirksBodyHtml": "<a>1</a><div><a>2</a><div><a>3</a>4</div>5</div>"
    +      }
    +    },
    +    {
    +      "data": "<table><a>1<p>2</a>3</p>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,10): unexpected-start-tag-implies-table-voodoo",
    +        "(1,11): unexpected-character-implies-table-voodoo",
    +        "(1,14): unexpected-start-tag-implies-table-voodoo",
    +        "(1,15): unexpected-character-implies-table-voodoo",
    +        "(1,19): unexpected-end-tag-implies-table-voodoo",
    +        "(1,19): adoption-agency-1.3",
    +        "(1,20): unexpected-character-implies-table-voodoo",
    +        "(1,24): unexpected-end-tag-implies-table-voodoo",
    +        "(1,24): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "p": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "3"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a>1</a><p><a>2</a>3</p><table></table></body></html>",
    +        "noQuirksBodyHtml": "<a>1</a><p><a>2</a>3</p><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<b><b><a><p></a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,16): adoption-agency-1.3",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "a": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "a"
    +                          },
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "tag": "a"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><b><a></a><p><a></a></p></b></b></body></html>",
    +        "noQuirksBodyHtml": "<b><b><a></a><p><a></a></p></b></b>"
    +      }
    +    },
    +    {
    +      "data": "<b><a><b><p></a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,16): adoption-agency-1.3",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "a": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "tag": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "tag": "a"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><a><b></b></a><b><p><a></a></p></b></b></body></html>",
    +        "noQuirksBodyHtml": "<b><a><b></b></a><b><p><a></a></p></b></b>"
    +      }
    +    },
    +    {
    +      "data": "<a><b><b><p></a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,16): adoption-agency-1.3",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "b": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "tag": "a"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a><b><b></b></b></a><b><b><p><a></a></p></b></b></body></html>",
    +        "noQuirksBodyHtml": "<a><b><b></b></b></a><b><b><p><a></a></p></b></b>"
    +      }
    +    },
    +    {
    +      "data": "<p>1<s id=\"A\">2<b id=\"B\">3</p>4</s>5</b>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,30): unexpected-end-tag",
    +        "(1,35): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "s": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      },
    +                      {
    +                        "tag": "s",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "A"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          },
    +                          {
    +                            "tag": "b",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "B"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "text": "3"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "s",
    +                    "attrs": [
    +                      {
    +                        "name": "id",
    +                        "value": "A"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "B"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "text": "4"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "attrs": [
    +                      {
    +                        "name": "id",
    +                        "value": "B"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "5"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p>1<s id=\"A\">2<b id=\"B\">3</b></s></p><s id=\"A\"><b id=\"B\">4</b></s><b id=\"B\">5</b></body></html>",
    +        "noQuirksBodyHtml": "<p>1<s id=\"A\">2<b id=\"B\">3</b></s></p><s id=\"A\"><b id=\"B\">4</b></s><b id=\"B\">5</b>"
    +      }
    +    },
    +    {
    +      "data": "<table><a>1<td>2</td>3</table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,10): unexpected-start-tag-implies-table-voodoo",
    +        "(1,11): unexpected-character-implies-table-voodoo",
    +        "(1,15): unexpected-cell-in-table-body",
    +        "(1,30): unexpected-implied-end-tag-in-table-view"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "3"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "2"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a>1</a><a>3</a><table><tbody><tr><td>2</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<a>1</a><a>3</a><table><tbody><tr><td>2</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table>A<td>B</td>C</table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,8): unexpected-character-implies-table-voodoo",
    +        "(1,12): unexpected-cell-in-table-body",
    +        "(1,22): unexpected-character-implies-table-voodoo"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "AC"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "B"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>AC<table><tbody><tr><td>B</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "AC<table><tbody><tr><td>B</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<a><svg><tr><input></a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,23): unexpected-end-tag",
    +        "(1,23): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "svg svg": true,
    +            "svg tr": true,
    +            "svg input": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "svg",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "input",
    +                                "ns": "http://www.w3.org/2000/svg"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a><svg><tr><input></input></tr></svg></a></body></html>",
    +        "noQuirksBodyHtml": "<a><svg><tr><input></input></tr></svg></a>"
    +      }
    +    },
    +    {
    +      "data": "<div><a><b><div><div><div><div><div><div><div><div><div><div></a>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,65): adoption-agency-1.3",
    +        "(1,65): adoption-agency-1.3",
    +        "(1,65): adoption-agency-1.3",
    +        "(1,65): adoption-agency-1.3",
    +        "(1,65): adoption-agency-1.3",
    +        "(1,65): adoption-agency-1.3",
    +        "(1,65): adoption-agency-1.3",
    +        "(1,65): adoption-agency-1.3",
    +        "(1,65): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "a": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "tag": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "tag": "a"
    +                              },
    +                              {
    +                                "tag": "div",
    +                                "children": [
    +                                  {
    +                                    "tag": "a"
    +                                  },
    +                                  {
    +                                    "tag": "div",
    +                                    "children": [
    +                                      {
    +                                        "tag": "a"
    +                                      },
    +                                      {
    +                                        "tag": "div",
    +                                        "children": [
    +                                          {
    +                                            "tag": "a"
    +                                          },
    +                                          {
    +                                            "tag": "div",
    +                                            "children": [
    +                                              {
    +                                                "tag": "a"
    +                                              },
    +                                              {
    +                                                "tag": "div",
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "a"
    +                                                  },
    +                                                  {
    +                                                    "tag": "div",
    +                                                    "children": [
    +                                                      {
    +                                                        "tag": "a"
    +                                                      },
    +                                                      {
    +                                                        "tag": "div",
    +                                                        "children": [
    +                                                          {
    +                                                            "tag": "a",
    +                                                            "children": [
    +                                                              {
    +                                                                "tag": "div",
    +                                                                "children": [
    +                                                                  {
    +                                                                    "tag": "div"
    +                                                                  }
    +                                                                ]
    +                                                              }
    +                                                            ]
    +                                                          }
    +                                                        ]
    +                                                      }
    +                                                    ]
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><a><b></b></a><b><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a><div><div></div></div></a></div></div></div></div></div></div></div></div></b></div></body></html>",
    +        "noQuirksBodyHtml": "<div><a><b></b></a><b><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a></a><div><a><div><div></div></div></a></div></div></div></div></div></div></div></div></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<div><a><b><u><i><code><div></a>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,32): adoption-agency-1.3",
    +        "(1,32): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "a": true,
    +            "b": true,
    +            "u": true,
    +            "i": true,
    +            "code": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "tag": "u",
    +                                "children": [
    +                                  {
    +                                    "tag": "i",
    +                                    "children": [
    +                                      {
    +                                        "tag": "code"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "u",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "tag": "code",
    +                                "children": [
    +                                  {
    +                                    "tag": "div",
    +                                    "children": [
    +                                      {
    +                                        "tag": "a"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><a><b><u><i><code></code></i></u></b></a><u><i><code><div><a></a></div></code></i></u></div></body></html>",
    +        "noQuirksBodyHtml": "<div><a><b><u><i><code></code></i></u></b></a><u><i><code><div><a></a></div></code></i></u></div>"
    +      }
    +    },
    +    {
    +      "data": "<b><b><b><b>x</b></b></b></b>y",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "children": [
    +                                  {
    +                                    "text": "x"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "y"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><b><b><b>x</b></b></b></b>y</body></html>",
    +        "noQuirksBodyHtml": "<b><b><b><b>x</b></b></b></b>y"
    +      }
    +    },
    +    {
    +      "data": "<p><b><b><b><b><p>x",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,18): unexpected-end-tag",
    +        "(1,19): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "children": [
    +                                  {
    +                                    "tag": "b"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "children": [
    +                                  {
    +                                    "text": "x"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><b><b><b><b></b></b></b></b></p><p><b><b><b>x</b></b></b></p></body></html>",
    +        "noQuirksBodyHtml": "<p><b><b><b><b></b></b></b></b></p><p><b><b><b>x</b></b></b></p>"
    +      }
    +    }
    +  ],
    +  "adoption02.dat": [
    +    {
    +      "data": "<b>1<i>2<p>3</b>4",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,16): adoption-agency-1.3",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "i": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      },
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "text": "3"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": "4"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b>1<i>2</i></b><i><p><b>3</b>4</p></i></body></html>",
    +        "noQuirksBodyHtml": "<b>1<i>2</i></b><i><p><b>3</b>4</p></i>"
    +      }
    +    },
    +    {
    +      "data": "<a><div><style></style><address><a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,35): unexpected-start-tag-implies-end-tag",
    +        "(1,35): adoption-agency-1.3",
    +        "(1,35): adoption-agency-1.3",
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "div": true,
    +            "style": true,
    +            "address": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a"
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "tag": "style"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "address",
    +                        "children": [
    +                          {
    +                            "tag": "a"
    +                          },
    +                          {
    +                            "tag": "a"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a></a><div><a><style></style></a><address><a></a><a></a></address></div></body></html>",
    +        "noQuirksBodyHtml": "<a></a><div><a><style></style></a><address><a></a><a></a></address></div>"
    +      }
    +    }
    +  ],
    +  "comments01.dat": [
    +    {
    +      "data": "FOO<!-- BAR -->BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": " BAR "
    +                  },
    +                  {
    +                    "text": "BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!-- BAR -->BAZ</body></html>",
    +        "noQuirksBodyHtml": "FOO<!-- BAR -->BAZ"
    +      }
    +    },
    +    {
    +      "data": "FOO<!-- BAR --!>BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,15): unexpected-bang-after-double-dash-in-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": " BAR "
    +                  },
    +                  {
    +                    "text": "BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!-- BAR -->BAZ</body></html>",
    +        "noQuirksBodyHtml": "FOO<!-- BAR -->BAZ"
    +      }
    +    },
    +    {
    +      "data": "FOO<!-- BAR --   >BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,15): unexpected-char-in-comment",
    +        "(1,21): eof-in-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": " BAR --   >BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!-- BAR --   >BAZ--></body></html>",
    +        "noQuirksBodyHtml": "FOO<!-- BAR --   >BAZ-->"
    +      }
    +    },
    +    {
    +      "data": "FOO<!-- BAR -- <QUX> -- MUX -->BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,15): unexpected-char-in-comment",
    +        "(1,24): unexpected-char-in-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": " BAR -- <QUX> -- MUX "
    +                  },
    +                  {
    +                    "text": "BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!-- BAR -- <QUX> -- MUX -->BAZ</body></html>",
    +        "noQuirksBodyHtml": "FOO<!-- BAR -- <QUX> -- MUX -->BAZ"
    +      }
    +    },
    +    {
    +      "data": "FOO<!-- BAR -- <QUX> -- MUX --!>BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,15): unexpected-char-in-comment",
    +        "(1,24): unexpected-char-in-comment",
    +        "(1,31): unexpected-bang-after-double-dash-in-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": " BAR -- <QUX> -- MUX "
    +                  },
    +                  {
    +                    "text": "BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!-- BAR -- <QUX> -- MUX -->BAZ</body></html>",
    +        "noQuirksBodyHtml": "FOO<!-- BAR -- <QUX> -- MUX -->BAZ"
    +      }
    +    },
    +    {
    +      "data": "FOO<!-- BAR -- <QUX> -- MUX -- >BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,15): unexpected-char-in-comment",
    +        "(1,24): unexpected-char-in-comment",
    +        "(1,31): unexpected-char-in-comment",
    +        "(1,35): eof-in-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": " BAR -- <QUX> -- MUX -- >BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!-- BAR -- <QUX> -- MUX -- >BAZ--></body></html>",
    +        "noQuirksBodyHtml": "FOO<!-- BAR -- <QUX> -- MUX -- >BAZ-->"
    +      }
    +    },
    +    {
    +      "data": "FOO<!---->BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": ""
    +                  },
    +                  {
    +                    "text": "BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!---->BAZ</body></html>",
    +        "noQuirksBodyHtml": "FOO<!---->BAZ"
    +      }
    +    },
    +    {
    +      "data": "FOO<!--->BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,9): incorrect-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": ""
    +                  },
    +                  {
    +                    "text": "BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!---->BAZ</body></html>",
    +        "noQuirksBodyHtml": "FOO<!---->BAZ"
    +      }
    +    },
    +    {
    +      "data": "FOO<!-->BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,8): incorrect-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": ""
    +                  },
    +                  {
    +                    "text": "BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!---->BAZ</body></html>",
    +        "noQuirksBodyHtml": "FOO<!---->BAZ"
    +      }
    +    },
    +    {
    +      "data": "<?xml version=\"1.0\">Hi",
    +      "errors": [
    +        "(1,1): expected-tag-name-but-got-question-mark",
    +        "(1,22): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "?xml version=\"1.0\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hi"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--?xml version=\"1.0\"--><html><head></head><body>Hi</body></html>",
    +        "noQuirksBodyHtml": "<!--?xml version=\"1.0\"-->Hi"
    +      }
    +    },
    +    {
    +      "data": "<?xml version=\"1.0\">",
    +      "errors": [
    +        "(1,1): expected-tag-name-but-got-question-mark",
    +        "(1,20): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "?xml version=\"1.0\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--?xml version=\"1.0\"--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--?xml version=\"1.0\"-->"
    +      }
    +    },
    +    {
    +      "data": "<?xml version",
    +      "errors": [
    +        "(1,1): expected-tag-name-but-got-question-mark",
    +        "(1,13): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "?xml version"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--?xml version--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--?xml version-->"
    +      }
    +    },
    +    {
    +      "data": "FOO<!----->BAZ",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,10): unexpected-dash-after-double-dash-in-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "comment": "-"
    +                  },
    +                  {
    +                    "text": "BAZ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<!----->BAZ</body></html>",
    +        "noQuirksBodyHtml": "FOO<!----->BAZ"
    +      }
    +    },
    +    {
    +      "data": "<html><!-- comment --><title>Comment before head</title>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "comment": " comment "
    +              },
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "Comment before head"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><!-- comment --><head><title>Comment before head</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!-- comment --><title>Comment before head</title>"
    +      }
    +    }
    +  ],
    +  "doctype01.dat": [
    +    {
    +      "data": "<!DOCTYPE html>Hello",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!dOctYpE HtMl>Hello",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPEhtml>Hello",
    +      "errors": [
    +        "(1,9): need-space-after-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE>Hello",
    +      "errors": [
    +        "(1,9): need-space-after-doctype",
    +        "(1,10): expected-doctype-name-but-got-right-bracket",
    +        "(1,10): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": ""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE ><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE >Hello",
    +      "errors": [
    +        "(1,11): expected-doctype-name-but-got-right-bracket",
    +        "(1,11): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": ""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE ><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato>Hello",
    +      "errors": [
    +        "(1,17): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato >Hello",
    +      "errors": [
    +        "(1,18): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato taco>Hello",
    +      "errors": [
    +        "(1,17): expected-space-or-right-bracket-in-doctype",
    +        "(1,22): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato taco \"ddd>Hello",
    +      "errors": [
    +        "(1,17): expected-space-or-right-bracket-in-doctype",
    +        "(1,27): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato sYstEM>Hello",
    +      "errors": [
    +        "(1,24): unexpected-char-in-doctype",
    +        "(1,24): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato sYstEM    >Hello",
    +      "errors": [
    +        "(1,28): unexpected-char-in-doctype",
    +        "(1,28): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE   potato       sYstEM  ggg>Hello",
    +      "errors": [
    +        "(1,34): unexpected-char-in-doctype",
    +        "(1,37): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato SYSTEM taco  >Hello",
    +      "errors": [
    +        "(1,25): unexpected-char-in-doctype",
    +        "(1,31): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato SYSTEM 'taco\"'>Hello",
    +      "errors": [
    +        "(1,32): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato \"\" \"taco\"\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato SYSTEM \"taco\">Hello",
    +      "errors": [
    +        "(1,31): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato \"\" \"taco\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato SYSTEM \"tai'co\">Hello",
    +      "errors": [
    +        "(1,33): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato \"\" \"tai'co\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato SYSTEMtaco \"ddd\">Hello",
    +      "errors": [
    +        "(1,24): unexpected-char-in-doctype",
    +        "(1,34): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato grass SYSTEM taco>Hello",
    +      "errors": [
    +        "(1,17): expected-space-or-right-bracket-in-doctype",
    +        "(1,35): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato pUbLIc>Hello",
    +      "errors": [
    +        "(1,24): unexpected-end-of-doctype",
    +        "(1,24): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato pUbLIc >Hello",
    +      "errors": [
    +        "(1,25): unexpected-end-of-doctype",
    +        "(1,25): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato pUbLIcgoof>Hello",
    +      "errors": [
    +        "(1,24): unexpected-char-in-doctype",
    +        "(1,28): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato PUBLIC goof>Hello",
    +      "errors": [
    +        "(1,25): unexpected-char-in-doctype",
    +        "(1,29): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato PUBLIC \"go'of\">Hello",
    +      "errors": [
    +        "(1,32): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato \"go'of\" \"\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato PUBLIC 'go'of'>Hello",
    +      "errors": [
    +        "(1,29): unexpected-char-in-doctype",
    +        "(1,32): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato \"go\" \"\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato PUBLIC 'go:hh   of' >Hello",
    +      "errors": [
    +        "(1,38): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato \"go:hh   of\" \"\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE potato PUBLIC \"W3C-//dfdf\" SYSTEM ggg>Hello",
    +      "errors": [
    +        "(1,38): unexpected-char-in-doctype",
    +        "(1,48): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "potato \"W3C-//dfdf\" \"\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE potato><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\n   \"http://www.w3.org/TR/html4/strict.dtd\">Hello",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE ...>Hello",
    +      "errors": [
    +        "(1,14): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "..."
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Hello"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE ...><html><head></head><body>Hello</body></html>",
    +        "noQuirksBodyHtml": "Hello"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">",
    +      "errors": [
    +        "(2,58): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Frameset//EN\"\n\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\">",
    +      "errors": [
    +        "(2,54): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"-//W3C//DTD XHTML 1.0 Frameset//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE root-element [SYSTEM OR PUBLIC FPI] \"uri\" [ \n<!-- internal declarations -->\n]>",
    +      "errors": [
    +        "(1,23): expected-space-or-right-bracket-in-doctype",
    +        "(2,30): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "root-element"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "]>",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE root-element><html><head></head><body>]&gt;</body></html>",
    +        "noQuirksBodyHtml": "\n]&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html PUBLIC\n  \"-//WAPFORUM//DTD XHTML Mobile 1.0//EN\"\n    \"http://www.wapforum.org/DTD/xhtml-mobile10.dtd\">",
    +      "errors": [
    +        "(3,53): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"-//WAPFORUM//DTD XHTML Mobile 1.0//EN\" \"http://www.wapforum.org/DTD/xhtml-mobile10.dtd\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE HTML SYSTEM \"http://www.w3.org/DTD/HTML4-strict.dtd\"><body><b>Mine!</b></body>",
    +      "errors": [
    +        "(1,63): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"\" \"http://www.w3.org/DTD/HTML4-strict.dtd\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "Mine!"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><b>Mine!</b></body></html>",
    +        "noQuirksBodyHtml": "<b>Mine!</b>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"\"http://www.w3.org/TR/html4/strict.dtd\">",
    +      "errors": [
    +        "(1,50): unexpected-char-in-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\"'http://www.w3.org/TR/html4/strict.dtd'>",
    +      "errors": [
    +        "(1,50): unexpected-char-in-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE HTML PUBLIC\"-//W3C//DTD HTML 4.01//EN\"'http://www.w3.org/TR/html4/strict.dtd'>",
    +      "errors": [
    +        "(1,21): unexpected-char-in-doctype",
    +        "(1,49): unexpected-char-in-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE HTML PUBLIC'-//W3C//DTD HTML 4.01//EN''http://www.w3.org/TR/html4/strict.dtd'>",
    +      "errors": [
    +        "(1,21): unexpected-char-in-doctype",
    +        "(1,49): unexpected-char-in-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    }
    +  ],
    +  "domjs-unsafe.dat": [
    +    {
    +      "data": "<svg><![CDATA[foo\nbar]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(2,6): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "foo\nbar"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>foo\nbar</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>foo\nbar</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[foo\rbar]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(2,6): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "foo\nbar"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>foo\nbar</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>foo\nbar</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[foo\r\nbar]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(2,6): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "foo\nbar"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>foo\nbar</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>foo\nbar</svg>"
    +      }
    +    },
    +    {
    +      "data": "<script>a='\u0000'</script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,12): invalid-codepoint"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "a='�'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script>a='�'</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script>a='�'</script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--\u0000</script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag",
    +        "(1,25): invalid-codepoint"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--�",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--�</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--�</script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--foo\u0000</script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag",
    +        "(1,28): invalid-codepoint"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--foo�",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--foo�</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--foo�</script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!-- foo-\u0000</script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag",
    +        "(1,30): invalid-codepoint"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!-- foo-�",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!-- foo-�</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-�</script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!-- foo--\u0000</script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag",
    +        "(1,31): invalid-codepoint"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!-- foo--�",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!-- foo--�</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo--�</script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!-- foo-",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag",
    +        "(1,29): expected-script-data-but-got-eof",
    +        "(1,29): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!-- foo-",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!-- foo-</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-</script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!-- foo-<</script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!-- foo-<",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!-- foo-<</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-<</script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!-- foo-<S",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag",
    +        "(1,31): expected-script-data-but-got-eof",
    +        "(1,31): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!-- foo-<S",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!-- foo-<S</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-<S</script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!-- foo-</SCRIPT>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!-- foo-",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!-- foo-</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!-- foo-</script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--<p></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--<p>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--<p></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--<p></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--<script></script></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--<script></script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--<script></script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--<script>\u0000</script></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag",
    +        "(1,33): invalid-codepoint"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--<script>�</script>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--<script>�</script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--<script>�</script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--<script>-\u0000</script></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag",
    +        "(1,34): invalid-codepoint"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--<script>-�</script>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--<script>-�</script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--<script>-�</script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--<script>--\u0000</script></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag",
    +        "(1,35): invalid-codepoint"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--<script>--�</script>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--<script>--�</script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--<script>--�</script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--<script>---</script></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--<script>---</script>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--<script>---</script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--<script>---</script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--<script></scrip></SCRIPT></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></scrip></SCRIPT>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--<script></scrip></SCRIPT></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--<script></scrip></SCRIPT></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--<script></scrip </SCRIPT></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></scrip </SCRIPT>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--<script></scrip </SCRIPT></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--<script></scrip </SCRIPT></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--<script></scrip/</SCRIPT></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></scrip/</SCRIPT>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--<script></scrip/</SCRIPT></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--<script></scrip/</SCRIPT></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"></scrip/></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "</scrip/>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"></scrip/></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"></scrip/></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"></scrip ></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "</scrip >",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"></scrip ></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"></scrip ></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--</scrip></script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--</scrip>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--</scrip></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--</scrip></script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--</scrip </script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--</scrip ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--</scrip </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--</scrip </script>"
    +      }
    +    },
    +    {
    +      "data": "<script type=\"data\"><!--</scrip/</script>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "data"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "<!--</scrip/",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script type=\"data\"><!--</scrip/</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"data\"><!--</scrip/</script>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><!DOCTYPE html>",
    +      "errors": [
    +        "(1,30): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><!DOCTYPE html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,21): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><head><!DOCTYPE html></head>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,27): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><head></head><!DOCTYPE html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,34): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<body></body><!DOCTYPE html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,28): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<table><!DOCTYPE html></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,22): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table></table></body></html>",
    +        "noQuirksBodyHtml": "<table></table>"
    +      }
    +    },
    +    {
    +      "data": "<select><!DOCTYPE html></select>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,23): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup><!DOCTYPE html></colgroup></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,32): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup><!--test--></colgroup></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "comment": "test"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup><!--test--></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup><!--test--></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup><html></colgroup></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,23): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup> foo</colgroup></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,32): foster-parenting-character-in-table",
    +        "(1,32): foster-parenting-character-in-table",
    +        "(1,32): foster-parenting-character-in-table",
    +        "(1,32): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "foo"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "text": " "
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>foo<table><colgroup> </colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "foo<table><colgroup> </colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<select><!--test--></select>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "comment": "test"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><!--test--></select></body></html>",
    +        "noQuirksBodyHtml": "<select><!--test--></select>"
    +      }
    +    },
    +    {
    +      "data": "<select><html></select>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,14): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<frameset><html></frameset>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,16): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<frameset></frameset><html>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,27): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<frameset></frameset><!DOCTYPE html>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,36): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><body></body></html><!DOCTYPE html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,41): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<svg><!DOCTYPE html></svg>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,20): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><font></font></svg>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><font></font></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><font></font></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><font id=foo></font></svg>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "foo"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><font id=\"foo\"></font></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><font id=\"foo\"></font></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><font size=4></font></svg>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,18): unexpected-html-element-in-foreign-content",
    +        "(1,31): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  },
    +                  {
    +                    "tag": "font",
    +                    "attrs": [
    +                      {
    +                        "name": "size",
    +                        "value": "4"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg></svg><font size=\"4\"></font></body></html>",
    +        "noQuirksBodyHtml": "<svg><font size=\"4\"></font></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><font color=red></font></svg>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,21): unexpected-html-element-in-foreign-content",
    +        "(1,34): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  },
    +                  {
    +                    "tag": "font",
    +                    "attrs": [
    +                      {
    +                        "name": "color",
    +                        "value": "red"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg></svg><font color=\"red\"></font></body></html>",
    +        "noQuirksBodyHtml": "<svg><font color=\"red\"></font></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><font font=sans></font></svg>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "attrs": [
    +                          {
    +                            "name": "font",
    +                            "value": "sans"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><font font=\"sans\"></font></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><font font=\"sans\"></font></svg>"
    +      }
    +    }
    +  ],
    +  "entities01.dat": [
    +    {
    +      "data": "FOO&gt;BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO>BAR",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&gt;BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO&gt;BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&gtBAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,6): named-entity-without-semicolon"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO>BAR",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&gt;BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO&gt;BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&gt BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,6): named-entity-without-semicolon"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO> BAR",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&gt; BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO&gt; BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&gt;;;BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO>;;BAR",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&gt;;;BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO&gt;;;BAR"
    +      }
    +    },
    +    {
    +      "data": "I'm &notit; I tell you",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-chars",
    +        "(1,9): named-entity-without-semicolon"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "I'm ¬it; I tell you"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>I'm ¬it; I tell you</body></html>",
    +        "noQuirksBodyHtml": "I'm ¬it; I tell you"
    +      }
    +    },
    +    {
    +      "data": "I'm &notin; I tell you",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "I'm ∉ I tell you"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>I'm ∉ I tell you</body></html>",
    +        "noQuirksBodyHtml": "I'm ∉ I tell you"
    +      }
    +    },
    +    {
    +      "data": "FOO& BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO& BAR",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&amp; BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO&amp; BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&<BAR>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,9): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "bar": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO&",
    +                    "escaped": true
    +                  },
    +                  {
    +                    "tag": "bar"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&amp;<bar></bar></body></html>",
    +        "noQuirksBodyHtml": "FOO&amp;<bar></bar>"
    +      }
    +    },
    +    {
    +      "data": "FOO&&&&gt;BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO&&&>BAR",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&amp;&amp;&amp;&gt;BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO&amp;&amp;&amp;&gt;BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&#41;BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO)BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO)BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO)BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x41;BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOABAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOABAR</body></html>",
    +        "noQuirksBodyHtml": "FOOABAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&#X41;BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOABAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOABAR</body></html>",
    +        "noQuirksBodyHtml": "FOOABAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&#BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,5): expected-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO&#BAR",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&amp;#BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO&amp;#BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&#ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,5): expected-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO&#ZOO",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&amp;#ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO&amp;#ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#xBAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,7): expected-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOºR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOºR</body></html>",
    +        "noQuirksBodyHtml": "FOOºR"
    +      }
    +    },
    +    {
    +      "data": "FOO&#xZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,6): expected-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO&#xZOO",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&amp;#xZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO&amp;#xZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#XZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,6): expected-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO&#XZOO",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&amp;#XZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO&amp;#XZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#41BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,7): numeric-entity-without-semicolon"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO)BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO)BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO)BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x41BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,10): numeric-entity-without-semicolon"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO䆺R"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO䆺R</body></html>",
    +        "noQuirksBodyHtml": "FOO䆺R"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x41ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,8): numeric-entity-without-semicolon"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOAZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOAZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOAZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0000;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0078;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOxZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOxZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOxZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0079;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOyZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOyZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOyZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0080;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO€ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO€ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO€ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0081;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0082;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO‚ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO‚ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO‚ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0083;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOƒZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOƒZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOƒZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0084;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO„ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO„ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO„ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0085;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO…ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO…ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO…ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0086;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO†ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO†ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO†ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0087;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO‡ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO‡ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO‡ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0088;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOˆZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOˆZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOˆZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0089;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO‰ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO‰ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO‰ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x008A;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOÅ ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOÅ ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOÅ ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x008B;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO‹ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO‹ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO‹ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x008C;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOŒZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOŒZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOŒZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x008D;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x008E;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOŽZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOŽZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOŽZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x008F;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0090;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0091;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO‘ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO‘ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO‘ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0092;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO’ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO’ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO’ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0093;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO“ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO“ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO“ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0094;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO”ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO”ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO”ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0095;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO•ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO•ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO•ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0096;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO–ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO–ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO–ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0097;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO—ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO—ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO—ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0098;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO˜ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO˜ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO˜ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x0099;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO™ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO™ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO™ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x009A;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOÅ¡ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOÅ¡ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOÅ¡ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x009B;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO›ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO›ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO›ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x009C;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOœZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOœZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOœZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x009D;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x009E;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOžZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOžZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOžZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x009F;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOŸZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOŸZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOŸZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x00A0;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO ZOO",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO&nbsp;ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO&nbsp;ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#xD7FF;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO퟿ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO퟿ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO퟿ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#xD800;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#xD801;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#xDFFE;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#xDFFF;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#xE000;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOOZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOOZOO</body></html>",
    +        "noQuirksBodyHtml": "FOOZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x10FFFE;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO􏿾ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO􏿾ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO􏿾ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x1087D4;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO􈟔ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO􈟔ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO􈟔ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x10FFFF;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO􏿿ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO􏿿ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO􏿿ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#x110000;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#xFFFFFF;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#11111111111",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity",
    +        "(1,13): eof-in-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�</body></html>",
    +        "noQuirksBodyHtml": "FOO�"
    +      }
    +    },
    +    {
    +      "data": "FOO&#1111111111",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity",
    +        "(1,13): eof-in-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�</body></html>",
    +        "noQuirksBodyHtml": "FOO�"
    +      }
    +    },
    +    {
    +      "data": "FOO&#111111111111",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity",
    +        "(1,13): eof-in-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�</body></html>",
    +        "noQuirksBodyHtml": "FOO�"
    +      }
    +    },
    +    {
    +      "data": "FOO&#11111111111ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#1111111111ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    },
    +    {
    +      "data": "FOO&#111111111111ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,13): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO�ZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO�ZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO�ZOO"
    +      }
    +    }
    +  ],
    +  "entities02.dat": [
    +    {
    +      "data": "<div bar=\"ZZ&gt;YY\"></div>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ>YY"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ>YY\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ>YY\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&\"></div>",
    +      "errors": [
    +        "(1,15): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar='ZZ&'></div>",
    +      "errors": [
    +        "(1,15): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=ZZ&></div>",
    +      "errors": [
    +        "(1,13): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&gt=YY\"></div>",
    +      "errors": [
    +        "(1,15): named-entity-without-semicolon",
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&gt=YY",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;gt=YY\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gt=YY\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&gt0YY\"></div>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&gt0YY",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;gt0YY\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gt0YY\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&gt9YY\"></div>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&gt9YY",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;gt9YY\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gt9YY\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&gtaYY\"></div>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&gtaYY",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;gtaYY\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gtaYY\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&gtZYY\"></div>",
    +      "errors": [
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&gtZYY",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;gtZYY\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;gtZYY\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&gt YY\"></div>",
    +      "errors": [
    +        "(1,15): named-entity-without-semicolon",
    +        "(1,20): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ> YY"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ> YY\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ> YY\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&gt\"></div>",
    +      "errors": [
    +        "(1,15): named-entity-without-semicolon",
    +        "(1,17): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ>"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ>\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ>\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar='ZZ&gt'></div>",
    +      "errors": [
    +        "(1,15): named-entity-without-semicolon",
    +        "(1,17): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ>"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ>\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ>\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=ZZ&gt></div>",
    +      "errors": [
    +        "(1,14): named-entity-without-semicolon",
    +        "(1,15): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ>"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ>\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ>\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&pound_id=23\"></div>",
    +      "errors": [
    +        "(1,18): named-entity-without-semicolon",
    +        "(1,26): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ£_id=23"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ£_id=23\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ£_id=23\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&prod_id=23\"></div>",
    +      "errors": [
    +        "(1,25): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&prod_id=23",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;prod_id=23\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;prod_id=23\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&pound;_id=23\"></div>",
    +      "errors": [
    +        "(1,27): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ£_id=23"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ£_id=23\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ£_id=23\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&prod;_id=23\"></div>",
    +      "errors": [
    +        "(1,26): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ∏_id=23"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ∏_id=23\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ∏_id=23\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&pound=23\"></div>",
    +      "errors": [
    +        "(1,18): named-entity-without-semicolon",
    +        "(1,23): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&pound=23",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;pound=23\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;pound=23\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div bar=\"ZZ&prod=23\"></div>",
    +      "errors": [
    +        "(1,22): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "ZZ&prod=23",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div bar=\"ZZ&amp;prod=23\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div bar=\"ZZ&amp;prod=23\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div>ZZ&pound_id=23</div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,13): named-entity-without-semicolon"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "ZZ£_id=23"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>ZZ£_id=23</div></body></html>",
    +        "noQuirksBodyHtml": "<div>ZZ£_id=23</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>ZZ&prod_id=23</div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "ZZ&prod_id=23",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>ZZ&amp;prod_id=23</div></body></html>",
    +        "noQuirksBodyHtml": "<div>ZZ&amp;prod_id=23</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>ZZ&pound;_id=23</div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "ZZ£_id=23"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>ZZ£_id=23</div></body></html>",
    +        "noQuirksBodyHtml": "<div>ZZ£_id=23</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>ZZ&prod;_id=23</div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "ZZ∏_id=23"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>ZZ∏_id=23</div></body></html>",
    +        "noQuirksBodyHtml": "<div>ZZ∏_id=23</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>ZZ&pound=23</div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,13): named-entity-without-semicolon"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "ZZ£=23"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>ZZ£=23</div></body></html>",
    +        "noQuirksBodyHtml": "<div>ZZ£=23</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>ZZ&prod=23</div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "ZZ&prod=23",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>ZZ&amp;prod=23</div></body></html>",
    +        "noQuirksBodyHtml": "<div>ZZ&amp;prod=23</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>ZZ&AElig=</div>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "ZZÆ="
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>ZZÆ=</div></body></html>",
    +        "noQuirksBodyHtml": "<div>ZZÆ=</div>"
    +      }
    +    }
    +  ],
    +  "foreign-fragment.dat": [
    +    {
    +      "data": "<nobr>X",
    +      "errors": [
    +        "6: HTML start tag “nobr” in a foreign namespace context.",
    +        "7: End of file seen and there were open elements.",
    +        "6: Unclosed element “nobr”."
    +      ],
    +      "fragment": {
    +        "name": "path",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "svg nobr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "nobr",
    +            "ns": "http://www.w3.org/2000/svg",
    +            "children": [
    +              {
    +                "text": "X"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<nobr>X</nobr>",
    +        "noQuirksBodyHtml": "<nobr>X</nobr>"
    +      }
    +    },
    +    {
    +      "data": "<font color></font>X",
    +      "errors": [
    +        "12: HTML start tag “font” in a foreign namespace context."
    +      ],
    +      "fragment": {
    +        "name": "path",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "svg font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "font",
    +            "ns": "http://www.w3.org/2000/svg",
    +            "attrs": [
    +              {
    +                "name": "color",
    +                "value": ""
    +              }
    +            ]
    +          },
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "<font color=\"\"></font>X",
    +        "noQuirksBodyHtml": "<font color=\"\"></font>X"
    +      }
    +    },
    +    {
    +      "data": "<font></font>X",
    +      "errors": [],
    +      "fragment": {
    +        "name": "path",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "svg font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "font",
    +            "ns": "http://www.w3.org/2000/svg"
    +          },
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "<font></font>X",
    +        "noQuirksBodyHtml": "<font></font>X"
    +      }
    +    },
    +    {
    +      "data": "<g></path>X",
    +      "errors": [
    +        "10: End tag “path” did not match the name of the current open element (“g”).",
    +        "11: End of file seen and there were open elements.",
    +        "3: Unclosed element “g”."
    +      ],
    +      "fragment": {
    +        "name": "path",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "svg g": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "g",
    +            "ns": "http://www.w3.org/2000/svg",
    +            "children": [
    +              {
    +                "text": "X"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<g>X</g>",
    +        "noQuirksBodyHtml": "<g>X</g>"
    +      }
    +    },
    +    {
    +      "data": "</path>X",
    +      "errors": [
    +        "5: Stray end tag “path”."
    +      ],
    +      "fragment": {
    +        "name": "path",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</foreignObject>X",
    +      "errors": [
    +        "5: Stray end tag “foreignobject”."
    +      ],
    +      "fragment": {
    +        "name": "foreignObject",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</desc>X",
    +      "errors": [
    +        "5: Stray end tag “desc”."
    +      ],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</title>X",
    +      "errors": [
    +        "5: Stray end tag “title”."
    +      ],
    +      "fragment": {
    +        "name": "title",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</svg>X",
    +      "errors": [
    +        "5: Stray end tag “svg”."
    +      ],
    +      "fragment": {
    +        "name": "svg",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</mfenced>X",
    +      "errors": [
    +        "5: Stray end tag “mfenced”."
    +      ],
    +      "fragment": {
    +        "name": "mfenced",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</malignmark>X",
    +      "errors": [
    +        "5: Stray end tag “malignmark”."
    +      ],
    +      "fragment": {
    +        "name": "malignmark",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</math>X",
    +      "errors": [
    +        "5: Stray end tag “math”."
    +      ],
    +      "fragment": {
    +        "name": "math",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</annotation-xml>X",
    +      "errors": [
    +        "5: Stray end tag “annotation-xml”."
    +      ],
    +      "fragment": {
    +        "name": "annotation-xml",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</mtext>X",
    +      "errors": [
    +        "5: Stray end tag “mtext”."
    +      ],
    +      "fragment": {
    +        "name": "mtext",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</mi>X",
    +      "errors": [
    +        "5: Stray end tag “mi”."
    +      ],
    +      "fragment": {
    +        "name": "mi",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</mo>X",
    +      "errors": [
    +        "5: Stray end tag “mo”."
    +      ],
    +      "fragment": {
    +        "name": "mo",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</mn>X",
    +      "errors": [
    +        "5: Stray end tag “mn”."
    +      ],
    +      "fragment": {
    +        "name": "mn",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "</ms>X",
    +      "errors": [
    +        "5: Stray end tag “ms”."
    +      ],
    +      "fragment": {
    +        "name": "ms",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><ms/>X",
    +      "errors": [
    +        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
    +        "52: End of file seen and there were open elements.",
    +        "51: Unclosed element “ms”."
    +      ],
    +      "fragment": {
    +        "name": "ms",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "b": true,
    +            "math mglyph": true,
    +            "i": true,
    +            "math malignmark": true,
    +            "u": true,
    +            "ms": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "b"
    +          },
    +          {
    +            "tag": "mglyph",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "i"
    +          },
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "u"
    +          },
    +          {
    +            "tag": "ms",
    +            "children": [
    +              {
    +                "text": "X"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><ms>X</ms>",
    +        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><ms>X</ms></malignmark></mglyph>"
    +      }
    +    },
    +    {
    +      "data": "<malignmark></malignmark>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "ms",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          }
    +        ],
    +        "html": "<malignmark></malignmark>",
    +        "noQuirksBodyHtml": "<malignmark></malignmark>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "ms",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "ms",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><mn/>X",
    +      "errors": [
    +        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
    +        "52: End of file seen and there were open elements.",
    +        "51: Unclosed element “mn”."
    +      ],
    +      "fragment": {
    +        "name": "mn",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "b": true,
    +            "math mglyph": true,
    +            "i": true,
    +            "math malignmark": true,
    +            "u": true,
    +            "mn": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "b"
    +          },
    +          {
    +            "tag": "mglyph",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "i"
    +          },
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "u"
    +          },
    +          {
    +            "tag": "mn",
    +            "children": [
    +              {
    +                "text": "X"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><mn>X</mn>",
    +        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><mn>X</mn></malignmark></mglyph>"
    +      }
    +    },
    +    {
    +      "data": "<malignmark></malignmark>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mn",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          }
    +        ],
    +        "html": "<malignmark></malignmark>",
    +        "noQuirksBodyHtml": "<malignmark></malignmark>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mn",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mn",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><mo/>X",
    +      "errors": [
    +        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
    +        "52: End of file seen and there were open elements.",
    +        "51: Unclosed element “mo”."
    +      ],
    +      "fragment": {
    +        "name": "mo",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "b": true,
    +            "math mglyph": true,
    +            "i": true,
    +            "math malignmark": true,
    +            "u": true,
    +            "mo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "b"
    +          },
    +          {
    +            "tag": "mglyph",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "i"
    +          },
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "u"
    +          },
    +          {
    +            "tag": "mo",
    +            "children": [
    +              {
    +                "text": "X"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><mo>X</mo>",
    +        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><mo>X</mo></malignmark></mglyph>"
    +      }
    +    },
    +    {
    +      "data": "<malignmark></malignmark>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mo",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          }
    +        ],
    +        "html": "<malignmark></malignmark>",
    +        "noQuirksBodyHtml": "<malignmark></malignmark>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mo",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mo",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><mi/>X",
    +      "errors": [
    +        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
    +        "52: End of file seen and there were open elements.",
    +        "51: Unclosed element “mi”."
    +      ],
    +      "fragment": {
    +        "name": "mi",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "b": true,
    +            "math mglyph": true,
    +            "i": true,
    +            "math malignmark": true,
    +            "u": true,
    +            "mi": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "b"
    +          },
    +          {
    +            "tag": "mglyph",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "i"
    +          },
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "u"
    +          },
    +          {
    +            "tag": "mi",
    +            "children": [
    +              {
    +                "text": "X"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><mi>X</mi>",
    +        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><mi>X</mi></malignmark></mglyph>"
    +      }
    +    },
    +    {
    +      "data": "<malignmark></malignmark>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mi",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          }
    +        ],
    +        "html": "<malignmark></malignmark>",
    +        "noQuirksBodyHtml": "<malignmark></malignmark>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mi",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mi",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<b></b><mglyph/><i></i><malignmark/><u></u><mtext/>X",
    +      "errors": [
    +        "51: Self-closing syntax (“/>”) used on a non-void HTML element. Ignoring the slash and treating as a start tag.",
    +        "52: End of file seen and there were open elements.",
    +        "51: Unclosed element “mtext”."
    +      ],
    +      "fragment": {
    +        "name": "mtext",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "b": true,
    +            "math mglyph": true,
    +            "i": true,
    +            "math malignmark": true,
    +            "u": true,
    +            "mtext": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "b"
    +          },
    +          {
    +            "tag": "mglyph",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "i"
    +          },
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          },
    +          {
    +            "tag": "u"
    +          },
    +          {
    +            "tag": "mtext",
    +            "children": [
    +              {
    +                "text": "X"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<b></b><mglyph></mglyph><i></i><malignmark></malignmark><u></u><mtext>X</mtext>",
    +        "noQuirksBodyHtml": "<b></b><mglyph><i></i><malignmark><u></u><mtext>X</mtext></malignmark></mglyph>"
    +      }
    +    },
    +    {
    +      "data": "<malignmark></malignmark>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mtext",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "malignmark",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          }
    +        ],
    +        "html": "<malignmark></malignmark>",
    +        "noQuirksBodyHtml": "<malignmark></malignmark>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mtext",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "mtext",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [
    +        "5: HTML start tag “div” in a foreign namespace context."
    +      ],
    +      "fragment": {
    +        "name": "annotation-xml",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "annotation-xml",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [
    +        "5: HTML start tag “div” in a foreign namespace context."
    +      ],
    +      "fragment": {
    +        "name": "math",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "math",
    +        "ns": "http://www.w3.org/1998/Math/MathML"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure",
    +            "ns": "http://www.w3.org/1998/Math/MathML"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "foreignObject",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "foreignObject",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "title",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "title",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<div><h1>X</h1></div>",
    +      "errors": [
    +        "5: HTML start tag “div” in a foreign namespace context.",
    +        "9: HTML start tag “h1” in a foreign namespace context."
    +      ],
    +      "fragment": {
    +        "name": "svg",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "svg div": true,
    +            "svg h1": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div",
    +            "ns": "http://www.w3.org/2000/svg",
    +            "children": [
    +              {
    +                "tag": "h1",
    +                "ns": "http://www.w3.org/2000/svg",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<div><h1>X</h1></div>",
    +        "noQuirksBodyHtml": "<div><h1>X</h1></div>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [
    +        "5: HTML start tag “div” in a foreign namespace context."
    +      ],
    +      "fragment": {
    +        "name": "svg",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "svg div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div",
    +            "ns": "http://www.w3.org/2000/svg"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<figure></figure>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "figure": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "figure"
    +          }
    +        ],
    +        "html": "<figure></figure>",
    +        "noQuirksBodyHtml": "<figure></figure>"
    +      }
    +    },
    +    {
    +      "data": "<plaintext><foo>",
    +      "errors": [
    +        "16: End of file seen and there were open elements.",
    +        "11: Unclosed element “plaintext”."
    +      ],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "plaintext": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "plaintext",
    +            "children": [
    +              {
    +                "text": "<foo>",
    +                "no_escape": true
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<plaintext><foo></plaintext>",
    +        "noQuirksBodyHtml": "<plaintext><foo></plaintext>"
    +      }
    +    },
    +    {
    +      "data": "<frameset>X",
    +      "errors": [
    +        "6: Stray start tag “frameset”."
    +      ],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "<head>X",
    +      "errors": [
    +        "6: Stray start tag “head”."
    +      ],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "<body>X",
    +      "errors": [
    +        "6: Stray start tag “body”."
    +      ],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "<html>X",
    +      "errors": [
    +        "6: Stray start tag “html”."
    +      ],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "<html class=\"foo\">X",
    +      "errors": [
    +        "6: Stray start tag “html”."
    +      ],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "<body class=\"foo\">X",
    +      "errors": [
    +        "6: Stray start tag “body”."
    +      ],
    +      "fragment": {
    +        "name": "desc",
    +        "ns": "http://www.w3.org/2000/svg"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "X"
    +          }
    +        ],
    +        "html": "X",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    }
    +  ],
    +  "html5test-com.dat": [
    +    {
    +      "data": "<div<div>",
    +      "errors": [
    +        "(1,9): expected-doctype-but-got-start-tag",
    +        "(1,9): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div<div": true
    +          },
    +          "tagWithLt": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div<div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div<div></div<div></body></html>",
    +        "noQuirksBodyHtml": "<div<div></div<div>"
    +      }
    +    },
    +    {
    +      "data": "<div foo<bar=''>",
    +      "errors": [
    +        "(1,9): invalid-character-in-attribute-name",
    +        "(1,16): expected-doctype-but-got-start-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "attrWithFunnyChar": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "foo<bar",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div foo<bar=\"\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div foo<bar=\"\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div foo=`bar`>",
    +      "errors": [
    +        "(1,10): equals-in-unquoted-attribute-value",
    +        "(1,14): unexpected-character-in-unquoted-attribute-value",
    +        "(1,15): expected-doctype-but-got-start-tag",
    +        "(1,15): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "foo",
    +                        "value": "`bar`"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div foo=\"`bar`\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div foo=\"`bar`\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<div \\\"foo=''>",
    +      "errors": [
    +        "(1,7): invalid-character-in-attribute-name",
    +        "(1,14): expected-doctype-but-got-start-tag",
    +        "(1,14): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "attrWithFunnyChar": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "\\\"foo",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div \\\"foo=\"\"></div></body></html>",
    +        "noQuirksBodyHtml": "<div \\\"foo=\"\"></div>"
    +      }
    +    },
    +    {
    +      "data": "<a href='\\nbar'></a>",
    +      "errors": [
    +        "(1,16): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "\\nbar"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a href=\"\\nbar\"></a></body></html>",
    +        "noQuirksBodyHtml": "<a href=\"\\nbar\"></a>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "&lang;&rang;",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "⟨⟩"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>⟨⟩</body></html>",
    +        "noQuirksBodyHtml": "⟨⟩"
    +      }
    +    },
    +    {
    +      "data": "&apos;",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "'"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>'</body></html>",
    +        "noQuirksBodyHtml": "'"
    +      }
    +    },
    +    {
    +      "data": "&ImaginaryI;",
    +      "errors": [
    +        "(1,12): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "ⅈ"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>ⅈ</body></html>",
    +        "noQuirksBodyHtml": "ⅈ"
    +      }
    +    },
    +    {
    +      "data": "&Kopf;",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "𝕂"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>𝕂</body></html>",
    +        "noQuirksBodyHtml": "𝕂"
    +      }
    +    },
    +    {
    +      "data": "&notinva;",
    +      "errors": [
    +        "(1,9): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "∉"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>∉</body></html>",
    +        "noQuirksBodyHtml": "∉"
    +      }
    +    },
    +    {
    +      "data": "<?import namespace=\"foo\" implementation=\"#bar\">",
    +      "errors": [
    +        "(1,1): expected-tag-name-but-got-question-mark",
    +        "(1,47): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "?import namespace=\"foo\" implementation=\"#bar\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--?import namespace=\"foo\" implementation=\"#bar\"--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--?import namespace=\"foo\" implementation=\"#bar\"-->"
    +      }
    +    },
    +    {
    +      "data": "<!--foo--bar-->",
    +      "errors": [
    +        "(1,10): unexpected-char-in-comment",
    +        "(1,15): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "foo--bar"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--foo--bar--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--foo--bar-->"
    +      }
    +    },
    +    {
    +      "data": "<![CDATA[x]]>",
    +      "errors": [
    +        "(1,2): expected-dashes-or-doctype",
    +        "(1,13): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "[CDATA[x]]"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--[CDATA[x]]--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--[CDATA[x]]-->"
    +      }
    +    },
    +    {
    +      "data": "<textarea><!--</textarea>--></textarea>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,39): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><textarea>&lt;!--</textarea>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<textarea>&lt;!--</textarea>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<textarea><!--</textarea>-->",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><textarea>&lt;!--</textarea>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<textarea>&lt;!--</textarea>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<style><!--</style>--></style>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,30): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style><!--</style></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<style><!--</style>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<style><!--</style>-->",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style><!--</style></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<style><!--</style>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<ul><li>A </li> <li>B</li></ul>",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ul": true,
    +            "li": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ul",
    +                    "children": [
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "text": "A "
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": " "
    +                      },
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "text": "B"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ul><li>A </li> <li>B</li></ul></body></html>",
    +        "noQuirksBodyHtml": "<ul><li>A </li> <li>B</li></ul>"
    +      }
    +    },
    +    {
    +      "data": "<table><form><input type=hidden><input></form><div></div></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,13): unexpected-form-in-table",
    +        "(1,32): unexpected-hidden-input-in-table",
    +        "(1,39): unexpected-start-tag-implies-table-voodoo",
    +        "(1,46): unexpected-end-tag-implies-table-voodoo",
    +        "(1,46): unexpected-end-tag",
    +        "(1,51): unexpected-start-tag-implies-table-voodoo",
    +        "(1,57): unexpected-end-tag-implies-table-voodoo"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "input": true,
    +            "div": true,
    +            "table": true,
    +            "form": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "input"
    +                  },
    +                  {
    +                    "tag": "div"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "form"
    +                      },
    +                      {
    +                        "tag": "input",
    +                        "attrs": [
    +                          {
    +                            "name": "type",
    +                            "value": "hidden"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><input><div></div><table><form></form><input type=\"hidden\"></table></body></html>",
    +        "noQuirksBodyHtml": "<input><div></div><table><form></form><input type=\"hidden\"></table>"
    +      }
    +    },
    +    {
    +      "data": "<i>A<b>B<p></i>C</b>D",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,15): adoption-agency-1.3",
    +        "(1,20): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "i": true,
    +            "b": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "text": "A"
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "B"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "i"
    +                          },
    +                          {
    +                            "text": "C"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "D"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><i>A<b>B</b></i><b></b><p><b><i></i>C</b>D</p></body></html>",
    +        "noQuirksBodyHtml": "<i>A<b>B</b></i><b></b><p><b><i></i>C</b>D</p>"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div></div></body></html>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<svg></svg>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg>"
    +      }
    +    },
    +    {
    +      "data": "<math></math>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math></math></body></html>",
    +        "noQuirksBodyHtml": "<math></math>"
    +      }
    +    }
    +  ],
    +  "inbody01.dat": [
    +    {
    +      "data": "<button>1</foo>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,15): unexpected-end-tag",
    +        "(1,15): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "button": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "button",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><button>1</button></body></html>",
    +        "noQuirksBodyHtml": "<button>1</button>"
    +      }
    +    },
    +    {
    +      "data": "<foo>1<p>2</foo>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,16): unexpected-end-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "foo": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "foo",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      },
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><foo>1<p>2</p></foo></body></html>",
    +        "noQuirksBodyHtml": "<foo>1<p>2</p></foo>"
    +      }
    +    },
    +    {
    +      "data": "<dd>1</foo>",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "dd": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "dd",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><dd>1</dd></body></html>",
    +        "noQuirksBodyHtml": "<dd>1</dd>"
    +      }
    +    },
    +    {
    +      "data": "<foo>1<dd>2</foo>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,17): unexpected-end-tag",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "foo": true,
    +            "dd": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "foo",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      },
    +                      {
    +                        "tag": "dd",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><foo>1<dd>2</dd></foo></body></html>",
    +        "noQuirksBodyHtml": "<foo>1<dd>2</dd></foo>"
    +      }
    +    }
    +  ],
    +  "isindex.dat": [
    +    {
    +      "data": "<isindex>",
    +      "errors": [
    +        "(1,9): expected-doctype-but-got-start-tag",
    +        "(1,9): deprecated-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "hr": true,
    +            "label": true,
    +            "input": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "children": [
    +                      {
    +                        "tag": "hr"
    +                      },
    +                      {
    +                        "tag": "label",
    +                        "children": [
    +                          {
    +                            "text": "This is a searchable index. Enter search keywords: "
    +                          },
    +                          {
    +                            "tag": "input",
    +                            "attrs": [
    +                              {
    +                                "name": "name",
    +                                "value": "isindex"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "hr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
    +        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
    +      }
    +    },
    +    {
    +      "data": "<isindex name=\"A\" action=\"B\" prompt=\"C\" foo=\"D\">",
    +      "errors": [
    +        "(1,48): expected-doctype-but-got-start-tag",
    +        "(1,48): deprecated-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "hr": true,
    +            "label": true,
    +            "input": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "attrs": [
    +                      {
    +                        "name": "action",
    +                        "value": "B"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "hr"
    +                      },
    +                      {
    +                        "tag": "label",
    +                        "children": [
    +                          {
    +                            "text": "C"
    +                          },
    +                          {
    +                            "tag": "input",
    +                            "attrs": [
    +                              {
    +                                "name": "foo",
    +                                "value": "D"
    +                              },
    +                              {
    +                                "name": "name",
    +                                "value": "isindex"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "hr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><form action=\"B\"><hr><label>C<input name=\"isindex\" foo=\"D\"></label><hr></form></body></html>",
    +        "noQuirksBodyHtml": "<form action=\"B\"><hr><label>C<input name=\"isindex\" foo=\"D\"></label><hr></form>"
    +      }
    +    },
    +    {
    +      "data": "<form><isindex>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,15): deprecated-tag",
    +        "(1,15): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><form></form></body></html>",
    +        "noQuirksBodyHtml": "<form></form>"
    +      }
    +    }
    +  ],
    +  "main-element.dat": [
    +    {
    +      "data": "<!doctype html><p>foo<main>bar<p>baz",
    +      "errors": [
    +        "(1,36): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "main": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "main",
    +                    "children": [
    +                      {
    +                        "text": "bar"
    +                      },
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "text": "baz"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p>foo</p><main>bar<p>baz</p></main></body></html>",
    +        "noQuirksBodyHtml": "<p>foo</p><main>bar<p>baz</p></main>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><main><p>foo</main>bar",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "main": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "main",
    +                    "children": [
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "bar"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><main><p>foo</p></main>bar</body></html>",
    +        "noQuirksBodyHtml": "<main><p>foo</p></main>bar"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>xxx<svg><x><g><a><main><b>",
    +      "errors": [
    +        " * (1,42) unexpected HTML-like start tag token in foreign content",
    +        " * (1,42) unexpected end of file"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg x": true,
    +            "svg g": true,
    +            "svg a": true,
    +            "svg main": true,
    +            "b": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "xxx"
    +                  },
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "x",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "g",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "a",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "main",
    +                                    "ns": "http://www.w3.org/2000/svg"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>xxx<svg><x><g><a><main></main></a></g></x></svg><b></b></body></html>",
    +        "noQuirksBodyHtml": "xxx<svg><x><g><a><main><b></b></main></a></g></x></svg>"
    +      }
    +    }
    +  ],
    +  "math.dat": [
    +    {
    +      "data": "<math><tr><td><mo><tr>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math math": true,
    +            "math tr": true,
    +            "math td": true,
    +            "math mo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "math",
    +            "ns": "http://www.w3.org/1998/Math/MathML",
    +            "children": [
    +              {
    +                "tag": "tr",
    +                "ns": "http://www.w3.org/1998/Math/MathML",
    +                "children": [
    +                  {
    +                    "tag": "td",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mo",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<math><tr><td><mo></mo></td></tr></math>",
    +        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><tr><td><mo><tr>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math math": true,
    +            "math tr": true,
    +            "math td": true,
    +            "math mo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "math",
    +            "ns": "http://www.w3.org/1998/Math/MathML",
    +            "children": [
    +              {
    +                "tag": "tr",
    +                "ns": "http://www.w3.org/1998/Math/MathML",
    +                "children": [
    +                  {
    +                    "tag": "td",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mo",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<math><tr><td><mo></mo></td></tr></math>",
    +        "noQuirksBodyHtml": "<math><tr><td><mo></mo></td></tr></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><thead><mo><tbody>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "thead"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math math": true,
    +            "math thead": true,
    +            "math mo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "math",
    +            "ns": "http://www.w3.org/1998/Math/MathML",
    +            "children": [
    +              {
    +                "tag": "thead",
    +                "ns": "http://www.w3.org/1998/Math/MathML",
    +                "children": [
    +                  {
    +                    "tag": "mo",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<math><thead><mo></mo></thead></math>",
    +        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><tfoot><mo><tbody>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "tfoot"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math math": true,
    +            "math tfoot": true,
    +            "math mo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "math",
    +            "ns": "http://www.w3.org/1998/Math/MathML",
    +            "children": [
    +              {
    +                "tag": "tfoot",
    +                "ns": "http://www.w3.org/1998/Math/MathML",
    +                "children": [
    +                  {
    +                    "tag": "mo",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<math><tfoot><mo></mo></tfoot></math>",
    +        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><tbody><mo><tfoot>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math math": true,
    +            "math tbody": true,
    +            "math mo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "math",
    +            "ns": "http://www.w3.org/1998/Math/MathML",
    +            "children": [
    +              {
    +                "tag": "tbody",
    +                "ns": "http://www.w3.org/1998/Math/MathML",
    +                "children": [
    +                  {
    +                    "tag": "mo",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<math><tbody><mo></mo></tbody></math>",
    +        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><tbody><mo></table>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math math": true,
    +            "math tbody": true,
    +            "math mo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "math",
    +            "ns": "http://www.w3.org/1998/Math/MathML",
    +            "children": [
    +              {
    +                "tag": "tbody",
    +                "ns": "http://www.w3.org/1998/Math/MathML",
    +                "children": [
    +                  {
    +                    "tag": "mo",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<math><tbody><mo></mo></tbody></math>",
    +        "noQuirksBodyHtml": "<math><tbody><mo></mo></tbody></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><thead><mo></table>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math math": true,
    +            "math thead": true,
    +            "math mo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "math",
    +            "ns": "http://www.w3.org/1998/Math/MathML",
    +            "children": [
    +              {
    +                "tag": "thead",
    +                "ns": "http://www.w3.org/1998/Math/MathML",
    +                "children": [
    +                  {
    +                    "tag": "mo",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<math><thead><mo></mo></thead></math>",
    +        "noQuirksBodyHtml": "<math><thead><mo></mo></thead></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><tfoot><mo></table>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "math math": true,
    +            "math tfoot": true,
    +            "math mo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "math",
    +            "ns": "http://www.w3.org/1998/Math/MathML",
    +            "children": [
    +              {
    +                "tag": "tfoot",
    +                "ns": "http://www.w3.org/1998/Math/MathML",
    +                "children": [
    +                  {
    +                    "tag": "mo",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<math><tfoot><mo></mo></tfoot></math>",
    +        "noQuirksBodyHtml": "<math><tfoot><mo></mo></tfoot></math>"
    +      }
    +    }
    +  ],
    +  "namespace-sensitivity.dat": [
    +    {
    +      "data": "<body><table><tr><td><svg><td><foreignObject><span></td>Foo",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "svg svg": true,
    +            "svg td": true,
    +            "svg foreignObject": true,
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Foo"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "svg",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "td",
    +                                        "ns": "http://www.w3.org/2000/svg",
    +                                        "children": [
    +                                          {
    +                                            "tag": "foreignObject",
    +                                            "ns": "http://www.w3.org/2000/svg",
    +                                            "children": [
    +                                              {
    +                                                "tag": "span"
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "Foo<table><tbody><tr><td><svg><td><foreignObject><span></span></foreignObject></td></svg></td></tr></tbody></table>"
    +      }
    +    }
    +  ],
    +  "pending-spec-changes-plain-text-unsafe.dat": [
    +    {
    +      "data": "<body><table>\u0000filler\u0000text\u0000",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,14): invalid-codepoint",
    +        "(1,14): invalid-codepoint-in-table-text",
    +        "(1,21): invalid-codepoint",
    +        "(1,21): invalid-codepoint-in-table-text",
    +        "(1,26): invalid-codepoint",
    +        "(1,26): invalid-codepoint-in-table-text",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): foster-parenting-character-in-table",
    +        "(1,26): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "fillertext"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>fillertext<table></table></body></html>",
    +        "noQuirksBodyHtml": "fillertext<table></table>"
    +      }
    +    }
    +  ],
    +  "pending-spec-changes.dat": [
    +    {
    +      "data": "<input type=\"hidden\"><frameset>",
    +      "errors": [
    +        "(1,21): expected-doctype-but-got-start-tag",
    +        "(1,31): unexpected-start-tag",
    +        "(1,31): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<input type=\"hidden\">"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><table><caption><svg>foo</table>bar",
    +      "errors": [
    +        "(1,47): unexpected-end-tag",
    +        "(1,47): end-table-tag-in-caption"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "text": "foo"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "bar"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><svg>foo</svg></caption></table>bar</body></html>",
    +        "noQuirksBodyHtml": "<table><caption><svg>foo</svg></caption></table>bar"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><td><svg><desc><td></desc><circle>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,30): unexpected-cell-end-tag",
    +        "(1,37): unexpected-end-tag",
    +        "(1,45): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "svg svg": true,
    +            "svg desc": true,
    +            "circle": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "svg",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "desc",
    +                                        "ns": "http://www.w3.org/2000/svg"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "circle"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td><svg><desc></desc></svg></td><td><circle></circle></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><desc></desc></svg></td><td><circle></circle></td></tr></tbody></table>"
    +      }
    +    }
    +  ],
    +  "plain-text-unsafe.dat": [
    +    {
    +      "data": "FOO&#x000D;ZOO",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,11): illegal-codepoint-for-numeric-entity"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO\rZOO"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO\rZOO</body></html>",
    +        "noQuirksBodyHtml": "FOO\rZOO"
    +      }
    +    },
    +    {
    +      "data": "<html>\u0000<frameset></frameset>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,7): invalid-codepoint",
    +        "(1,7): invalid-codepoint-in-body",
    +        "(1,17): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html> \u0000 <frameset></frameset>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,8): invalid-codepoint",
    +        "(1,8): invalid-codepoint-in-body",
    +        "(1,19): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "  "
    +      }
    +    },
    +    {
    +      "data": "<html>a\u0000a<frameset></frameset>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,8): invalid-codepoint",
    +        "(1,8): invalid-codepoint-in-body",
    +        "(1,19): unexpected-start-tag",
    +        "(1,30): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "aa"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>aa</body></html>",
    +        "noQuirksBodyHtml": "aa"
    +      }
    +    },
    +    {
    +      "data": "<html>\u0000\u0000<frameset></frameset>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,7): invalid-codepoint",
    +        "(1,7): invalid-codepoint-in-body",
    +        "(1,8): invalid-codepoint",
    +        "(1,8): invalid-codepoint-in-body",
    +        "(1,18): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html>\u0000\n <frameset></frameset>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,7): invalid-codepoint",
    +        "(1,7): invalid-codepoint-in-body",
    +        "(2,11): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "\n "
    +      }
    +    },
    +    {
    +      "data": "<html><select>\u0000",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,15): invalid-codepoint",
    +        "(1,15): invalid-codepoint-in-select",
    +        "(1,15): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "\u0000",
    +      "errors": [
    +        "(1,1): invalid-codepoint",
    +        "(1,1): expected-doctype-but-got-chars",
    +        "(1,1): invalid-codepoint-in-body"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<body>\u0000",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,7): invalid-codepoint",
    +        "(1,7): invalid-codepoint-in-body"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<plaintext>\u0000filler\u0000text\u0000",
    +      "errors": [
    +        "(1,11): expected-doctype-but-got-start-tag",
    +        "(1,12): invalid-codepoint",
    +        "(1,19): invalid-codepoint",
    +        "(1,24): invalid-codepoint",
    +        "(1,24): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "plaintext": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "plaintext",
    +                    "children": [
    +                      {
    +                        "text": "�filler�text�",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><plaintext>�filler�text�</plaintext></body></html>",
    +        "noQuirksBodyHtml": "<plaintext>�filler�text�</plaintext>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[\u0000filler\u0000text\u0000]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,30): invalid-codepoint",
    +        "(1,30): invalid-codepoint",
    +        "(1,30): invalid-codepoint",
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "�filler�text�"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>�filler�text�</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>�filler�text�</svg>"
    +      }
    +    },
    +    {
    +      "data": "<body><!\u0000>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,8): expected-dashes-or-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "comment": "�"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><!--�--></body></html>",
    +        "noQuirksBodyHtml": "<!--�-->"
    +      }
    +    },
    +    {
    +      "data": "<body><!\u0000filler\u0000text>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,8): expected-dashes-or-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "comment": "�filler�text"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><!--�filler�text--></body></html>",
    +        "noQuirksBodyHtml": "<!--�filler�text-->"
    +      }
    +    },
    +    {
    +      "data": "<body><svg><foreignObject>\u0000filler\u0000text",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,27): invalid-codepoint",
    +        "(1,27): invalid-codepoint-in-body",
    +        "(1,34): invalid-codepoint",
    +        "(1,34): invalid-codepoint-in-body",
    +        "(1,38): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg foreignObject": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "foreignObject",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "fillertext"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><foreignObject>fillertext</foreignObject></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><foreignObject>fillertext</foreignObject></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg>\u0000filler\u0000text",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,6): invalid-codepoint",
    +        "(1,6): invalid-codepoint-in-foreign-content",
    +        "(1,13): invalid-codepoint",
    +        "(1,13): invalid-codepoint-in-foreign-content",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "�filler�text"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>�filler�text</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>�filler�text</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg>\u0000<frameset>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,6): invalid-codepoint",
    +        "(1,6): invalid-codepoint-in-foreign-content",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "�"
    +                      },
    +                      {
    +                        "tag": "frameset",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>�<frameset></frameset></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>�<frameset></frameset></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg>\u0000 <frameset>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,6): invalid-codepoint",
    +        "(1,6): invalid-codepoint-in-foreign-content",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "� "
    +                      },
    +                      {
    +                        "tag": "frameset",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>� <frameset></frameset></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>� <frameset></frameset></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg>\u0000a<frameset>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,6): invalid-codepoint",
    +        "(1,6): invalid-codepoint-in-foreign-content",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "�a"
    +                      },
    +                      {
    +                        "tag": "frameset",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>�a<frameset></frameset></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>�a<frameset></frameset></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg>\u0000</svg><frameset>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,6): invalid-codepoint",
    +        "(1,6): invalid-codepoint-in-foreign-content",
    +        "(1,22): unexpected-start-tag",
    +        "(1,22): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<svg>�</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg>\u0000 </svg><frameset>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,6): invalid-codepoint",
    +        "(1,6): invalid-codepoint-in-foreign-content",
    +        "(1,23): unexpected-start-tag",
    +        "(1,23): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<svg>� </svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg>\u0000a</svg><frameset>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,6): invalid-codepoint",
    +        "(1,6): invalid-codepoint-in-foreign-content",
    +        "(1,23): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "�a"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>�a</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>�a</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><path></path></svg><frameset>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,34): unexpected-start-tag",
    +        "(1,34): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<svg><path></path></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><p><frameset>",
    +      "errors": [
    +        "(1, 5) expected-doctype-but-got-start-tag",
    +        "(1, 8) unexpected-html-element-in-foreign-content",
    +        "(1, 18) unexpected-start-tag",
    +        "(1, 18) eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<svg><p><frameset></frameset></p></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><pre>\r\n\r\nA</pre>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true,
    +          "extraNL": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "\nA",
    +                        "extraNL": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
    +        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><pre>\r\rA</pre>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true,
    +          "extraNL": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "\nA",
    +                        "extraNL": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
    +        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><pre>\rA</pre>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "A"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>A</pre></body></html>",
    +        "noQuirksBodyHtml": "<pre>A</pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><table><tr><td><math><mtext>\u0000a",
    +      "errors": [
    +        "(1,44): invalid-codepoint",
    +        "(1,44): invalid-codepoint-in-body",
    +        "(1,45): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "math math": true,
    +            "math mtext": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "math",
    +                                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                                    "children": [
    +                                      {
    +                                        "tag": "mtext",
    +                                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                                        "children": [
    +                                          {
    +                                            "text": "a"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><math><mtext>a</mtext></math></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><math><mtext>a</mtext></math></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><table><tr><td><svg><foreignObject>\u0000a",
    +      "errors": [
    +        "(1,51): invalid-codepoint",
    +        "(1,51): invalid-codepoint-in-body",
    +        "(1,52): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "svg svg": true,
    +            "svg foreignObject": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "svg",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "foreignObject",
    +                                        "ns": "http://www.w3.org/2000/svg",
    +                                        "children": [
    +                                          {
    +                                            "text": "a"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg><foreignObject>a</foreignObject></svg></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><foreignObject>a</foreignObject></svg></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><math><mi>a\u0000b",
    +      "errors": [
    +        "(1,27): invalid-codepoint",
    +        "(1,27): invalid-codepoint-in-body",
    +        "(1,28): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "ab"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mi>ab</mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mi>ab</mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><math><mo>a\u0000b",
    +      "errors": [
    +        "(1,27): invalid-codepoint",
    +        "(1,27): invalid-codepoint-in-body",
    +        "(1,28): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mo": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mo",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "ab"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mo>ab</mo></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mo>ab</mo></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><math><mn>a\u0000b",
    +      "errors": [
    +        "(1,27): invalid-codepoint",
    +        "(1,27): invalid-codepoint-in-body",
    +        "(1,28): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mn": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mn",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "ab"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mn>ab</mn></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mn>ab</mn></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><math><ms>a\u0000b",
    +      "errors": [
    +        "(1,27): invalid-codepoint",
    +        "(1,27): invalid-codepoint-in-body",
    +        "(1,28): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math ms": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "ms",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "ab"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><ms>ab</ms></math></body></html>",
    +        "noQuirksBodyHtml": "<math><ms>ab</ms></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><math><mtext>a\u0000b",
    +      "errors": [
    +        "(1,30): invalid-codepoint",
    +        "(1,30): invalid-codepoint-in-body",
    +        "(1,31): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mtext": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mtext",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "ab"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mtext>ab</mtext></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mtext>ab</mtext></math>"
    +      }
    +    }
    +  ],
    +  "ruby.dat": [
    +    {
    +      "data": "<html><ruby>a<rb>b<rb></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rb": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rb",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rb"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rb>b</rb><rb></rb></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rb></rb></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rb>b<rt></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rb": true,
    +            "rt": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rb",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rt"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rb>b</rb><rt></rt></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rt></rt></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rb>b<rtc></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rb": true,
    +            "rtc": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rb",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rtc"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rb>b</rb><rtc></rtc></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rtc></rtc></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rb>b<rp></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rb": true,
    +            "rp": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rb",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rp"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rb>b</rb><rp></rp></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rp></rp></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rb>b<span></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rb": true,
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rb",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          },
    +                          {
    +                            "tag": "span"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rb>b<span></span></rb></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rb>b<span></span></rb></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rt>b<rb></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rt": true,
    +            "rb": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rt",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rb"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rt>b</rt><rb></rb></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rb></rb></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rt>b<rt></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rt": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rt",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rt"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rt>b</rt><rt></rt></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rt></rt></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rt>b<rtc></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rt": true,
    +            "rtc": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rt",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rtc"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rt>b</rt><rtc></rtc></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rtc></rtc></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rt>b<rp></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rt": true,
    +            "rp": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rt",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rp"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rt>b</rt><rp></rp></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rp></rp></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rt>b<span></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rt": true,
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rt",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          },
    +                          {
    +                            "tag": "span"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rt>b<span></span></rt></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rt>b<span></span></rt></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rtc>b<rb></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rtc": true,
    +            "rb": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rtc",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rb"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rtc>b</rtc><rb></rb></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rtc>b</rtc><rb></rb></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rtc>b<rt>c<rt>d</ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rtc": true,
    +            "rt": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rtc",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          },
    +                          {
    +                            "tag": "rt",
    +                            "children": [
    +                              {
    +                                "text": "c"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "rt",
    +                            "children": [
    +                              {
    +                                "text": "d"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rtc>b<rt>c</rt><rt>d</rt></rtc></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rtc>b<rt>c</rt><rt>d</rt></rtc></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rtc>b<rtc></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rtc": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rtc",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rtc"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rtc>b</rtc><rtc></rtc></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rtc>b</rtc><rtc></rtc></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rtc>b<rp></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rtc": true,
    +            "rp": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rtc",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          },
    +                          {
    +                            "tag": "rp"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rtc>b<rp></rp></rtc></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rtc>b<rp></rp></rtc></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rtc>b<span></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rtc": true,
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rtc",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          },
    +                          {
    +                            "tag": "span"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rtc>b<span></span></rtc></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rtc>b<span></span></rtc></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rp>b<rb></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rp": true,
    +            "rb": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rp",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rb"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rp>b</rp><rb></rb></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rb></rb></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rp>b<rt></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rp": true,
    +            "rt": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rp",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rt"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rp>b</rp><rt></rt></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rt></rt></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rp>b<rtc></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rp": true,
    +            "rtc": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rp",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rtc"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rp>b</rp><rtc></rtc></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rtc></rtc></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rp>b<rp></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rp": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rp",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rp"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rp>b</rp><rp></rp></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rp></rp></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rp>b<span></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rp": true,
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rp",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          },
    +                          {
    +                            "tag": "span"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rp>b<span></span></rp></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rp>b<span></span></rp></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby><rtc><ruby>a<rb>b<rt></ruby></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rtc": true,
    +            "rb": true,
    +            "rt": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "tag": "rtc",
    +                        "children": [
    +                          {
    +                            "tag": "ruby",
    +                            "children": [
    +                              {
    +                                "text": "a"
    +                              },
    +                              {
    +                                "tag": "rb",
    +                                "children": [
    +                                  {
    +                                    "text": "b"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "rt"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby><rtc><ruby>a<rb>b</rb><rt></rt></ruby></rtc></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby><rtc><ruby>a<rb>b</rb><rt></rt></ruby></rtc></ruby>"
    +      }
    +    }
    +  ],
    +  "scriptdata01.dat": [
    +    {
    +      "data": "FOO<script>'Hello'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'Hello'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'Hello'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'Hello'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script></script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script"
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script></script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script></script >BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script"
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script></script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script></script/>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,21): self-closing-flag-on-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script"
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script></script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script></script/ >BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,20): unexpected-character-after-solidus-in-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script"
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script></script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\"></scriptx>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,42): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "</scriptx>BAR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\"></scriptx>BAR</script></body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\"></scriptx>BAR</script>"
    +      }
    +    },
    +    {
    +      "data": "FOO<script></script foo=\">\" dd>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,31): attributes-in-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script"
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script></script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script></script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<!'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<!'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<!'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<!'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<!-'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<!-'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<!-'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<!-'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<!--'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<!--'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<!--'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<!--'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<!---'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<!---'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<!---'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<!---'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<!-->'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<!-->'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<!-->'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<!-->'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<!-->'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<!-->'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<!-->'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<!-->'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<!-- potato'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<!-- potato'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<!-- potato'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<!-- potato'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<!-- <sCrIpt'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<!-- <sCrIpt'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<!-- <sCrIpt'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt>'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,56): expected-script-data-but-got-eof",
    +        "(1,56): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt>'</script>BAR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt>'</script>BAR</script></body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt>'</script>BAR</script>"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> -'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,58): expected-script-data-but-got-eof",
    +        "(1,58): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt> -'</script>BAR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt> -'</script>BAR</script></body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> -'</script>BAR</script>"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> --'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,59): expected-script-data-but-got-eof",
    +        "(1,59): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt> --'</script>BAR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt> --'</script>BAR</script></body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> --'</script>BAR</script>"
    +      }
    +    },
    +    {
    +      "data": "FOO<script>'<!-- <sCrIpt> -->'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt> -->'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script>'<!-- <sCrIpt> -->'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script>'<!-- <sCrIpt> -->'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> --!>'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,61): expected-script-data-but-got-eof",
    +        "(1,61): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt> --!>'</script>BAR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt> --!>'</script>BAR</script></body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> --!>'</script>BAR</script>"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> -- >'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,61): expected-script-data-but-got-eof",
    +        "(1,61): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt> -- >'</script>BAR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt> -- >'</script>BAR</script></body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt> -- >'</script>BAR</script>"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt '</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,56): expected-script-data-but-got-eof",
    +        "(1,56): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt '</script>BAR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt '</script>BAR</script></body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt '</script>BAR</script>"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars",
    +        "(1,56): expected-script-data-but-got-eof",
    +        "(1,56): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt/'</script>BAR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script></body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script>"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt\\'</script>BAR",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt\\'",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "BAR"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt\\'</script>BAR</body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt\\'</script>BAR"
    +      }
    +    },
    +    {
    +      "data": "FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script>QUX",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/plain"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "'<!-- <sCrIpt/'</script>BAR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "QUX"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script>QUX</body></html>",
    +        "noQuirksBodyHtml": "FOO<script type=\"text/plain\">'<!-- <sCrIpt/'</script>BAR</script>QUX"
    +      }
    +    },
    +    {
    +      "data": "FOO<script><!--<script>-></script>--></script>QUX",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "FOO"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script>-></script>-->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "QUX"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>FOO<script><!--<script>-></script>--></script>QUX</body></html>",
    +        "noQuirksBodyHtml": "FOO<script><!--<script>-></script>--></script>QUX"
    +      }
    +    }
    +  ],
    +  "tables01.dat": [
    +    {
    +      "data": "<table><th>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,11): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "th": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "th"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><th></th></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><th></th></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><td>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,11): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><col foo='bar'>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,22): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true,
    +            "col": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "col",
    +                            "attrs": [
    +                              {
    +                                "name": "foo",
    +                                "value": "bar"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup><col foo=\"bar\"></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup><col foo=\"bar\"></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup></html>foo",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,24): unexpected-end-tag",
    +        "(1,27): foster-parenting-character-in-table",
    +        "(1,27): foster-parenting-character-in-table",
    +        "(1,27): foster-parenting-character-in-table",
    +        "(1,27): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "foo"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>foo<table><colgroup></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "foo<table><colgroup></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<table></table><p>foo",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table></table><p>foo</p></body></html>",
    +        "noQuirksBodyHtml": "<table></table><p>foo</p>"
    +      }
    +    },
    +    {
    +      "data": "<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr><td>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-end-tag",
    +        "(1,24): unexpected-end-tag",
    +        "(1,30): unexpected-end-tag",
    +        "(1,41): unexpected-end-tag",
    +        "(1,48): unexpected-end-tag",
    +        "(1,56): unexpected-end-tag",
    +        "(1,61): unexpected-end-tag",
    +        "(1,69): unexpected-end-tag",
    +        "(1,74): unexpected-end-tag",
    +        "(1,82): unexpected-end-tag",
    +        "(1,87): unexpected-end-tag",
    +        "(1,91): unexpected-cell-in-table-body",
    +        "(1,91): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><select><option>3</select></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,15): unexpected-start-tag-implies-table-voodoo"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option",
    +                        "children": [
    +                          {
    +                            "text": "3"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><option>3</option></select><table></table></body></html>",
    +        "noQuirksBodyHtml": "<select><option>3</option></select><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><select><table></table></select></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,15): unexpected-start-tag-implies-table-voodoo",
    +        "(1,22): unexpected-table-element-start-tag-in-select-in-table",
    +        "(1,22): unexpected-start-tag-implies-end-tag",
    +        "(1,39): unexpected-end-tag",
    +        "(1,47): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select></select><table></table><table></table></body></html>",
    +        "noQuirksBodyHtml": "<select></select><table></table><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><select></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,15): unexpected-start-tag-implies-table-voodoo",
    +        "(1,23): unexpected-table-element-end-tag-in-select-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select></select><table></table></body></html>",
    +        "noQuirksBodyHtml": "<select></select><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><select><option>A<tr><td>B</td></tr></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,15): unexpected-start-tag-implies-table-voodoo",
    +        "(1,28): unexpected-table-element-start-tag-in-select-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option",
    +                        "children": [
    +                          {
    +                            "text": "A"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "B"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><option>A</option></select><table><tbody><tr><td>B</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<select><option>A</option></select><table><tbody><tr><td>B</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><td></body></caption></col></colgroup></html>foo",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,18): unexpected-end-tag",
    +        "(1,28): unexpected-end-tag",
    +        "(1,34): unexpected-end-tag",
    +        "(1,45): unexpected-end-tag",
    +        "(1,52): unexpected-end-tag",
    +        "(1,55): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "foo"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td>foo</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td>foo</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><td>A</table>B",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "A"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "B"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td>A</td></tr></tbody></table>B</body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td>A</td></tr></tbody></table>B"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><caption>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "caption": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "caption"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr></tr></tbody><caption></caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr></tr></tbody><caption></caption></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr></body></caption></col></colgroup></html></td></th><td>foo",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,18): unexpected-end-tag-in-table-row",
    +        "(1,28): unexpected-end-tag-in-table-row",
    +        "(1,34): unexpected-end-tag-in-table-row",
    +        "(1,45): unexpected-end-tag-in-table-row",
    +        "(1,52): unexpected-end-tag-in-table-row",
    +        "(1,57): unexpected-end-tag-in-table-row",
    +        "(1,62): unexpected-end-tag-in-table-row",
    +        "(1,69): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "foo"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td>foo</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td>foo</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><td><tr>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,15): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td></td></tr><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><td><button><td>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,23): unexpected-cell-end-tag",
    +        "(1,23): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "button": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "button"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td><button></button></td><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><button></button></td><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><td><svg><desc><td>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,30): unexpected-cell-end-tag",
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "svg svg": true,
    +            "svg desc": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "svg",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "desc",
    +                                        "ns": "http://www.w3.org/2000/svg"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td><svg><desc></desc></svg></td><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><desc></desc></svg></td><td></td></tr></tbody></table>"
    +      }
    +    }
    +  ],
    +  "template.dat": [
    +    {
    +      "data": "<body><template>Hello</template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "text": "Hello"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template>Hello</template></body></html>",
    +        "noQuirksBodyHtml": "<template>Hello</template>"
    +      }
    +    },
    +    {
    +      "data": "<template>Hello</template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "text": "Hello"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template>Hello</template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template>Hello</template>"
    +      }
    +    },
    +    {
    +      "data": "<template></template><div></div>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template></template></head><body><div></div></body></html>",
    +        "noQuirksBodyHtml": "<template></template><div></div>"
    +      }
    +    },
    +    {
    +      "data": "<html><template>Hello</template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "text": "Hello"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template>Hello</template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template>Hello</template>"
    +      }
    +    },
    +    {
    +      "data": "<head><template><div></div></template></head>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "div": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><div></div></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><div></div></template>"
    +      }
    +    },
    +    {
    +      "data": "<div><template><div><span></template><b>",
    +      "errors": [
    +        " * (1,6) missing DOCTYPE",
    +        " * (1,38) mismatched template end tag",
    +        " * (1,41) unexpected end of file"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "template": true,
    +            "span": true,
    +            "b": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "div",
    +                                "children": [
    +                                  {
    +                                    "tag": "span"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><template><div><span></span></div></template><b></b></div></body></html>",
    +        "noQuirksBodyHtml": "<div><template><div><span></span></div></template><b></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<div><template></div>Hello",
    +      "errors": [
    +        " * (1,6) missing DOCTYPE",
    +        " * (1,22) unexpected token in template",
    +        " * (1,27) unexpected end of file in template",
    +        " * (1,27) unexpected end of file"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "text": "Hello"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><template>Hello</template></div></body></html>",
    +        "noQuirksBodyHtml": "<div><template>Hello</template></div>"
    +      }
    +    },
    +    {
    +      "data": "<div></template></div>",
    +      "errors": [
    +        " * (1,6) missing DOCTYPE",
    +        " * (1,17) unexpected template end tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div></div></body></html>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<table><template></template></table>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><template></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table><template></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><template></template></div>",
    +      "errors": [
    +        " * (1,8) missing DOCTYPE",
    +        " * (1,35) unexpected token in table - foster parenting",
    +        " * (1,35) unexpected end tag",
    +        " * (1,35) unexpected end of file"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><template></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table><template></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><div><template></template></div>",
    +      "errors": [
    +        " * (1,8) missing DOCTYPE",
    +        " * (1,13) unexpected token in table - foster parenting",
    +        " * (1,40) unexpected token in table - foster parenting",
    +        " * (1,40) unexpected end of file"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "template": true,
    +            "table": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><template></template></div><table></table></body></html>",
    +        "noQuirksBodyHtml": "<div><template></template></div><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><template></template><div></div>",
    +      "errors": [
    +        "no doctype",
    +        "bad div in table",
    +        "bad /div in table",
    +        "eof in table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "table": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div></div><table><template></template></table></body></html>",
    +        "noQuirksBodyHtml": "<div></div><table><template></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<table>   <template></template></table>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "text": "   "
    +                      },
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table>   <template></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table>   <template></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tbody><template></template></tbody>",
    +      "errors": [
    +        "no doctype",
    +        "eof in table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><template></template></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><template></template></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tbody><template></tbody></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad /tbody",
    +        "eof in table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><template></template></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><template></template></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tbody><template></template></tbody></table>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><template></template></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><template></template></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><thead><template></template></thead>",
    +      "errors": [
    +        "no doctype",
    +        "eof in table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "thead": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "thead",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><thead><template></template></thead></table></body></html>",
    +        "noQuirksBodyHtml": "<table><thead><template></template></thead></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tfoot><template></template></tfoot>",
    +      "errors": [
    +        "no doctype",
    +        "eof in table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tfoot": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tfoot",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tfoot><template></template></tfoot></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tfoot><template></template></tfoot></table>"
    +      }
    +    },
    +    {
    +      "data": "<select><template></template></select>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><template></template></select></body></html>",
    +        "noQuirksBodyHtml": "<select><template></template></select>"
    +      }
    +    },
    +    {
    +      "data": "<select><template><option></option></template></select>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "template": true,
    +            "option": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "option"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><template><option></option></template></select></body></html>",
    +        "noQuirksBodyHtml": "<select><template><option></option></template></select>"
    +      }
    +    },
    +    {
    +      "data": "<template><option></option></select><option></option></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad /select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "option": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "option"
    +                          },
    +                          {
    +                            "tag": "option"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><option></option><option></option></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><option></option><option></option></template>"
    +      }
    +    },
    +    {
    +      "data": "<select><template></template><option></select>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "template": true,
    +            "option": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "option"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><template></template><option></option></select></body></html>",
    +        "noQuirksBodyHtml": "<select><template></template><option></option></select>"
    +      }
    +    },
    +    {
    +      "data": "<select><option><template></template></select>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><option><template></template></option></select></body></html>",
    +        "noQuirksBodyHtml": "<select><option><template></template></option></select>"
    +      }
    +    },
    +    {
    +      "data": "<select><template>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><template></template></select></body></html>",
    +        "noQuirksBodyHtml": "<select><template></template></select>"
    +      }
    +    },
    +    {
    +      "data": "<select><option></option><template>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      },
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><option></option><template></template></select></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option><template></template></select>"
    +      }
    +    },
    +    {
    +      "data": "<select><option></option><template><option>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      },
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "option"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><option></option><template><option></option></template></select></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option><template><option></option></template></select>"
    +      }
    +    },
    +    {
    +      "data": "<table><thead><template><td></template></table>",
    +      "errors": [
    +        " * (1,8) missing DOCTYPE"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "thead": true,
    +            "template": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "thead",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "td"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><thead><template><td></td></template></thead></table></body></html>",
    +        "noQuirksBodyHtml": "<table><thead><template><td></td></template></thead></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><template><thead></template></table>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true,
    +            "thead": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "thead"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><template><thead></thead></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table><template><thead></thead></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<body><table><template><td></tr><div></template></table>",
    +      "errors": [
    +        "no doctype",
    +        "bad </tr>",
    +        "missing </div>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true,
    +            "td": true,
    +            "div": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "div"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><template><td><div></div></td></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table><template><td><div></div></td></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><template><thead></template></thead></table>",
    +      "errors": [
    +        "no doctype",
    +        "bad /thead after /template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true,
    +            "thead": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "thead"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><template><thead></thead></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table><template><thead></thead></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><thead><template><tr></template></table>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "thead": true,
    +            "template": true,
    +            "tr": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "thead",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "tr"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><thead><template><tr></tr></template></thead></table></body></html>",
    +        "noQuirksBodyHtml": "<table><thead><template><tr></tr></template></thead></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><template><tr></template></table>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true,
    +            "tr": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "tr"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><template><tr></tr></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table><template><tr></tr></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><template><td>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "template": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "template",
    +                                "children": [
    +                                  {
    +                                    "content": true,
    +                                    "children": [
    +                                      {
    +                                        "tag": "td"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><template><td></td></template></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><template><td></td></template></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><template><tr><template><td></template></tr></template></table>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "template",
    +                                    "children": [
    +                                      {
    +                                        "content": true,
    +                                        "children": [
    +                                          {
    +                                            "tag": "td"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><template><tr><template><td></td></template></tr></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table><template><tr><template><td></td></template></tr></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><template><tr><template><td></td></template></tr></template></table>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "template",
    +                                    "children": [
    +                                      {
    +                                        "content": true,
    +                                        "children": [
    +                                          {
    +                                            "tag": "td"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><template><tr><template><td></td></template></tr></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table><template><tr><template><td></td></template></tr></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><template><td></template>",
    +      "errors": [
    +        "no doctype",
    +        "eof in table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "template": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><template><td></td></template></table></body></html>",
    +        "noQuirksBodyHtml": "<table><template><td></td></template></table>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><td></td></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><template><tr></tr></template><td></td></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "tr"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><template><tr></tr></template><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><template><tr></tr></template><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup><template><col>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true,
    +            "template": true,
    +            "col": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "col"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup><template><col></template></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup><template><col></template></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<frameset><template><frame></frame></template></frameset>",
    +      "errors": [
    +        " * (1,11) missing DOCTYPE",
    +        " * (1,21) unexpected start tag token",
    +        " * (1,36) unexpected end tag token",
    +        " * (1,47) unexpected end tag token"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "frame": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "tag": "frame"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset><frame></frameset></html>",
    +        "noQuirksBodyHtml": "<template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><frame></frame></frameset><frame></frame></template>",
    +      "errors": [
    +        " * (1,11) missing DOCTYPE",
    +        " * (1,18) unexpected start tag",
    +        " * (1,26) unexpected end tag",
    +        " * (1,37) unexpected end tag",
    +        " * (1,44) unexpected start tag",
    +        " * (1,52) unexpected end tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><div><frameset><span></span></div><span></span></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "div": true,
    +            "span": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "tag": "span"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "span"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><div><span></span></div><span></span></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><div><span></span></div><span></span></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><div><frameset><span></span></div><span></span></template></body>",
    +      "errors": [
    +        "no doctype",
    +        "bad frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "div": true,
    +            "span": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "tag": "span"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "span"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><div><span></span></div><span></span></template></body></html>",
    +        "noQuirksBodyHtml": "<template><div><span></span></div><span></span></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><script>var i = 1;</script><td></td></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "script": true,
    +            "td": true
    +          },
    +          "template": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "script",
    +                            "children": [
    +                              {
    +                                "text": "var i = 1;",
    +                                "no_escape": true
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><script>var i = 1;</script><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><script>var i = 1;</script><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><tr><div></div></tr></template>",
    +      "errors": [
    +        "no doctype",
    +        "foster-parented div",
    +        "foster-parented /div"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "tr": true,
    +            "div": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          },
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><tr></tr><div></div></template></body></html>",
    +        "noQuirksBodyHtml": "<template><tr></tr><div></div></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><tr></tr><td></td></template>",
    +      "errors": [
    +        "no doctype",
    +        "unexpected <td>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          },
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><tr></tr><tr><td></td></tr></template></body></html>",
    +        "noQuirksBodyHtml": "<template><tr></tr><tr><td></td></tr></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><td></td></tr><td></td></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad </tr>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "td"
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><td></td><tbody><td></td></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad <tbody>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "td"
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><td></td><caption></caption><td></td></template>",
    +      "errors": [
    +        " * (1,7) missing DOCTYPE",
    +        " * (1,35) unexpected start tag in table row",
    +        " * (1,45) unexpected end tag in table row"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "td"
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><td></td><colgroup></caption><td></td></template>",
    +      "errors": [
    +        " * (1,7) missing DOCTYPE",
    +        " * (1,36) unexpected start tag in table row",
    +        " * (1,46) unexpected end tag in table row"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "td"
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><td></td></table><td></td></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad </table>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "td"
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><td></td><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><td></td><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><tr></tr><tbody><tr></tr></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad <tbody>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "tr": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          },
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><tr></tr><tr></tr></template></body></html>",
    +        "noQuirksBodyHtml": "<template><tr></tr><tr></tr></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><tr></tr><caption><tr></tr></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad <caption>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "tr": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          },
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><tr></tr><tr></tr></template></body></html>",
    +        "noQuirksBodyHtml": "<template><tr></tr><tr></tr></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><tr></tr></table><tr></tr></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad </table>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "tr": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          },
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><tr></tr><tr></tr></template></body></html>",
    +        "noQuirksBodyHtml": "<template><tr></tr><tr></tr></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><thead></thead><caption></caption><tbody></tbody></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "thead": true,
    +            "caption": true,
    +            "tbody": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "thead"
    +                          },
    +                          {
    +                            "tag": "caption"
    +                          },
    +                          {
    +                            "tag": "tbody"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><thead></thead><caption></caption><tbody></tbody></template></body></html>",
    +        "noQuirksBodyHtml": "<template><thead></thead><caption></caption><tbody></tbody></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><thead></thead></table><tbody></tbody></template></body>",
    +      "errors": [
    +        "no doctype",
    +        "bad </table>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "thead": true,
    +            "tbody": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "thead"
    +                          },
    +                          {
    +                            "tag": "tbody"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><thead></thead><tbody></tbody></template></body></html>",
    +        "noQuirksBodyHtml": "<template><thead></thead><tbody></tbody></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><div><tr></tr></div></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad tr",
    +        "bad /tr"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "div": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><div></div></template></body></html>",
    +        "noQuirksBodyHtml": "<template><div></div></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><em>Hello</em></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "em": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "em",
    +                            "children": [
    +                              {
    +                                "text": "Hello"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><em>Hello</em></template></body></html>",
    +        "noQuirksBodyHtml": "<template><em>Hello</em></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><!--comment--></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true
    +          },
    +          "template": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "comment": "comment"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><!--comment--></template></body></html>",
    +        "noQuirksBodyHtml": "<template><!--comment--></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><style></style><td></td></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "style": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "style"
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><style></style><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><style></style><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><meta><td></td></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "meta": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "meta"
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><meta><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><meta><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><link><td></td></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "link": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "link"
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><link><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><link><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><template><tr></tr></template><td></td></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "tr"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><template><tr></tr></template><td></td></template></body></html>",
    +        "noQuirksBodyHtml": "<template><template><tr></tr></template><td></td></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><table><colgroup><template><col></col></template></colgroup></table></body>",
    +      "errors": [
    +        "no doctype",
    +        "bad /col"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true,
    +            "template": true,
    +            "col": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "col"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup><template><col></template></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup><template><col></template></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<body a=b><template><div></div><body c=d><div></div></body></template></body>",
    +      "errors": [
    +        "no doctype",
    +        "bad <body>",
    +        "bad </body>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "div": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "a",
    +                    "value": "b"
    +                  }
    +                ],
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          },
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body a=\"b\"><template><div></div><div></div></template></body></html>",
    +        "noQuirksBodyHtml": "<template><div></div><div></div></template>"
    +      }
    +    },
    +    {
    +      "data": "<html a=b><template><div><html b=c><span></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad <html>",
    +        "missing end tags in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "div": true,
    +            "span": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "a",
    +                "value": "b"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "tag": "span"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html a=\"b\"><head><template><div><span></span></div></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><div><span></span></div></template>"
    +      }
    +    },
    +    {
    +      "data": "<html a=b><template><col></col><html b=c><col></col></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad /col",
    +        "bad html",
    +        "bad /col"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "col": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "a",
    +                "value": "b"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          },
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html a=\"b\"><head><template><col><col></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><col><col></template>"
    +      }
    +    },
    +    {
    +      "data": "<html a=b><template><frame></frame><html b=c><frame></frame></template>",
    +      "errors": [
    +        "no doctype",
    +        "bad frame",
    +        "bad /frame",
    +        "bad html",
    +        "bad frame",
    +        "bad /frame"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "a",
    +                "value": "b"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html a=\"b\"><head><template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><tr></tr><template></template><td></td></template>",
    +      "errors": [
    +        "no doctype",
    +        "unexpected <td>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          },
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><tr></tr><template></template><tr><td></td></tr></template></body></html>",
    +        "noQuirksBodyHtml": "<template><tr></tr><template></template><tr><td></td></tr></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><thead></thead><template><tr></tr></template><tr></tr><tfoot></tfoot></template>",
    +      "errors": [
    +        "no doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "thead": true,
    +            "tr": true,
    +            "tbody": true,
    +            "tfoot": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "thead"
    +                          },
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "tr"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "tfoot"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><thead></thead><template><tr></tr></template><tbody><tr></tr></tbody><tfoot></tfoot></template></body></html>",
    +        "noQuirksBodyHtml": "<template><thead></thead><template><tr></tr></template><tbody><tr></tr></tbody><tfoot></tfoot></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><template><b><template></template></template>text</template>",
    +      "errors": [
    +        "no doctype",
    +        "missing </b>"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "b": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "b",
    +                                    "children": [
    +                                      {
    +                                        "tag": "template",
    +                                        "children": [
    +                                          {
    +                                            "content": true
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": "text"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><template><b><template></template></b></template>text</template></body></html>",
    +        "noQuirksBodyHtml": "<template><template><b><template></template></b></template>text</template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><col><colgroup>",
    +      "errors": [
    +        "no doctype",
    +        "bad colgroup",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "col": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><col></template></body></html>",
    +        "noQuirksBodyHtml": "<template><col></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><col></colgroup>",
    +      "errors": [
    +        "no doctype",
    +        "bogus /colgroup",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "col": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><col></template></body></html>",
    +        "noQuirksBodyHtml": "<template><col></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><col><colgroup></template></body>",
    +      "errors": [
    +        "no doctype",
    +        "bad colgroup"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "col": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><col></template></body></html>",
    +        "noQuirksBodyHtml": "<template><col></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><col><div>",
    +      "errors": [
    +        " * (1,7) missing DOCTYPE",
    +        " * (1,27) unexpected token",
    +        " * (1,27) unexpected end of file in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "col": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><col></template></body></html>",
    +        "noQuirksBodyHtml": "<template><col></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><col></div>",
    +      "errors": [
    +        "no doctype",
    +        "bad /div",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "col": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><col></template></body></html>",
    +        "noQuirksBodyHtml": "<template><col></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><col>Hello",
    +      "errors": [
    +        "no doctype",
    +        "unexpected text",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "col": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><col></template></body></html>",
    +        "noQuirksBodyHtml": "<template><col></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template><i><menu>Foo</i>",
    +      "errors": [
    +        "no doctype",
    +        "mising /menu",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "i": true,
    +            "menu": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "i"
    +                          },
    +                          {
    +                            "tag": "menu",
    +                            "children": [
    +                              {
    +                                "tag": "i",
    +                                "children": [
    +                                  {
    +                                    "text": "Foo"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><i></i><menu><i>Foo</i></menu></template></body></html>",
    +        "noQuirksBodyHtml": "<template><i></i><menu><i>Foo</i></menu></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><template></div><div>Foo</div><template></template><tr></tr>",
    +      "errors": [
    +        "no doctype",
    +        "bogus /div",
    +        "bogus tr",
    +        "bogus /tr",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true,
    +            "div": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "text": "Foo"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template><div>Foo</div><template></template></template></body></html>",
    +        "noQuirksBodyHtml": "<template><div>Foo</div><template></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<body><div><template></div><tr><td>Foo</td></tr></template>",
    +      "errors": [
    +        " * (1,7) missing DOCTYPE",
    +        " * (1,28) unexpected token in template",
    +        " * (1,60) unexpected end of file"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "template": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "text": "Foo"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><template><tr><td>Foo</td></tr></template></div></body></html>",
    +        "noQuirksBodyHtml": "<div><template><tr><td>Foo</td></tr></template></div>"
    +      }
    +    },
    +    {
    +      "data": "<template></figcaption><sub><table></table>",
    +      "errors": [
    +        "no doctype",
    +        "bad /figcaption",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "sub": true,
    +            "table": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "sub",
    +                            "children": [
    +                              {
    +                                "tag": "table"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><sub><table></table></sub></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><sub><table></table></sub></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><div>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "div": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><div></div></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><div></div></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><div>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "div": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "div"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><div></div></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><div></div></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><table>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "table": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "table"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><table></table></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><table></table></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><tbody>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "tbody": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "tbody"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><tbody></tbody></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><tbody></tbody></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><tr>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "tr": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "tr"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><tr></tr></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><tr></tr></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><td>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "td": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "td"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><td></td></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><td></td></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><caption>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "caption": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "caption"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><caption></caption></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><caption></caption></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><colgroup>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "colgroup": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "colgroup"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><colgroup></colgroup></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><colgroup></colgroup></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><col>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "col": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "col"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><col></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><col></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><tbody><select>",
    +      "errors": [
    +        " * (1,11) missing DOCTYPE",
    +        " * (1,36) unexpected token in table - foster parenting",
    +        " * (1,36) unexpected end of file in template",
    +        " * (1,36) unexpected end of file in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "tbody": true,
    +            "select": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "tbody"
    +                                  },
    +                                  {
    +                                    "tag": "select"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><tbody></tbody><select></select></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><tbody></tbody><select></select></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><table>Foo",
    +      "errors": [
    +        "no doctype",
    +        "foster-parenting text F",
    +        "foster-parenting text o",
    +        "foster-parenting text o",
    +        "eof",
    +        "eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "table": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "text": "Foo"
    +                                  },
    +                                  {
    +                                    "tag": "table"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template>Foo<table></table></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template>Foo<table></table></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><frame>",
    +      "errors": [
    +        "no doctype",
    +        "bad tag",
    +        "eof",
    +        "eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><script>var i",
    +      "errors": [
    +        "no doctype",
    +        "eof in script",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "template": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "script",
    +                                    "children": [
    +                                      {
    +                                        "text": "var i",
    +                                        "no_escape": true
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><script>var i</script></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><script>var i</script></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><template><style>var i",
    +      "errors": [
    +        "no doctype",
    +        "eof in style",
    +        "eof in template",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "template": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "style",
    +                                    "children": [
    +                                      {
    +                                        "text": "var i",
    +                                        "no_escape": true
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><template><style>var i</style></template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><template><style>var i</style></template></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><table></template><body><span>Foo",
    +      "errors": [
    +        "no doctype",
    +        "missing /table",
    +        "bad eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "table": true,
    +            "body": true,
    +            "span": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "table"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "span",
    +                    "children": [
    +                      {
    +                        "text": "Foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><table></table></template></head><body><span>Foo</span></body></html>",
    +        "noQuirksBodyHtml": "<template><table></table></template><span>Foo</span>"
    +      }
    +    },
    +    {
    +      "data": "<template><td></template><body><span>Foo",
    +      "errors": [
    +        "no doctype",
    +        "bad eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "td": true,
    +            "body": true,
    +            "span": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "td"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "span",
    +                    "children": [
    +                      {
    +                        "text": "Foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><td></td></template></head><body><span>Foo</span></body></html>",
    +        "noQuirksBodyHtml": "<template><td></td></template><span>Foo</span>"
    +      }
    +    },
    +    {
    +      "data": "<template><object></template><body><span>Foo",
    +      "errors": [
    +        "no doctype",
    +        "missing /object",
    +        "bad eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "object": true,
    +            "body": true,
    +            "span": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "object"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "span",
    +                    "children": [
    +                      {
    +                        "text": "Foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><object></object></template></head><body><span>Foo</span></body></html>",
    +        "noQuirksBodyHtml": "<template><object></object></template><span>Foo</span>"
    +      }
    +    },
    +    {
    +      "data": "<template><svg><template>",
    +      "errors": [
    +        "no doctype",
    +        "eof in template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "svg svg": true,
    +            "svg template": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "template",
    +                                "ns": "http://www.w3.org/2000/svg"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><svg><template></template></svg></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><svg><template></template></svg></template>"
    +      }
    +    },
    +    {
    +      "data": "<template><svg><foo><template><foreignObject><div></template><div>",
    +      "errors": [
    +        "no doctype",
    +        "ugly template closure",
    +        "bad eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "svg svg": true,
    +            "svg foo": true,
    +            "svg template": true,
    +            "svg foreignObject": true,
    +            "div": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "foo",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "template",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "foreignObject",
    +                                        "ns": "http://www.w3.org/2000/svg",
    +                                        "children": [
    +                                          {
    +                                            "tag": "div"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><svg><foo><template><foreignObject><div></div></foreignObject></template></foo></svg></template></head><body><div></div></body></html>",
    +        "noQuirksBodyHtml": "<template><svg><foo><template><foreignObject><div></div></foreignObject></template></foo></svg></template><div></div>"
    +      }
    +    },
    +    {
    +      "data": "<dummy><template><span></dummy>",
    +      "errors": [
    +        "no doctype",
    +        "bad end tag </dummy>",
    +        "eof in template",
    +        "eof in dummy"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "dummy": true,
    +            "template": true,
    +            "span": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "dummy",
    +                    "children": [
    +                      {
    +                        "tag": "template",
    +                        "children": [
    +                          {
    +                            "content": true,
    +                            "children": [
    +                              {
    +                                "tag": "span"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><dummy><template><span></span></template></dummy></body></html>",
    +        "noQuirksBodyHtml": "<dummy><template><span></span></template></dummy>"
    +      }
    +    },
    +    {
    +      "data": "<body><table><tr><td><select><template>Foo</template><caption>A</table>",
    +      "errors": [
    +        "no doctype",
    +        "(1,62): unexpected-caption-in-select-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "select": true,
    +            "template": true,
    +            "caption": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "select",
    +                                    "children": [
    +                                      {
    +                                        "tag": "template",
    +                                        "children": [
    +                                          {
    +                                            "content": true,
    +                                            "children": [
    +                                              {
    +                                                "text": "Foo"
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "text": "A"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td><select><template>Foo</template></select></td></tr></tbody><caption>A</caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><select><template>Foo</template></select></td></tr></tbody><caption>A</caption></table>"
    +      }
    +    },
    +    {
    +      "data": "<body></body><template>",
    +      "errors": [
    +        "no doctype",
    +        "(1,23): template-after-body",
    +        "(1,24): eof-in-template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "template": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><template></template></body></html>",
    +        "noQuirksBodyHtml": "<template></template>"
    +      }
    +    },
    +    {
    +      "data": "<head></head><template>",
    +      "errors": [
    +        "no doctype",
    +        "(1,23): template-after-head",
    +        "(1,24): eof-in-template"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template></template>"
    +      }
    +    },
    +    {
    +      "data": "<head></head><template>Foo</template>",
    +      "errors": [
    +        "no doctype",
    +        "(1,23): template-after-head"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "text": "Foo"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template>Foo</template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template>Foo</template>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE HTML><dummy><table><template><table><template><table><script>",
    +      "errors": [
    +        "eof script",
    +        "eof template",
    +        "eof template",
    +        "eof table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "dummy": true,
    +            "table": true,
    +            "template": true,
    +            "script": true
    +          },
    +          "doctype": true,
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "dummy",
    +                    "children": [
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "template",
    +                            "children": [
    +                              {
    +                                "content": true,
    +                                "children": [
    +                                  {
    +                                    "tag": "table",
    +                                    "children": [
    +                                      {
    +                                        "tag": "template",
    +                                        "children": [
    +                                          {
    +                                            "content": true,
    +                                            "children": [
    +                                              {
    +                                                "tag": "table",
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "script"
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><dummy><table><template><table><template><table><script></script></table></template></table></template></table></dummy></body></html>",
    +        "noQuirksBodyHtml": "<dummy><table><template><table><template><table><script></script></table></template></table></template></table></dummy>"
    +      }
    +    },
    +    {
    +      "data": "<template><a><table><a>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "template": true,
    +            "a": true,
    +            "table": true,
    +            "body": true
    +          },
    +          "template": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "template",
    +                    "children": [
    +                      {
    +                        "content": true,
    +                        "children": [
    +                          {
    +                            "tag": "a",
    +                            "children": [
    +                              {
    +                                "tag": "a"
    +                              },
    +                              {
    +                                "tag": "table"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><template><a><a></a><table></table></a></template></head><body></body></html>",
    +        "noQuirksBodyHtml": "<template><a><a></a><table></table></a></template>"
    +      }
    +    }
    +  ],
    +  "tests1.dat": [
    +    {
    +      "data": "Test",
    +      "errors": [
    +        "(1,0): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Test"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>Test</body></html>",
    +        "noQuirksBodyHtml": "Test"
    +      }
    +    },
    +    {
    +      "data": "<p>One<p>Two",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "One"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "Two"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p>One</p><p>Two</p></body></html>",
    +        "noQuirksBodyHtml": "<p>One</p><p>Two</p>"
    +      }
    +    },
    +    {
    +      "data": "Line1<br>Line2<br>Line3<br>Line4",
    +      "errors": [
    +        "(1,0): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "br": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Line1"
    +                  },
    +                  {
    +                    "tag": "br"
    +                  },
    +                  {
    +                    "text": "Line2"
    +                  },
    +                  {
    +                    "tag": "br"
    +                  },
    +                  {
    +                    "text": "Line3"
    +                  },
    +                  {
    +                    "tag": "br"
    +                  },
    +                  {
    +                    "text": "Line4"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>Line1<br>Line2<br>Line3<br>Line4</body></html>",
    +        "noQuirksBodyHtml": "Line1<br>Line2<br>Line3<br>Line4"
    +      }
    +    },
    +    {
    +      "data": "<html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<head>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<body>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><head>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><head></head>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><head></head><body>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><head></head><body></body>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><head><body></body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><head></body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><head><body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<head></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "</head>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "</body>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-end-tag element."
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "</html>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-end-tag element."
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<b><table><td><i></table>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-cell-in-table-body",
    +        "(1,25): unexpected-cell-end-tag",
    +        "(1,25): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "i": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "tag": "i"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><table><tbody><tr><td><i></i></td></tr></tbody></table></b></body></html>",
    +        "noQuirksBodyHtml": "<b><table><tbody><tr><td><i></i></td></tr></tbody></table></b>"
    +      }
    +    },
    +    {
    +      "data": "<b><table><td></b><i></table>X",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-cell-in-table-body",
    +        "(1,18): unexpected-end-tag",
    +        "(1,29): unexpected-cell-end-tag",
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "i": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "tag": "i"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><table><tbody><tr><td><i></i></td></tr></tbody></table>X</b></body></html>",
    +        "noQuirksBodyHtml": "<b><table><tbody><tr><td><i></i></td></tr></tbody></table>X</b>"
    +      }
    +    },
    +    {
    +      "data": "<h1>Hello<h2>World",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-start-tag",
    +        "(1,13): unexpected-start-tag",
    +        "(1,18): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "h1": true,
    +            "h2": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "h1",
    +                    "children": [
    +                      {
    +                        "text": "Hello"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "h2",
    +                    "children": [
    +                      {
    +                        "text": "World"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><h1>Hello</h1><h2>World</h2></body></html>",
    +        "noQuirksBodyHtml": "<h1>Hello</h1><h2>World</h2>"
    +      }
    +    },
    +    {
    +      "data": "<a><p>X<a>Y</a>Z</p></a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,10): unexpected-start-tag-implies-end-tag",
    +        "(1,10): adoption-agency-1.3",
    +        "(1,24): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "X"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "Y"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "Z"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a></a><p><a>X</a><a>Y</a>Z</p></body></html>",
    +        "noQuirksBodyHtml": "<a></a><p><a>X</a><a>Y</a>Z</p>"
    +      }
    +    },
    +    {
    +      "data": "<b><button>foo</b>bar",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,18): adoption-agency-1.3",
    +        "(1,21): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "button": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "button",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "bar"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b></b><button><b>foo</b>bar</button></body></html>",
    +        "noQuirksBodyHtml": "<b></b><button><b>foo</b>bar</button>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><span><button>foo</span>bar",
    +      "errors": [
    +        "(1,39): unexpected-end-tag",
    +        "(1,42): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "span": true,
    +            "button": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "span",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "text": "foobar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><span><button>foobar</button></span></body></html>",
    +        "noQuirksBodyHtml": "<span><button>foobar</button></span>"
    +      }
    +    },
    +    {
    +      "data": "<p><b><div><marquee></p></b></div>X",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-end-tag",
    +        "(1,24): unexpected-end-tag",
    +        "(1,28): unexpected-end-tag",
    +        "(1,34): end-tag-too-early",
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "b": true,
    +            "div": true,
    +            "marquee": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "marquee",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              },
    +                              {
    +                                "text": "X"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><b></b></p><div><b><marquee><p></p>X</marquee></b></div></body></html>",
    +        "noQuirksBodyHtml": "<p><b></b></p><div><b><marquee><p></p>X</marquee></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<script><div></script></div><title><p></title><p><p>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,28): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "title": true,
    +            "body": true,
    +            "p": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<div>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "<p>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "p"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><div></script><title>&lt;p&gt;</title></head><body><p></p><p></p></body></html>",
    +        "noQuirksBodyHtml": "<script><div></script><title>&lt;p&gt;</title><p></p><p></p>"
    +      }
    +    },
    +    {
    +      "data": "<!--><div>--<!-->",
    +      "errors": [
    +        "(1,5): incorrect-comment",
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,17): incorrect-comment",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": ""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "--"
    +                      },
    +                      {
    +                        "comment": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!----><html><head></head><body><div>--<!----></div></body></html>",
    +        "noQuirksBodyHtml": "<!----><div>--<!----></div>"
    +      }
    +    },
    +    {
    +      "data": "<p><hr></p>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "hr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "hr"
    +                  },
    +                  {
    +                    "tag": "p"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p></p><hr><p></p></body></html>",
    +        "noQuirksBodyHtml": "<p></p><hr><p></p>"
    +      }
    +    },
    +    {
    +      "data": "<select><b><option><select><option></b></select>X",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-start-tag-in-select",
    +        "(1,27): unexpected-select-in-select",
    +        "(1,39): unexpected-end-tag",
    +        "(1,48): unexpected-end-tag",
    +        "(1,49): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "option",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><option></option></select><option>X</option></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option></select><option>X</option>"
    +      }
    +    },
    +    {
    +      "data": "<a><table><td><a><table></table><a></tr><a></table><b>X</b>C<a>Y",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-cell-in-table-body",
    +        "(1,35): unexpected-start-tag-implies-end-tag",
    +        "(1,40): unexpected-cell-end-tag",
    +        "(1,43): unexpected-start-tag-implies-table-voodoo",
    +        "(1,43): unexpected-start-tag-implies-end-tag",
    +        "(1,43): unexpected-end-tag",
    +        "(1,63): unexpected-start-tag-implies-end-tag",
    +        "(1,64): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      },
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "tag": "a",
    +                                        "children": [
    +                                          {
    +                                            "tag": "table"
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "a"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "X"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "C"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "Y"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a><a></a><table><tbody><tr><td><a><table></table></a><a></a></td></tr></tbody></table></a><a><b>X</b>C</a><a>Y</a></body></html>",
    +        "noQuirksBodyHtml": "<a><a></a><table><tbody><tr><td><a><table></table></a><a></a></td></tr></tbody></table></a><a><b>X</b>C</a><a>Y</a>"
    +      }
    +    },
    +    {
    +      "data": "<a X>0<b>1<a Y>2",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,15): unexpected-start-tag-implies-end-tag",
    +        "(1,15): adoption-agency-1.3",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "x",
    +                        "value": ""
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "0"
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "1"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "attrs": [
    +                          {
    +                            "name": "y",
    +                            "value": ""
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a x=\"\">0<b>1</b></a><b><a y=\"\">2</a></b></body></html>",
    +        "noQuirksBodyHtml": "<a x=\"\">0<b>1</b></a><b><a y=\"\">2</a></b>"
    +      }
    +    },
    +    {
    +      "data": "<!-----><font><div>hello<table>excite!<b>me!<th><i>please!</tr><!--X-->",
    +      "errors": [
    +        "(1,7): unexpected-dash-after-double-dash-in-comment",
    +        "(1,14): expected-doctype-but-got-start-tag",
    +        "(1,41): unexpected-start-tag-implies-table-voodoo",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): foster-parenting-character-in-table",
    +        "(1,48): unexpected-cell-in-table-body",
    +        "(1,63): unexpected-cell-end-tag",
    +        "(1,71): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "font": true,
    +            "div": true,
    +            "b": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "th": true,
    +            "i": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "-"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "font",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "text": "helloexcite!"
    +                          },
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "text": "me!"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "table",
    +                            "children": [
    +                              {
    +                                "tag": "tbody",
    +                                "children": [
    +                                  {
    +                                    "tag": "tr",
    +                                    "children": [
    +                                      {
    +                                        "tag": "th",
    +                                        "children": [
    +                                          {
    +                                            "tag": "i",
    +                                            "children": [
    +                                              {
    +                                                "text": "please!"
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "comment": "X"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!-----><html><head></head><body><font><div>helloexcite!<b>me!</b><table><tbody><tr><th><i>please!</i></th></tr><!--X--></tbody></table></div></font></body></html>",
    +        "noQuirksBodyHtml": "<!-----><font><div>helloexcite!<b>me!</b><table><tbody><tr><th><i>please!</i></th></tr><!--X--></tbody></table></div></font>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><li>hello<li>world<ul>how<li>do</ul>you</body><!--do-->",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "li": true,
    +            "ul": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "li",
    +                    "children": [
    +                      {
    +                        "text": "hello"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "li",
    +                    "children": [
    +                      {
    +                        "text": "world"
    +                      },
    +                      {
    +                        "tag": "ul",
    +                        "children": [
    +                          {
    +                            "text": "how"
    +                          },
    +                          {
    +                            "tag": "li",
    +                            "children": [
    +                              {
    +                                "text": "do"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "you"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "comment": "do"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><li>hello</li><li>world<ul>how<li>do</li></ul>you</li></body><!--do--></html>",
    +        "noQuirksBodyHtml": "<li>hello</li><li>world<ul>how<li>do</li></ul>you<!--do--></li>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>A<option>B<optgroup>C<select>D</option>E",
    +      "errors": [
    +        "(1,54): unexpected-end-tag-in-select",
    +        "(1,55): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "option": true,
    +            "optgroup": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "A"
    +                  },
    +                  {
    +                    "tag": "option",
    +                    "children": [
    +                      {
    +                        "text": "B"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "optgroup",
    +                    "children": [
    +                      {
    +                        "text": "C"
    +                      },
    +                      {
    +                        "tag": "select",
    +                        "children": [
    +                          {
    +                            "text": "DE"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>A<option>B</option><optgroup>C<select>DE</select></optgroup></body></html>",
    +        "noQuirksBodyHtml": "A<option>B</option><optgroup>C<select>DE</select></optgroup>"
    +      }
    +    },
    +    {
    +      "data": "<",
    +      "errors": [
    +        "(1,1): expected-tag-name",
    +        "(1,1): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "<",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&lt;</body></html>",
    +        "noQuirksBodyHtml": "&lt;"
    +      }
    +    },
    +    {
    +      "data": "<#",
    +      "errors": [
    +        "(1,1): expected-tag-name",
    +        "(1,1): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "<#",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&lt;#</body></html>",
    +        "noQuirksBodyHtml": "&lt;#"
    +      }
    +    },
    +    {
    +      "data": "</",
    +      "errors": [
    +        "(1,2): expected-closing-tag-but-got-eof",
    +        "(1,2): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "</",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&lt;/</body></html>",
    +        "noQuirksBodyHtml": "&lt;/"
    +      }
    +    },
    +    {
    +      "data": "</#",
    +      "errors": [
    +        "(1,2): expected-closing-tag-but-got-char",
    +        "(1,3): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "#"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--#--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--#-->"
    +      }
    +    },
    +    {
    +      "data": "<?",
    +      "errors": [
    +        "(1,1): expected-tag-name-but-got-question-mark",
    +        "(1,2): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "?"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--?--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--?-->"
    +      }
    +    },
    +    {
    +      "data": "<?#",
    +      "errors": [
    +        "(1,1): expected-tag-name-but-got-question-mark",
    +        "(1,3): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "?#"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--?#--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--?#-->"
    +      }
    +    },
    +    {
    +      "data": "<!",
    +      "errors": [
    +        "(1,2): expected-dashes-or-doctype",
    +        "(1,2): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": ""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!----><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!---->"
    +      }
    +    },
    +    {
    +      "data": "<!#",
    +      "errors": [
    +        "(1,2): expected-dashes-or-doctype",
    +        "(1,3): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "#"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--#--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--#-->"
    +      }
    +    },
    +    {
    +      "data": "<?COMMENT?>",
    +      "errors": [
    +        "(1,1): expected-tag-name-but-got-question-mark",
    +        "(1,11): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "?COMMENT?"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--?COMMENT?--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--?COMMENT?-->"
    +      }
    +    },
    +    {
    +      "data": "<!COMMENT>",
    +      "errors": [
    +        "(1,2): expected-dashes-or-doctype",
    +        "(1,10): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "COMMENT"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--COMMENT--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--COMMENT-->"
    +      }
    +    },
    +    {
    +      "data": "</ COMMENT >",
    +      "errors": [
    +        "(1,2): expected-closing-tag-but-got-char",
    +        "(1,12): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": " COMMENT "
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!-- COMMENT --><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!-- COMMENT -->"
    +      }
    +    },
    +    {
    +      "data": "<?COM--MENT?>",
    +      "errors": [
    +        "(1,1): expected-tag-name-but-got-question-mark",
    +        "(1,13): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "?COM--MENT?"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--?COM--MENT?--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--?COM--MENT?-->"
    +      }
    +    },
    +    {
    +      "data": "<!COM--MENT>",
    +      "errors": [
    +        "(1,2): expected-dashes-or-doctype",
    +        "(1,12): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "COM--MENT"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!--COM--MENT--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--COM--MENT-->"
    +      }
    +    },
    +    {
    +      "data": "</ COM--MENT >",
    +      "errors": [
    +        "(1,2): expected-closing-tag-but-got-char",
    +        "(1,14): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": " COM--MENT "
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!-- COM--MENT --><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!-- COM--MENT -->"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><style> EOF",
    +      "errors": [
    +        "(1,26): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": " EOF",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><style> EOF</style></head><body></body></html>",
    +        "noQuirksBodyHtml": "<style> EOF</style>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><script> <!-- </script> --> </script> EOF",
    +      "errors": [
    +        "(1,52): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": " <!-- ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": " "
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->  EOF",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script> <!-- </script> </head><body>--&gt;  EOF</body></html>",
    +        "noQuirksBodyHtml": "<script> <!-- </script> --&gt;  EOF"
    +      }
    +    },
    +    {
    +      "data": "<b><p></b>TEST",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,10): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      },
    +                      {
    +                        "text": "TEST"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b></b><p><b></b>TEST</p></body></html>",
    +        "noQuirksBodyHtml": "<b></b><p><b></b>TEST</p>"
    +      }
    +    },
    +    {
    +      "data": "<p id=a><b><p id=b></b>TEST",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,19): unexpected-end-tag",
    +        "(1,23): adoption-agency-1.2"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "attrs": [
    +                      {
    +                        "name": "id",
    +                        "value": "a"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "attrs": [
    +                      {
    +                        "name": "id",
    +                        "value": "b"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "TEST"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p id=\"a\"><b></b></p><p id=\"b\">TEST</p></body></html>",
    +        "noQuirksBodyHtml": "<p id=\"a\"><b></b></p><p id=\"b\">TEST</p>"
    +      }
    +    },
    +    {
    +      "data": "<b id=a><p><b id=b></p></b>TEST",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,23): unexpected-end-tag",
    +        "(1,27): adoption-agency-1.2",
    +        "(1,31): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "attrs": [
    +                      {
    +                        "name": "id",
    +                        "value": "a"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "b"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "TEST"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b id=\"a\"><p><b id=\"b\"></b></p>TEST</b></body></html>",
    +        "noQuirksBodyHtml": "<b id=\"a\"><p><b id=\"b\"></b></p>TEST</b>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><title>U-test</title><body><div><p>Test<u></p></div></body>",
    +      "errors": [
    +        "(1,61): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true,
    +            "div": true,
    +            "p": true,
    +            "u": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "U-test"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "text": "Test"
    +                          },
    +                          {
    +                            "tag": "u"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><title>U-test</title></head><body><div><p>Test<u></u></p></div></body></html>",
    +        "noQuirksBodyHtml": "<title>U-test</title><div><p>Test<u></u></p></div>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><font><table></font></table></font>",
    +      "errors": [
    +        "(1,35): unexpected-end-tag-implies-table-voodoo",
    +        "(1,35): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "font": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "font",
    +                    "children": [
    +                      {
    +                        "tag": "table"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><font><table></table></font></body></html>",
    +        "noQuirksBodyHtml": "<font><table></table></font>"
    +      }
    +    },
    +    {
    +      "data": "<font><p>hello<b>cruel</font>world",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,29): adoption-agency-1.3",
    +        "(1,29): adoption-agency-1.3",
    +        "(1,34): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "font": true,
    +            "p": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "font"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "children": [
    +                          {
    +                            "text": "hello"
    +                          },
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "text": "cruel"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "world"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><font></font><p><font>hello<b>cruel</b></font><b>world</b></p></body></html>",
    +        "noQuirksBodyHtml": "<font></font><p><font>hello<b>cruel</b></font><b>world</b></p>"
    +      }
    +    },
    +    {
    +      "data": "<b>Test</i>Test",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-end-tag",
    +        "(1,15): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "TestTest"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b>TestTest</b></body></html>",
    +        "noQuirksBodyHtml": "<b>TestTest</b>"
    +      }
    +    },
    +    {
    +      "data": "<b>A<cite>B<div>C",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "cite": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "A"
    +                      },
    +                      {
    +                        "tag": "cite",
    +                        "children": [
    +                          {
    +                            "text": "B"
    +                          },
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "text": "C"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b>A<cite>B<div>C</div></cite></b></body></html>",
    +        "noQuirksBodyHtml": "<b>A<cite>B<div>C</div></cite></b>"
    +      }
    +    },
    +    {
    +      "data": "<b>A<cite>B<div>C</cite>D",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,24): unexpected-end-tag",
    +        "(1,25): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "cite": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "A"
    +                      },
    +                      {
    +                        "tag": "cite",
    +                        "children": [
    +                          {
    +                            "text": "B"
    +                          },
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "text": "CD"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b>A<cite>B<div>CD</div></cite></b></body></html>",
    +        "noQuirksBodyHtml": "<b>A<cite>B<div>CD</div></cite></b>"
    +      }
    +    },
    +    {
    +      "data": "<b>A<cite>B<div>C</b>D",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,21): adoption-agency-1.3",
    +        "(1,22): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "cite": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "A"
    +                      },
    +                      {
    +                        "tag": "cite",
    +                        "children": [
    +                          {
    +                            "text": "B"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "C"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "D"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b>A<cite>B</cite></b><div><b>C</b>D</div></body></html>",
    +        "noQuirksBodyHtml": "<b>A<cite>B</cite></b><div><b>C</b>D</div>"
    +      }
    +    },
    +    {
    +      "data": "",
    +      "errors": [
    +        "(1,0): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<DIV>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,5): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div></div></body></html>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,9): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc</div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc</div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,13): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b></b></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def</b></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def</b></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,21): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i></i></b></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i></i></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I> ghi",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,25): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": " ghi"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i> ghi</i></b></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi</i></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I> ghi <P>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,29): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": " ghi "
    +                              },
    +                              {
    +                                "tag": "p"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i> ghi <p></p></i></b></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi <p></p></i></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I> ghi <P> jkl",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": " ghi "
    +                              },
    +                              {
    +                                "tag": "p",
    +                                "children": [
    +                                  {
    +                                    "text": " jkl"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i> ghi <p> jkl</p></i></b></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi <p> jkl</p></i></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,38): adoption-agency-1.3",
    +        "(1,38): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": " ghi "
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "children": [
    +                                  {
    +                                    "text": " jkl "
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i><p><b> jkl </b></p></i></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i><p><b> jkl </b></p></i></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,38): adoption-agency-1.3",
    +        "(1,42): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": " ghi "
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "children": [
    +                                  {
    +                                    "text": " jkl "
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "text": " mno"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i><p><b> jkl </b> mno</p></i></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i><p><b> jkl </b> mno</p></i></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,38): adoption-agency-1.3",
    +        "(1,47): adoption-agency-1.3",
    +        "(1,47): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": " ghi "
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i"
    +                      },
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "children": [
    +                                  {
    +                                    "text": " jkl "
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "text": " mno "
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i></p></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i></p></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,38): adoption-agency-1.3",
    +        "(1,47): adoption-agency-1.3",
    +        "(1,51): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": " ghi "
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i"
    +                      },
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "children": [
    +                                  {
    +                                    "text": " jkl "
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "text": " mno "
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": " pqr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr</p></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr</p></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,38): adoption-agency-1.3",
    +        "(1,47): adoption-agency-1.3",
    +        "(1,56): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": " ghi "
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i"
    +                      },
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "children": [
    +                                  {
    +                                    "text": " jkl "
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "text": " mno "
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": " pqr "
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr </p></div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr </p></div>"
    +      }
    +    },
    +    {
    +      "data": "<DIV> abc <B> def <I> ghi <P> jkl </B> mno </I> pqr </P> stu",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,38): adoption-agency-1.3",
    +        "(1,47): adoption-agency-1.3",
    +        "(1,60): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "i": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": " abc "
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": " def "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": " ghi "
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i"
    +                      },
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "children": [
    +                                  {
    +                                    "text": " jkl "
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "text": " mno "
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": " pqr "
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": " stu"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr </p> stu</div></body></html>",
    +        "noQuirksBodyHtml": "<div> abc <b> def <i> ghi </i></b><i></i><p><i><b> jkl </b> mno </i> pqr </p> stu</div>"
    +      }
    +    },
    +    {
    +      "data": "<test attribute---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------->",
    +      "errors": [
    +        "(1,1040): expected-doctype-but-got-start-tag",
    +        "(1,1040): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "test": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "test",
    +                    "attrs": [
    +                      {
    +                        "name": "attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><test attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------=\"\"></test></body></html>",
    +        "noQuirksBodyHtml": "<test attribute----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------=\"\"></test>"
    +      }
    +    },
    +    {
    +      "data": "<a href=\"blah\">aba<table><a href=\"foo\">br<tr><td></td></tr>x</table>aoe",
    +      "errors": [
    +        "(1,15): expected-doctype-but-got-start-tag",
    +        "(1,39): unexpected-start-tag-implies-table-voodoo",
    +        "(1,39): unexpected-start-tag-implies-end-tag",
    +        "(1,39): unexpected-end-tag",
    +        "(1,45): foster-parenting-character-in-table",
    +        "(1,45): foster-parenting-character-in-table",
    +        "(1,68): foster-parenting-character-in-table",
    +        "(1,71): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "blah"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "aba"
    +                      },
    +                      {
    +                        "tag": "a",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "value": "foo"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "text": "br"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "a",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "value": "foo"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "text": "x"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "foo"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "aoe"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a href=\"blah\">aba<a href=\"foo\">br</a><a href=\"foo\">x</a><table><tbody><tr><td></td></tr></tbody></table></a><a href=\"foo\">aoe</a></body></html>",
    +        "noQuirksBodyHtml": "<a href=\"blah\">aba<a href=\"foo\">br</a><a href=\"foo\">x</a><table><tbody><tr><td></td></tr></tbody></table></a><a href=\"foo\">aoe</a>"
    +      }
    +    },
    +    {
    +      "data": "<a href=\"blah\">aba<table><tr><td><a href=\"foo\">br</td></tr>x</table>aoe",
    +      "errors": [
    +        "(1,15): expected-doctype-but-got-start-tag",
    +        "(1,54): unexpected-cell-end-tag",
    +        "(1,68): unexpected text in table",
    +        "(1,71): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "blah"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "abax"
    +                      },
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "tag": "a",
    +                                        "attrs": [
    +                                          {
    +                                            "name": "href",
    +                                            "value": "foo"
    +                                          }
    +                                        ],
    +                                        "children": [
    +                                          {
    +                                            "text": "br"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "aoe"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a href=\"blah\">abax<table><tbody><tr><td><a href=\"foo\">br</a></td></tr></tbody></table>aoe</a></body></html>",
    +        "noQuirksBodyHtml": "<a href=\"blah\">abax<table><tbody><tr><td><a href=\"foo\">br</a></td></tr></tbody></table>aoe</a>"
    +      }
    +    },
    +    {
    +      "data": "<table><a href=\"blah\">aba<tr><td><a href=\"foo\">br</td></tr>x</table>aoe",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,22): unexpected-start-tag-implies-table-voodoo",
    +        "(1,29): foster-parenting-character-in-table",
    +        "(1,29): foster-parenting-character-in-table",
    +        "(1,29): foster-parenting-character-in-table",
    +        "(1,54): unexpected-cell-end-tag",
    +        "(1,68): foster-parenting-character-in-table",
    +        "(1,71): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "blah"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "aba"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "blah"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "x"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "a",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "href",
    +                                        "value": "foo"
    +                                      }
    +                                    ],
    +                                    "children": [
    +                                      {
    +                                        "text": "br"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "blah"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "aoe"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a href=\"blah\">aba</a><a href=\"blah\">x</a><table><tbody><tr><td><a href=\"foo\">br</a></td></tr></tbody></table><a href=\"blah\">aoe</a></body></html>",
    +        "noQuirksBodyHtml": "<a href=\"blah\">aba</a><a href=\"blah\">x</a><table><tbody><tr><td><a href=\"foo\">br</a></td></tr></tbody></table><a href=\"blah\">aoe</a>"
    +      }
    +    },
    +    {
    +      "data": "<a href=a>aa<marquee>aa<a href=b>bb</marquee>aa",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,45): end-tag-too-early",
    +        "(1,47): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "marquee": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "a"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "aa"
    +                      },
    +                      {
    +                        "tag": "marquee",
    +                        "children": [
    +                          {
    +                            "text": "aa"
    +                          },
    +                          {
    +                            "tag": "a",
    +                            "attrs": [
    +                              {
    +                                "name": "href",
    +                                "value": "b"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "text": "bb"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "aa"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a href=\"a\">aa<marquee>aa<a href=\"b\">bb</a></marquee>aa</a></body></html>",
    +        "noQuirksBodyHtml": "<a href=\"a\">aa<marquee>aa<a href=\"b\">bb</a></marquee>aa</a>"
    +      }
    +    },
    +    {
    +      "data": "<wbr><strike><code></strike><code><strike></code>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,28): adoption-agency-1.3",
    +        "(1,49): adoption-agency-1.3",
    +        "(1,49): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "wbr": true,
    +            "strike": true,
    +            "code": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "wbr"
    +                  },
    +                  {
    +                    "tag": "strike",
    +                    "children": [
    +                      {
    +                        "tag": "code"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "code",
    +                    "children": [
    +                      {
    +                        "tag": "code",
    +                        "children": [
    +                          {
    +                            "tag": "strike"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><wbr><strike><code></code></strike><code><code><strike></strike></code></code></body></html>",
    +        "noQuirksBodyHtml": "<wbr><strike><code></code></strike><code><code><strike></strike></code></code>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><spacer>foo",
    +      "errors": [
    +        "(1,26): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "spacer": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "spacer",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><spacer>foo</spacer></body></html>",
    +        "noQuirksBodyHtml": "<spacer>foo</spacer>"
    +      }
    +    },
    +    {
    +      "data": "<title><meta></title><link><title><meta></title>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "link": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "<meta>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "link"
    +                  },
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "<meta>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title>&lt;meta&gt;</title><link><title>&lt;meta&gt;</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>&lt;meta&gt;</title><link><title>&lt;meta&gt;</title>"
    +      }
    +    },
    +    {
    +      "data": "<style><!--</style><meta><script>--><link></script>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "meta": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "meta"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "--><link>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style><!--</style><meta><script>--><link></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<style><!--</style><meta><script>--><link></script>"
    +      }
    +    },
    +    {
    +      "data": "<head><meta></head><link>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,25): unexpected-start-tag-out-of-my-head"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "meta": true,
    +            "link": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "meta"
    +                  },
    +                  {
    +                    "tag": "link"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><meta><link></head><body></body></html>",
    +        "noQuirksBodyHtml": "<meta><link>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><tr><td><td><span><th><span>X</table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,33): unexpected-cell-end-tag",
    +        "(1,48): unexpected-cell-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "span": true,
    +            "th": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          },
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              },
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "span"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "th",
    +                                "children": [
    +                                  {
    +                                    "tag": "span",
    +                                    "children": [
    +                                      {
    +                                        "text": "X"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr></tr><tr><td></td><td><span></span></td><th><span>X</span></th></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr></tr><tr><td></td><td><span></span></td><th><span>X</span></th></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<body><body><base><link><meta><title><p></title><body><p></body>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,12): unexpected-start-tag",
    +        "(1,54): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "base": true,
    +            "link": true,
    +            "meta": true,
    +            "title": true,
    +            "p": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "base"
    +                  },
    +                  {
    +                    "tag": "link"
    +                  },
    +                  {
    +                    "tag": "meta"
    +                  },
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "<p>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><base><link><meta><title>&lt;p&gt;</title><p></p></body></html>",
    +        "noQuirksBodyHtml": "<base><link><meta><title>&lt;p&gt;</title><p></p>"
    +      }
    +    },
    +    {
    +      "data": "<textarea><p></textarea>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "<p>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><textarea>&lt;p&gt;</textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea>&lt;p&gt;</textarea>"
    +      }
    +    },
    +    {
    +      "data": "<p><image></p>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,10): unexpected-start-tag-treated-as"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "img": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "img"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><img></p></body></html>",
    +        "noQuirksBodyHtml": "<p><img></p>"
    +      }
    +    },
    +    {
    +      "data": "<a><table><a></table><p><a><div><a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,13): unexpected-start-tag-implies-table-voodoo",
    +        "(1,13): unexpected-start-tag-implies-end-tag",
    +        "(1,13): adoption-agency-1.3",
    +        "(1,27): unexpected-start-tag-implies-end-tag",
    +        "(1,27): adoption-agency-1.2",
    +        "(1,32): unexpected-end-tag",
    +        "(1,35): unexpected-start-tag-implies-end-tag",
    +        "(1,35): adoption-agency-1.2",
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "table": true,
    +            "p": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      },
    +                      {
    +                        "tag": "table"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a><a></a><table></table></a><p><a></a></p><div><a></a></div></body></html>",
    +        "noQuirksBodyHtml": "<a><a></a><table></table></a><p><a></a></p><div><a></a></div>"
    +      }
    +    },
    +    {
    +      "data": "<head></p><meta><p>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,10): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "meta": true,
    +            "body": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "meta"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><meta></head><body><p></p></body></html>",
    +        "noQuirksBodyHtml": "<p></p><meta><p></p>"
    +      }
    +    },
    +    {
    +      "data": "<head></html><meta><p>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,19): expected-eof-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "meta": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "meta"
    +                  },
    +                  {
    +                    "tag": "p"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><meta><p></p></body></html>",
    +        "noQuirksBodyHtml": "<meta><p></p>"
    +      }
    +    },
    +    {
    +      "data": "<b><table><td><i></table>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-cell-in-table-body",
    +        "(1,25): unexpected-cell-end-tag",
    +        "(1,25): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "i": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "tag": "i"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><table><tbody><tr><td><i></i></td></tr></tbody></table></b></body></html>",
    +        "noQuirksBodyHtml": "<b><table><tbody><tr><td><i></i></td></tr></tbody></table></b>"
    +      }
    +    },
    +    {
    +      "data": "<b><table><td></b><i></table>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-cell-in-table-body",
    +        "(1,18): unexpected-end-tag",
    +        "(1,29): unexpected-cell-end-tag",
    +        "(1,29): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "i": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "tag": "i"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><table><tbody><tr><td><i></i></td></tr></tbody></table></b></body></html>",
    +        "noQuirksBodyHtml": "<b><table><tbody><tr><td><i></i></td></tr></tbody></table></b>"
    +      }
    +    },
    +    {
    +      "data": "<h1><h2>",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-start-tag",
    +        "(1,8): unexpected-start-tag",
    +        "(1,8): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "h1": true,
    +            "h2": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "h1"
    +                  },
    +                  {
    +                    "tag": "h2"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><h1></h1><h2></h2></body></html>",
    +        "noQuirksBodyHtml": "<h1></h1><h2></h2>"
    +      }
    +    },
    +    {
    +      "data": "<a><p><a></a></p></a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,9): unexpected-start-tag-implies-end-tag",
    +        "(1,9): adoption-agency-1.3",
    +        "(1,21): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      },
    +                      {
    +                        "tag": "a"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a></a><p><a></a><a></a></p></body></html>",
    +        "noQuirksBodyHtml": "<a></a><p><a></a><a></a></p>"
    +      }
    +    },
    +    {
    +      "data": "<b><button></b></button></b>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,15): adoption-agency-1.3",
    +        "(1,28): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "button": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "button",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b></b><button><b></b></button></body></html>",
    +        "noQuirksBodyHtml": "<b></b><button><b></b></button>"
    +      }
    +    },
    +    {
    +      "data": "<p><b><div><marquee></p></b></div>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-end-tag",
    +        "(1,24): unexpected-end-tag",
    +        "(1,28): unexpected-end-tag",
    +        "(1,34): end-tag-too-early",
    +        "(1,34): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "b": true,
    +            "div": true,
    +            "marquee": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "marquee",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><b></b></p><div><b><marquee><p></p></marquee></b></div></body></html>",
    +        "noQuirksBodyHtml": "<p><b></b></p><div><b><marquee><p></p></marquee></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<script></script></div><title></title><p><p>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,23): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "title": true,
    +            "body": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script"
    +                  },
    +                  {
    +                    "tag": "title"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "p"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></script><title></title></head><body><p></p><p></p></body></html>",
    +        "noQuirksBodyHtml": "<script></script><title></title><p></p><p></p>"
    +      }
    +    },
    +    {
    +      "data": "<p><hr></p>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "hr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "hr"
    +                  },
    +                  {
    +                    "tag": "p"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p></p><hr><p></p></body></html>",
    +        "noQuirksBodyHtml": "<p></p><hr><p></p>"
    +      }
    +    },
    +    {
    +      "data": "<select><b><option><select><option></b></select>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-start-tag-in-select",
    +        "(1,27): unexpected-select-in-select",
    +        "(1,39): unexpected-end-tag",
    +        "(1,48): unexpected-end-tag",
    +        "(1,48): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "option"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><option></option></select><option></option></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option></select><option></option>"
    +      }
    +    },
    +    {
    +      "data": "<html><head><title></title><body></body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title></title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title></title>"
    +      }
    +    },
    +    {
    +      "data": "<a><table><td><a><table></table><a></tr><a></table><a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-cell-in-table-body",
    +        "(1,35): unexpected-start-tag-implies-end-tag",
    +        "(1,40): unexpected-cell-end-tag",
    +        "(1,43): unexpected-start-tag-implies-table-voodoo",
    +        "(1,43): unexpected-start-tag-implies-end-tag",
    +        "(1,43): unexpected-end-tag",
    +        "(1,54): unexpected-start-tag-implies-end-tag",
    +        "(1,54): adoption-agency-1.2",
    +        "(1,54): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      },
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "tag": "a",
    +                                        "children": [
    +                                          {
    +                                            "tag": "table"
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "a"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a><a></a><table><tbody><tr><td><a><table></table></a><a></a></td></tr></tbody></table></a><a></a></body></html>",
    +        "noQuirksBodyHtml": "<a><a></a><table><tbody><tr><td><a><table></table></a><a></a></td></tr></tbody></table></a><a></a>"
    +      }
    +    },
    +    {
    +      "data": "<ul><li></li><div><li></div><li><li><div><li><address><li><b><em></b><li></ul>",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-start-tag",
    +        "(1,45): end-tag-too-early",
    +        "(1,58): end-tag-too-early",
    +        "(1,69): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ul": true,
    +            "li": true,
    +            "div": true,
    +            "address": true,
    +            "b": true,
    +            "em": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ul",
    +                    "children": [
    +                      {
    +                        "tag": "li"
    +                      },
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "li"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "li"
    +                      },
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "tag": "address"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "tag": "em"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "li"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ul><li></li><div><li></li></div><li></li><li><div></div></li><li><address></address></li><li><b><em></em></b></li><li></li></ul></body></html>",
    +        "noQuirksBodyHtml": "<ul><li></li><div><li></li></div><li></li><li><div></div></li><li><address></address></li><li><b><em></em></b></li><li></li></ul>"
    +      }
    +    },
    +    {
    +      "data": "<ul><li><ul></li><li>a</li></ul></li></ul>",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-start-tag",
    +        "(1,17): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ul": true,
    +            "li": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ul",
    +                    "children": [
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "tag": "ul",
    +                            "children": [
    +                              {
    +                                "tag": "li",
    +                                "children": [
    +                                  {
    +                                    "text": "a"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ul><li><ul><li>a</li></ul></li></ul></body></html>",
    +        "noQuirksBodyHtml": "<ul><li><ul><li>a</li></ul></li></ul>"
    +      }
    +    },
    +    {
    +      "data": "<frameset><frame><frameset><frame></frameset><noframes></noframes></frameset>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "frame": true,
    +            "noframes": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "tag": "frame"
    +                  },
    +                  {
    +                    "tag": "frameset",
    +                    "children": [
    +                      {
    +                        "tag": "frame"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "noframes"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset><frame><frameset><frame></frameset><noframes></noframes></frameset></html>",
    +        "noQuirksBodyHtml": "<noframes></noframes>"
    +      }
    +    },
    +    {
    +      "data": "<h1><table><td><h3></table><h3></h1>",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-start-tag",
    +        "(1,15): unexpected-cell-in-table-body",
    +        "(1,27): unexpected-cell-end-tag",
    +        "(1,31): unexpected-start-tag",
    +        "(1,36): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "h1": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "h3": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "h1",
    +                    "children": [
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "tag": "h3"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "h3"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><h1><table><tbody><tr><td><h3></h3></td></tr></tbody></table></h1><h3></h3></body></html>",
    +        "noQuirksBodyHtml": "<h1><table><tbody><tr><td><h3></h3></td></tr></tbody></table></h1><h3></h3>"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup><col><colgroup><col><col><col><colgroup><col><col><thead><tr><td></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true,
    +            "col": true,
    +            "thead": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          },
    +                          {
    +                            "tag": "col"
    +                          },
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          },
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "thead",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup><col></colgroup><colgroup><col><col><col></colgroup><colgroup><col><col></colgroup><thead><tr><td></td></tr></thead></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup><col></colgroup><colgroup><col><col><col></colgroup><colgroup><col><col></colgroup><thead><tr><td></td></tr></thead></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><col><tbody><col><tr><col><td><col></table><col>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,37): unexpected-cell-in-table-body",
    +        "(1,55): unexpected-start-tag-ignored"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true,
    +            "col": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "tbody"
    +                      },
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "colgroup",
    +                        "children": [
    +                          {
    +                            "tag": "col"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup><col></colgroup><tbody></tbody><colgroup><col></colgroup><tbody><tr></tr></tbody><colgroup><col></colgroup><tbody><tr><td></td></tr></tbody><colgroup><col></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup><col></colgroup><tbody></tbody><colgroup><col></colgroup><tbody><tr></tr></tbody><colgroup><col></colgroup><tbody><tr><td></td></tr></tbody><colgroup><col></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup><tbody><colgroup><tr><colgroup><td><colgroup></table><colgroup>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,52): unexpected-cell-in-table-body",
    +        "(1,80): unexpected-start-tag-ignored"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup"
    +                      },
    +                      {
    +                        "tag": "tbody"
    +                      },
    +                      {
    +                        "tag": "colgroup"
    +                      },
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "colgroup"
    +                      },
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "colgroup"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup></colgroup><tbody></tbody><colgroup></colgroup><tbody><tr></tr></tbody><colgroup></colgroup><tbody><tr><td></td></tr></tbody><colgroup></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup></colgroup><tbody></tbody><colgroup></colgroup><tbody><tr></tr></tbody><colgroup></colgroup><tbody><tr><td></td></tr></tbody><colgroup></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "</strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea>",
    +      "errors": [
    +        "(1,9): expected-doctype-but-got-end-tag",
    +        "(1,9): unexpected-end-tag-before-html",
    +        "(1,13): unexpected-end-tag-before-html",
    +        "(1,18): unexpected-end-tag-before-html",
    +        "(1,22): unexpected-end-tag-before-html",
    +        "(1,26): unexpected-end-tag-before-html",
    +        "(1,35): unexpected-end-tag-before-html",
    +        "(1,39): unexpected-end-tag-before-html",
    +        "(1,47): unexpected-end-tag-before-html",
    +        "(1,52): unexpected-end-tag-before-html",
    +        "(1,58): unexpected-end-tag-before-html",
    +        "(1,64): unexpected-end-tag-before-html",
    +        "(1,72): unexpected-end-tag-before-html",
    +        "(1,79): unexpected-end-tag-before-html",
    +        "(1,88): unexpected-end-tag-before-html",
    +        "(1,93): unexpected-end-tag-before-html",
    +        "(1,98): unexpected-end-tag-before-html",
    +        "(1,103): unexpected-end-tag-before-html",
    +        "(1,108): unexpected-end-tag-before-html",
    +        "(1,113): unexpected-end-tag-before-html",
    +        "(1,118): unexpected-end-tag-before-html",
    +        "(1,130): unexpected-end-tag-after-body",
    +        "(1,130): unexpected-end-tag-treated-as",
    +        "(1,134): unexpected-end-tag",
    +        "(1,140): unexpected-end-tag",
    +        "(1,148): unexpected-end-tag",
    +        "(1,155): unexpected-end-tag",
    +        "(1,163): unexpected-end-tag",
    +        "(1,172): unexpected-end-tag",
    +        "(1,180): unexpected-end-tag",
    +        "(1,185): unexpected-end-tag",
    +        "(1,190): unexpected-end-tag",
    +        "(1,195): unexpected-end-tag",
    +        "(1,203): unexpected-end-tag",
    +        "(1,210): unexpected-end-tag",
    +        "(1,217): unexpected-end-tag",
    +        "(1,225): unexpected-end-tag",
    +        "(1,230): unexpected-end-tag",
    +        "(1,238): unexpected-end-tag",
    +        "(1,244): unexpected-end-tag",
    +        "(1,251): unexpected-end-tag",
    +        "(1,258): unexpected-end-tag",
    +        "(1,269): unexpected-end-tag",
    +        "(1,279): unexpected-end-tag",
    +        "(1,287): unexpected-end-tag",
    +        "(1,296): unexpected-end-tag",
    +        "(1,300): unexpected-end-tag",
    +        "(1,305): unexpected-end-tag",
    +        "(1,310): unexpected-end-tag",
    +        "(1,320): unexpected-end-tag",
    +        "(1,331): unexpected-end-tag",
    +        "(1,339): unexpected-end-tag",
    +        "(1,347): unexpected-end-tag",
    +        "(1,355): unexpected-end-tag",
    +        "(1,365): end-tag-too-early",
    +        "(1,378): end-tag-too-early",
    +        "(1,387): end-tag-too-early",
    +        "(1,393): end-tag-too-early",
    +        "(1,399): end-tag-too-early",
    +        "(1,404): end-tag-too-early",
    +        "(1,415): end-tag-too-early",
    +        "(1,425): end-tag-too-early",
    +        "(1,432): end-tag-too-early",
    +        "(1,437): end-tag-too-early",
    +        "(1,442): end-tag-too-early",
    +        "(1,447): unexpected-end-tag",
    +        "(1,454): unexpected-end-tag",
    +        "(1,460): unexpected-end-tag",
    +        "(1,467): unexpected-end-tag",
    +        "(1,476): end-tag-too-early",
    +        "(1,486): end-tag-too-early",
    +        "(1,495): end-tag-too-early",
    +        "(1,513): expected-eof-but-got-end-tag",
    +        "(1,513): unexpected-end-tag",
    +        "(1,520): unexpected-end-tag",
    +        "(1,529): unexpected-end-tag",
    +        "(1,537): unexpected-end-tag",
    +        "(1,547): unexpected-end-tag",
    +        "(1,557): unexpected-end-tag",
    +        "(1,568): unexpected-end-tag",
    +        "(1,579): unexpected-end-tag",
    +        "(1,590): unexpected-end-tag",
    +        "(1,599): unexpected-end-tag",
    +        "(1,611): unexpected-end-tag",
    +        "(1,622): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "br": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "br"
    +                  },
    +                  {
    +                    "tag": "p"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><br><p></p></body></html>",
    +        "noQuirksBodyHtml": "<br><p></p>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr></strong></b></em></i></u></strike></s></blink></tt></pre></big></small></font></select></h1></h2></h3></h4></h5></h6></body></br></a></img></title></span></style></script></table></th></td></tr></frame></area></link></param></hr></input></col></base></meta></basefont></bgsound></embed></spacer></p></dd></dt></caption></colgroup></tbody></tfoot></thead></address></blockquote></center></dir></div></dl></fieldset></listing></menu></ol></ul></li></nobr></wbr></form></button></marquee></object></html></frameset></head></iframe></image></isindex></noembed></noframes></noscript></optgroup></option></plaintext></textarea>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,20): unexpected-end-tag-implies-table-voodoo",
    +        "(1,20): unexpected-end-tag",
    +        "(1,24): unexpected-end-tag-implies-table-voodoo",
    +        "(1,24): unexpected-end-tag",
    +        "(1,29): unexpected-end-tag-implies-table-voodoo",
    +        "(1,29): unexpected-end-tag",
    +        "(1,33): unexpected-end-tag-implies-table-voodoo",
    +        "(1,33): unexpected-end-tag",
    +        "(1,37): unexpected-end-tag-implies-table-voodoo",
    +        "(1,37): unexpected-end-tag",
    +        "(1,46): unexpected-end-tag-implies-table-voodoo",
    +        "(1,46): unexpected-end-tag",
    +        "(1,50): unexpected-end-tag-implies-table-voodoo",
    +        "(1,50): unexpected-end-tag",
    +        "(1,58): unexpected-end-tag-implies-table-voodoo",
    +        "(1,58): unexpected-end-tag",
    +        "(1,63): unexpected-end-tag-implies-table-voodoo",
    +        "(1,63): unexpected-end-tag",
    +        "(1,69): unexpected-end-tag-implies-table-voodoo",
    +        "(1,69): end-tag-too-early",
    +        "(1,75): unexpected-end-tag-implies-table-voodoo",
    +        "(1,75): unexpected-end-tag",
    +        "(1,83): unexpected-end-tag-implies-table-voodoo",
    +        "(1,83): unexpected-end-tag",
    +        "(1,90): unexpected-end-tag-implies-table-voodoo",
    +        "(1,90): unexpected-end-tag",
    +        "(1,99): unexpected-end-tag-implies-table-voodoo",
    +        "(1,99): unexpected-end-tag",
    +        "(1,104): unexpected-end-tag-implies-table-voodoo",
    +        "(1,104): end-tag-too-early",
    +        "(1,109): unexpected-end-tag-implies-table-voodoo",
    +        "(1,109): end-tag-too-early",
    +        "(1,114): unexpected-end-tag-implies-table-voodoo",
    +        "(1,114): end-tag-too-early",
    +        "(1,119): unexpected-end-tag-implies-table-voodoo",
    +        "(1,119): end-tag-too-early",
    +        "(1,124): unexpected-end-tag-implies-table-voodoo",
    +        "(1,124): end-tag-too-early",
    +        "(1,129): unexpected-end-tag-implies-table-voodoo",
    +        "(1,129): end-tag-too-early",
    +        "(1,136): unexpected-end-tag-in-table-row",
    +        "(1,141): unexpected-end-tag-implies-table-voodoo",
    +        "(1,141): unexpected-end-tag-treated-as",
    +        "(1,145): unexpected-end-tag-implies-table-voodoo",
    +        "(1,145): unexpected-end-tag",
    +        "(1,151): unexpected-end-tag-implies-table-voodoo",
    +        "(1,151): unexpected-end-tag",
    +        "(1,159): unexpected-end-tag-implies-table-voodoo",
    +        "(1,159): unexpected-end-tag",
    +        "(1,166): unexpected-end-tag-implies-table-voodoo",
    +        "(1,166): unexpected-end-tag",
    +        "(1,174): unexpected-end-tag-implies-table-voodoo",
    +        "(1,174): unexpected-end-tag",
    +        "(1,183): unexpected-end-tag-implies-table-voodoo",
    +        "(1,183): unexpected-end-tag",
    +        "(1,196): unexpected-end-tag",
    +        "(1,201): unexpected-end-tag",
    +        "(1,206): unexpected-end-tag",
    +        "(1,214): unexpected-end-tag",
    +        "(1,221): unexpected-end-tag",
    +        "(1,228): unexpected-end-tag",
    +        "(1,236): unexpected-end-tag",
    +        "(1,241): unexpected-end-tag",
    +        "(1,249): unexpected-end-tag",
    +        "(1,255): unexpected-end-tag",
    +        "(1,262): unexpected-end-tag",
    +        "(1,269): unexpected-end-tag",
    +        "(1,280): unexpected-end-tag",
    +        "(1,290): unexpected-end-tag",
    +        "(1,298): unexpected-end-tag",
    +        "(1,307): unexpected-end-tag",
    +        "(1,311): unexpected-end-tag",
    +        "(1,316): unexpected-end-tag",
    +        "(1,321): unexpected-end-tag",
    +        "(1,331): unexpected-end-tag",
    +        "(1,342): unexpected-end-tag",
    +        "(1,350): unexpected-end-tag",
    +        "(1,358): unexpected-end-tag",
    +        "(1,366): unexpected-end-tag",
    +        "(1,376): end-tag-too-early",
    +        "(1,389): end-tag-too-early",
    +        "(1,398): end-tag-too-early",
    +        "(1,404): end-tag-too-early",
    +        "(1,410): end-tag-too-early",
    +        "(1,415): end-tag-too-early",
    +        "(1,426): end-tag-too-early",
    +        "(1,436): end-tag-too-early",
    +        "(1,443): end-tag-too-early",
    +        "(1,448): end-tag-too-early",
    +        "(1,453): end-tag-too-early",
    +        "(1,458): unexpected-end-tag",
    +        "(1,465): unexpected-end-tag",
    +        "(1,471): unexpected-end-tag",
    +        "(1,478): unexpected-end-tag",
    +        "(1,487): end-tag-too-early",
    +        "(1,497): end-tag-too-early",
    +        "(1,506): end-tag-too-early",
    +        "(1,524): expected-eof-but-got-end-tag",
    +        "(1,524): unexpected-end-tag",
    +        "(1,531): unexpected-end-tag",
    +        "(1,540): unexpected-end-tag",
    +        "(1,548): unexpected-end-tag",
    +        "(1,558): unexpected-end-tag",
    +        "(1,568): unexpected-end-tag",
    +        "(1,579): unexpected-end-tag",
    +        "(1,590): unexpected-end-tag",
    +        "(1,601): unexpected-end-tag",
    +        "(1,610): unexpected-end-tag",
    +        "(1,622): unexpected-end-tag",
    +        "(1,633): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "br": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "br"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><br><table><tbody><tr></tr></tbody></table><p></p></body></html>",
    +        "noQuirksBodyHtml": "<br><table><tbody><tr></tr></tbody></table><p></p>"
    +      }
    +    },
    +    {
    +      "data": "<frameset>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,10): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    }
    +  ],
    +  "tests10.dat": [
    +    {
    +      "data": "<!DOCTYPE html><svg></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><svg></svg><![CDATA[a]]>",
    +      "errors": [
    +        "(1,28) expected-dashes-or-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  },
    +                  {
    +                    "comment": "[CDATA[a]]"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg></svg><!--[CDATA[a]]--></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg><!--[CDATA[a]]-->"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><svg></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><select><svg></svg></select>",
    +      "errors": [
    +        "(1,34) unexpected-start-tag-in-select",
    +        "(1,40) unexpected-end-tag-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><select><option><svg></svg></option></select>",
    +      "errors": [
    +        "(1,42) unexpected-start-tag-in-select",
    +        "(1,48) unexpected-end-tag-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><option></option></select></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option></select>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><svg></svg></table>",
    +      "errors": [
    +        "(1,33) foster-parenting-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg></svg><table></table></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><svg><g>foo</g></svg></table>",
    +      "errors": [
    +        "(1,33) foster-parenting-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g></svg><table></table></body></html>",
    +        "noQuirksBodyHtml": "<svg><g>foo</g></svg><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><svg><g>foo</g><g>bar</g></svg></table>",
    +      "errors": [
    +        "(1,33) foster-parenting-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><table></table></body></html>",
    +        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g></svg><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tbody><svg><g>foo</g><g>bar</g></svg></tbody></table>",
    +      "errors": [
    +        "(1,40) foster-parenting-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "table": true,
    +            "tbody": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><table><tbody></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g></svg><table><tbody></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tbody><tr><svg><g>foo</g><g>bar</g></svg></tr></tbody></table>",
    +      "errors": [
    +        "(1,44) foster-parenting-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g></svg><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "svg svg": true,
    +            "svg g": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "svg",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "g",
    +                                        "ns": "http://www.w3.org/2000/svg",
    +                                        "children": [
    +                                          {
    +                                            "text": "foo"
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "g",
    +                                        "ns": "http://www.w3.org/2000/svg",
    +                                        "children": [
    +                                          {
    +                                            "text": "bar"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</td></tr></tbody></table>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "svg",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "g",
    +                                        "ns": "http://www.w3.org/2000/svg",
    +                                        "children": [
    +                                          {
    +                                            "text": "foo"
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "g",
    +                                        "ns": "http://www.w3.org/2000/svg",
    +                                        "children": [
    +                                          {
    +                                            "text": "bar"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "tag": "p",
    +                                    "children": [
    +                                      {
    +                                        "text": "baz"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</p></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><g>foo</g><g>bar</g></svg><p>baz</p></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</caption></table>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "g",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "text": "foo"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "g",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "text": "bar"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "text": "baz"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</p></caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</p></caption></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g><p>baz</table><p>quux",
    +      "errors": [
    +        "(1,65) unexpected-html-element-in-foreign-content"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "g",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "text": "foo"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "g",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "text": "bar"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "text": "baz"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><svg><g>foo</g><g>bar</g></svg><p>baz</p></caption></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><svg><g>foo</g><g>bar</g><p>baz</p></svg></caption></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><caption><svg><g>foo</g><g>bar</g>baz</table><p>quux",
    +      "errors": [
    +        "(1,73) unexpected-end-tag",
    +        "(1,73) expected-one-end-tag-but-got-another"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "g",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "text": "foo"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "g",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "text": "bar"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "text": "baz"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><svg><g>foo</g><g>bar</g>baz</svg></caption></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><svg><g>foo</g><g>bar</g>baz</svg></caption></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><colgroup><svg><g>foo</g><g>bar</g><p>baz</table><p>quux",
    +      "errors": [
    +        "(1,43) foster-parenting-start-tag svg",
    +        "(1,66) unexpected HTML-like start tag token in foreign content",
    +        "(1,66) foster-parenting-start-tag",
    +        "(1,67) foster-parenting-character",
    +        "(1,68) foster-parenting-character",
    +        "(1,69) foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "p": true,
    +            "table": true,
    +            "colgroup": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "baz"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><p>baz</p><table><colgroup></colgroup></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g><p>baz</p></svg><table><colgroup></colgroup></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tr><td><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux",
    +      "errors": [
    +        "(1,49) unexpected-start-tag-in-select",
    +        "(1,52) unexpected-start-tag-in-select",
    +        "(1,59) unexpected-end-tag-in-select",
    +        "(1,62) unexpected-start-tag-in-select",
    +        "(1,69) unexpected-end-tag-in-select",
    +        "(1,72) unexpected-start-tag-in-select",
    +        "(1,83) unexpected-table-element-end-tag-in-select-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "select": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "select",
    +                                    "children": [
    +                                      {
    +                                        "text": "foobarbaz"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><select>foobarbaz</select></td></tr></tbody></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><select>foobarbaz</select></td></tr></tbody></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><select><svg><g>foo</g><g>bar</g><p>baz</table><p>quux",
    +      "errors": [
    +        "(1,36) unexpected-start-tag-implies-table-voodoo",
    +        "(1,41) unexpected-start-tag-in-select",
    +        "(1,44) unexpected-start-tag-in-select",
    +        "(1,51) unexpected-end-tag-in-select",
    +        "(1,54) unexpected-start-tag-in-select",
    +        "(1,61) unexpected-end-tag-in-select",
    +        "(1,64) unexpected-start-tag-in-select",
    +        "(1,75) unexpected-table-element-end-tag-in-select-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "table": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "text": "foobarbaz"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select>foobarbaz</select><table></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<select>foobarbaz</select><table></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body></body></html><svg><g>foo</g><g>bar</g><p>baz",
    +      "errors": [
    +        "(1,40) expected-eof-but-got-start-tag",
    +        "(1,63) unexpected-html-element-in-foreign-content"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "baz"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><p>baz</p></body></html>",
    +        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g><p>baz</p></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body></body><svg><g>foo</g><g>bar</g><p>baz",
    +      "errors": [
    +        "(1,33) unexpected-start-tag-after-body",
    +        "(1,56) unexpected-html-element-in-foreign-content"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "baz"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><g>foo</g><g>bar</g></svg><p>baz</p></body></html>",
    +        "noQuirksBodyHtml": "<svg><g>foo</g><g>bar</g><p>baz</p></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><frameset><svg><g></g><g></g><p><span>",
    +      "errors": [
    +        "(1,30) unexpected-start-tag-in-frameset",
    +        "(1,33) unexpected-start-tag-in-frameset",
    +        "(1,37) unexpected-end-tag-in-frameset",
    +        "(1,40) unexpected-start-tag-in-frameset",
    +        "(1,44) unexpected-end-tag-in-frameset",
    +        "(1,47) unexpected-start-tag-in-frameset",
    +        "(1,53) unexpected-start-tag-in-frameset",
    +        "(1,53) eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<svg><g></g><g></g><p><span></span></p></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><frameset></frameset><svg><g></g><g></g><p><span>",
    +      "errors": [
    +        "(1,41) unexpected-start-tag-after-frameset",
    +        "(1,44) unexpected-start-tag-after-frameset",
    +        "(1,48) unexpected-end-tag-after-frameset",
    +        "(1,51) unexpected-start-tag-after-frameset",
    +        "(1,55) unexpected-end-tag-after-frameset",
    +        "(1,58) unexpected-start-tag-after-frameset",
    +        "(1,64) unexpected-start-tag-after-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<svg><g></g><g></g><p><span></span></p></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body xlink:href=foo><svg xlink:href=foo></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "xlink:href",
    +                    "value": "foo"
    +                  }
    +                ],
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "ns": "http://www.w3.org/1999/xlink",
    +                        "value": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\"><svg xlink:href=\"foo\"></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg xlink:href=\"foo\"></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo></g></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "xlink:href",
    +                    "value": "foo"
    +                  },
    +                  {
    +                    "name": "xml:lang",
    +                    "value": "en"
    +                  }
    +                ],
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "ns": "http://www.w3.org/1999/xlink",
    +                            "value": "foo"
    +                          },
    +                          {
    +                            "name": "lang",
    +                            "ns": "http://www.w3.org/XML/1998/namespace",
    +                            "value": "en"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><svg><g xml:lang=\"en\" xlink:href=\"foo\"></g></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><g xml:lang=\"en\" xlink:href=\"foo\"></g></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo /></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "xlink:href",
    +                    "value": "foo"
    +                  },
    +                  {
    +                    "name": "xml:lang",
    +                    "value": "en"
    +                  }
    +                ],
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "ns": "http://www.w3.org/1999/xlink",
    +                            "value": "foo"
    +                          },
    +                          {
    +                            "name": "lang",
    +                            "ns": "http://www.w3.org/XML/1998/namespace",
    +                            "value": "en"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><svg><g xml:lang=\"en\" xlink:href=\"foo\"></g></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><g xml:lang=\"en\" xlink:href=\"foo\"></g></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><svg><g xml:lang=en xlink:href=foo />bar</svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg g": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "xlink:href",
    +                    "value": "foo"
    +                  },
    +                  {
    +                    "name": "xml:lang",
    +                    "value": "en"
    +                  }
    +                ],
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "g",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "ns": "http://www.w3.org/1999/xlink",
    +                            "value": "foo"
    +                          },
    +                          {
    +                            "name": "lang",
    +                            "ns": "http://www.w3.org/XML/1998/namespace",
    +                            "value": "en"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "bar"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><svg><g xml:lang=\"en\" xlink:href=\"foo\"></g>bar</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><g xml:lang=\"en\" xlink:href=\"foo\"></g>bar</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg></path>",
    +      "errors": [
    +        "(1,5) expected-doctype-but-got-start-tag",
    +        "(1,12) unexpected-end-tag",
    +        "(1,12) unexpected-end-tag",
    +        "(1,12) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg>"
    +      }
    +    },
    +    {
    +      "data": "<div><svg></div>a",
    +      "errors": [
    +        "(1,5) expected-doctype-but-got-start-tag",
    +        "(1,16) unexpected-end-tag",
    +        "(1,16) end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "svg",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "a"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><svg></svg></div>a</body></html>",
    +        "noQuirksBodyHtml": "<div><svg></svg></div>a"
    +      }
    +    },
    +    {
    +      "data": "<div><svg><path></div>a",
    +      "errors": [
    +        "(1,5) expected-doctype-but-got-start-tag",
    +        "(1,22) unexpected-end-tag",
    +        "(1,22) end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "svg svg": true,
    +            "svg path": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "svg",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "path",
    +                            "ns": "http://www.w3.org/2000/svg"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "a"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><svg><path></path></svg></div>a</body></html>",
    +        "noQuirksBodyHtml": "<div><svg><path></path></svg></div>a"
    +      }
    +    },
    +    {
    +      "data": "<div><svg><path></svg><path>",
    +      "errors": [
    +        "(1,5) expected-doctype-but-got-start-tag",
    +        "(1,22) unexpected-end-tag",
    +        "(1,28) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "svg svg": true,
    +            "svg path": true,
    +            "path": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "svg",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "path",
    +                            "ns": "http://www.w3.org/2000/svg"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "path"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><svg><path></path></svg><path></path></div></body></html>",
    +        "noQuirksBodyHtml": "<div><svg><path></path></svg><path></path></div>"
    +      }
    +    },
    +    {
    +      "data": "<div><svg><path><foreignObject><math></div>a",
    +      "errors": [
    +        "(1,5) expected-doctype-but-got-start-tag",
    +        "(1,43) unexpected-end-tag",
    +        "(1,43) end-tag-too-early",
    +        "(1,44) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "svg svg": true,
    +            "svg path": true,
    +            "svg foreignObject": true,
    +            "math math": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "svg",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "path",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "foreignObject",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "math",
    +                                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                                    "children": [
    +                                      {
    +                                        "text": "a"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><svg><path><foreignObject><math>a</math></foreignObject></path></svg></div></body></html>",
    +        "noQuirksBodyHtml": "<div><svg><path><foreignObject><math>a</math></foreignObject></path></svg></div>"
    +      }
    +    },
    +    {
    +      "data": "<div><svg><path><foreignObject><p></div>a",
    +      "errors": [
    +        "(1,5) expected-doctype-but-got-start-tag",
    +        "(1,40) end-tag-too-early",
    +        "(1,41) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "svg svg": true,
    +            "svg path": true,
    +            "svg foreignObject": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "svg",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "path",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "foreignObject",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "p",
    +                                    "children": [
    +                                      {
    +                                        "text": "a"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><svg><path><foreignObject><p>a</p></foreignObject></path></svg></div></body></html>",
    +        "noQuirksBodyHtml": "<div><svg><path><foreignObject><p>a</p></foreignObject></path></svg></div>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><svg><desc><div><svg><ul>a",
    +      "errors": [
    +        "(1,40) unexpected-html-element-in-foreign-content",
    +        "(1,41) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg desc": true,
    +            "div": true,
    +            "ul": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "desc",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "tag": "svg",
    +                                "ns": "http://www.w3.org/2000/svg"
    +                              },
    +                              {
    +                                "tag": "ul",
    +                                "children": [
    +                                  {
    +                                    "text": "a"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><desc><div><svg></svg><ul>a</ul></div></desc></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><desc><div><svg><ul>a</ul></svg></div></desc></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><svg><desc><svg><ul>a",
    +      "errors": [
    +        "(1,35) unexpected-html-element-in-foreign-content",
    +        "(1,36) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg desc": true,
    +            "ul": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "desc",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg"
    +                          },
    +                          {
    +                            "tag": "ul",
    +                            "children": [
    +                              {
    +                                "text": "a"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><desc><svg></svg><ul>a</ul></desc></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><desc><svg><ul>a</ul></svg></desc></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><p><svg><desc><p>",
    +      "errors": [
    +        "(1,32) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "svg svg": true,
    +            "svg desc": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "svg",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "desc",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><svg><desc><p></p></desc></svg></p></body></html>",
    +        "noQuirksBodyHtml": "<p><svg><desc><p></p></desc></svg></p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><p><svg><title><p>",
    +      "errors": [
    +        "(1,33) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "svg svg": true,
    +            "svg title": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "svg",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "title",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><svg><title><p></p></title></svg></p></body></html>",
    +        "noQuirksBodyHtml": "<p><svg><title><p></p></title></svg></p>"
    +      }
    +    },
    +    {
    +      "data": "<div><svg><path><foreignObject><p></foreignObject><p>",
    +      "errors": [
    +        "(1,5) expected-doctype-but-got-start-tag",
    +        "(1,50) unexpected-end-tag",
    +        "(1,53) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "svg svg": true,
    +            "svg path": true,
    +            "svg foreignObject": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "svg",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "path",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "foreignObject",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "p"
    +                                  },
    +                                  {
    +                                    "tag": "p"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><svg><path><foreignObject><p></p><p></p></foreignObject></path></svg></div></body></html>",
    +        "noQuirksBodyHtml": "<div><svg><path><foreignObject><p></p><p></p></foreignObject></path></svg></div>"
    +      }
    +    },
    +    {
    +      "data": "<math><mi><div><object><div><span></span></div></object></div></mi><mi>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,71) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "div": true,
    +            "object": true,
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "tag": "object",
    +                                "children": [
    +                                  {
    +                                    "tag": "div",
    +                                    "children": [
    +                                      {
    +                                        "tag": "span"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mi><div><object><div><span></span></div></object></div></mi><mi></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mi><div><object><div><span></span></div></object></div></mi><mi></mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,83) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "svg svg": true,
    +            "svg foreignObject": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "foreignObject",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "div",
    +                                    "children": [
    +                                      {
    +                                        "tag": "div"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mi><svg><foreignObject><div><div></div></div></foreignObject></svg></mi><mi></mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<svg><script></script><path>",
    +      "errors": [
    +        "(1,5) expected-doctype-but-got-start-tag",
    +        "(1,28) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg script": true,
    +            "svg path": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "script",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "path",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><script></script><path></path></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><script></script><path></path></svg>"
    +      }
    +    },
    +    {
    +      "data": "<table><svg></svg><tr>",
    +      "errors": [
    +        "(1,7) expected-doctype-but-got-start-tag",
    +        "(1,12) unexpected-start-tag-implies-table-voodoo",
    +        "(1,22) eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg></svg><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<math><mi><mglyph>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,18) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "math mglyph": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mglyph",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mi><mglyph></mglyph></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mi><mglyph></mglyph></mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><mi><malignmark>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,22) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "malignmark",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mi><malignmark></malignmark></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mi><malignmark></malignmark></mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><mo><mglyph>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,18) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mo": true,
    +            "math mglyph": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mo",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mglyph",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mo><mglyph></mglyph></mo></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mo><mglyph></mglyph></mo></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><mo><malignmark>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,22) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mo": true,
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mo",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "malignmark",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mo><malignmark></malignmark></mo></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mo><malignmark></malignmark></mo></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><mn><mglyph>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,18) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mn": true,
    +            "math mglyph": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mn",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mglyph",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mn><mglyph></mglyph></mn></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mn><mglyph></mglyph></mn></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><mn><malignmark>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,22) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mn": true,
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mn",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "malignmark",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mn><malignmark></malignmark></mn></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mn><malignmark></malignmark></mn></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><ms><mglyph>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,18) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math ms": true,
    +            "math mglyph": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "ms",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mglyph",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><ms><mglyph></mglyph></ms></math></body></html>",
    +        "noQuirksBodyHtml": "<math><ms><mglyph></mglyph></ms></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><ms><malignmark>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,22) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math ms": true,
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "ms",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "malignmark",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><ms><malignmark></malignmark></ms></math></body></html>",
    +        "noQuirksBodyHtml": "<math><ms><malignmark></malignmark></ms></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><mtext><mglyph>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,21) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mtext": true,
    +            "math mglyph": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mtext",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mglyph",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mtext><mglyph></mglyph></mtext></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mtext><mglyph></mglyph></mtext></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><mtext><malignmark>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,25) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mtext": true,
    +            "math malignmark": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mtext",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "malignmark",
    +                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mtext><malignmark></malignmark></mtext></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mtext><malignmark></malignmark></mtext></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml><svg></svg></annotation-xml><mi>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,54) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "svg svg": true,
    +            "math mi": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml><svg></svg></annotation-xml><mi></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml><svg></svg></annotation-xml><mi></mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,144) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "svg svg": true,
    +            "svg foreignObject": true,
    +            "div": true,
    +            "math mi": true,
    +            "span": true,
    +            "svg path": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "foreignObject",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "div",
    +                                    "children": [
    +                                      {
    +                                        "tag": "math",
    +                                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                                        "children": [
    +                                          {
    +                                            "tag": "mi",
    +                                            "ns": "http://www.w3.org/1998/Math/MathML"
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "span"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "path",
    +                                "ns": "http://www.w3.org/2000/svg"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml><svg><foreignObject><div><math><mi></mi></math><span></span></div></foreignObject><path></path></svg></annotation-xml><mi></mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi>",
    +      "errors": [
    +        "(1,6) expected-doctype-but-got-start-tag",
    +        "(1,153) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "svg svg": true,
    +            "svg foreignObject": true,
    +            "math mi": true,
    +            "math mo": true,
    +            "span": true,
    +            "svg path": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "foreignObject",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "math",
    +                                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                                    "children": [
    +                                      {
    +                                        "tag": "mi",
    +                                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                                        "children": [
    +                                          {
    +                                            "tag": "svg",
    +                                            "ns": "http://www.w3.org/2000/svg"
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "mo",
    +                                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "tag": "span"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "path",
    +                                "ns": "http://www.w3.org/2000/svg"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml><svg><foreignObject><math><mi><svg></svg></mi><mo></mo></math><span></span></foreignObject><path></path></svg></annotation-xml><mi></mi></math>"
    +      }
    +    }
    +  ],
    +  "tests11.dat": [
    +    {
    +      "data": "<!DOCTYPE html><body><svg attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' diffuseConstant='' edgeMode='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "attrs": [
    +                      {
    +                        "name": "attributeName",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "attributeType",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "baseFrequency",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "baseProfile",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "calcMode",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "clipPathUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "diffuseConstant",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "edgeMode",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "filterUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "glyphRef",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "gradientTransform",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "gradientUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "kernelMatrix",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "kernelUnitLength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keyPoints",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keySplines",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keyTimes",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "lengthAdjust",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "limitingConeAngle",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerHeight",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerWidth",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "maskContentUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "maskUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "numOctaves",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pathLength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternContentUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternTransform",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsAtX",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsAtY",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsAtZ",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "preserveAlpha",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "preserveAspectRatio",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "primitiveUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "refX",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "refY",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "repeatCount",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "repeatDur",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "requiredExtensions",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "requiredFeatures",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "specularConstant",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "specularExponent",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "spreadMethod",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "startOffset",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "stdDeviation",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "stitchTiles",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "surfaceScale",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "systemLanguage",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "tableValues",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "targetX",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "targetY",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "textLength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "viewBox",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "viewTarget",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "xChannelSelector",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "yChannelSelector",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "zoomAndPan",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><BODY><SVG ATTRIBUTENAME='' ATTRIBUTETYPE='' BASEFREQUENCY='' BASEPROFILE='' CALCMODE='' CLIPPATHUNITS='' DIFFUSECONSTANT='' EDGEMODE='' FILTERUNITS='' GLYPHREF='' GRADIENTTRANSFORM='' GRADIENTUNITS='' KERNELMATRIX='' KERNELUNITLENGTH='' KEYPOINTS='' KEYSPLINES='' KEYTIMES='' LENGTHADJUST='' LIMITINGCONEANGLE='' MARKERHEIGHT='' MARKERUNITS='' MARKERWIDTH='' MASKCONTENTUNITS='' MASKUNITS='' NUMOCTAVES='' PATHLENGTH='' PATTERNCONTENTUNITS='' PATTERNTRANSFORM='' PATTERNUNITS='' POINTSATX='' POINTSATY='' POINTSATZ='' PRESERVEALPHA='' PRESERVEASPECTRATIO='' PRIMITIVEUNITS='' REFX='' REFY='' REPEATCOUNT='' REPEATDUR='' REQUIREDEXTENSIONS='' REQUIREDFEATURES='' SPECULARCONSTANT='' SPECULAREXPONENT='' SPREADMETHOD='' STARTOFFSET='' STDDEVIATION='' STITCHTILES='' SURFACESCALE='' SYSTEMLANGUAGE='' TABLEVALUES='' TARGETX='' TARGETY='' TEXTLENGTH='' VIEWBOX='' VIEWTARGET='' XCHANNELSELECTOR='' YCHANNELSELECTOR='' ZOOMANDPAN=''></SVG>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "attrs": [
    +                      {
    +                        "name": "attributeName",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "attributeType",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "baseFrequency",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "baseProfile",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "calcMode",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "clipPathUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "diffuseConstant",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "edgeMode",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "filterUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "glyphRef",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "gradientTransform",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "gradientUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "kernelMatrix",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "kernelUnitLength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keyPoints",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keySplines",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keyTimes",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "lengthAdjust",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "limitingConeAngle",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerHeight",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerWidth",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "maskContentUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "maskUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "numOctaves",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pathLength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternContentUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternTransform",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsAtX",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsAtY",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsAtZ",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "preserveAlpha",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "preserveAspectRatio",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "primitiveUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "refX",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "refY",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "repeatCount",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "repeatDur",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "requiredExtensions",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "requiredFeatures",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "specularConstant",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "specularExponent",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "spreadMethod",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "startOffset",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "stdDeviation",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "stitchTiles",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "surfaceScale",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "systemLanguage",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "tableValues",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "targetX",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "targetY",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "textLength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "viewBox",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "viewTarget",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "xChannelSelector",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "yChannelSelector",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "zoomAndPan",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><svg attributename='' attributetype='' basefrequency='' baseprofile='' calcmode='' clippathunits='' diffuseconstant='' edgemode='' filterunits='' filterres='' glyphref='' gradienttransform='' gradientunits='' kernelmatrix='' kernelunitlength='' keypoints='' keysplines='' keytimes='' lengthadjust='' limitingconeangle='' markerheight='' markerunits='' markerwidth='' maskcontentunits='' maskunits='' numoctaves='' pathlength='' patterncontentunits='' patterntransform='' patternunits='' pointsatx='' pointsaty='' pointsatz='' preservealpha='' preserveaspectratio='' primitiveunits='' refx='' refy='' repeatcount='' repeatdur='' requiredextensions='' requiredfeatures='' specularconstant='' specularexponent='' spreadmethod='' startoffset='' stddeviation='' stitchtiles='' surfacescale='' systemlanguage='' tablevalues='' targetx='' targety='' textlength='' viewbox='' viewtarget='' xchannelselector='' ychannelselector='' zoomandpan=''></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "attrs": [
    +                      {
    +                        "name": "attributeName",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "attributeType",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "baseFrequency",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "baseProfile",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "calcMode",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "clipPathUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "diffuseConstant",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "edgeMode",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "filterUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "filterres",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "glyphRef",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "gradientTransform",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "gradientUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "kernelMatrix",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "kernelUnitLength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keyPoints",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keySplines",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keyTimes",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "lengthAdjust",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "limitingConeAngle",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerHeight",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerWidth",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "maskContentUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "maskUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "numOctaves",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pathLength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternContentUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternTransform",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsAtX",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsAtY",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsAtZ",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "preserveAlpha",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "preserveAspectRatio",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "primitiveUnits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "refX",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "refY",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "repeatCount",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "repeatDur",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "requiredExtensions",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "requiredFeatures",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "specularConstant",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "specularExponent",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "spreadMethod",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "startOffset",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "stdDeviation",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "stitchTiles",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "surfaceScale",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "systemLanguage",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "tableValues",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "targetX",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "targetY",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "textLength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "viewBox",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "viewTarget",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "xChannelSelector",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "yChannelSelector",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "zoomAndPan",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" filterres=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg attributeName=\"\" attributeType=\"\" baseFrequency=\"\" baseProfile=\"\" calcMode=\"\" clipPathUnits=\"\" diffuseConstant=\"\" edgeMode=\"\" filterUnits=\"\" filterres=\"\" glyphRef=\"\" gradientTransform=\"\" gradientUnits=\"\" kernelMatrix=\"\" kernelUnitLength=\"\" keyPoints=\"\" keySplines=\"\" keyTimes=\"\" lengthAdjust=\"\" limitingConeAngle=\"\" markerHeight=\"\" markerUnits=\"\" markerWidth=\"\" maskContentUnits=\"\" maskUnits=\"\" numOctaves=\"\" pathLength=\"\" patternContentUnits=\"\" patternTransform=\"\" patternUnits=\"\" pointsAtX=\"\" pointsAtY=\"\" pointsAtZ=\"\" preserveAlpha=\"\" preserveAspectRatio=\"\" primitiveUnits=\"\" refX=\"\" refY=\"\" repeatCount=\"\" repeatDur=\"\" requiredExtensions=\"\" requiredFeatures=\"\" specularConstant=\"\" specularExponent=\"\" spreadMethod=\"\" startOffset=\"\" stdDeviation=\"\" stitchTiles=\"\" surfaceScale=\"\" systemLanguage=\"\" tableValues=\"\" targetX=\"\" targetY=\"\" textLength=\"\" viewBox=\"\" viewTarget=\"\" xChannelSelector=\"\" yChannelSelector=\"\" zoomAndPan=\"\"></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><math attributeName='' attributeType='' baseFrequency='' baseProfile='' calcMode='' clipPathUnits='' diffuseConstant='' edgeMode='' filterUnits='' glyphRef='' gradientTransform='' gradientUnits='' kernelMatrix='' kernelUnitLength='' keyPoints='' keySplines='' keyTimes='' lengthAdjust='' limitingConeAngle='' markerHeight='' markerUnits='' markerWidth='' maskContentUnits='' maskUnits='' numOctaves='' pathLength='' patternContentUnits='' patternTransform='' patternUnits='' pointsAtX='' pointsAtY='' pointsAtZ='' preserveAlpha='' preserveAspectRatio='' primitiveUnits='' refX='' refY='' repeatCount='' repeatDur='' requiredExtensions='' requiredFeatures='' specularConstant='' specularExponent='' spreadMethod='' startOffset='' stdDeviation='' stitchTiles='' surfaceScale='' systemLanguage='' tableValues='' targetX='' targetY='' textLength='' viewBox='' viewTarget='' xChannelSelector='' yChannelSelector='' zoomAndPan=''></math>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "attrs": [
    +                      {
    +                        "name": "attributename",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "attributetype",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "basefrequency",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "baseprofile",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "calcmode",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "clippathunits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "diffuseconstant",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "edgemode",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "filterunits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "glyphref",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "gradienttransform",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "gradientunits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "kernelmatrix",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "kernelunitlength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keypoints",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keysplines",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "keytimes",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "lengthadjust",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "limitingconeangle",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerheight",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerunits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "markerwidth",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "maskcontentunits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "maskunits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "numoctaves",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pathlength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patterncontentunits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patterntransform",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "patternunits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsatx",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsaty",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "pointsatz",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "preservealpha",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "preserveaspectratio",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "primitiveunits",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "refx",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "refy",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "repeatcount",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "repeatdur",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "requiredextensions",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "requiredfeatures",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "specularconstant",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "specularexponent",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "spreadmethod",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "startoffset",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "stddeviation",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "stitchtiles",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "surfacescale",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "systemlanguage",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "tablevalues",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "targetx",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "targety",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "textlength",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "viewbox",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "viewtarget",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "xchannelselector",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "ychannelselector",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "zoomandpan",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math attributename=\"\" attributetype=\"\" basefrequency=\"\" baseprofile=\"\" calcmode=\"\" clippathunits=\"\" diffuseconstant=\"\" edgemode=\"\" filterunits=\"\" glyphref=\"\" gradienttransform=\"\" gradientunits=\"\" kernelmatrix=\"\" kernelunitlength=\"\" keypoints=\"\" keysplines=\"\" keytimes=\"\" lengthadjust=\"\" limitingconeangle=\"\" markerheight=\"\" markerunits=\"\" markerwidth=\"\" maskcontentunits=\"\" maskunits=\"\" numoctaves=\"\" pathlength=\"\" patterncontentunits=\"\" patterntransform=\"\" patternunits=\"\" pointsatx=\"\" pointsaty=\"\" pointsatz=\"\" preservealpha=\"\" preserveaspectratio=\"\" primitiveunits=\"\" refx=\"\" refy=\"\" repeatcount=\"\" repeatdur=\"\" requiredextensions=\"\" requiredfeatures=\"\" specularconstant=\"\" specularexponent=\"\" spreadmethod=\"\" startoffset=\"\" stddeviation=\"\" stitchtiles=\"\" surfacescale=\"\" systemlanguage=\"\" tablevalues=\"\" targetx=\"\" targety=\"\" textlength=\"\" viewbox=\"\" viewtarget=\"\" xchannelselector=\"\" ychannelselector=\"\" zoomandpan=\"\"></math></body></html>",
    +        "noQuirksBodyHtml": "<math attributename=\"\" attributetype=\"\" basefrequency=\"\" baseprofile=\"\" calcmode=\"\" clippathunits=\"\" diffuseconstant=\"\" edgemode=\"\" filterunits=\"\" glyphref=\"\" gradienttransform=\"\" gradientunits=\"\" kernelmatrix=\"\" kernelunitlength=\"\" keypoints=\"\" keysplines=\"\" keytimes=\"\" lengthadjust=\"\" limitingconeangle=\"\" markerheight=\"\" markerunits=\"\" markerwidth=\"\" maskcontentunits=\"\" maskunits=\"\" numoctaves=\"\" pathlength=\"\" patterncontentunits=\"\" patterntransform=\"\" patternunits=\"\" pointsatx=\"\" pointsaty=\"\" pointsatz=\"\" preservealpha=\"\" preserveaspectratio=\"\" primitiveunits=\"\" refx=\"\" refy=\"\" repeatcount=\"\" repeatdur=\"\" requiredextensions=\"\" requiredfeatures=\"\" specularconstant=\"\" specularexponent=\"\" spreadmethod=\"\" startoffset=\"\" stddeviation=\"\" stitchtiles=\"\" surfacescale=\"\" systemlanguage=\"\" tablevalues=\"\" targetx=\"\" targety=\"\" textlength=\"\" viewbox=\"\" viewtarget=\"\" xchannelselector=\"\" ychannelselector=\"\" zoomandpan=\"\"></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><svg><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg altGlyph": true,
    +            "svg altGlyphDef": true,
    +            "svg altGlyphItem": true,
    +            "svg animateColor": true,
    +            "svg animateMotion": true,
    +            "svg animateTransform": true,
    +            "svg clipPath": true,
    +            "svg feBlend": true,
    +            "svg feColorMatrix": true,
    +            "svg feComponentTransfer": true,
    +            "svg feComposite": true,
    +            "svg feConvolveMatrix": true,
    +            "svg feDiffuseLighting": true,
    +            "svg feDisplacementMap": true,
    +            "svg feDistantLight": true,
    +            "svg feFlood": true,
    +            "svg feFuncA": true,
    +            "svg feFuncB": true,
    +            "svg feFuncG": true,
    +            "svg feFuncR": true,
    +            "svg feGaussianBlur": true,
    +            "svg feImage": true,
    +            "svg feMerge": true,
    +            "svg feMergeNode": true,
    +            "svg feMorphology": true,
    +            "svg feOffset": true,
    +            "svg fePointLight": true,
    +            "svg feSpecularLighting": true,
    +            "svg feSpotLight": true,
    +            "svg feTile": true,
    +            "svg feTurbulence": true,
    +            "svg foreignObject": true,
    +            "svg glyphRef": true,
    +            "svg linearGradient": true,
    +            "svg radialGradient": true,
    +            "svg textPath": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "altGlyph",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "altGlyphDef",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "altGlyphItem",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "animateColor",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "animateMotion",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "animateTransform",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "clipPath",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feBlend",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feColorMatrix",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feComponentTransfer",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feComposite",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feConvolveMatrix",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feDiffuseLighting",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feDisplacementMap",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feDistantLight",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFlood",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncA",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncB",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncG",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncR",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feGaussianBlur",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feImage",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feMerge",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feMergeNode",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feMorphology",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feOffset",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "fePointLight",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feSpecularLighting",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feSpotLight",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feTile",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feTurbulence",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "foreignObject",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "glyphRef",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "linearGradient",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "radialGradient",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "textPath",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><svg><altglyph /><altglyphdef /><altglyphitem /><animatecolor /><animatemotion /><animatetransform /><clippath /><feblend /><fecolormatrix /><fecomponenttransfer /><fecomposite /><feconvolvematrix /><fediffuselighting /><fedisplacementmap /><fedistantlight /><feflood /><fefunca /><fefuncb /><fefuncg /><fefuncr /><fegaussianblur /><feimage /><femerge /><femergenode /><femorphology /><feoffset /><fepointlight /><fespecularlighting /><fespotlight /><fetile /><feturbulence /><foreignobject /><glyphref /><lineargradient /><radialgradient /><textpath /></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg altGlyph": true,
    +            "svg altGlyphDef": true,
    +            "svg altGlyphItem": true,
    +            "svg animateColor": true,
    +            "svg animateMotion": true,
    +            "svg animateTransform": true,
    +            "svg clipPath": true,
    +            "svg feBlend": true,
    +            "svg feColorMatrix": true,
    +            "svg feComponentTransfer": true,
    +            "svg feComposite": true,
    +            "svg feConvolveMatrix": true,
    +            "svg feDiffuseLighting": true,
    +            "svg feDisplacementMap": true,
    +            "svg feDistantLight": true,
    +            "svg feFlood": true,
    +            "svg feFuncA": true,
    +            "svg feFuncB": true,
    +            "svg feFuncG": true,
    +            "svg feFuncR": true,
    +            "svg feGaussianBlur": true,
    +            "svg feImage": true,
    +            "svg feMerge": true,
    +            "svg feMergeNode": true,
    +            "svg feMorphology": true,
    +            "svg feOffset": true,
    +            "svg fePointLight": true,
    +            "svg feSpecularLighting": true,
    +            "svg feSpotLight": true,
    +            "svg feTile": true,
    +            "svg feTurbulence": true,
    +            "svg foreignObject": true,
    +            "svg glyphRef": true,
    +            "svg linearGradient": true,
    +            "svg radialGradient": true,
    +            "svg textPath": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "altGlyph",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "altGlyphDef",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "altGlyphItem",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "animateColor",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "animateMotion",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "animateTransform",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "clipPath",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feBlend",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feColorMatrix",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feComponentTransfer",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feComposite",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feConvolveMatrix",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feDiffuseLighting",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feDisplacementMap",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feDistantLight",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFlood",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncA",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncB",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncG",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncR",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feGaussianBlur",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feImage",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feMerge",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feMergeNode",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feMorphology",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feOffset",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "fePointLight",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feSpecularLighting",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feSpotLight",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feTile",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feTurbulence",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "foreignObject",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "glyphRef",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "linearGradient",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "radialGradient",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "textPath",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><BODY><SVG><ALTGLYPH /><ALTGLYPHDEF /><ALTGLYPHITEM /><ANIMATECOLOR /><ANIMATEMOTION /><ANIMATETRANSFORM /><CLIPPATH /><FEBLEND /><FECOLORMATRIX /><FECOMPONENTTRANSFER /><FECOMPOSITE /><FECONVOLVEMATRIX /><FEDIFFUSELIGHTING /><FEDISPLACEMENTMAP /><FEDISTANTLIGHT /><FEFLOOD /><FEFUNCA /><FEFUNCB /><FEFUNCG /><FEFUNCR /><FEGAUSSIANBLUR /><FEIMAGE /><FEMERGE /><FEMERGENODE /><FEMORPHOLOGY /><FEOFFSET /><FEPOINTLIGHT /><FESPECULARLIGHTING /><FESPOTLIGHT /><FETILE /><FETURBULENCE /><FOREIGNOBJECT /><GLYPHREF /><LINEARGRADIENT /><RADIALGRADIENT /><TEXTPATH /></SVG>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg altGlyph": true,
    +            "svg altGlyphDef": true,
    +            "svg altGlyphItem": true,
    +            "svg animateColor": true,
    +            "svg animateMotion": true,
    +            "svg animateTransform": true,
    +            "svg clipPath": true,
    +            "svg feBlend": true,
    +            "svg feColorMatrix": true,
    +            "svg feComponentTransfer": true,
    +            "svg feComposite": true,
    +            "svg feConvolveMatrix": true,
    +            "svg feDiffuseLighting": true,
    +            "svg feDisplacementMap": true,
    +            "svg feDistantLight": true,
    +            "svg feFlood": true,
    +            "svg feFuncA": true,
    +            "svg feFuncB": true,
    +            "svg feFuncG": true,
    +            "svg feFuncR": true,
    +            "svg feGaussianBlur": true,
    +            "svg feImage": true,
    +            "svg feMerge": true,
    +            "svg feMergeNode": true,
    +            "svg feMorphology": true,
    +            "svg feOffset": true,
    +            "svg fePointLight": true,
    +            "svg feSpecularLighting": true,
    +            "svg feSpotLight": true,
    +            "svg feTile": true,
    +            "svg feTurbulence": true,
    +            "svg foreignObject": true,
    +            "svg glyphRef": true,
    +            "svg linearGradient": true,
    +            "svg radialGradient": true,
    +            "svg textPath": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "altGlyph",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "altGlyphDef",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "altGlyphItem",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "animateColor",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "animateMotion",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "animateTransform",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "clipPath",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feBlend",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feColorMatrix",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feComponentTransfer",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feComposite",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feConvolveMatrix",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feDiffuseLighting",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feDisplacementMap",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feDistantLight",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFlood",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncA",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncB",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncG",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feFuncR",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feGaussianBlur",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feImage",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feMerge",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feMergeNode",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feMorphology",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feOffset",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "fePointLight",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feSpecularLighting",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feSpotLight",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feTile",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "feTurbulence",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "foreignObject",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "glyphRef",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "linearGradient",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "radialGradient",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "textPath",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><altGlyph></altGlyph><altGlyphDef></altGlyphDef><altGlyphItem></altGlyphItem><animateColor></animateColor><animateMotion></animateMotion><animateTransform></animateTransform><clipPath></clipPath><feBlend></feBlend><feColorMatrix></feColorMatrix><feComponentTransfer></feComponentTransfer><feComposite></feComposite><feConvolveMatrix></feConvolveMatrix><feDiffuseLighting></feDiffuseLighting><feDisplacementMap></feDisplacementMap><feDistantLight></feDistantLight><feFlood></feFlood><feFuncA></feFuncA><feFuncB></feFuncB><feFuncG></feFuncG><feFuncR></feFuncR><feGaussianBlur></feGaussianBlur><feImage></feImage><feMerge></feMerge><feMergeNode></feMergeNode><feMorphology></feMorphology><feOffset></feOffset><fePointLight></fePointLight><feSpecularLighting></feSpecularLighting><feSpotLight></feSpotLight><feTile></feTile><feTurbulence></feTurbulence><foreignObject></foreignObject><glyphRef></glyphRef><linearGradient></linearGradient><radialGradient></radialGradient><textPath></textPath></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><math><altGlyph /><altGlyphDef /><altGlyphItem /><animateColor /><animateMotion /><animateTransform /><clipPath /><feBlend /><feColorMatrix /><feComponentTransfer /><feComposite /><feConvolveMatrix /><feDiffuseLighting /><feDisplacementMap /><feDistantLight /><feFlood /><feFuncA /><feFuncB /><feFuncG /><feFuncR /><feGaussianBlur /><feImage /><feMerge /><feMergeNode /><feMorphology /><feOffset /><fePointLight /><feSpecularLighting /><feSpotLight /><feTile /><feTurbulence /><foreignObject /><glyphRef /><linearGradient /><radialGradient /><textPath /></math>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math altglyph": true,
    +            "math altglyphdef": true,
    +            "math altglyphitem": true,
    +            "math animatecolor": true,
    +            "math animatemotion": true,
    +            "math animatetransform": true,
    +            "math clippath": true,
    +            "math feblend": true,
    +            "math fecolormatrix": true,
    +            "math fecomponenttransfer": true,
    +            "math fecomposite": true,
    +            "math feconvolvematrix": true,
    +            "math fediffuselighting": true,
    +            "math fedisplacementmap": true,
    +            "math fedistantlight": true,
    +            "math feflood": true,
    +            "math fefunca": true,
    +            "math fefuncb": true,
    +            "math fefuncg": true,
    +            "math fefuncr": true,
    +            "math fegaussianblur": true,
    +            "math feimage": true,
    +            "math femerge": true,
    +            "math femergenode": true,
    +            "math femorphology": true,
    +            "math feoffset": true,
    +            "math fepointlight": true,
    +            "math fespecularlighting": true,
    +            "math fespotlight": true,
    +            "math fetile": true,
    +            "math feturbulence": true,
    +            "math foreignobject": true,
    +            "math glyphref": true,
    +            "math lineargradient": true,
    +            "math radialgradient": true,
    +            "math textpath": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "altglyph",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "altglyphdef",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "altglyphitem",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "animatecolor",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "animatemotion",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "animatetransform",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "clippath",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "feblend",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fecolormatrix",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fecomponenttransfer",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fecomposite",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "feconvolvematrix",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fediffuselighting",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fedisplacementmap",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fedistantlight",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "feflood",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fefunca",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fefuncb",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fefuncg",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fefuncr",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fegaussianblur",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "feimage",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "femerge",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "femergenode",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "femorphology",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "feoffset",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fepointlight",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fespecularlighting",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fespotlight",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "fetile",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "feturbulence",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "foreignobject",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "glyphref",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "lineargradient",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "radialgradient",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      },
    +                      {
    +                        "tag": "textpath",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><altglyph></altglyph><altglyphdef></altglyphdef><altglyphitem></altglyphitem><animatecolor></animatecolor><animatemotion></animatemotion><animatetransform></animatetransform><clippath></clippath><feblend></feblend><fecolormatrix></fecolormatrix><fecomponenttransfer></fecomponenttransfer><fecomposite></fecomposite><feconvolvematrix></feconvolvematrix><fediffuselighting></fediffuselighting><fedisplacementmap></fedisplacementmap><fedistantlight></fedistantlight><feflood></feflood><fefunca></fefunca><fefuncb></fefuncb><fefuncg></fefuncg><fefuncr></fefuncr><fegaussianblur></fegaussianblur><feimage></feimage><femerge></femerge><femergenode></femergenode><femorphology></femorphology><feoffset></feoffset><fepointlight></fepointlight><fespecularlighting></fespecularlighting><fespotlight></fespotlight><fetile></fetile><feturbulence></feturbulence><foreignobject></foreignobject><glyphref></glyphref><lineargradient></lineargradient><radialgradient></radialgradient><textpath></textpath></math></body></html>",
    +        "noQuirksBodyHtml": "<math><altglyph></altglyph><altglyphdef></altglyphdef><altglyphitem></altglyphitem><animatecolor></animatecolor><animatemotion></animatemotion><animatetransform></animatetransform><clippath></clippath><feblend></feblend><fecolormatrix></fecolormatrix><fecomponenttransfer></fecomponenttransfer><fecomposite></fecomposite><feconvolvematrix></feconvolvematrix><fediffuselighting></fediffuselighting><fedisplacementmap></fedisplacementmap><fedistantlight></fedistantlight><feflood></feflood><fefunca></fefunca><fefuncb></fefuncb><fefuncg></fefuncg><fefuncr></fefuncr><fegaussianblur></fegaussianblur><feimage></feimage><femerge></femerge><femergenode></femergenode><femorphology></femorphology><feoffset></feoffset><fepointlight></fepointlight><fespecularlighting></fespecularlighting><fespotlight></fespotlight><fetile></fetile><feturbulence></feturbulence><foreignobject></foreignobject><glyphref></glyphref><lineargradient></lineargradient><radialgradient></radialgradient><textpath></textpath></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><svg><solidColor /></svg>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg solidcolor": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "solidcolor",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><solidcolor></solidcolor></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><solidcolor></solidcolor></svg>"
    +      }
    +    }
    +  ],
    +  "tests12.dat": [
    +    {
    +      "data": "<!DOCTYPE html><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "math math": true,
    +            "math mtext": true,
    +            "i": true,
    +            "math annotation-xml": true,
    +            "svg svg": true,
    +            "svg desc": true,
    +            "b": true,
    +            "svg g": true,
    +            "svg foreignObject": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "img": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      },
    +                      {
    +                        "tag": "math",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mtext",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "i",
    +                                "children": [
    +                                  {
    +                                    "text": "baz"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "annotation-xml",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "svg",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "desc",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "b",
    +                                        "children": [
    +                                          {
    +                                            "text": "eggs"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "tag": "g",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "foreignObject",
    +                                        "ns": "http://www.w3.org/2000/svg",
    +                                        "children": [
    +                                          {
    +                                            "tag": "p",
    +                                            "children": [
    +                                              {
    +                                                "text": "spam"
    +                                              }
    +                                            ]
    +                                          },
    +                                          {
    +                                            "tag": "table",
    +                                            "children": [
    +                                              {
    +                                                "tag": "tbody",
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "tr",
    +                                                    "children": [
    +                                                      {
    +                                                        "tag": "td",
    +                                                        "children": [
    +                                                          {
    +                                                            "tag": "img"
    +                                                          }
    +                                                        ]
    +                                                      }
    +                                                    ]
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "tag": "g",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "text": "quux"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "bar"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><p>spam</p><table><tbody><tr><td><img></td></tr></tbody></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar</p></body></html>",
    +        "noQuirksBodyHtml": "<p>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><p>spam</p><table><tbody><tr><td><img></td></tr></tbody></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><P>spam<TABLE><tr><td><img></td></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mtext": true,
    +            "i": true,
    +            "math annotation-xml": true,
    +            "svg svg": true,
    +            "svg desc": true,
    +            "b": true,
    +            "svg g": true,
    +            "svg foreignObject": true,
    +            "p": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "img": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "foo"
    +                  },
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mtext",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "baz"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg",
    +                            "children": [
    +                              {
    +                                "tag": "desc",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "b",
    +                                    "children": [
    +                                      {
    +                                        "text": "eggs"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "g",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "tag": "foreignObject",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "p",
    +                                        "children": [
    +                                          {
    +                                            "text": "spam"
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "table",
    +                                        "children": [
    +                                          {
    +                                            "tag": "tbody",
    +                                            "children": [
    +                                              {
    +                                                "tag": "tr",
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "td",
    +                                                    "children": [
    +                                                      {
    +                                                        "tag": "img"
    +                                                      }
    +                                                    ]
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "g",
    +                                "ns": "http://www.w3.org/2000/svg",
    +                                "children": [
    +                                  {
    +                                    "text": "quux"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "bar"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><p>spam</p><table><tbody><tr><td><img></td></tr></tbody></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar</body></html>",
    +        "noQuirksBodyHtml": "foo<math><mtext><i>baz</i></mtext><annotation-xml><svg><desc><b>eggs</b></desc><g><foreignObject><p>spam</p><table><tbody><tr><td><img></td></tr></tbody></table></foreignObject></g><g>quux</g></svg></annotation-xml></math>bar"
    +      }
    +    }
    +  ],
    +  "tests14.dat": [
    +    {
    +      "data": "<!DOCTYPE html><html><body><xyz:abc></xyz:abc>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "xyz:abc": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "xyz:abc"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><xyz:abc></xyz:abc></body></html>",
    +        "noQuirksBodyHtml": "<xyz:abc></xyz:abc>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><body><xyz:abc></xyz:abc><span></span>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "xyz:abc": true,
    +            "span": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "xyz:abc"
    +                  },
    +                  {
    +                    "tag": "span"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><xyz:abc></xyz:abc><span></span></body></html>",
    +        "noQuirksBodyHtml": "<xyz:abc></xyz:abc><span></span>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><html abc:def=gh><xyz:abc></xyz:abc>",
    +      "errors": [
    +        "(1,38): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "xyz:abc": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "abc:def",
    +                "value": "gh"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "xyz:abc"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html abc:def=\"gh\"><head></head><body><xyz:abc></xyz:abc></body></html>",
    +        "noQuirksBodyHtml": "<xyz:abc></xyz:abc>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html xml:lang=bar><html xml:lang=foo>",
    +      "errors": [
    +        "(1,53): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "xml:lang",
    +                "value": "bar"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html xml:lang=\"bar\"><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html 123=456>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "123",
    +                "value": "456"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html 123=\"456\"><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html 123=456><html 789=012>",
    +      "errors": [
    +        "(1,43): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "123",
    +                "value": "456"
    +              },
    +              {
    +                "name": "789",
    +                "value": "012"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html 123=\"456\" 789=\"012\"><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><body 789=012>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "789",
    +                    "value": "012"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body 789=\"012\"></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    }
    +  ],
    +  "tests15.dat": [
    +    {
    +      "data": "<!DOCTYPE html><p><b><i><u></p> <p>X",
    +      "errors": [
    +        "(1,31): unexpected-end-tag",
    +        "(1,36): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "b": true,
    +            "i": true,
    +            "u": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "tag": "u"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "tag": "u",
    +                            "children": [
    +                              {
    +                                "text": " "
    +                              },
    +                              {
    +                                "tag": "p",
    +                                "children": [
    +                                  {
    +                                    "text": "X"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><b><i><u></u></i></b></p><b><i><u> <p>X</p></u></i></b></body></html>",
    +        "noQuirksBodyHtml": "<p><b><i><u></u></i></b></p><b><i><u> <p>X</p></u></i></b>"
    +      }
    +    },
    +    {
    +      "data": "<p><b><i><u></p>\n<p>X",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,16): unexpected-end-tag",
    +        "(2,4): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "b": true,
    +            "i": true,
    +            "u": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "tag": "u"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "tag": "u",
    +                            "children": [
    +                              {
    +                                "text": "\n"
    +                              },
    +                              {
    +                                "tag": "p",
    +                                "children": [
    +                                  {
    +                                    "text": "X"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><b><i><u></u></i></b></p><b><i><u>\n<p>X</p></u></i></b></body></html>",
    +        "noQuirksBodyHtml": "<p><b><i><u></u></i></b></p><b><i><u>\n<p>X</p></u></i></b>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html></html> <head>",
    +      "errors": [
    +        "(1,29): expected-eof-but-got-start-tag",
    +        "(1,29): unexpected-start-tag-ignored"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": " "
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body> </body></html>",
    +        "noQuirksBodyHtml": " "
    +      }
    +    },
    +    {
    +      "data": "<!doctype html></body><meta>",
    +      "errors": [
    +        "(1,28): unexpected-start-tag-after-body"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "meta": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "meta"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><meta></body></html>",
    +        "noQuirksBodyHtml": "<meta>"
    +      }
    +    },
    +    {
    +      "data": "<html></html><!-- foo -->",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          },
    +          {
    +            "comment": " foo "
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html><!-- foo -->",
    +        "noQuirksBodyHtml": "<!-- foo -->"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html></body><title>X</title>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag-after-body"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "title": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><title>X</title></body></html>",
    +        "noQuirksBodyHtml": "<title>X</title>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table> X<meta></table>",
    +      "errors": [
    +        "(1,23): foster-parenting-character",
    +        "(1,24): foster-parenting-character",
    +        "(1,30): foster-parenting-start-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "meta": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": " X"
    +                  },
    +                  {
    +                    "tag": "meta"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body> X<meta><table></table></body></html>",
    +        "noQuirksBodyHtml": " X<meta><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table> x</table>",
    +      "errors": [
    +        "(1,23): foster-parenting-character",
    +        "(1,24): foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": " x"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body> x<table></table></body></html>",
    +        "noQuirksBodyHtml": " x<table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table> x </table>",
    +      "errors": [
    +        "(1,23): foster-parenting-character",
    +        "(1,24): foster-parenting-character",
    +        "(1,25): foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": " x "
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body> x <table></table></body></html>",
    +        "noQuirksBodyHtml": " x <table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tr> x</table>",
    +      "errors": [
    +        "(1,27): foster-parenting-character",
    +        "(1,28): foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": " x"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body> x<table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": " x<table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table>X<style> <tr>x </style> </table>",
    +      "errors": [
    +        "(1,23): foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "style": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "style",
    +                        "children": [
    +                          {
    +                            "text": " <tr>x ",
    +                            "no_escape": true
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": " "
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>X<table><style> <tr>x </style> </table></body></html>",
    +        "noQuirksBodyHtml": "X<table><style> <tr>x </style> </table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><div><table><a>foo</a> <tr><td>bar</td> </tr></table></div>",
    +      "errors": [
    +        "(1,30): foster-parenting-start-tag",
    +        "(1,31): foster-parenting-character",
    +        "(1,32): foster-parenting-character",
    +        "(1,33): foster-parenting-character",
    +        "(1,37): foster-parenting-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "text": " "
    +                          },
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr",
    +                                "children": [
    +                                  {
    +                                    "tag": "td",
    +                                    "children": [
    +                                      {
    +                                        "text": "bar"
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "text": " "
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><div><a>foo</a><table> <tbody><tr><td>bar</td> </tr></tbody></table></div></body></html>",
    +        "noQuirksBodyHtml": "<div><a>foo</a><table> <tbody><tr><td>bar</td> </tr></tbody></table></div>"
    +      }
    +    },
    +    {
    +      "data": "<frame></frame></frame><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,7): unexpected-start-tag-ignored",
    +        "(1,15): unexpected-end-tag",
    +        "(1,23): unexpected-end-tag",
    +        "(1,33): unexpected-start-tag",
    +        "(1,99): expected-named-closing-tag-but-got-eof",
    +        "(1,99): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "frame": true,
    +            "noframes": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "tag": "frame"
    +                  },
    +                  {
    +                    "tag": "frameset",
    +                    "children": [
    +                      {
    +                        "tag": "frame"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "noframes",
    +                    "children": [
    +                      {
    +                        "text": "</frameset><noframes>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset><frame><frameset><frame></frameset><noframes></frameset><noframes></noframes></frameset></html>",
    +        "noQuirksBodyHtml": "<noframes></frameset><noframes></noframes>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><object></html>",
    +      "errors": [
    +        "(1,30): expected-body-in-scope",
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "object": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "object"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><object></object></body></html>",
    +        "noQuirksBodyHtml": "<object></object>"
    +      }
    +    }
    +  ],
    +  "tests16.dat": [
    +    {
    +      "data": "<!doctype html><script>",
    +      "errors": [
    +        "(1,23): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script>a",
    +      "errors": [
    +        "(1,24): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script>a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script>a</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><",
    +      "errors": [
    +        "(1,24): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></",
    +      "errors": [
    +        "(1,25): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></S",
    +      "errors": [
    +        "(1,26): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</S",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></S</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></S</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></SC",
    +      "errors": [
    +        "(1,27): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SC",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></SC</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SC</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></SCR",
    +      "errors": [
    +        "(1,28): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SCR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></SCR</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SCR</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></SCRI",
    +      "errors": [
    +        "(1,29): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SCRI",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></SCRI</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SCRI</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></SCRIP",
    +      "errors": [
    +        "(1,30): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SCRIP",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></SCRIP</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SCRIP</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></SCRIPT",
    +      "errors": [
    +        "(1,31): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SCRIPT",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></SCRIPT</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SCRIPT</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></SCRIPT ",
    +      "errors": [
    +        "(1,32): expected-attribute-name-but-got-eof",
    +        "(1,32): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></s",
    +      "errors": [
    +        "(1,26): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</s",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></s</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></s</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></sc",
    +      "errors": [
    +        "(1,27): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</sc",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></sc</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></sc</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></scr",
    +      "errors": [
    +        "(1,28): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</scr",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></scr</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></scr</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></scri",
    +      "errors": [
    +        "(1,29): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</scri",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></scri</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></scri</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></scrip",
    +      "errors": [
    +        "(1,30): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</scrip",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></scrip</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></scrip</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></script",
    +      "errors": [
    +        "(1,31): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></script</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script></script ",
    +      "errors": [
    +        "(1,32): expected-attribute-name-but-got-eof",
    +        "(1,32): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!",
    +      "errors": [
    +        "(1,25): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!a",
    +      "errors": [
    +        "(1,26): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!a</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!-",
    +      "errors": [
    +        "(1,26): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!-",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!-</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!-</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!-a",
    +      "errors": [
    +        "(1,27): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!-a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!-a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!-a</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--",
    +      "errors": [
    +        "(1,27): expected-named-closing-tag-but-got-eof",
    +        "(1,27): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--a",
    +      "errors": [
    +        "(1,28): expected-named-closing-tag-but-got-eof",
    +        "(1,28): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--a</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<",
    +      "errors": [
    +        "(1,28): expected-named-closing-tag-but-got-eof",
    +        "(1,28): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<a",
    +      "errors": [
    +        "(1,29): expected-named-closing-tag-but-got-eof",
    +        "(1,29): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<a</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--</",
    +      "errors": [
    +        "(1,29): expected-named-closing-tag-but-got-eof",
    +        "(1,29): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--</",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--</</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--</</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--</script",
    +      "errors": [
    +        "(1,35): expected-named-closing-tag-but-got-eof",
    +        "(1,35): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--</script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--</script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--</script</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--</script ",
    +      "errors": [
    +        "(1,36): expected-attribute-name-but-got-eof",
    +        "(1,36): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<s",
    +      "errors": [
    +        "(1,29): expected-named-closing-tag-but-got-eof",
    +        "(1,29): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<s",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<s</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<s</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script",
    +      "errors": [
    +        "(1,34): expected-named-closing-tag-but-got-eof",
    +        "(1,34): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script ",
    +      "errors": [
    +        "(1,35): eof-in-script-in-script",
    +        "(1,35): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script <",
    +      "errors": [
    +        "(1,36): eof-in-script-in-script",
    +        "(1,36): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script <",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script <</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script <</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script <a",
    +      "errors": [
    +        "(1,37): eof-in-script-in-script",
    +        "(1,37): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script <a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script <a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script <a</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </",
    +      "errors": [
    +        "(1,37): eof-in-script-in-script",
    +        "(1,37): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </s",
    +      "errors": [
    +        "(1,38): eof-in-script-in-script",
    +        "(1,38): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </s",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </s</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </s</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script",
    +      "errors": [
    +        "(1,43): eof-in-script-in-script",
    +        "(1,43): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </scripta",
    +      "errors": [
    +        "(1,44): eof-in-script-in-script",
    +        "(1,44): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </scripta",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </scripta</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </scripta</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script ",
    +      "errors": [
    +        "(1,44): expected-named-closing-tag-but-got-eof",
    +        "(1,44): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script>",
    +      "errors": [
    +        "(1,44): expected-named-closing-tag-but-got-eof",
    +        "(1,44): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script/",
    +      "errors": [
    +        "(1,44): expected-named-closing-tag-but-got-eof",
    +        "(1,44): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script/",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script/</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script/</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script <",
    +      "errors": [
    +        "(1,45): expected-named-closing-tag-but-got-eof",
    +        "(1,45): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script <",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script <</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script <</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script <a",
    +      "errors": [
    +        "(1,46): expected-named-closing-tag-but-got-eof",
    +        "(1,46): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script <a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script <a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script <a</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script </",
    +      "errors": [
    +        "(1,46): expected-named-closing-tag-but-got-eof",
    +        "(1,46): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script </",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script </</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script </script",
    +      "errors": [
    +        "(1,52): expected-named-closing-tag-but-got-eof",
    +        "(1,52): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script </script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script </script ",
    +      "errors": [
    +        "(1,53): expected-attribute-name-but-got-eof",
    +        "(1,53): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script </script/",
    +      "errors": [
    +        "(1,53): unexpected-EOF-after-solidus-in-tag",
    +        "(1,53): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script </script </script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script </script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script -",
    +      "errors": [
    +        "(1,36): eof-in-script-in-script",
    +        "(1,36): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script -</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script -</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script -a",
    +      "errors": [
    +        "(1,37): eof-in-script-in-script",
    +        "(1,37): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script -a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script -a</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script -<",
    +      "errors": [
    +        "(1,37): eof-in-script-in-script",
    +        "(1,37): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -<",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script -<</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script -<</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script --",
    +      "errors": [
    +        "(1,37): eof-in-script-in-script",
    +        "(1,37): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script --a",
    +      "errors": [
    +        "(1,38): eof-in-script-in-script",
    +        "(1,38): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --a</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script --<",
    +      "errors": [
    +        "(1,38): eof-in-script-in-script",
    +        "(1,38): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --<",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --<</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --<</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script -->",
    +      "errors": [
    +        "(1,38): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script --><",
    +      "errors": [
    +        "(1,39): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --><",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --><</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --><</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script --></",
    +      "errors": [
    +        "(1,40): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --></",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --></</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script --></script",
    +      "errors": [
    +        "(1,46): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --></script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --></script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script --></script ",
    +      "errors": [
    +        "(1,47): expected-attribute-name-but-got-eof",
    +        "(1,47): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script --></script/",
    +      "errors": [
    +        "(1,47): unexpected-EOF-after-solidus-in-tag",
    +        "(1,47): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script --></script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script --></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script><\\/script>--></script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script><\\/script>-->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script><\\/script>--></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script><\\/script>--></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script></scr'+'ipt>--></script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></scr'+'ipt>-->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script></scr'+'ipt>--></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></scr'+'ipt>--></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script></script><script></script></script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script></script><script></script>--><!--</script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>--><!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>--><!--</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>--><!--</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script></script><script></script>-- ></script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>-- >",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>-- ></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>-- ></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script></script><script></script>- -></script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>- ->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>- -></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>- -></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script></script><script></script>- - ></script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>- - >",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>- - ></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>- - ></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script></script><script></script>-></script>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script></script><script></script>-></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>-></script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script>--!></script>X",
    +      "errors": [
    +        "(1,49): expected-named-closing-tag-but-got-eof",
    +        "(1,49): unexpected-EOF-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script>--!></script>X",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script>--!></script>X</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script>--!></script>X</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<scr'+'ipt></script>--></script>",
    +      "errors": [
    +        "(1,59): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<scr'+'ipt>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<scr'+'ipt></script></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<script><!--<scr'+'ipt></script>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><script><!--<script></scr'+'ipt></script>X",
    +      "errors": [
    +        "(1,57): expected-named-closing-tag-but-got-eof",
    +        "(1,57): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></scr'+'ipt></script>X",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script><!--<script></scr'+'ipt></script>X</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></scr'+'ipt></script>X</script>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><style><!--<style></style>--></style>",
    +      "errors": [
    +        "(1,52): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--<style>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><style><!--<style></style></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<style><!--<style></style>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><style><!--</style>X",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><style><!--</style></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "<style><!--</style>X"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><style><!--...</style>...--></style>",
    +      "errors": [
    +        "(1,51): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "...-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><style><!--...</style></head><body>...--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<style><!--...</style>...--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style>X",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "<style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style>X"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><style><!--...<style><!--...--!></style>--></style>",
    +      "errors": [
    +        "(1,66): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--...<style><!--...--!>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><style><!--...<style><!--...--!></style></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<style><!--...<style><!--...--!></style>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><style><!--...</style><!-- --><style>@import ...</style>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "comment": " "
    +                  },
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "@import ...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><style><!--...</style><!-- --><style>@import ...</style></head><body></body></html>",
    +        "noQuirksBodyHtml": "<style><!--...</style><!-- --><style>@import ...</style>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><style>...<style><!--...</style><!-- --></style>",
    +      "errors": [
    +        "(1,63): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "...<style><!--...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "comment": " "
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><style>...<style><!--...</style><!-- --></head><body></body></html>",
    +        "noQuirksBodyHtml": "<style>...<style><!--...</style><!-- -->"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><style>...<!--[if IE]><style>...</style>X",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "...<!--[if IE]><style>...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><style>...<!--[if IE]><style>...</style></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "<style>...<!--[if IE]><style>...</style>X"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><title><!--<title></title>--></title>",
    +      "errors": [
    +        "(1,52): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "<!--<title>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><title>&lt;!--&lt;title&gt;</title></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<title>&lt;!--&lt;title&gt;</title>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><title>&lt;/title></title>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "</title>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><title>&lt;/title&gt;</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>&lt;/title&gt;</title>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><title>foo/title><link></head><body>X",
    +      "errors": [
    +        "(1,52): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "foo/title><link></head><body>X",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><title>foo/title&gt;&lt;link&gt;&lt;/head&gt;&lt;body&gt;X</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>foo/title&gt;&lt;link&gt;&lt;/head&gt;&lt;body&gt;X</title>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><noscript><!--<noscript></noscript>--></noscript>",
    +      "errors": [
    +        "(1,64): unexpected-end-tag"
    +      ],
    +      "script": "on",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "text": "<!--<noscript>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><noscript><!--<noscript></noscript></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><noscript><!--<noscript></noscript>--></noscript>",
    +      "errors": [],
    +      "script": "off",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "comment": "<noscript></noscript>"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><noscript><!--<noscript></noscript>--></noscript></head><body></body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><noscript><!--</noscript>X<noscript>--></noscript>",
    +      "errors": [],
    +      "script": "on",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  },
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "text": "-->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><noscript><!--</noscript></head><body>X<noscript>--></noscript></body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><noscript><!--</noscript>X<noscript>--></noscript>",
    +      "errors": [],
    +      "script": "off",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "comment": "</noscript>X<noscript>"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><noscript><!--</noscript>X<noscript>--></noscript></head><body></body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><noscript><iframe></noscript>X",
    +      "errors": [],
    +      "script": "on",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "text": "<iframe>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><noscript><iframe></noscript></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><noscript><iframe></noscript>X",
    +      "errors": [
    +        " * (1,34) unexpected token in head noscript",
    +        " * (1,46) unexpected EOF"
    +      ],
    +      "script": "off",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true,
    +            "iframe": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "iframe",
    +                    "children": [
    +                      {
    +                        "text": "</noscript>X",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><noscript></noscript></head><body><iframe></noscript>X</iframe></body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><noframes><!--<noframes></noframes>--></noframes>",
    +      "errors": [
    +        "(1,64): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noframes": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noframes",
    +                    "children": [
    +                      {
    +                        "text": "<!--<noframes>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><noframes><!--<noframes></noframes></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<noframes><!--<noframes></noframes>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><noframes><body><script><!--...</script></body></noframes></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noframes": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noframes",
    +                    "children": [
    +                      {
    +                        "text": "<body><script><!--...</script></body>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><noframes><body><script><!--...</script></body></noframes></head><body></body></html>",
    +        "noQuirksBodyHtml": "<noframes><body><script><!--...</script></body></noframes>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><textarea><!--<textarea></textarea>--></textarea>",
    +      "errors": [
    +        "(1,64): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "<!--<textarea>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><textarea>&lt;!--&lt;textarea&gt;</textarea>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<textarea>&lt;!--&lt;textarea&gt;</textarea>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><textarea>&lt;/textarea></textarea>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "</textarea>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><textarea>&lt;/textarea&gt;</textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea>&lt;/textarea&gt;</textarea>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><textarea>&lt;</textarea>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "<",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><textarea>&lt;</textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea>&lt;</textarea>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><textarea>a&lt;b</textarea>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "a<b",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><textarea>a&lt;b</textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea>a&lt;b</textarea>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><iframe><!--<iframe></iframe>--></iframe>",
    +      "errors": [
    +        "(1,56): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "iframe": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "iframe",
    +                    "children": [
    +                      {
    +                        "text": "<!--<iframe>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><iframe><!--<iframe></iframe>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<iframe><!--<iframe></iframe>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><iframe>...<!--X->...<!--/X->...</iframe>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "iframe": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "iframe",
    +                    "children": [
    +                      {
    +                        "text": "...<!--X->...<!--/X->...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><iframe>...<!--X->...<!--/X->...</iframe></body></html>",
    +        "noQuirksBodyHtml": "<iframe>...<!--X->...<!--/X->...</iframe>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><xmp><!--<xmp></xmp>--></xmp>",
    +      "errors": [
    +        "(1,44): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "xmp": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "xmp",
    +                    "children": [
    +                      {
    +                        "text": "<!--<xmp>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><xmp><!--<xmp></xmp>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<xmp><!--<xmp></xmp>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><noembed><!--<noembed></noembed>--></noembed>",
    +      "errors": [
    +        "(1,60): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "noembed": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "noembed",
    +                    "children": [
    +                      {
    +                        "text": "<!--<noembed>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><noembed><!--<noembed></noembed>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<noembed><!--<noembed></noembed>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,8): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script>a",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,9): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script>a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script>a</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,9): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,10): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></S",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,11): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</S",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></S</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></S</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></SC",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,12): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SC",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></SC</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SC</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></SCR",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,13): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SCR",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></SCR</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SCR</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></SCRI",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,14): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SCRI",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></SCRI</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SCRI</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></SCRIP",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,15): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SCRIP",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></SCRIP</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SCRIP</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></SCRIPT",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,16): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</SCRIPT",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></SCRIPT</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></SCRIPT</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></SCRIPT ",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,17): expected-attribute-name-but-got-eof",
    +        "(1,17): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script></s",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,11): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</s",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></s</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></s</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></sc",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,12): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</sc",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></sc</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></sc</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></scr",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,13): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</scr",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></scr</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></scr</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></scri",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,14): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</scri",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></scri</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></scri</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></scrip",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,15): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</scrip",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></scrip</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></scrip</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></script",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,16): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></script</script>"
    +      }
    +    },
    +    {
    +      "data": "<script></script ",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,17): expected-attribute-name-but-got-eof",
    +        "(1,17): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,10): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!a",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,11): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!a</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!-",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,11): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!-",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!-</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!-</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!-a",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,12): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!-a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!-a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!-a</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,12): expected-named-closing-tag-but-got-eof",
    +        "(1,12): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--a",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,13): expected-named-closing-tag-but-got-eof",
    +        "(1,13): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--a</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,13): expected-named-closing-tag-but-got-eof",
    +        "(1,13): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<a",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,14): expected-named-closing-tag-but-got-eof",
    +        "(1,14): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<a</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--</",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,14): expected-named-closing-tag-but-got-eof",
    +        "(1,14): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--</",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--</</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--</</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--</script",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,20): expected-named-closing-tag-but-got-eof",
    +        "(1,20): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--</script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--</script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--</script</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--</script ",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,21): expected-attribute-name-but-got-eof",
    +        "(1,21): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<s",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,14): expected-named-closing-tag-but-got-eof",
    +        "(1,14): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<s",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<s</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<s</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,19): expected-named-closing-tag-but-got-eof",
    +        "(1,19): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script ",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,20): eof-in-script-in-script",
    +        "(1,20): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script <",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,21): eof-in-script-in-script",
    +        "(1,21): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script <",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script <</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script <</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script <a",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,22): eof-in-script-in-script",
    +        "(1,22): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script <a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script <a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script <a</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,22): eof-in-script-in-script",
    +        "(1,22): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </s",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,23): eof-in-script-in-script",
    +        "(1,23): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </s",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </s</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </s</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,28): eof-in-script-in-script",
    +        "(1,28): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </scripta",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,29): eof-in-script-in-script",
    +        "(1,29): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </scripta",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </scripta</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </scripta</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script ",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,29): expected-named-closing-tag-but-got-eof",
    +        "(1,29): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,29): expected-named-closing-tag-but-got-eof",
    +        "(1,29): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script/",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,29): expected-named-closing-tag-but-got-eof",
    +        "(1,29): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script/",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script/</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script/</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script <",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,30): expected-named-closing-tag-but-got-eof",
    +        "(1,30): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script <",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script <</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script <</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script <a",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,31): expected-named-closing-tag-but-got-eof",
    +        "(1,31): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script <a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script <a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script <a</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script </",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,31): expected-named-closing-tag-but-got-eof",
    +        "(1,31): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script </",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script </</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script </script",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,37): expected-named-closing-tag-but-got-eof",
    +        "(1,37): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script </script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script </script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script </script ",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,38): expected-attribute-name-but-got-eof",
    +        "(1,38): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script </script/",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,38): unexpected-EOF-after-solidus-in-tag",
    +        "(1,38): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script </script </script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script </script ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script </script </script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script </script </script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script -",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,21): eof-in-script-in-script",
    +        "(1,21): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script -</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script -</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script -a",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,22): eof-in-script-in-script",
    +        "(1,22): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script -a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script -a</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script --",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,22): eof-in-script-in-script",
    +        "(1,22): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script --</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script --a",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,23): eof-in-script-in-script",
    +        "(1,23): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --a",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script --a</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --a</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script -->",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,23): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script --></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script --><",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,24): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --><",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script --><</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --><</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script --></",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,25): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --></",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script --></</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script --></script",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,31): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script --></script",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script --></script</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script --></script ",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,32): expected-attribute-name-but-got-eof",
    +        "(1,32): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script --></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script --></script/",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,32): unexpected-EOF-after-solidus-in-tag",
    +        "(1,32): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script --></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script --></script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script -->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script --></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script --></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script><\\/script>--></script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script><\\/script>-->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script><\\/script>--></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script><\\/script>--></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script></scr'+'ipt>--></script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></scr'+'ipt>-->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script></scr'+'ipt>--></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></scr'+'ipt>--></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script></script><script></script></script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script></script><script></script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script></script><script></script>--><!--</script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>--><!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script></script><script></script>--><!--</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>--><!--</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script></script><script></script>-- ></script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>-- >",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script></script><script></script>-- ></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>-- ></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script></script><script></script>- -></script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>- ->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script></script><script></script>- -></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>- -></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script></script><script></script>- - ></script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>- - >",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script></script><script></script>- - ></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>- - ></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script></script><script></script>-></script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></script><script></script>->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script></script><script></script>-></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></script><script></script>-></script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script>--!></script>X",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,34): expected-named-closing-tag-but-got-eof",
    +        "(1,34): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script>--!></script>X",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script>--!></script>X</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script>--!></script>X</script>"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<scr'+'ipt></script>--></script>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,44): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<scr'+'ipt>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<scr'+'ipt></script></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<script><!--<scr'+'ipt></script>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<script><!--<script></scr'+'ipt></script>X",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,42): expected-named-closing-tag-but-got-eof",
    +        "(1,42): unexpected-eof-in-text-mode"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "<!--<script></scr'+'ipt></script>X",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script><!--<script></scr'+'ipt></script>X</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script><!--<script></scr'+'ipt></script>X</script>"
    +      }
    +    },
    +    {
    +      "data": "<style><!--<style></style>--></style>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,37): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--<style>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style><!--<style></style></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<style><!--<style></style>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<style><!--</style>X",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style><!--</style></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "<style><!--</style>X"
    +      }
    +    },
    +    {
    +      "data": "<style><!--...</style>...--></style>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,36): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "...-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style><!--...</style></head><body>...--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<style><!--...</style>...--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style>X",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "<style><!--<br><html xmlns:v=\"urn:schemas-microsoft-com:vml\"><!--[if !mso]><style></style>X"
    +      }
    +    },
    +    {
    +      "data": "<style><!--...<style><!--...--!></style>--></style>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,51): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--...<style><!--...--!>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style><!--...<style><!--...--!></style></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<style><!--...<style><!--...--!></style>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<style><!--...</style><!-- --><style>@import ...</style>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "<!--...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "comment": " "
    +                  },
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "@import ...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style><!--...</style><!-- --><style>@import ...</style></head><body></body></html>",
    +        "noQuirksBodyHtml": "<style><!--...</style><!-- --><style>@import ...</style>"
    +      }
    +    },
    +    {
    +      "data": "<style>...<style><!--...</style><!-- --></style>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,48): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "...<style><!--...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "comment": " "
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style>...<style><!--...</style><!-- --></head><body></body></html>",
    +        "noQuirksBodyHtml": "<style>...<style><!--...</style><!-- -->"
    +      }
    +    },
    +    {
    +      "data": "<style>...<!--[if IE]><style>...</style>X",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "...<!--[if IE]><style>...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style>...<!--[if IE]><style>...</style></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "<style>...<!--[if IE]><style>...</style>X"
    +      }
    +    },
    +    {
    +      "data": "<title><!--<title></title>--></title>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,37): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "<!--<title>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title>&lt;!--&lt;title&gt;</title></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<title>&lt;!--&lt;title&gt;</title>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<title>&lt;/title></title>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "</title>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title>&lt;/title&gt;</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>&lt;/title&gt;</title>"
    +      }
    +    },
    +    {
    +      "data": "<title>foo/title><link></head><body>X",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,37): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "foo/title><link></head><body>X",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title>foo/title&gt;&lt;link&gt;&lt;/head&gt;&lt;body&gt;X</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>foo/title&gt;&lt;link&gt;&lt;/head&gt;&lt;body&gt;X</title>"
    +      }
    +    },
    +    {
    +      "data": "<noscript><!--<noscript></noscript>--></noscript>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,49): unexpected-end-tag"
    +      ],
    +      "script": "on",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "text": "<!--<noscript>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noscript><!--<noscript></noscript></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<noscript><!--<noscript></noscript>--></noscript>",
    +      "errors": [
    +        " * (1,11) missing DOCTYPE"
    +      ],
    +      "script": "off",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "comment": "<noscript></noscript>"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noscript><!--<noscript></noscript>--></noscript></head><body></body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--&lt;noscript&gt;</noscript>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<noscript><!--</noscript>X<noscript>--></noscript>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "script": "on",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  },
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "text": "-->",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noscript><!--</noscript></head><body>X<noscript>--></noscript></body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
    +      }
    +    },
    +    {
    +      "data": "<noscript><!--</noscript>X<noscript>--></noscript>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "script": "off",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "comment": "</noscript>X<noscript>"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noscript><!--</noscript>X<noscript>--></noscript></head><body></body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>X<noscript>--&gt;</noscript>"
    +      }
    +    },
    +    {
    +      "data": "<noscript><iframe></noscript>X",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "script": "on",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "text": "<iframe>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noscript><iframe></noscript></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
    +      }
    +    },
    +    {
    +      "data": "<noscript><iframe></noscript>X",
    +      "errors": [
    +        " * (1,11) missing DOCTYPE",
    +        " * (1,19) unexpected token in head noscript",
    +        " * (1,31) unexpected EOF"
    +      ],
    +      "script": "off",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true,
    +            "iframe": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "iframe",
    +                    "children": [
    +                      {
    +                        "text": "</noscript>X",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noscript></noscript></head><body><iframe></noscript>X</iframe></body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;iframe&gt;</noscript>X"
    +      }
    +    },
    +    {
    +      "data": "<noframes><!--<noframes></noframes>--></noframes>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,49): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noframes": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noframes",
    +                    "children": [
    +                      {
    +                        "text": "<!--<noframes>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noframes><!--<noframes></noframes></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<noframes><!--<noframes></noframes>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<noframes><body><script><!--...</script></body></noframes></html>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noframes": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noframes",
    +                    "children": [
    +                      {
    +                        "text": "<body><script><!--...</script></body>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noframes><body><script><!--...</script></body></noframes></head><body></body></html>",
    +        "noQuirksBodyHtml": "<noframes><body><script><!--...</script></body></noframes>"
    +      }
    +    },
    +    {
    +      "data": "<textarea><!--<textarea></textarea>--></textarea>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,49): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "<!--<textarea>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><textarea>&lt;!--&lt;textarea&gt;</textarea>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<textarea>&lt;!--&lt;textarea&gt;</textarea>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<textarea>&lt;/textarea></textarea>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "</textarea>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><textarea>&lt;/textarea&gt;</textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea>&lt;/textarea&gt;</textarea>"
    +      }
    +    },
    +    {
    +      "data": "<iframe><!--<iframe></iframe>--></iframe>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,41): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "iframe": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "iframe",
    +                    "children": [
    +                      {
    +                        "text": "<!--<iframe>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><iframe><!--<iframe></iframe>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<iframe><!--<iframe></iframe>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<iframe>...<!--X->...<!--/X->...</iframe>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "iframe": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "iframe",
    +                    "children": [
    +                      {
    +                        "text": "...<!--X->...<!--/X->...",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><iframe>...<!--X->...<!--/X->...</iframe></body></html>",
    +        "noQuirksBodyHtml": "<iframe>...<!--X->...<!--/X->...</iframe>"
    +      }
    +    },
    +    {
    +      "data": "<xmp><!--<xmp></xmp>--></xmp>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,29): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "xmp": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "xmp",
    +                    "children": [
    +                      {
    +                        "text": "<!--<xmp>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><xmp><!--<xmp></xmp>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<xmp><!--<xmp></xmp>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<noembed><!--<noembed></noembed>--></noembed>",
    +      "errors": [
    +        "(1,9): expected-doctype-but-got-start-tag",
    +        "(1,45): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "noembed": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "noembed",
    +                    "children": [
    +                      {
    +                        "text": "<!--<noembed>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><noembed><!--<noembed></noembed>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<noembed><!--<noembed></noembed>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table>\n",
    +      "errors": [
    +        "(2,0): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table>\n</table></body></html>",
    +        "noQuirksBodyHtml": "<table>\n</table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><td><span><font></span><span>",
    +      "errors": [
    +        "(1,26): unexpected-cell-in-table-body",
    +        "(1,45): unexpected-end-tag",
    +        "(1,51): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "span": true,
    +            "font": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "span",
    +                                    "children": [
    +                                      {
    +                                        "tag": "font"
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "tag": "font",
    +                                    "children": [
    +                                      {
    +                                        "tag": "span"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><span><font></font></span><font><span></span></font></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><span><font></font></span><font><span></span></font></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><form><table></form><form></table></form>",
    +      "errors": [
    +        "(1,35): unexpected-end-tag-implies-table-voodoo",
    +        "(1,35): unexpected-end-tag",
    +        "(1,41): unexpected-form-in-table",
    +        "(1,56): unexpected-end-tag",
    +        "(1,56): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "children": [
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "form"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><form><table><form></form></table></form></body></html>",
    +        "noQuirksBodyHtml": "<form><table><form></form></table></form>"
    +      }
    +    }
    +  ],
    +  "tests17.dat": [
    +    {
    +      "data": "<!doctype html><table><tbody><select><tr>",
    +      "errors": [
    +        "(1,37): unexpected-start-tag-implies-table-voodoo",
    +        "(1,41): unexpected-table-element-start-tag-in-select-in-table",
    +        "(1,41): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<select></select><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tr><select><td>",
    +      "errors": [
    +        "(1,34): unexpected-start-tag-implies-table-voodoo",
    +        "(1,38): unexpected-table-element-start-tag-in-select-in-table",
    +        "(1,38): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select><table><tbody><tr><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<select></select><table><tbody><tr><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tr><td><select><td>",
    +      "errors": [
    +        "(1,42): unexpected-table-element-start-tag-in-select-in-table",
    +        "(1,42): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "select"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><select></select></td><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><select></select></td><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tr><th><select><td>",
    +      "errors": [
    +        "(1,42): unexpected-table-element-start-tag-in-select-in-table",
    +        "(1,42): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "th": true,
    +            "select": true,
    +            "td": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "th",
    +                                "children": [
    +                                  {
    +                                    "tag": "select"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><th><select></select></th><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><th><select></select></th><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><caption><select><tr>",
    +      "errors": [
    +        "(1,43): unexpected-table-element-start-tag-in-select-in-table",
    +        "(1,43): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "select": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "select"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><select></select></caption><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><select></select></caption><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><tr>",
    +      "errors": [
    +        "(1,27): unexpected-start-tag-in-select",
    +        "(1,27): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><td>",
    +      "errors": [
    +        "(1,27): unexpected-start-tag-in-select",
    +        "(1,27): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><th>",
    +      "errors": [
    +        "(1,27): unexpected-start-tag-in-select",
    +        "(1,27): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><tbody>",
    +      "errors": [
    +        "(1,30): unexpected-start-tag-in-select",
    +        "(1,30): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><thead>",
    +      "errors": [
    +        "(1,30): unexpected-start-tag-in-select",
    +        "(1,30): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><tfoot>",
    +      "errors": [
    +        "(1,30): unexpected-start-tag-in-select",
    +        "(1,30): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><caption>",
    +      "errors": [
    +        "(1,32): unexpected-start-tag-in-select",
    +        "(1,32): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tr></table>a",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "a"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr></tr></tbody></table>a</body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr></tr></tbody></table>a"
    +      }
    +    }
    +  ],
    +  "tests18.dat": [
    +    {
    +      "data": "<!doctype html><plaintext></plaintext>",
    +      "errors": [
    +        "(1,38): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "plaintext": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "plaintext",
    +                    "children": [
    +                      {
    +                        "text": "</plaintext>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><plaintext></plaintext></plaintext></body></html>",
    +        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><plaintext></plaintext>",
    +      "errors": [
    +        "(1,33): foster-parenting-start-tag",
    +        "(1,34): foster-parenting-character",
    +        "(1,35): foster-parenting-character",
    +        "(1,36): foster-parenting-character",
    +        "(1,37): foster-parenting-character",
    +        "(1,38): foster-parenting-character",
    +        "(1,39): foster-parenting-character",
    +        "(1,40): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,42): foster-parenting-character",
    +        "(1,43): foster-parenting-character",
    +        "(1,44): foster-parenting-character",
    +        "(1,45): foster-parenting-character",
    +        "(1,45): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "plaintext": true,
    +            "table": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "plaintext",
    +                    "children": [
    +                      {
    +                        "text": "</plaintext>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><plaintext></plaintext></plaintext><table></table></body></html>",
    +        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tbody><plaintext></plaintext>",
    +      "errors": [
    +        "(1,40): foster-parenting-start-tag",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,52): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "plaintext": true,
    +            "table": true,
    +            "tbody": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "plaintext",
    +                    "children": [
    +                      {
    +                        "text": "</plaintext>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><plaintext></plaintext></plaintext><table><tbody></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext><table><tbody></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tbody><tr><plaintext></plaintext>",
    +      "errors": [
    +        "(1,44): foster-parenting-start-tag",
    +        "(1,45): foster-parenting-character",
    +        "(1,46): foster-parenting-character",
    +        "(1,47): foster-parenting-character",
    +        "(1,48): foster-parenting-character",
    +        "(1,49): foster-parenting-character",
    +        "(1,50): foster-parenting-character",
    +        "(1,51): foster-parenting-character",
    +        "(1,52): foster-parenting-character",
    +        "(1,53): foster-parenting-character",
    +        "(1,54): foster-parenting-character",
    +        "(1,55): foster-parenting-character",
    +        "(1,56): foster-parenting-character",
    +        "(1,56): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "plaintext": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "plaintext",
    +                    "children": [
    +                      {
    +                        "text": "</plaintext>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><plaintext></plaintext></plaintext><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><td><plaintext></plaintext>",
    +      "errors": [
    +        "(1,26): unexpected-cell-in-table-body",
    +        "(1,49): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "plaintext": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "plaintext",
    +                                    "children": [
    +                                      {
    +                                        "text": "</plaintext>",
    +                                        "no_escape": true
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><plaintext></plaintext></plaintext></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><plaintext></plaintext></plaintext></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><caption><plaintext></plaintext>",
    +      "errors": [
    +        "(1,54): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "plaintext": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "plaintext",
    +                            "children": [
    +                              {
    +                                "text": "</plaintext>",
    +                                "no_escape": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><plaintext></plaintext></plaintext></caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><plaintext></plaintext></plaintext></caption></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tr><style></script></style>abc",
    +      "errors": [
    +        "(1,51): foster-parenting-character",
    +        "(1,52): foster-parenting-character",
    +        "(1,53): foster-parenting-character",
    +        "(1,53): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "style": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "abc"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "style",
    +                                "children": [
    +                                  {
    +                                    "text": "</script>",
    +                                    "no_escape": true
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>abc<table><tbody><tr><style></script></style></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "abc<table><tbody><tr><style></script></style></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tr><script></style></script>abc",
    +      "errors": [
    +        "(1,52): foster-parenting-character",
    +        "(1,53): foster-parenting-character",
    +        "(1,54): foster-parenting-character",
    +        "(1,54): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "script": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "abc"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "script",
    +                                "children": [
    +                                  {
    +                                    "text": "</style>",
    +                                    "no_escape": true
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>abc<table><tbody><tr><script></style></script></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "abc<table><tbody><tr><script></style></script></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><caption><style></script></style>abc",
    +      "errors": [
    +        "(1,58): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "style": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "style",
    +                            "children": [
    +                              {
    +                                "text": "</script>",
    +                                "no_escape": true
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": "abc"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><style></script></style>abc</caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><style></script></style>abc</caption></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><td><style></script></style>abc",
    +      "errors": [
    +        "(1,26): unexpected-cell-in-table-body",
    +        "(1,53): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "style": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "style",
    +                                    "children": [
    +                                      {
    +                                        "text": "</script>",
    +                                        "no_escape": true
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "text": "abc"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><style></script></style>abc</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><style></script></style>abc</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><script></style></script>abc",
    +      "errors": [
    +        "(1,51): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "script": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "script",
    +                        "children": [
    +                          {
    +                            "text": "</style>",
    +                            "no_escape": true
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "abc"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><script></style></script>abc</select></body></html>",
    +        "noQuirksBodyHtml": "<select><script></style></script>abc</select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><select><script></style></script>abc",
    +      "errors": [
    +        "(1,30): unexpected-start-tag-implies-table-voodoo",
    +        "(1,58): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "script": true,
    +            "table": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "script",
    +                        "children": [
    +                          {
    +                            "text": "</style>",
    +                            "no_escape": true
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "abc"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><script></style></script>abc</select><table></table></body></html>",
    +        "noQuirksBodyHtml": "<select><script></style></script>abc</select><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tr><select><script></style></script>abc",
    +      "errors": [
    +        "(1,34): unexpected-start-tag-implies-table-voodoo",
    +        "(1,62): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "script": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "script",
    +                        "children": [
    +                          {
    +                            "text": "</style>",
    +                            "no_escape": true
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "abc"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><script></style></script>abc</select><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<select><script></style></script>abc</select><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><frameset></frameset><noframes>abc",
    +      "errors": [
    +        "(1,49): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "noframes": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "tag": "noframes",
    +                "children": [
    +                  {
    +                    "text": "abc",
    +                    "no_escape": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset><noframes>abc</noframes></html>",
    +        "noQuirksBodyHtml": "<noframes>abc</noframes>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><frameset></frameset><noframes>abc</noframes><!--abc-->",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "noframes": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "tag": "noframes",
    +                "children": [
    +                  {
    +                    "text": "abc",
    +                    "no_escape": true
    +                  }
    +                ]
    +              },
    +              {
    +                "comment": "abc"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset><noframes>abc</noframes><!--abc--></html>",
    +        "noQuirksBodyHtml": "<noframes>abc</noframes><!--abc-->"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><frameset></frameset></html><noframes>abc",
    +      "errors": [
    +        "(1,56): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "noframes": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "tag": "noframes",
    +                "children": [
    +                  {
    +                    "text": "abc",
    +                    "no_escape": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset><noframes>abc</noframes></html>",
    +        "noQuirksBodyHtml": "<noframes>abc</noframes>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><frameset></frameset></html><noframes>abc</noframes><!--abc-->",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "noframes": true
    +          },
    +          "doctype": true,
    +          "no_escape": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "tag": "noframes",
    +                "children": [
    +                  {
    +                    "text": "abc",
    +                    "no_escape": true
    +                  }
    +                ]
    +              }
    +            ]
    +          },
    +          {
    +            "comment": "abc"
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset><noframes>abc</noframes></html><!--abc-->",
    +        "noQuirksBodyHtml": "<noframes>abc</noframes><!--abc-->"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><tr></tbody><tfoot>",
    +      "errors": [
    +        "(1,41): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "tfoot": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "tfoot"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr></tr></tbody><tfoot></tfoot></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr></tr></tbody><tfoot></tfoot></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><td><svg></svg>abc<td>",
    +      "errors": [
    +        "(1,26): unexpected-cell-in-table-body",
    +        "(1,44): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "svg",
    +                                    "ns": "http://www.w3.org/2000/svg"
    +                                  },
    +                                  {
    +                                    "text": "abc"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg></svg>abc</td><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><svg></svg>abc</td><td></td></tr></tbody></table>"
    +      }
    +    }
    +  ],
    +  "tests19.dat": [
    +    {
    +      "data": "<!doctype html><math><mn DefinitionUrl=\"foo\">",
    +      "errors": [
    +        "(1,45): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mn": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mn",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "definitionURL",
    +                            "value": "foo"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mn definitionURL=\"foo\"></mn></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mn definitionURL=\"foo\"></mn></math>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html></p><!--foo-->",
    +      "errors": [
    +        "(1,25): end-tag-after-implied-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "comment": "foo"
    +              },
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><!--foo--><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<p></p><!--foo-->"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><head></head></p><!--foo-->",
    +      "errors": [
    +        "(1,32): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "comment": "foo"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><!--foo--><body></body></html>",
    +        "noQuirksBodyHtml": "<p></p><!--foo-->"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><body><p><pre>",
    +      "errors": [
    +        "(1,29): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "pre": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "pre"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><pre></pre></body></html>",
    +        "noQuirksBodyHtml": "<p></p><pre></pre>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><body><p><listing>",
    +      "errors": [
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "listing": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "listing"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><listing></listing></body></html>",
    +        "noQuirksBodyHtml": "<p></p><listing></listing>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><plaintext>",
    +      "errors": [
    +        "(1,29): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "plaintext": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "plaintext"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><plaintext></plaintext></body></html>",
    +        "noQuirksBodyHtml": "<p></p><plaintext></plaintext>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><h1>",
    +      "errors": [
    +        "(1,22): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "h1": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "h1"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><h1></h1></body></html>",
    +        "noQuirksBodyHtml": "<p></p><h1></h1>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><form><isindex>",
    +      "errors": [
    +        "(1,30): deprecated-tag",
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><form></form></body></html>",
    +        "noQuirksBodyHtml": "<form></form>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><isindex action=\"POST\">",
    +      "errors": [
    +        "(1,38): deprecated-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "hr": true,
    +            "label": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "attrs": [
    +                      {
    +                        "name": "action",
    +                        "value": "POST"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "hr"
    +                      },
    +                      {
    +                        "tag": "label",
    +                        "children": [
    +                          {
    +                            "text": "This is a searchable index. Enter search keywords: "
    +                          },
    +                          {
    +                            "tag": "input",
    +                            "attrs": [
    +                              {
    +                                "name": "name",
    +                                "value": "isindex"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "hr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><form action=\"POST\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
    +        "noQuirksBodyHtml": "<form action=\"POST\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><isindex prompt=\"this is isindex\">",
    +      "errors": [
    +        "(1,49): deprecated-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "hr": true,
    +            "label": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "children": [
    +                      {
    +                        "tag": "hr"
    +                      },
    +                      {
    +                        "tag": "label",
    +                        "children": [
    +                          {
    +                            "text": "this is isindex"
    +                          },
    +                          {
    +                            "tag": "input",
    +                            "attrs": [
    +                              {
    +                                "name": "name",
    +                                "value": "isindex"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "hr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>this is isindex<input name=\"isindex\"></label><hr></form></body></html>",
    +        "noQuirksBodyHtml": "<form><hr><label>this is isindex<input name=\"isindex\"></label><hr></form>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><isindex type=\"hidden\">",
    +      "errors": [
    +        "(1,38): deprecated-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "hr": true,
    +            "label": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "children": [
    +                      {
    +                        "tag": "hr"
    +                      },
    +                      {
    +                        "tag": "label",
    +                        "children": [
    +                          {
    +                            "text": "This is a searchable index. Enter search keywords: "
    +                          },
    +                          {
    +                            "tag": "input",
    +                            "attrs": [
    +                              {
    +                                "name": "name",
    +                                "value": "isindex"
    +                              },
    +                              {
    +                                "name": "type",
    +                                "value": "hidden"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "hr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" type=\"hidden\"></label><hr></form></body></html>",
    +        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" type=\"hidden\"></label><hr></form>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><isindex name=\"foo\">",
    +      "errors": [
    +        "(1,35): deprecated-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "hr": true,
    +            "label": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "children": [
    +                      {
    +                        "tag": "hr"
    +                      },
    +                      {
    +                        "tag": "label",
    +                        "children": [
    +                          {
    +                            "text": "This is a searchable index. Enter search keywords: "
    +                          },
    +                          {
    +                            "tag": "input",
    +                            "attrs": [
    +                              {
    +                                "name": "name",
    +                                "value": "isindex"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "hr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form></body></html>",
    +        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><ruby><p><rp>",
    +      "errors": [
    +        "(1,28): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "p": true,
    +            "rp": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "tag": "p"
    +                      },
    +                      {
    +                        "tag": "rp"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><ruby><p></p><rp></rp></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby><p></p><rp></rp></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><ruby><div><span><rp>",
    +      "errors": [
    +        "(1,36): XXX-undefined-error",
    +        "(1,36): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "div": true,
    +            "span": true,
    +            "rp": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "span",
    +                            "children": [
    +                              {
    +                                "tag": "rp"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><ruby><div><span><rp></rp></span></div></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby><div><span><rp></rp></span></div></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><ruby><div><p><rp>",
    +      "errors": [
    +        "(1,33): XXX-undefined-error",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "div": true,
    +            "p": true,
    +            "rp": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "p"
    +                          },
    +                          {
    +                            "tag": "rp"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><ruby><div><p></p><rp></rp></div></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby><div><p></p><rp></rp></div></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><ruby><p><rt>",
    +      "errors": [
    +        "(1,28): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "p": true,
    +            "rt": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "tag": "p"
    +                      },
    +                      {
    +                        "tag": "rt"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><ruby><p></p><rt></rt></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby><p></p><rt></rt></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><ruby><div><span><rt>",
    +      "errors": [
    +        "(1,36): XXX-undefined-error",
    +        "(1,36): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "div": true,
    +            "span": true,
    +            "rt": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "span",
    +                            "children": [
    +                              {
    +                                "tag": "rt"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><ruby><div><span><rt></rt></span></div></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby><div><span><rt></rt></span></div></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><ruby><div><p><rt>",
    +      "errors": [
    +        "(1,33): XXX-undefined-error",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "div": true,
    +            "p": true,
    +            "rt": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "p"
    +                          },
    +                          {
    +                            "tag": "rt"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><ruby><div><p></p><rt></rt></div></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby><div><p></p><rt></rt></div></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rb>b<rt></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rb": true,
    +            "rt": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rb",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rt"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rb>b</rb><rt></rt></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rb>b</rb><rt></rt></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rp>b<rt></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rp": true,
    +            "rt": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rp",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rt"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rp>b</rp><rt></rt></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rp>b</rp><rt></rt></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rt>b<rt></ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rt": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rt",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rt"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rt>b</rt><rt></rt></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rt>b</rt><rt></rt></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><ruby>a<rtc>b<rt>c<rb>d</ruby></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "rtc": true,
    +            "rt": true,
    +            "rb": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "rtc",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          },
    +                          {
    +                            "tag": "rt",
    +                            "children": [
    +                              {
    +                                "text": "c"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "rb",
    +                        "children": [
    +                          {
    +                            "text": "d"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby>a<rtc>b<rt>c</rt></rtc><rb>d</rb></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby>a<rtc>b<rt>c</rt></rtc><rb>d</rb></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><math/><foo>",
    +      "errors": [
    +        "(1,27): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "foo": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  },
    +                  {
    +                    "tag": "foo"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math></math><foo></foo></body></html>",
    +        "noQuirksBodyHtml": "<math></math><foo></foo>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><svg/><foo>",
    +      "errors": [
    +        "(1,26): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "foo": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  },
    +                  {
    +                    "tag": "foo"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg></svg><foo></foo></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg><foo></foo>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><div></body><!--foo-->",
    +      "errors": [
    +        "(1,27): expected-one-end-tag-but-got-another"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              },
    +              {
    +                "comment": "foo"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><div></div></body><!--foo--></html>",
    +        "noQuirksBodyHtml": "<div><!--foo--></div>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><h1><div><h3><span></h1>foo",
    +      "errors": [
    +        "(1,39): end-tag-too-early",
    +        "(1,42): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "h1": true,
    +            "div": true,
    +            "h3": true,
    +            "span": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "h1",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "h3",
    +                            "children": [
    +                              {
    +                                "tag": "span"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><h1><div><h3><span></span></h3>foo</div></h1></body></html>",
    +        "noQuirksBodyHtml": "<h1><div><h3><span></span></h3>foo</div></h1>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p></h3>foo",
    +      "errors": [
    +        "(1,23): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p>foo</p></body></html>",
    +        "noQuirksBodyHtml": "<p>foo</p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><h3><li>abc</h2>foo",
    +      "errors": [
    +        "(1,31): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "h3": true,
    +            "li": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "h3",
    +                    "children": [
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "text": "abc"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "foo"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><h3><li>abc</li></h3>foo</body></html>",
    +        "noQuirksBodyHtml": "<h3><li>abc</li></h3>foo"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table>abc<!--foo-->",
    +      "errors": [
    +        "(1,23): foster-parenting-character",
    +        "(1,24): foster-parenting-character",
    +        "(1,25): foster-parenting-character",
    +        "(1,35): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "abc"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "comment": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>abc<table><!--foo--></table></body></html>",
    +        "noQuirksBodyHtml": "abc<table><!--foo--></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table>  <!--foo-->",
    +      "errors": [
    +        "(1,34): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "text": "  "
    +                      },
    +                      {
    +                        "comment": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table>  <!--foo--></table></body></html>",
    +        "noQuirksBodyHtml": "<table>  <!--foo--></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table> b <!--foo-->",
    +      "errors": [
    +        "(1,23): foster-parenting-character",
    +        "(1,24): foster-parenting-character",
    +        "(1,25): foster-parenting-character",
    +        "(1,35): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": " b "
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "comment": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body> b <table><!--foo--></table></body></html>",
    +        "noQuirksBodyHtml": " b <table><!--foo--></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><option><option>",
    +      "errors": [
    +        "(1,39): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      },
    +                      {
    +                        "tag": "option"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><option></option><option></option></select></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option><option></option></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><option></optgroup>",
    +      "errors": [
    +        "(1,42): unexpected-end-tag-in-select",
    +        "(1,42): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><option></option></select></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><option></optgroup>",
    +      "errors": [
    +        "(1,42): unexpected-end-tag-in-select",
    +        "(1,42): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><option></option></select></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><dd><optgroup><dd>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "dd": true,
    +            "optgroup": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "dd",
    +                    "children": [
    +                      {
    +                        "tag": "optgroup"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "dd"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><dd><optgroup></optgroup></dd><dd></dd></body></html>",
    +        "noQuirksBodyHtml": "<dd><optgroup></optgroup></dd><dd></dd>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><math><mi><p><h1>",
    +      "errors": [
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "math math": true,
    +            "math mi": true,
    +            "h1": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "math",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mi",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              },
    +                              {
    +                                "tag": "h1"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><math><mi><p></p><h1></h1></mi></math></p></body></html>",
    +        "noQuirksBodyHtml": "<p><math><mi><p></p><h1></h1></mi></math></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><math><mo><p><h1>",
    +      "errors": [
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "math math": true,
    +            "math mo": true,
    +            "h1": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "math",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mo",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              },
    +                              {
    +                                "tag": "h1"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><math><mo><p></p><h1></h1></mo></math></p></body></html>",
    +        "noQuirksBodyHtml": "<p><math><mo><p></p><h1></h1></mo></math></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><math><mn><p><h1>",
    +      "errors": [
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "math math": true,
    +            "math mn": true,
    +            "h1": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "math",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mn",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              },
    +                              {
    +                                "tag": "h1"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><math><mn><p></p><h1></h1></mn></math></p></body></html>",
    +        "noQuirksBodyHtml": "<p><math><mn><p></p><h1></h1></mn></math></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><math><ms><p><h1>",
    +      "errors": [
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "math math": true,
    +            "math ms": true,
    +            "h1": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "math",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "ms",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              },
    +                              {
    +                                "tag": "h1"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><math><ms><p></p><h1></h1></ms></math></p></body></html>",
    +        "noQuirksBodyHtml": "<p><math><ms><p></p><h1></h1></ms></math></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><math><mtext><p><h1>",
    +      "errors": [
    +        "(1,38): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "math math": true,
    +            "math mtext": true,
    +            "h1": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "math",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mtext",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              },
    +                              {
    +                                "tag": "h1"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><math><mtext><p></p><h1></h1></mtext></math></p></body></html>",
    +        "noQuirksBodyHtml": "<p><math><mtext><p></p><h1></h1></mtext></math></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><frameset></noframes>",
    +      "errors": [
    +        "(1,36): unexpected-end-tag-in-frameset",
    +        "(1,36): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html c=d><body></html><html a=b>",
    +      "errors": [
    +        "(1,48): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "a",
    +                "value": "b"
    +              },
    +              {
    +                "name": "c",
    +                "value": "d"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html c=\"d\" a=\"b\"><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html c=d><frameset></frameset></html><html a=b>",
    +      "errors": [
    +        "(1,63): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "a",
    +                "value": "b"
    +              },
    +              {
    +                "name": "c",
    +                "value": "d"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html c=\"d\" a=\"b\"><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html><frameset></frameset></html><!--foo-->",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          },
    +          {
    +            "comment": "foo"
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html><!--foo-->",
    +        "noQuirksBodyHtml": "<!--foo-->"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html><frameset></frameset></html>  ",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "text": "  "
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset>  </html>",
    +        "noQuirksBodyHtml": "  "
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html><frameset></frameset></html>abc",
    +      "errors": [
    +        "(1,50): expected-eof-but-got-char",
    +        "(1,51): expected-eof-but-got-char",
    +        "(1,52): expected-eof-but-got-char"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "abc"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html><frameset></frameset></html><p>",
    +      "errors": [
    +        "(1,52): expected-eof-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<p></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html><frameset></frameset></html></p>",
    +      "errors": [
    +        "(1,53): expected-eof-but-got-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<p></p>"
    +      }
    +    },
    +    {
    +      "data": "<html><frameset></frameset></html><!doctype html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,49): unexpected-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><body><frameset>",
    +      "errors": [
    +        "(1,31): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><frameset><frame>",
    +      "errors": [
    +        "(1,28): unexpected-start-tag",
    +        "(1,35): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "frame": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "tag": "frame"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
    +        "noQuirksBodyHtml": "<p></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p>a<frameset>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p>a</p></body></html>",
    +        "noQuirksBodyHtml": "<p>a</p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p> <frameset><frame>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag",
    +        "(1,36): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "frame": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "tag": "frame"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
    +        "noQuirksBodyHtml": "<p> </p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><pre><frameset>",
    +      "errors": [
    +        "(1,30): unexpected-start-tag",
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre></pre></body></html>",
    +        "noQuirksBodyHtml": "<pre></pre>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><listing><frameset>",
    +      "errors": [
    +        "(1,34): unexpected-start-tag",
    +        "(1,34): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "listing": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "listing"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><listing></listing></body></html>",
    +        "noQuirksBodyHtml": "<listing></listing>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><li><frameset>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "li": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "li"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><li></li></body></html>",
    +        "noQuirksBodyHtml": "<li></li>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><dd><frameset>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "dd": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "dd"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><dd></dd></body></html>",
    +        "noQuirksBodyHtml": "<dd></dd>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><dt><frameset>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "dt": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "dt"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><dt></dt></body></html>",
    +        "noQuirksBodyHtml": "<dt></dt>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><button><frameset>",
    +      "errors": [
    +        "(1,33): unexpected-start-tag",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "button": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "button"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><button></button></body></html>",
    +        "noQuirksBodyHtml": "<button></button>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><applet><frameset>",
    +      "errors": [
    +        "(1,33): unexpected-start-tag",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "applet": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "applet"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><applet></applet></body></html>",
    +        "noQuirksBodyHtml": "<applet></applet>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><marquee><frameset>",
    +      "errors": [
    +        "(1,34): unexpected-start-tag",
    +        "(1,34): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "marquee": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "marquee"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><marquee></marquee></body></html>",
    +        "noQuirksBodyHtml": "<marquee></marquee>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><object><frameset>",
    +      "errors": [
    +        "(1,33): unexpected-start-tag",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "object": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "object"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><object></object></body></html>",
    +        "noQuirksBodyHtml": "<object></object>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><frameset>",
    +      "errors": [
    +        "(1,32): unexpected-start-tag-implies-table-voodoo",
    +        "(1,32): unexpected-start-tag",
    +        "(1,32): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table></table></body></html>",
    +        "noQuirksBodyHtml": "<table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><area><frameset>",
    +      "errors": [
    +        "(1,31): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "area": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "area"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><area></body></html>",
    +        "noQuirksBodyHtml": "<area>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><basefont><frameset>",
    +      "errors": [
    +        "(1,35): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "basefont": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "basefont"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><basefont></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<basefont>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><bgsound><frameset>",
    +      "errors": [
    +        "(1,34): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "bgsound": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "bgsound"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><bgsound></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<bgsound>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><br><frameset>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "br": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "br"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><br></body></html>",
    +        "noQuirksBodyHtml": "<br>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><embed><frameset>",
    +      "errors": [
    +        "(1,32): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "embed": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "embed"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><embed></body></html>",
    +        "noQuirksBodyHtml": "<embed>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><img><frameset>",
    +      "errors": [
    +        "(1,30): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "img": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "img"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><img></body></html>",
    +        "noQuirksBodyHtml": "<img>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><input><frameset>",
    +      "errors": [
    +        "(1,32): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "input"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><input></body></html>",
    +        "noQuirksBodyHtml": "<input>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><keygen><frameset>",
    +      "errors": [
    +        "(1,33): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "keygen": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "keygen"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><keygen></body></html>",
    +        "noQuirksBodyHtml": "<keygen>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><wbr><frameset>",
    +      "errors": [
    +        "(1,30): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "wbr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "wbr"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><wbr></body></html>",
    +        "noQuirksBodyHtml": "<wbr>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><hr><frameset>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "hr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "hr"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><hr></body></html>",
    +        "noQuirksBodyHtml": "<hr>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><textarea></textarea><frameset>",
    +      "errors": [
    +        "(1,46): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><textarea></textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea></textarea>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><xmp></xmp><frameset>",
    +      "errors": [
    +        "(1,36): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "xmp": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "xmp"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><xmp></xmp></body></html>",
    +        "noQuirksBodyHtml": "<xmp></xmp>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><iframe></iframe><frameset>",
    +      "errors": [
    +        "(1,42): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "iframe": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "iframe"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><iframe></iframe></body></html>",
    +        "noQuirksBodyHtml": "<iframe></iframe>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select></select><frameset>",
    +      "errors": [
    +        "(1,42): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><svg></svg><frameset><frame>",
    +      "errors": [
    +        "(1,36): unexpected-start-tag",
    +        "(1,43): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "frame": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "tag": "frame"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
    +        "noQuirksBodyHtml": "<svg></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><math></math><frameset><frame>",
    +      "errors": [
    +        "(1,38): unexpected-start-tag",
    +        "(1,45): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "frame": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "tag": "frame"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
    +        "noQuirksBodyHtml": "<math></math>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><svg><foreignObject><div> <frameset><frame>",
    +      "errors": [
    +        "(1,51): unexpected-start-tag",
    +        "(1,58): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "frame": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "tag": "frame"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
    +        "noQuirksBodyHtml": "<svg><foreignObject><div> </div></foreignObject></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><svg>a</svg><frameset><frame>",
    +      "errors": [
    +        "(1,37): unexpected-start-tag",
    +        "(1,44): unexpected-start-tag-ignored"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg>a</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>a</svg>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><svg> </svg><frameset><frame>",
    +      "errors": [
    +        "(1,37): unexpected-start-tag",
    +        "(1,44): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "frame": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "tag": "frame"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset><frame></frameset></html>",
    +        "noQuirksBodyHtml": "<svg> </svg>"
    +      }
    +    },
    +    {
    +      "data": "<html>aaa<frameset></frameset>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,19): unexpected-start-tag",
    +        "(1,30): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "aaa"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>aaa</body></html>",
    +        "noQuirksBodyHtml": "aaa"
    +      }
    +    },
    +    {
    +      "data": "<html> a <frameset></frameset>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,19): unexpected-start-tag",
    +        "(1,30): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "a "
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>a </body></html>",
    +        "noQuirksBodyHtml": " a "
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><div><frameset>",
    +      "errors": [
    +        "(1,30): unexpected-start-tag",
    +        "(1,30): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><div><body><frameset>",
    +      "errors": [
    +        "(1,26): unexpected-start-tag",
    +        "(1,36): unexpected-start-tag",
    +        "(1,36): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><div></div></body></html>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><math></p>a",
    +      "errors": [
    +        "(1,28): unexpected-end-tag",
    +        "(1,28): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "math math": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "math",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "a"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><math></math></p>a</body></html>",
    +        "noQuirksBodyHtml": "<p><math></math></p>a"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><math><mn><span></p>a",
    +      "errors": [
    +        "(1,38): unexpected-end-tag",
    +        "(1,39): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "math math": true,
    +            "math mn": true,
    +            "span": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "math",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mn",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "span",
    +                                "children": [
    +                                  {
    +                                    "tag": "p"
    +                                  },
    +                                  {
    +                                    "text": "a"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><math><mn><span><p></p>a</span></mn></math></p></body></html>",
    +        "noQuirksBodyHtml": "<p><math><mn><span><p></p>a</span></mn></math></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><math></html>",
    +      "errors": [
    +        "(1,28): unexpected-end-tag",
    +        "(1,28): expected-one-end-tag-but-got-another",
    +        "(1,28): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math></math></body></html>",
    +        "noQuirksBodyHtml": "<math></math>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><meta charset=\"ascii\">",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "meta": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "meta",
    +                    "attrs": [
    +                      {
    +                        "name": "charset",
    +                        "value": "ascii"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><meta charset=\"ascii\"></head><body></body></html>",
    +        "noQuirksBodyHtml": "<meta charset=\"ascii\">"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><meta http-equiv=\"content-type\" content=\"text/html;charset=ascii\">",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "meta": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "meta",
    +                    "attrs": [
    +                      {
    +                        "name": "content",
    +                        "value": "text/html;charset=ascii"
    +                      },
    +                      {
    +                        "name": "http-equiv",
    +                        "value": "content-type"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><meta http-equiv=\"content-type\" content=\"text/html;charset=ascii\"></head><body></body></html>",
    +        "noQuirksBodyHtml": "<meta http-equiv=\"content-type\" content=\"text/html;charset=ascii\">"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset=\"utf8\">",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "meta": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "comment": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    +                  },
    +                  {
    +                    "tag": "meta",
    +                    "attrs": [
    +                      {
    +                        "name": "charset",
    +                        "value": "utf8"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset=\"utf8\"></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa--><meta charset=\"utf8\">"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html a=b><head></head><html c=d>",
    +      "errors": [
    +        "(1,48): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "a",
    +                "value": "b"
    +              },
    +              {
    +                "name": "c",
    +                "value": "d"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html a=\"b\" c=\"d\"><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><image/>",
    +      "errors": [
    +        "(1,23): image-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "img": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "img"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><img></body></html>",
    +        "noQuirksBodyHtml": "<img>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html>a<i>b<table>c<b>d</i>e</b>f",
    +      "errors": [
    +        "(1,28): foster-parenting-character",
    +        "(1,31): foster-parenting-start-tag",
    +        "(1,32): foster-parenting-character",
    +        "(1,36): foster-parenting-end-tag",
    +        "(1,36): adoption-agency-1.3",
    +        "(1,37): foster-parenting-character",
    +        "(1,41): foster-parenting-end-tag",
    +        "(1,42): foster-parenting-character",
    +        "(1,42): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "i": true,
    +            "b": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "a"
    +                  },
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "text": "bc"
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "de"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "f"
    +                      },
    +                      {
    +                        "tag": "table"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>a<i>bc<b>de</b>f<table></table></i></body></html>",
    +        "noQuirksBodyHtml": "a<i>bc<b>de</b>f<table></table></i>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f",
    +      "errors": [
    +        "(1,25): foster-parenting-start-tag",
    +        "(1,26): foster-parenting-character",
    +        "(1,29): foster-parenting-start-tag",
    +        "(1,30): foster-parenting-character",
    +        "(1,35): foster-parenting-start-tag",
    +        "(1,36): foster-parenting-character",
    +        "(1,39): foster-parenting-start-tag",
    +        "(1,40): foster-parenting-character",
    +        "(1,44): foster-parenting-end-tag",
    +        "(1,44): adoption-agency-1.3",
    +        "(1,44): adoption-agency-1.3",
    +        "(1,45): foster-parenting-character",
    +        "(1,49): foster-parenting-end-tag",
    +        "(1,49): adoption-agency-1.3",
    +        "(1,49): adoption-agency-1.3",
    +        "(1,50): foster-parenting-character",
    +        "(1,50): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "i": true,
    +            "b": true,
    +            "div": true,
    +            "a": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "c"
    +                              },
    +                              {
    +                                "tag": "a",
    +                                "children": [
    +                                  {
    +                                    "text": "d"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "a",
    +                            "children": [
    +                              {
    +                                "text": "e"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "f"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div><table></table></body></html>",
    +        "noQuirksBodyHtml": "<i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><i>a<b>b<div>c<a>d</i>e</b>f",
    +      "errors": [
    +        "(1,37): adoption-agency-1.3",
    +        "(1,37): adoption-agency-1.3",
    +        "(1,42): adoption-agency-1.3",
    +        "(1,42): adoption-agency-1.3",
    +        "(1,43): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "i": true,
    +            "b": true,
    +            "div": true,
    +            "a": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "c"
    +                              },
    +                              {
    +                                "tag": "a",
    +                                "children": [
    +                                  {
    +                                    "text": "d"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "a",
    +                            "children": [
    +                              {
    +                                "text": "e"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "f"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div></body></html>",
    +        "noQuirksBodyHtml": "<i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><i>a<b>b<div>c</i>",
    +      "errors": [
    +        "(1,25): foster-parenting-start-tag",
    +        "(1,26): foster-parenting-character",
    +        "(1,29): foster-parenting-start-tag",
    +        "(1,30): foster-parenting-character",
    +        "(1,35): foster-parenting-start-tag",
    +        "(1,36): foster-parenting-character",
    +        "(1,40): foster-parenting-end-tag",
    +        "(1,40): adoption-agency-1.3",
    +        "(1,40): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "i": true,
    +            "b": true,
    +            "div": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "c"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><i>a<b>b</b></i><b><div><i>c</i></div></b><table></table></body></html>",
    +        "noQuirksBodyHtml": "<i>a<b>b</b></i><b><div><i>c</i></div></b><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><i>a<b>b<div>c<a>d</i>e</b>f",
    +      "errors": [
    +        "(1,25): foster-parenting-start-tag",
    +        "(1,26): foster-parenting-character",
    +        "(1,29): foster-parenting-start-tag",
    +        "(1,30): foster-parenting-character",
    +        "(1,35): foster-parenting-start-tag",
    +        "(1,36): foster-parenting-character",
    +        "(1,39): foster-parenting-start-tag",
    +        "(1,40): foster-parenting-character",
    +        "(1,44): foster-parenting-end-tag",
    +        "(1,44): adoption-agency-1.3",
    +        "(1,44): adoption-agency-1.3",
    +        "(1,45): foster-parenting-character",
    +        "(1,49): foster-parenting-end-tag",
    +        "(1,44): adoption-agency-1.3",
    +        "(1,44): adoption-agency-1.3",
    +        "(1,50): foster-parenting-character",
    +        "(1,50): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "i": true,
    +            "b": true,
    +            "div": true,
    +            "a": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "c"
    +                              },
    +                              {
    +                                "tag": "a",
    +                                "children": [
    +                                  {
    +                                    "text": "d"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "a",
    +                            "children": [
    +                              {
    +                                "text": "e"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "f"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div><table></table></body></html>",
    +        "noQuirksBodyHtml": "<i>a<b>b</b></i><b></b><div><b><i>c<a>d</a></i><a>e</a></b><a>f</a></div><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><i>a<div>b<tr>c<b>d</i>e",
    +      "errors": [
    +        "(1,25): foster-parenting-start-tag",
    +        "(1,26): foster-parenting-character",
    +        "(1,31): foster-parenting-start-tag",
    +        "(1,32): foster-parenting-character",
    +        "(1,37): foster-parenting-character",
    +        "(1,40): foster-parenting-start-tag",
    +        "(1,41): foster-parenting-character",
    +        "(1,45): foster-parenting-end-tag",
    +        "(1,45): adoption-agency-1.3",
    +        "(1,46): foster-parenting-character",
    +        "(1,46): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "i": true,
    +            "div": true,
    +            "b": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "text": "c"
    +                      },
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "d"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "e"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><i>a<div>b</div></i><i>c<b>d</b></i><b>e</b><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<i>a<div>b</div></i><i>c<b>d</b></i><b>e</b><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><td><table><i>a<div>b<b>c</i>d",
    +      "errors": [
    +        "(1,26): unexpected-cell-in-table-body",
    +        "(1,36): foster-parenting-start-tag",
    +        "(1,37): foster-parenting-character",
    +        "(1,42): foster-parenting-start-tag",
    +        "(1,43): foster-parenting-character",
    +        "(1,46): foster-parenting-start-tag",
    +        "(1,47): foster-parenting-character",
    +        "(1,51): foster-parenting-end-tag",
    +        "(1,51): adoption-agency-1.3",
    +        "(1,51): adoption-agency-1.3",
    +        "(1,52): foster-parenting-character",
    +        "(1,52): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "i": true,
    +            "div": true,
    +            "b": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "i",
    +                                    "children": [
    +                                      {
    +                                        "text": "a"
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "tag": "div",
    +                                    "children": [
    +                                      {
    +                                        "tag": "i",
    +                                        "children": [
    +                                          {
    +                                            "text": "b"
    +                                          },
    +                                          {
    +                                            "tag": "b",
    +                                            "children": [
    +                                              {
    +                                                "text": "c"
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "b",
    +                                        "children": [
    +                                          {
    +                                            "text": "d"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "tag": "table"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><i>a</i><div><i>b<b>c</b></i><b>d</b></div><table></table></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><i>a</i><div><i>b<b>c</b></i><b>d</b></div><table></table></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><body><bgsound>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "bgsound": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "bgsound"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><bgsound></body></html>",
    +        "noQuirksBodyHtml": "<bgsound>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><body><basefont>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "basefont": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "basefont"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><basefont></body></html>",
    +        "noQuirksBodyHtml": "<basefont>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><a><b></a><basefont>",
    +      "errors": [
    +        "(1,25): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "b": true,
    +            "basefont": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "basefont"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><a><b></b></a><basefont></body></html>",
    +        "noQuirksBodyHtml": "<a><b></b></a><basefont>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><a><b></a><bgsound>",
    +      "errors": [
    +        "(1,25): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "b": true,
    +            "bgsound": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "bgsound"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><a><b></b></a><bgsound></body></html>",
    +        "noQuirksBodyHtml": "<a><b></b></a><bgsound>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><figcaption><article></figcaption>a",
    +      "errors": [
    +        "(1,49): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "figcaption": true,
    +            "article": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "figcaption",
    +                    "children": [
    +                      {
    +                        "tag": "article"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "a"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><figcaption><article></article></figcaption>a</body></html>",
    +        "noQuirksBodyHtml": "<figcaption><article></article></figcaption>a"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><summary><article></summary>a",
    +      "errors": [
    +        "(1,43): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "summary": true,
    +            "article": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "summary",
    +                    "children": [
    +                      {
    +                        "tag": "article"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "a"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><summary><article></article></summary>a</body></html>",
    +        "noQuirksBodyHtml": "<summary><article></article></summary>a"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><a><plaintext>b",
    +      "errors": [
    +        "(1,32): unexpected-end-tag",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "a": true,
    +            "plaintext": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "plaintext",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><a></a></p><plaintext><a>b</a></plaintext></body></html>",
    +        "noQuirksBodyHtml": "<p><a></a></p><plaintext><a>b</a></plaintext>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><div>a<a></div>b<p>c</p>d",
    +      "errors": [
    +        "(1,30): end-tag-too-early",
    +        "(1,40): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "a": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "a"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "b"
    +                      },
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "text": "c"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "d"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><div>a<a></a></div><a>b<p>c</p>d</a></body></html>",
    +        "noQuirksBodyHtml": "<div>a<a></a></div><a>b<p>c</p>d</a>"
    +      }
    +    }
    +  ],
    +  "tests2.dat": [
    +    {
    +      "data": "<!DOCTYPE html>Test",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Test"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>Test</body></html>",
    +        "noQuirksBodyHtml": "Test"
    +      }
    +    },
    +    {
    +      "data": "<textarea>test</div>test",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,24): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "test</div>test",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><textarea>test&lt;/div&gt;test</textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea>test&lt;/div&gt;test</textarea>"
    +      }
    +    },
    +    {
    +      "data": "<table><td>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,11): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><td>test</tbody></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "test"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td>test</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td>test</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<frame>test",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,7): unexpected-start-tag-ignored"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "test"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>test</body></html>",
    +        "noQuirksBodyHtml": "test"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><frameset>test",
    +      "errors": [
    +        "(1,29): unexpected-char-in-frameset",
    +        "(1,29): unexpected-char-in-frameset",
    +        "(1,29): unexpected-char-in-frameset",
    +        "(1,29): unexpected-char-in-frameset",
    +        "(1,29): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "test"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><frameset> te st",
    +      "errors": [
    +        "(1,29): unexpected-char-in-frameset",
    +        "(1,29): unexpected-char-in-frameset",
    +        "(1,29): unexpected-char-in-frameset",
    +        "(1,29): unexpected-char-in-frameset",
    +        "(1,29): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "text": "  "
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset>  </frameset></html>",
    +        "noQuirksBodyHtml": " te st"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><frameset></frameset> te st",
    +      "errors": [
    +        "(1,29): unexpected-char-after-frameset",
    +        "(1,29): unexpected-char-after-frameset",
    +        "(1,29): unexpected-char-after-frameset",
    +        "(1,29): unexpected-char-after-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "text": "  "
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset>  </html>",
    +        "noQuirksBodyHtml": " te st"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><frameset><!DOCTYPE html>",
    +      "errors": [
    +        "(1,40): unexpected-doctype",
    +        "(1,40): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><font><p><b>test</font>",
    +      "errors": [
    +        "(1,38): adoption-agency-1.3",
    +        "(1,38): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "font": true,
    +            "p": true,
    +            "b": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "font"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "text": "test"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><font></font><p><font><b>test</b></font></p></body></html>",
    +        "noQuirksBodyHtml": "<font></font><p><font><b>test</b></font></p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><dt><div><dd>",
    +      "errors": [
    +        "(1,28): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "dt": true,
    +            "div": true,
    +            "dd": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "dt",
    +                    "children": [
    +                      {
    +                        "tag": "div"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "dd"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><dt><div></div></dt><dd></dd></body></html>",
    +        "noQuirksBodyHtml": "<dt><div></div></dt><dd></dd>"
    +      }
    +    },
    +    {
    +      "data": "<script></x",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,11): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "</x",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></x</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></x</script>"
    +      }
    +    },
    +    {
    +      "data": "<table><plaintext><td>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,18): unexpected-start-tag-implies-table-voodoo",
    +        "(1,22): foster-parenting-character-in-table",
    +        "(1,22): foster-parenting-character-in-table",
    +        "(1,22): foster-parenting-character-in-table",
    +        "(1,22): foster-parenting-character-in-table",
    +        "(1,22): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "plaintext": true,
    +            "table": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "plaintext",
    +                    "children": [
    +                      {
    +                        "text": "<td>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><plaintext><td></plaintext><table></table></body></html>",
    +        "noQuirksBodyHtml": "<plaintext><td></plaintext><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<plaintext></plaintext>",
    +      "errors": [
    +        "(1,11): expected-doctype-but-got-start-tag",
    +        "(1,23): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "plaintext": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "plaintext",
    +                    "children": [
    +                      {
    +                        "text": "</plaintext>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><plaintext></plaintext></plaintext></body></html>",
    +        "noQuirksBodyHtml": "<plaintext></plaintext></plaintext>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><table><tr>TEST",
    +      "errors": [
    +        "(1,30): foster-parenting-character-in-table",
    +        "(1,30): foster-parenting-character-in-table",
    +        "(1,30): foster-parenting-character-in-table",
    +        "(1,30): foster-parenting-character-in-table",
    +        "(1,30): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "TEST"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>TEST<table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "TEST<table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body t1=1><body t2=2><body t3=3 t4=4>",
    +      "errors": [
    +        "(1,37): unexpected-start-tag",
    +        "(1,53): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "t1",
    +                    "value": "1"
    +                  },
    +                  {
    +                    "name": "t2",
    +                    "value": "2"
    +                  },
    +                  {
    +                    "name": "t3",
    +                    "value": "3"
    +                  },
    +                  {
    +                    "name": "t4",
    +                    "value": "4"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body t1=\"1\" t2=\"2\" t3=\"3\" t4=\"4\"></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "</b test",
    +      "errors": [
    +        "(1,8): eof-in-attribute-name",
    +        "(1,8): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html></b test<b &=&amp>X",
    +      "errors": [
    +        "(1,24): invalid-character-in-attribute-name",
    +        "(1,32): named-entity-without-semicolon",
    +        "(1,33): attributes-in-end-tag",
    +        "(1,33): unexpected-end-tag-before-html"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "<!doctypehtml><scrIPt type=text/x-foobar;baz>X</SCRipt",
    +      "errors": [
    +        "(1,9): need-space-after-doctype",
    +        "(1,54): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "text/x-foobar;baz"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "X</SCRipt",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script type=\"text/x-foobar;baz\">X</SCRipt</script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script type=\"text/x-foobar;baz\">X</SCRipt</script>"
    +      }
    +    },
    +    {
    +      "data": "&",
    +      "errors": [
    +        "(1,1): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "&",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&amp;</body></html>",
    +        "noQuirksBodyHtml": "&amp;"
    +      }
    +    },
    +    {
    +      "data": "&#",
    +      "errors": [
    +        "(1,2): expected-numeric-entity",
    +        "(1,2): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "&#",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&amp;#</body></html>",
    +        "noQuirksBodyHtml": "&amp;#"
    +      }
    +    },
    +    {
    +      "data": "&#X",
    +      "errors": [
    +        "(1,3): expected-numeric-entity",
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "&#X",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&amp;#X</body></html>",
    +        "noQuirksBodyHtml": "&amp;#X"
    +      }
    +    },
    +    {
    +      "data": "&#x",
    +      "errors": [
    +        "(1,3): expected-numeric-entity",
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "&#x",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&amp;#x</body></html>",
    +        "noQuirksBodyHtml": "&amp;#x"
    +      }
    +    },
    +    {
    +      "data": "&#45",
    +      "errors": [
    +        "(1,4): numeric-entity-without-semicolon",
    +        "(1,4): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>-</body></html>",
    +        "noQuirksBodyHtml": "-"
    +      }
    +    },
    +    {
    +      "data": "&x-test",
    +      "errors": [
    +        "(1,2): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "&x-test",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&amp;x-test</body></html>",
    +        "noQuirksBodyHtml": "&amp;x-test"
    +      }
    +    },
    +    {
    +      "data": "<!doctypehtml><p><li>",
    +      "errors": [
    +        "(1,9): need-space-after-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "li": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "li"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><li></li></body></html>",
    +        "noQuirksBodyHtml": "<p></p><li></li>"
    +      }
    +    },
    +    {
    +      "data": "<!doctypehtml><p><dt>",
    +      "errors": [
    +        "(1,9): need-space-after-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "dt": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "dt"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><dt></dt></body></html>",
    +        "noQuirksBodyHtml": "<p></p><dt></dt>"
    +      }
    +    },
    +    {
    +      "data": "<!doctypehtml><p><dd>",
    +      "errors": [
    +        "(1,9): need-space-after-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "dd": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "dd"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><dd></dd></body></html>",
    +        "noQuirksBodyHtml": "<p></p><dd></dd>"
    +      }
    +    },
    +    {
    +      "data": "<!doctypehtml><p><form>",
    +      "errors": [
    +        "(1,9): need-space-after-doctype",
    +        "(1,23): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "form": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "form"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><form></form></body></html>",
    +        "noQuirksBodyHtml": "<p></p><form></form>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><p></P>X",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p>X</body></html>",
    +        "noQuirksBodyHtml": "<p></p>X"
    +      }
    +    },
    +    {
    +      "data": "&AMP",
    +      "errors": [
    +        "(1,4): named-entity-without-semicolon",
    +        "(1,4): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "&",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&amp;</body></html>",
    +        "noQuirksBodyHtml": "&amp;"
    +      }
    +    },
    +    {
    +      "data": "&AMp;",
    +      "errors": [
    +        "(1,3): expected-named-entity",
    +        "(1,3): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "&AMp;",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&amp;AMp;</body></html>",
    +        "noQuirksBodyHtml": "&amp;AMp;"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><head></head><body><thisISasillyTESTelementNameToMakeSureCrazyTagNamesArePARSEDcorrectLY>",
    +      "errors": [
    +        "(1,110): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly></thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly></body></html>",
    +        "noQuirksBodyHtml": "<thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly></thisisasillytestelementnametomakesurecrazytagnamesareparsedcorrectly>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>X</body>X",
    +      "errors": [
    +        "(1,24): unexpected-char-after-body"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "XX"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>XX</body></html>",
    +        "noQuirksBodyHtml": "XX"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><!-- X",
    +      "errors": [
    +        "(1,21): eof-in-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "comment": " X"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><!-- X--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!-- X-->"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><table><caption>test TEST</caption><td>test",
    +      "errors": [
    +        "(1,54): unexpected-cell-in-table-body",
    +        "(1,58): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "text": "test TEST"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "test"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption>test TEST</caption><tbody><tr><td>test</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption>test TEST</caption><tbody><tr><td>test</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><select><option><optgroup>",
    +      "errors": [
    +        "(1,41): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true,
    +            "optgroup": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      },
    +                      {
    +                        "tag": "optgroup"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><option></option><optgroup></optgroup></select></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option><optgroup></optgroup></select>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><select><optgroup><option></optgroup><option><select><option>",
    +      "errors": [
    +        "(1,68): unexpected-select-in-select",
    +        "(1,76): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "optgroup": true,
    +            "option": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "optgroup",
    +                        "children": [
    +                          {
    +                            "tag": "option"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "option"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "option"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><optgroup><option></option></optgroup><option></option></select><option></option></body></html>",
    +        "noQuirksBodyHtml": "<select><optgroup><option></option></optgroup><option></option></select><option></option>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><select><optgroup><option><optgroup>",
    +      "errors": [
    +        "(1,51): eof-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "optgroup": true,
    +            "option": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "optgroup",
    +                        "children": [
    +                          {
    +                            "tag": "option"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "optgroup"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><optgroup><option></option></optgroup><optgroup></optgroup></select></body></html>",
    +        "noQuirksBodyHtml": "<select><optgroup><option></option></optgroup><optgroup></optgroup></select>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><datalist><option>foo</datalist>bar",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "datalist": true,
    +            "option": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "datalist",
    +                    "children": [
    +                      {
    +                        "tag": "option",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "bar"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><datalist><option>foo</option></datalist>bar</body></html>",
    +        "noQuirksBodyHtml": "<datalist><option>foo</option></datalist>bar"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><font><input><input></font>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "font": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "font",
    +                    "children": [
    +                      {
    +                        "tag": "input"
    +                      },
    +                      {
    +                        "tag": "input"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><font><input><input></font></body></html>",
    +        "noQuirksBodyHtml": "<font><input><input></font>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><!-- XXX - XXX -->",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "comment": " XXX - XXX "
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><!-- XXX - XXX --><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!-- XXX - XXX -->"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><!-- XXX - XXX",
    +      "errors": [
    +        "(1,29): eof-in-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "comment": " XXX - XXX"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><!-- XXX - XXX--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!-- XXX - XXX-->"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><!-- XXX - XXX - XXX -->",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "comment": " XXX - XXX - XXX "
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><!-- XXX - XXX - XXX --><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!-- XXX - XXX - XXX -->"
    +      }
    +    },
    +    {
    +      "data": "<isindex test=x name=x>",
    +      "errors": [
    +        "(1,23): expected-doctype-but-got-start-tag",
    +        "(1,23): deprecated-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "hr": true,
    +            "label": true,
    +            "input": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "children": [
    +                      {
    +                        "tag": "hr"
    +                      },
    +                      {
    +                        "tag": "label",
    +                        "children": [
    +                          {
    +                            "text": "This is a searchable index. Enter search keywords: "
    +                          },
    +                          {
    +                            "tag": "input",
    +                            "attrs": [
    +                              {
    +                                "name": "name",
    +                                "value": "isindex"
    +                              },
    +                              {
    +                                "name": "test",
    +                                "value": "x"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "hr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" test=\"x\"></label><hr></form></body></html>",
    +        "noQuirksBodyHtml": "<form><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\" test=\"x\"></label><hr></form>"
    +      }
    +    },
    +    {
    +      "data": "test\ntest",
    +      "errors": [
    +        "(2,4): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "test\ntest"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>test\ntest</body></html>",
    +        "noQuirksBodyHtml": "test\ntest"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><title>test</body></title>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "title": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "test</body>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><title>test&lt;/body&gt;</title></body></html>",
    +        "noQuirksBodyHtml": "<title>test&lt;/body&gt;</title>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><title>X</title><meta name=z><link rel=foo><style>\nx { content:\"</style\" } </style>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "title": true,
    +            "meta": true,
    +            "link": true,
    +            "style": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "meta",
    +                    "attrs": [
    +                      {
    +                        "name": "name",
    +                        "value": "z"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "link",
    +                    "attrs": [
    +                      {
    +                        "name": "rel",
    +                        "value": "foo"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": "\nx { content:\"</style\" } ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><title>X</title><meta name=\"z\"><link rel=\"foo\"><style>\nx { content:\"</style\" } </style></body></html>",
    +        "noQuirksBodyHtml": "<title>X</title><meta name=\"z\"><link rel=\"foo\"><style>\nx { content:\"</style\" } </style>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><select><optgroup></optgroup></select>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "optgroup": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "optgroup"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><optgroup></optgroup></select></body></html>",
    +        "noQuirksBodyHtml": "<select><optgroup></optgroup></select>"
    +      }
    +    },
    +    {
    +      "data": " \n ",
    +      "errors": [
    +        "(2,1): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": " \n "
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>  <html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "  "
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><script>\n</script>  <title>x</title>  </head>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "\n",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "  "
    +                  },
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "x"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "  "
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><script>\n</script>  <title>x</title>  </head><body></body></html>",
    +        "noQuirksBodyHtml": "<script>\n</script>  <title>x</title>  "
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><body><html id=x>",
    +      "errors": [
    +        "(1,38): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "id",
    +                "value": "x"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html id=\"x\"><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>X</body><html id=\"x\">",
    +      "errors": [
    +        "(1,36): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "id",
    +                "value": "x"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html id=\"x\"><head></head><body>X</body></html>",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><head><html id=x>",
    +      "errors": [
    +        "(1,32): non-html-root"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "attrs": [
    +              {
    +                "name": "id",
    +                "value": "x"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html id=\"x\"><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>X</html>X",
    +      "errors": [
    +        "(1,24): expected-eof-but-got-char"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "XX"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>XX</body></html>",
    +        "noQuirksBodyHtml": "XX"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>X</html> ",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X "
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>X </body></html>",
    +        "noQuirksBodyHtml": "X "
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>X</html><p>X",
    +      "errors": [
    +        "(1,26): expected-eof-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>X<p>X</p></body></html>",
    +        "noQuirksBodyHtml": "X<p>X</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>X<p/x/y/z>",
    +      "errors": [
    +        "(1,19): unexpected-character-after-solidus-in-tag",
    +        "(1,21): unexpected-character-after-solidus-in-tag",
    +        "(1,23): unexpected-character-after-solidus-in-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "attrs": [
    +                      {
    +                        "name": "x",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "y",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "z",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>X<p x=\"\" y=\"\" z=\"\"></p></body></html>",
    +        "noQuirksBodyHtml": "X<p x=\"\" y=\"\" z=\"\"></p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><!--x--",
    +      "errors": [
    +        "(1,22): eof-in-comment-double-dash"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "comment": "x"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><!--x--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!--x-->"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><table><tr><td></p></table>",
    +      "errors": [
    +        "(1,34): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "p"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><p></p></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><p></p></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE <!DOCTYPE HTML>><!--<!--x-->-->",
    +      "errors": [
    +        "(1,20): expected-space-or-right-bracket-in-doctype",
    +        "(1,25): unknown-doctype",
    +        "(1,35): unexpected-char-in-comment"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "escaped": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "<!doctype"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": ">",
    +                    "escaped": true
    +                  },
    +                  {
    +                    "comment": "<!--x"
    +                  },
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE <!doctype><html><head></head><body>&gt;<!--<!--x-->--&gt;</body></html>",
    +        "noQuirksBodyHtml": "&gt;<!--<!--x-->--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><div><form></form><div></div></div>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "form": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "form"
    +                      },
    +                      {
    +                        "tag": "div"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><div><form></form><div></div></div></body></html>",
    +        "noQuirksBodyHtml": "<div><form></form><div></div></div>"
    +      }
    +    }
    +  ],
    +  "tests20.dat": [
    +    {
    +      "data": "<!doctype html><p><button><button>",
    +      "errors": [
    +        "(1,34): unexpected-start-tag-implies-end-tag",
    +        "(1,34): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button"
    +                      },
    +                      {
    +                        "tag": "button"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button></button><button></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button></button><button></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><address>",
    +      "errors": [
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "address": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "address"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><address></address></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><address></address></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><blockquote>",
    +      "errors": [
    +        "(1,38): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "blockquote": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "blockquote"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><blockquote></blockquote></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><blockquote></blockquote></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><menu>",
    +      "errors": [
    +        "(1,32): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "menu": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "menu"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><menu></menu></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><menu></menu></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><p>",
    +      "errors": [
    +        "(1,29): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "p"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><p></p></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><p></p></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><ul>",
    +      "errors": [
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "ul": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "ul"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><ul></ul></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><ul></ul></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><h1>",
    +      "errors": [
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "h1": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "h1"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><h1></h1></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><h1></h1></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><h6>",
    +      "errors": [
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "h6": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "h6"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><h6></h6></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><h6></h6></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><listing>",
    +      "errors": [
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "listing": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "listing"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><listing></listing></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><listing></listing></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><pre>",
    +      "errors": [
    +        "(1,31): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "pre": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "pre"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><pre></pre></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><pre></pre></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><form>",
    +      "errors": [
    +        "(1,32): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "form": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "form"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><form></form></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><form></form></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><li>",
    +      "errors": [
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "li": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "li"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><li></li></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><li></li></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><dd>",
    +      "errors": [
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "dd": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "dd"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><dd></dd></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><dd></dd></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><dt>",
    +      "errors": [
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "dt": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "dt"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><dt></dt></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><dt></dt></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><plaintext>",
    +      "errors": [
    +        "(1,37): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "plaintext": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "plaintext"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><plaintext></plaintext></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><plaintext></plaintext></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><table>",
    +      "errors": [
    +        "(1,33): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "table"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><table></table></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><table></table></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><hr>",
    +      "errors": [
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "hr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "hr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><hr></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><hr></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button><xmp>",
    +      "errors": [
    +        "(1,31): expected-named-closing-tag-but-got-eof",
    +        "(1,31): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true,
    +            "xmp": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "xmp"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><xmp></xmp></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><xmp></xmp></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><button></p>",
    +      "errors": [
    +        "(1,30): unexpected-end-tag",
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "button": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "button",
    +                        "children": [
    +                          {
    +                            "tag": "p"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><button><p></p></button></p></body></html>",
    +        "noQuirksBodyHtml": "<p><button><p></p></button></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><address><button></address>a",
    +      "errors": [
    +        "(1,42): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "address": true,
    +            "button": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "address",
    +                    "children": [
    +                      {
    +                        "tag": "button"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "a"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><address><button></button></address>a</body></html>",
    +        "noQuirksBodyHtml": "<address><button></button></address>a"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><address><button></address>a",
    +      "errors": [
    +        "(1,42): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "address": true,
    +            "button": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "address",
    +                    "children": [
    +                      {
    +                        "tag": "button"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "a"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><address><button></button></address>a</body></html>",
    +        "noQuirksBodyHtml": "<address><button></button></address>a"
    +      }
    +    },
    +    {
    +      "data": "<p><table></p>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-end-tag-implies-table-voodoo",
    +        "(1,14): unexpected-end-tag",
    +        "(1,14): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "p"
    +                      },
    +                      {
    +                        "tag": "table"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><p></p><table></table></p></body></html>",
    +        "noQuirksBodyHtml": "<p></p><p></p><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><svg>",
    +      "errors": [
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><figcaption>",
    +      "errors": [
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "figcaption": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "figcaption"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><figcaption></figcaption></body></html>",
    +        "noQuirksBodyHtml": "<p></p><figcaption></figcaption>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><summary>",
    +      "errors": [
    +        "(1,27): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "summary": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "summary"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><summary></summary></body></html>",
    +        "noQuirksBodyHtml": "<p></p><summary></summary>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><form><table><form>",
    +      "errors": [
    +        "(1,34): unexpected-form-in-table",
    +        "(1,34): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "children": [
    +                      {
    +                        "tag": "table"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><form><table></table></form></body></html>",
    +        "noQuirksBodyHtml": "<form><table></table></form>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><form><form>",
    +      "errors": [
    +        "(1,28): unexpected-form-in-table",
    +        "(1,34): unexpected-form-in-table",
    +        "(1,34): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "form": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "form"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><form></form></table></body></html>",
    +        "noQuirksBodyHtml": "<table><form></form></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><form></table><form>",
    +      "errors": [
    +        "(1,28): unexpected-form-in-table",
    +        "(1,42): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "form": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "form"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><form></form></table></body></html>",
    +        "noQuirksBodyHtml": "<table><form></form></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><svg><foreignObject><p>",
    +      "errors": [
    +        "(1,38): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg foreignObject": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "foreignObject",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "p"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><foreignObject><p></p></foreignObject></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><foreignObject><p></p></foreignObject></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><svg><title>abc",
    +      "errors": [
    +        "(1,30): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg title": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "title",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "text": "abc"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><title>abc</title></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><title>abc</title></svg>"
    +      }
    +    },
    +    {
    +      "data": "<option><span><option>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,22): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "option": true,
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "option",
    +                    "children": [
    +                      {
    +                        "tag": "span",
    +                        "children": [
    +                          {
    +                            "tag": "option"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><option><span><option></option></span></option></body></html>",
    +        "noQuirksBodyHtml": "<option><span><option></option></span></option>"
    +      }
    +    },
    +    {
    +      "data": "<option><option>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "option": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "option"
    +                  },
    +                  {
    +                    "tag": "option"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><option></option><option></option></body></html>",
    +        "noQuirksBodyHtml": "<option></option><option></option>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml><div>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,27): unexpected-html-element-in-foreign-content",
    +        "(1,27): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml></annotation-xml></math><div></div></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml><div></div></annotation-xml></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml encoding=\"application/svg+xml\"><div>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,58): unexpected-html-element-in-foreign-content",
    +        "(1,58): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "encoding",
    +                            "value": "application/svg+xml"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/svg+xml\"></annotation-xml></math><div></div></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/svg+xml\"><div></div></annotation-xml></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,60): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "encoding",
    +                            "value": "application/xhtml+xml"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"application/xhtml+xml\"><div></div></annotation-xml></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,60): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "encoding",
    +                            "value": "aPPlication/xhtmL+xMl"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"aPPlication/xhtmL+xMl\"><div></div></annotation-xml></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml encoding=\"text/html\"><div>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,48): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "encoding",
    +                            "value": "text/html"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"text/html\"><div></div></annotation-xml></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml encoding=\"Text/htmL\"><div>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,48): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "encoding",
    +                            "value": "Text/htmL"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml encoding=\"Text/htmL\"><div></div></annotation-xml></math>"
    +      }
    +    },
    +    {
    +      "data": "<math><annotation-xml encoding=\" text/html \"><div>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,50): unexpected-html-element-in-foreign-content",
    +        "(1,50): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "encoding",
    +                            "value": " text/html "
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><annotation-xml encoding=\" text/html \"></annotation-xml></math><div></div></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml encoding=\" text/html \"><div></div></annotation-xml></math>"
    +      }
    +    }
    +  ],
    +  "tests21.dat": [
    +    {
    +      "data": "<svg><![CDATA[foo]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>foo</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>foo</svg>"
    +      }
    +    },
    +    {
    +      "data": "<math><![CDATA[foo]]>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,21): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math>foo</math></body></html>",
    +        "noQuirksBodyHtml": "<math>foo</math>"
    +      }
    +    },
    +    {
    +      "data": "<div><![CDATA[foo]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,7): expected-dashes-or-doctype",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "comment": "[CDATA[foo]]"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><!--[CDATA[foo]]--></div></body></html>",
    +        "noQuirksBodyHtml": "<div><!--[CDATA[foo]]--></div>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[foo",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>foo</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>foo</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[foo",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>foo</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>foo</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,14): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[]] >]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,21): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "]] >",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>]] &gt;</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>]] &gt;</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[]] >]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,21): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "]] >",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>]] &gt;</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>]] &gt;</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[]]",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "]]"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>]]</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>]]</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[]",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,15): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "]"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>]</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>]</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[]>a",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "]>a",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>]&gt;a</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>]&gt;a</svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><svg><![CDATA[foo]]]>",
    +      "errors": [
    +        "(1,36): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "foo]"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg>foo]</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>foo]</svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><svg><![CDATA[foo]]]]>",
    +      "errors": [
    +        "(1,37): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "foo]]"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg>foo]]</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>foo]]</svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><svg><![CDATA[foo]]]]]>",
    +      "errors": [
    +        "(1,38): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "foo]]]"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg>foo]]]</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>foo]]]</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><foreignObject><div><![CDATA[foo]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,27): expected-dashes-or-doctype",
    +        "(1,40): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg foreignObject": true,
    +            "div": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "foreignObject",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "comment": "[CDATA[foo]]"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><foreignObject><div><!--[CDATA[foo]]--></div></foreignObject></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><foreignObject><div><!--[CDATA[foo]]--></div></foreignObject></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[<svg>]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,22): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "<svg>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>&lt;svg&gt;</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>&lt;svg&gt;</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[</svg>a]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,24): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "</svg>a",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>&lt;/svg&gt;a</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>&lt;/svg&gt;a</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[<svg>a",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "<svg>a",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>&lt;svg&gt;a</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>&lt;svg&gt;a</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[</svg>a",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,21): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "</svg>a",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>&lt;/svg&gt;a</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>&lt;/svg&gt;a</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[<svg>]]><path>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,28): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg path": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "<svg>",
    +                        "escaped": true
    +                      },
    +                      {
    +                        "tag": "path",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>&lt;svg&gt;<path></path></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>&lt;svg&gt;<path></path></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[<svg>]]></path>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,29): unexpected-end-tag",
    +        "(1,29): unexpected-end-tag",
    +        "(1,29): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "<svg>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>&lt;svg&gt;</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>&lt;svg&gt;</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[<svg>]]><!--path-->",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "<svg>",
    +                        "escaped": true
    +                      },
    +                      {
    +                        "comment": "path"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>&lt;svg&gt;<!--path--></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>&lt;svg&gt;<!--path--></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[<svg>]]>path",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,26): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "<svg>path",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>&lt;svg&gt;path</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>&lt;svg&gt;path</svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><![CDATA[<!--svg-->]]>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,27): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "text": "<!--svg-->",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg>&lt;!--svg--&gt;</svg></body></html>",
    +        "noQuirksBodyHtml": "<svg>&lt;!--svg--&gt;</svg>"
    +      }
    +    }
    +  ],
    +  "tests22.dat": [
    +    {
    +      "data": "<a><b><big><em><strong><div>X</a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,33): adoption-agency-1.3",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "b": true,
    +            "big": true,
    +            "em": true,
    +            "strong": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "big",
    +                            "children": [
    +                              {
    +                                "tag": "em",
    +                                "children": [
    +                                  {
    +                                    "tag": "strong"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "big",
    +                    "children": [
    +                      {
    +                        "tag": "em",
    +                        "children": [
    +                          {
    +                            "tag": "strong",
    +                            "children": [
    +                              {
    +                                "tag": "div",
    +                                "children": [
    +                                  {
    +                                    "tag": "a",
    +                                    "children": [
    +                                      {
    +                                        "text": "X"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a><b><big><em><strong></strong></em></big></b></a><big><em><strong><div><a>X</a></div></strong></em></big></body></html>",
    +        "noQuirksBodyHtml": "<a><b><big><em><strong></strong></em></big></b></a><big><em><strong><div><a>X</a></div></strong></em></big>"
    +      }
    +    },
    +    {
    +      "data": "<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8>A</a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,91): adoption-agency-1.3",
    +        "(1,91): adoption-agency-1.3",
    +        "(1,91): adoption-agency-1.3",
    +        "(1,91): adoption-agency-1.3",
    +        "(1,91): adoption-agency-1.3",
    +        "(1,91): adoption-agency-1.3",
    +        "(1,91): adoption-agency-1.3",
    +        "(1,91): adoption-agency-1.3",
    +        "(1,91): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "b": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "1"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "a"
    +                          },
    +                          {
    +                            "tag": "div",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "2"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "a"
    +                              },
    +                              {
    +                                "tag": "div",
    +                                "attrs": [
    +                                  {
    +                                    "name": "id",
    +                                    "value": "3"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "a"
    +                                  },
    +                                  {
    +                                    "tag": "div",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "id",
    +                                        "value": "4"
    +                                      }
    +                                    ],
    +                                    "children": [
    +                                      {
    +                                        "tag": "a"
    +                                      },
    +                                      {
    +                                        "tag": "div",
    +                                        "attrs": [
    +                                          {
    +                                            "name": "id",
    +                                            "value": "5"
    +                                          }
    +                                        ],
    +                                        "children": [
    +                                          {
    +                                            "tag": "a"
    +                                          },
    +                                          {
    +                                            "tag": "div",
    +                                            "attrs": [
    +                                              {
    +                                                "name": "id",
    +                                                "value": "6"
    +                                              }
    +                                            ],
    +                                            "children": [
    +                                              {
    +                                                "tag": "a"
    +                                              },
    +                                              {
    +                                                "tag": "div",
    +                                                "attrs": [
    +                                                  {
    +                                                    "name": "id",
    +                                                    "value": "7"
    +                                                  }
    +                                                ],
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "a"
    +                                                  },
    +                                                  {
    +                                                    "tag": "div",
    +                                                    "attrs": [
    +                                                      {
    +                                                        "name": "id",
    +                                                        "value": "8"
    +                                                      }
    +                                                    ],
    +                                                    "children": [
    +                                                      {
    +                                                        "tag": "a",
    +                                                        "children": [
    +                                                          {
    +                                                            "text": "A"
    +                                                          }
    +                                                        ]
    +                                                      }
    +                                                    ]
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a>A</a></div></div></div></div></div></div></div></div></b></body></html>",
    +        "noQuirksBodyHtml": "<a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a>A</a></div></div></div></div></div></div></div></div></b>"
    +      }
    +    },
    +    {
    +      "data": "<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9>A</a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,101): adoption-agency-1.3",
    +        "(1,101): adoption-agency-1.3",
    +        "(1,101): adoption-agency-1.3",
    +        "(1,101): adoption-agency-1.3",
    +        "(1,101): adoption-agency-1.3",
    +        "(1,101): adoption-agency-1.3",
    +        "(1,101): adoption-agency-1.3",
    +        "(1,101): adoption-agency-1.3",
    +        "(1,101): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "b": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "1"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "a"
    +                          },
    +                          {
    +                            "tag": "div",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "2"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "a"
    +                              },
    +                              {
    +                                "tag": "div",
    +                                "attrs": [
    +                                  {
    +                                    "name": "id",
    +                                    "value": "3"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "a"
    +                                  },
    +                                  {
    +                                    "tag": "div",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "id",
    +                                        "value": "4"
    +                                      }
    +                                    ],
    +                                    "children": [
    +                                      {
    +                                        "tag": "a"
    +                                      },
    +                                      {
    +                                        "tag": "div",
    +                                        "attrs": [
    +                                          {
    +                                            "name": "id",
    +                                            "value": "5"
    +                                          }
    +                                        ],
    +                                        "children": [
    +                                          {
    +                                            "tag": "a"
    +                                          },
    +                                          {
    +                                            "tag": "div",
    +                                            "attrs": [
    +                                              {
    +                                                "name": "id",
    +                                                "value": "6"
    +                                              }
    +                                            ],
    +                                            "children": [
    +                                              {
    +                                                "tag": "a"
    +                                              },
    +                                              {
    +                                                "tag": "div",
    +                                                "attrs": [
    +                                                  {
    +                                                    "name": "id",
    +                                                    "value": "7"
    +                                                  }
    +                                                ],
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "a"
    +                                                  },
    +                                                  {
    +                                                    "tag": "div",
    +                                                    "attrs": [
    +                                                      {
    +                                                        "name": "id",
    +                                                        "value": "8"
    +                                                      }
    +                                                    ],
    +                                                    "children": [
    +                                                      {
    +                                                        "tag": "a",
    +                                                        "children": [
    +                                                          {
    +                                                            "tag": "div",
    +                                                            "attrs": [
    +                                                              {
    +                                                                "name": "id",
    +                                                                "value": "9"
    +                                                              }
    +                                                            ],
    +                                                            "children": [
    +                                                              {
    +                                                                "text": "A"
    +                                                              }
    +                                                            ]
    +                                                          }
    +                                                        ]
    +                                                      }
    +                                                    ]
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a><div id=\"9\">A</div></a></div></div></div></div></div></div></div></div></b></body></html>",
    +        "noQuirksBodyHtml": "<a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a><div id=\"9\">A</div></a></div></div></div></div></div></div></div></div></b>"
    +      }
    +    },
    +    {
    +      "data": "<a><b><div id=1><div id=2><div id=3><div id=4><div id=5><div id=6><div id=7><div id=8><div id=9><div id=10>A</a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,112): adoption-agency-1.3",
    +        "(1,112): adoption-agency-1.3",
    +        "(1,112): adoption-agency-1.3",
    +        "(1,112): adoption-agency-1.3",
    +        "(1,112): adoption-agency-1.3",
    +        "(1,112): adoption-agency-1.3",
    +        "(1,112): adoption-agency-1.3",
    +        "(1,112): adoption-agency-1.3",
    +        "(1,112): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "b": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "1"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "a"
    +                          },
    +                          {
    +                            "tag": "div",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "2"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "a"
    +                              },
    +                              {
    +                                "tag": "div",
    +                                "attrs": [
    +                                  {
    +                                    "name": "id",
    +                                    "value": "3"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "a"
    +                                  },
    +                                  {
    +                                    "tag": "div",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "id",
    +                                        "value": "4"
    +                                      }
    +                                    ],
    +                                    "children": [
    +                                      {
    +                                        "tag": "a"
    +                                      },
    +                                      {
    +                                        "tag": "div",
    +                                        "attrs": [
    +                                          {
    +                                            "name": "id",
    +                                            "value": "5"
    +                                          }
    +                                        ],
    +                                        "children": [
    +                                          {
    +                                            "tag": "a"
    +                                          },
    +                                          {
    +                                            "tag": "div",
    +                                            "attrs": [
    +                                              {
    +                                                "name": "id",
    +                                                "value": "6"
    +                                              }
    +                                            ],
    +                                            "children": [
    +                                              {
    +                                                "tag": "a"
    +                                              },
    +                                              {
    +                                                "tag": "div",
    +                                                "attrs": [
    +                                                  {
    +                                                    "name": "id",
    +                                                    "value": "7"
    +                                                  }
    +                                                ],
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "a"
    +                                                  },
    +                                                  {
    +                                                    "tag": "div",
    +                                                    "attrs": [
    +                                                      {
    +                                                        "name": "id",
    +                                                        "value": "8"
    +                                                      }
    +                                                    ],
    +                                                    "children": [
    +                                                      {
    +                                                        "tag": "a",
    +                                                        "children": [
    +                                                          {
    +                                                            "tag": "div",
    +                                                            "attrs": [
    +                                                              {
    +                                                                "name": "id",
    +                                                                "value": "9"
    +                                                              }
    +                                                            ],
    +                                                            "children": [
    +                                                              {
    +                                                                "tag": "div",
    +                                                                "attrs": [
    +                                                                  {
    +                                                                    "name": "id",
    +                                                                    "value": "10"
    +                                                                  }
    +                                                                ],
    +                                                                "children": [
    +                                                                  {
    +                                                                    "text": "A"
    +                                                                  }
    +                                                                ]
    +                                                              }
    +                                                            ]
    +                                                          }
    +                                                        ]
    +                                                      }
    +                                                    ]
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a><div id=\"9\"><div id=\"10\">A</div></div></a></div></div></div></div></div></div></div></div></b></body></html>",
    +        "noQuirksBodyHtml": "<a><b></b></a><b><div id=\"1\"><a></a><div id=\"2\"><a></a><div id=\"3\"><a></a><div id=\"4\"><a></a><div id=\"5\"><a></a><div id=\"6\"><a></a><div id=\"7\"><a></a><div id=\"8\"><a><div id=\"9\"><div id=\"10\">A</div></div></a></div></div></div></div></div></div></div></div></b>"
    +      }
    +    },
    +    {
    +      "data": "<cite><b><cite><i><cite><i><cite><i><div>X</b>TEST",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,46): adoption-agency-1.3",
    +        "(1,50): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "cite": true,
    +            "b": true,
    +            "i": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "cite",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "cite",
    +                            "children": [
    +                              {
    +                                "tag": "i",
    +                                "children": [
    +                                  {
    +                                    "tag": "cite",
    +                                    "children": [
    +                                      {
    +                                        "tag": "i",
    +                                        "children": [
    +                                          {
    +                                            "tag": "cite",
    +                                            "children": [
    +                                              {
    +                                                "tag": "i"
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "tag": "div",
    +                                "children": [
    +                                  {
    +                                    "tag": "b",
    +                                    "children": [
    +                                      {
    +                                        "text": "X"
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "text": "TEST"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><cite><b><cite><i><cite><i><cite><i></i></cite></i></cite></i></cite></b><i><i><div><b>X</b>TEST</div></i></i></cite></body></html>",
    +        "noQuirksBodyHtml": "<cite><b><cite><i><cite><i><cite><i></i></cite></i></cite></i></cite></b><i><i><div><b>X</b>TEST</div></i></i></cite>"
    +      }
    +    }
    +  ],
    +  "tests23.dat": [
    +    {
    +      "data": "<p><font size=4><font color=red><font size=4><font size=4><font size=4><font size=4><font size=4><font color=red><p>X",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,116): unexpected-end-tag",
    +        "(1,117): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "size",
    +                            "value": "4"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "font",
    +                            "attrs": [
    +                              {
    +                                "name": "color",
    +                                "value": "red"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "font",
    +                                "attrs": [
    +                                  {
    +                                    "name": "size",
    +                                    "value": "4"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "font",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "size",
    +                                        "value": "4"
    +                                      }
    +                                    ],
    +                                    "children": [
    +                                      {
    +                                        "tag": "font",
    +                                        "attrs": [
    +                                          {
    +                                            "name": "size",
    +                                            "value": "4"
    +                                          }
    +                                        ],
    +                                        "children": [
    +                                          {
    +                                            "tag": "font",
    +                                            "attrs": [
    +                                              {
    +                                                "name": "size",
    +                                                "value": "4"
    +                                              }
    +                                            ],
    +                                            "children": [
    +                                              {
    +                                                "tag": "font",
    +                                                "attrs": [
    +                                                  {
    +                                                    "name": "size",
    +                                                    "value": "4"
    +                                                  }
    +                                                ],
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "font",
    +                                                    "attrs": [
    +                                                      {
    +                                                        "name": "color",
    +                                                        "value": "red"
    +                                                      }
    +                                                    ]
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "color",
    +                            "value": "red"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "font",
    +                            "attrs": [
    +                              {
    +                                "name": "size",
    +                                "value": "4"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "font",
    +                                "attrs": [
    +                                  {
    +                                    "name": "size",
    +                                    "value": "4"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "font",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "size",
    +                                        "value": "4"
    +                                      }
    +                                    ],
    +                                    "children": [
    +                                      {
    +                                        "tag": "font",
    +                                        "attrs": [
    +                                          {
    +                                            "name": "color",
    +                                            "value": "red"
    +                                          }
    +                                        ],
    +                                        "children": [
    +                                          {
    +                                            "text": "X"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><font size=\"4\"><font color=\"red\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font color=\"red\"></font></font></font></font></font></font></font></font></p><p><font color=\"red\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font color=\"red\">X</font></font></font></font></font></p></body></html>",
    +        "noQuirksBodyHtml": "<p><font size=\"4\"><font color=\"red\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font color=\"red\"></font></font></font></font></font></font></font></font></p><p><font color=\"red\"><font size=\"4\"><font size=\"4\"><font size=\"4\"><font color=\"red\">X</font></font></font></font></font></p>"
    +      }
    +    },
    +    {
    +      "data": "<p><font size=4><font size=4><font size=4><font size=4><p>X",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,58): unexpected-end-tag",
    +        "(1,59): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "size",
    +                            "value": "4"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "font",
    +                            "attrs": [
    +                              {
    +                                "name": "size",
    +                                "value": "4"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "font",
    +                                "attrs": [
    +                                  {
    +                                    "name": "size",
    +                                    "value": "4"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "font",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "size",
    +                                        "value": "4"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "size",
    +                            "value": "4"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "font",
    +                            "attrs": [
    +                              {
    +                                "name": "size",
    +                                "value": "4"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "font",
    +                                "attrs": [
    +                                  {
    +                                    "name": "size",
    +                                    "value": "4"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "text": "X"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"></font></font></font></font></p><p><font size=\"4\"><font size=\"4\"><font size=\"4\">X</font></font></font></p></body></html>",
    +        "noQuirksBodyHtml": "<p><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"4\"></font></font></font></font></p><p><font size=\"4\"><font size=\"4\"><font size=\"4\">X</font></font></font></p>"
    +      }
    +    },
    +    {
    +      "data": "<p><font size=4><font size=4><font size=4><font size=\"5\"><font size=4><p>X",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,73): unexpected-end-tag",
    +        "(1,74): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "size",
    +                            "value": "4"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "font",
    +                            "attrs": [
    +                              {
    +                                "name": "size",
    +                                "value": "4"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "font",
    +                                "attrs": [
    +                                  {
    +                                    "name": "size",
    +                                    "value": "4"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "font",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "size",
    +                                        "value": "5"
    +                                      }
    +                                    ],
    +                                    "children": [
    +                                      {
    +                                        "tag": "font",
    +                                        "attrs": [
    +                                          {
    +                                            "name": "size",
    +                                            "value": "4"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "size",
    +                            "value": "4"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "font",
    +                            "attrs": [
    +                              {
    +                                "name": "size",
    +                                "value": "4"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "font",
    +                                "attrs": [
    +                                  {
    +                                    "name": "size",
    +                                    "value": "5"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "font",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "size",
    +                                        "value": "4"
    +                                      }
    +                                    ],
    +                                    "children": [
    +                                      {
    +                                        "text": "X"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"5\"><font size=\"4\"></font></font></font></font></font></p><p><font size=\"4\"><font size=\"4\"><font size=\"5\"><font size=\"4\">X</font></font></font></font></p></body></html>",
    +        "noQuirksBodyHtml": "<p><font size=\"4\"><font size=\"4\"><font size=\"4\"><font size=\"5\"><font size=\"4\"></font></font></font></font></font></p><p><font size=\"4\"><font size=\"4\"><font size=\"5\"><font size=\"4\">X</font></font></font></font></p>"
    +      }
    +    },
    +    {
    +      "data": "<p><font size=4 id=a><font size=4 id=b><font size=4><font size=4><p>X",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,68): unexpected-end-tag",
    +        "(1,69): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "font": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "a"
    +                          },
    +                          {
    +                            "name": "size",
    +                            "value": "4"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "font",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "b"
    +                              },
    +                              {
    +                                "name": "size",
    +                                "value": "4"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "font",
    +                                "attrs": [
    +                                  {
    +                                    "name": "size",
    +                                    "value": "4"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "font",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "size",
    +                                        "value": "4"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "a"
    +                          },
    +                          {
    +                            "name": "size",
    +                            "value": "4"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "font",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "b"
    +                              },
    +                              {
    +                                "name": "size",
    +                                "value": "4"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "font",
    +                                "attrs": [
    +                                  {
    +                                    "name": "size",
    +                                    "value": "4"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "font",
    +                                    "attrs": [
    +                                      {
    +                                        "name": "size",
    +                                        "value": "4"
    +                                      }
    +                                    ],
    +                                    "children": [
    +                                      {
    +                                        "text": "X"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><font size=\"4\" id=\"a\"><font size=\"4\" id=\"b\"><font size=\"4\"><font size=\"4\"></font></font></font></font></p><p><font size=\"4\" id=\"a\"><font size=\"4\" id=\"b\"><font size=\"4\"><font size=\"4\">X</font></font></font></font></p></body></html>",
    +        "noQuirksBodyHtml": "<p><font size=\"4\" id=\"a\"><font size=\"4\" id=\"b\"><font size=\"4\"><font size=\"4\"></font></font></font></font></p><p><font size=\"4\" id=\"a\"><font size=\"4\" id=\"b\"><font size=\"4\"><font size=\"4\">X</font></font></font></font></p>"
    +      }
    +    },
    +    {
    +      "data": "<p><b id=a><b id=a><b id=a><b><object><b id=a><b id=a>X</object><p>Y",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,64): end-tag-too-early",
    +        "(1,67): unexpected-end-tag",
    +        "(1,68): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "b": true,
    +            "object": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "a"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "a"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "attrs": [
    +                                  {
    +                                    "name": "id",
    +                                    "value": "a"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "b",
    +                                    "children": [
    +                                      {
    +                                        "tag": "object",
    +                                        "children": [
    +                                          {
    +                                            "tag": "b",
    +                                            "attrs": [
    +                                              {
    +                                                "name": "id",
    +                                                "value": "a"
    +                                              }
    +                                            ],
    +                                            "children": [
    +                                              {
    +                                                "tag": "b",
    +                                                "attrs": [
    +                                                  {
    +                                                    "name": "id",
    +                                                    "value": "a"
    +                                                  }
    +                                                ],
    +                                                "children": [
    +                                                  {
    +                                                    "text": "X"
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "attrs": [
    +                          {
    +                            "name": "id",
    +                            "value": "a"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "a"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "tag": "b",
    +                                "attrs": [
    +                                  {
    +                                    "name": "id",
    +                                    "value": "a"
    +                                  }
    +                                ],
    +                                "children": [
    +                                  {
    +                                    "tag": "b",
    +                                    "children": [
    +                                      {
    +                                        "text": "Y"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><b id=\"a\"><b id=\"a\"><b id=\"a\"><b><object><b id=\"a\"><b id=\"a\">X</b></b></object></b></b></b></b></p><p><b id=\"a\"><b id=\"a\"><b id=\"a\"><b>Y</b></b></b></b></p></body></html>",
    +        "noQuirksBodyHtml": "<p><b id=\"a\"><b id=\"a\"><b id=\"a\"><b><object><b id=\"a\"><b id=\"a\">X</b></b></object></b></b></b></b></p><p><b id=\"a\"><b id=\"a\"><b id=\"a\"><b>Y</b></b></b></b></p>"
    +      }
    +    }
    +  ],
    +  "tests24.dat": [
    +    {
    +      "data": "<!DOCTYPE html>&NotEqualTilde;",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "≂̸"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>≂̸</body></html>",
    +        "noQuirksBodyHtml": "≂̸"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>&NotEqualTilde;A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "≂̸A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>≂̸A</body></html>",
    +        "noQuirksBodyHtml": "≂̸A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>&ThickSpace;",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "  "
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>  </body></html>",
    +        "noQuirksBodyHtml": "  "
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>&ThickSpace;A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "  A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>  A</body></html>",
    +        "noQuirksBodyHtml": "  A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>&NotSubset;",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "⊂⃒"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>⊂⃒</body></html>",
    +        "noQuirksBodyHtml": "⊂⃒"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>&NotSubset;A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "⊂⃒A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>⊂⃒A</body></html>",
    +        "noQuirksBodyHtml": "⊂⃒A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>&Gopf;",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "𝔾"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>𝔾</body></html>",
    +        "noQuirksBodyHtml": "𝔾"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html>&Gopf;A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "𝔾A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>𝔾A</body></html>",
    +        "noQuirksBodyHtml": "𝔾A"
    +      }
    +    }
    +  ],
    +  "tests25.dat": [
    +    {
    +      "data": "<!DOCTYPE html><body><foo>A",
    +      "errors": [
    +        "(1,27): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "foo": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "foo",
    +                    "children": [
    +                      {
    +                        "text": "A"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><foo>A</foo></body></html>",
    +        "noQuirksBodyHtml": "<foo>A</foo>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><area>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "area": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "area"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><area>A</body></html>",
    +        "noQuirksBodyHtml": "<area>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><base>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "base": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "base"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><base>A</body></html>",
    +        "noQuirksBodyHtml": "<base>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><basefont>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "basefont": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "basefont"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><basefont>A</body></html>",
    +        "noQuirksBodyHtml": "<basefont>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><bgsound>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "bgsound": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "bgsound"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><bgsound>A</body></html>",
    +        "noQuirksBodyHtml": "<bgsound>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><br>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "br": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "br"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><br>A</body></html>",
    +        "noQuirksBodyHtml": "<br>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><col>A",
    +      "errors": [
    +        "(1,26): unexpected-start-tag-ignored"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>A</body></html>",
    +        "noQuirksBodyHtml": "A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><command>A",
    +      "errors": [
    +        "eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "command": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "command",
    +                    "children": [
    +                      {
    +                        "text": "A"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><command>A</command></body></html>",
    +        "noQuirksBodyHtml": "<command>A</command>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><menuitem>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "menuitem": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "menuitem"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><menuitem>A</body></html>",
    +        "noQuirksBodyHtml": "<menuitem>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><embed>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "embed": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "embed"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><embed>A</body></html>",
    +        "noQuirksBodyHtml": "<embed>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><frame>A",
    +      "errors": [
    +        "(1,28): unexpected-start-tag-ignored"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>A</body></html>",
    +        "noQuirksBodyHtml": "A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><hr>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "hr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "hr"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><hr>A</body></html>",
    +        "noQuirksBodyHtml": "<hr>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><img>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "img": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "img"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><img>A</body></html>",
    +        "noQuirksBodyHtml": "<img>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><input>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "input"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><input>A</body></html>",
    +        "noQuirksBodyHtml": "<input>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><keygen>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "keygen": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "keygen"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><keygen>A</body></html>",
    +        "noQuirksBodyHtml": "<keygen>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><link>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "link": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "link"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><link>A</body></html>",
    +        "noQuirksBodyHtml": "<link>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><meta>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "meta": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "meta"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><meta>A</body></html>",
    +        "noQuirksBodyHtml": "<meta>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><param>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "param": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "param"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><param>A</body></html>",
    +        "noQuirksBodyHtml": "<param>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><source>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "source": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "source"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><source>A</body></html>",
    +        "noQuirksBodyHtml": "<source>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><track>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "track": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "track"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><track>A</body></html>",
    +        "noQuirksBodyHtml": "<track>A"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><wbr>A",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "wbr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "wbr"
    +                  },
    +                  {
    +                    "text": "A"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><wbr>A</body></html>",
    +        "noQuirksBodyHtml": "<wbr>A"
    +      }
    +    }
    +  ],
    +  "tests26.dat": [
    +    {
    +      "data": "<!DOCTYPE html><body><a href='#1'><nobr>1<nobr></a><br><a href='#2'><nobr>2<nobr></a><br><a href='#3'><nobr>3<nobr></a>",
    +      "errors": [
    +        "(1,47): unexpected-start-tag-implies-end-tag",
    +        "(1,51): adoption-agency-1.3",
    +        "(1,74): unexpected-start-tag-implies-end-tag",
    +        "(1,74): adoption-agency-1.3",
    +        "(1,81): unexpected-start-tag-implies-end-tag",
    +        "(1,85): adoption-agency-1.3",
    +        "(1,108): unexpected-start-tag-implies-end-tag",
    +        "(1,108): adoption-agency-1.3",
    +        "(1,115): unexpected-start-tag-implies-end-tag",
    +        "(1,119): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "nobr": true,
    +            "br": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "#1"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "1"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "nobr",
    +                    "children": [
    +                      {
    +                        "tag": "br"
    +                      },
    +                      {
    +                        "tag": "a",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "value": "#2"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "#2"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "nobr",
    +                    "children": [
    +                      {
    +                        "tag": "br"
    +                      },
    +                      {
    +                        "tag": "a",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "value": "#3"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "value": "#3"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "3"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><a href=\"#1\"><nobr>1</nobr><nobr></nobr></a><nobr><br><a href=\"#2\"></a></nobr><a href=\"#2\"><nobr>2</nobr><nobr></nobr></a><nobr><br><a href=\"#3\"></a></nobr><a href=\"#3\"><nobr>3</nobr><nobr></nobr></a></body></html>",
    +        "noQuirksBodyHtml": "<a href=\"#1\"><nobr>1</nobr><nobr></nobr></a><nobr><br><a href=\"#2\"></a></nobr><a href=\"#2\"><nobr>2</nobr><nobr></nobr></a><nobr><br><a href=\"#3\"></a></nobr><a href=\"#3\"><nobr>3</nobr><nobr></nobr></a>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><b><nobr>1<nobr></b><i><nobr>2<nobr></i>3",
    +      "errors": [
    +        "(1,37): unexpected-start-tag-implies-end-tag",
    +        "(1,41): adoption-agency-1.3",
    +        "(1,50): unexpected-start-tag-implies-end-tag",
    +        "(1,50): adoption-agency-1.3",
    +        "(1,57): unexpected-start-tag-implies-end-tag",
    +        "(1,61): adoption-agency-1.3",
    +        "(1,62): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "nobr": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "1"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "nobr",
    +                    "children": [
    +                      {
    +                        "tag": "i"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "nobr",
    +                    "children": [
    +                      {
    +                        "text": "3"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1</nobr><nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></body></html>",
    +        "noQuirksBodyHtml": "<b><nobr>1</nobr><nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><b><nobr>1<table><nobr></b><i><nobr>2<nobr></i>3",
    +      "errors": [
    +        "(1,44): foster-parenting-start-tag",
    +        "(1,48): foster-parenting-end-tag",
    +        "(1,48): adoption-agency-1.3",
    +        "(1,51): foster-parenting-start-tag",
    +        "(1,57): foster-parenting-start-tag",
    +        "(1,57): nobr-already-in-scope",
    +        "(1,57): adoption-agency-1.2",
    +        "(1,58): foster-parenting-character",
    +        "(1,64): foster-parenting-start-tag",
    +        "(1,64): nobr-already-in-scope",
    +        "(1,68): foster-parenting-end-tag",
    +        "(1,68): adoption-agency-1.2",
    +        "(1,69): foster-parenting-character",
    +        "(1,69): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "nobr": true,
    +            "i": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "1"
    +                          },
    +                          {
    +                            "tag": "nobr",
    +                            "children": [
    +                              {
    +                                "tag": "i"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "tag": "nobr",
    +                                "children": [
    +                                  {
    +                                    "text": "2"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "nobr"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "nobr",
    +                            "children": [
    +                              {
    +                                "text": "3"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "table"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1<nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr><table></table></nobr></b></body></html>",
    +        "noQuirksBodyHtml": "<b><nobr>1<nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr><table></table></nobr></b>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><b><nobr>1<table><tr><td><nobr></b><i><nobr>2<nobr></i>3",
    +      "errors": [
    +        "(1,56): unexpected-end-tag",
    +        "(1,65): unexpected-start-tag-implies-end-tag",
    +        "(1,65): adoption-agency-1.3",
    +        "(1,72): unexpected-start-tag-implies-end-tag",
    +        "(1,76): adoption-agency-1.3",
    +        "(1,77): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "nobr": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "1"
    +                          },
    +                          {
    +                            "tag": "table",
    +                            "children": [
    +                              {
    +                                "tag": "tbody",
    +                                "children": [
    +                                  {
    +                                    "tag": "tr",
    +                                    "children": [
    +                                      {
    +                                        "tag": "td",
    +                                        "children": [
    +                                          {
    +                                            "tag": "nobr",
    +                                            "children": [
    +                                              {
    +                                                "tag": "i"
    +                                              }
    +                                            ]
    +                                          },
    +                                          {
    +                                            "tag": "i",
    +                                            "children": [
    +                                              {
    +                                                "tag": "nobr",
    +                                                "children": [
    +                                                  {
    +                                                    "text": "2"
    +                                                  }
    +                                                ]
    +                                              },
    +                                              {
    +                                                "tag": "nobr"
    +                                              }
    +                                            ]
    +                                          },
    +                                          {
    +                                            "tag": "nobr",
    +                                            "children": [
    +                                              {
    +                                                "text": "3"
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1<table><tbody><tr><td><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></td></tr></tbody></table></nobr></b></body></html>",
    +        "noQuirksBodyHtml": "<b><nobr>1<table><tbody><tr><td><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></td></tr></tbody></table></nobr></b>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><b><nobr>1<div><nobr></b><i><nobr>2<nobr></i>3",
    +      "errors": [
    +        "(1,42): unexpected-start-tag-implies-end-tag",
    +        "(1,42): adoption-agency-1.3",
    +        "(1,46): adoption-agency-1.3",
    +        "(1,46): adoption-agency-1.3",
    +        "(1,55): unexpected-start-tag-implies-end-tag",
    +        "(1,55): adoption-agency-1.3",
    +        "(1,62): unexpected-start-tag-implies-end-tag",
    +        "(1,66): adoption-agency-1.3",
    +        "(1,67): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "nobr": true,
    +            "div": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "1"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "nobr"
    +                          },
    +                          {
    +                            "tag": "nobr"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "tag": "i"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "tag": "nobr",
    +                            "children": [
    +                              {
    +                                "text": "2"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "nobr"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "3"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1</nobr></b><div><b><nobr></nobr><nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></div></body></html>",
    +        "noQuirksBodyHtml": "<b><nobr>1</nobr></b><div><b><nobr></nobr><nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></div>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><b><nobr>1<nobr></b><div><i><nobr>2<nobr></i>3",
    +      "errors": [
    +        "(1,37): unexpected-start-tag-implies-end-tag",
    +        "(1,41): adoption-agency-1.3",
    +        "(1,55): unexpected-start-tag-implies-end-tag",
    +        "(1,55): adoption-agency-1.3",
    +        "(1,62): unexpected-start-tag-implies-end-tag",
    +        "(1,66): adoption-agency-1.3",
    +        "(1,67): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "nobr": true,
    +            "div": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "1"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "tag": "i"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "tag": "nobr",
    +                            "children": [
    +                              {
    +                                "text": "2"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "nobr"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "3"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1</nobr><nobr></nobr></b><div><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></div></body></html>",
    +        "noQuirksBodyHtml": "<b><nobr>1</nobr><nobr></nobr></b><div><nobr><i></i></nobr><i><nobr>2</nobr><nobr></nobr></i><nobr>3</nobr></div>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><b><nobr>1<nobr><ins></b><i><nobr>",
    +      "errors": [
    +        "(1,37): unexpected-start-tag-implies-end-tag",
    +        "(1,46): adoption-agency-1.3",
    +        "(1,55): unexpected-start-tag-implies-end-tag",
    +        "(1,55): adoption-agency-1.3",
    +        "(1,55): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "nobr": true,
    +            "ins": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "1"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "tag": "ins"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "nobr",
    +                    "children": [
    +                      {
    +                        "tag": "i"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1</nobr><nobr><ins></ins></nobr></b><nobr><i></i></nobr><i><nobr></nobr></i></body></html>",
    +        "noQuirksBodyHtml": "<b><nobr>1</nobr><nobr><ins></ins></nobr></b><nobr><i></i></nobr><i><nobr></nobr></i>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><b><nobr>1<ins><nobr></b><i>2",
    +      "errors": [
    +        "(1,42): unexpected-start-tag-implies-end-tag",
    +        "(1,42): adoption-agency-1.3",
    +        "(1,46): adoption-agency-1.3",
    +        "(1,50): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "nobr": true,
    +            "ins": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "1"
    +                          },
    +                          {
    +                            "tag": "ins"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "nobr",
    +                    "children": [
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><b><nobr>1<ins></ins></nobr><nobr></nobr></b><nobr><i>2</i></nobr></body></html>",
    +        "noQuirksBodyHtml": "<b><nobr>1<ins></ins></nobr><nobr></nobr></b><nobr><i>2</i></nobr>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><b>1<nobr></b><i><nobr>2</i>",
    +      "errors": [
    +        "(1,35): adoption-agency-1.3",
    +        "(1,44): unexpected-start-tag-implies-end-tag",
    +        "(1,44): adoption-agency-1.3",
    +        "(1,49): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "nobr": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "1"
    +                      },
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "nobr",
    +                    "children": [
    +                      {
    +                        "tag": "i"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "tag": "nobr",
    +                        "children": [
    +                          {
    +                            "text": "2"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><b>1<nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr></i></body></html>",
    +        "noQuirksBodyHtml": "<b>1<nobr></nobr></b><nobr><i></i></nobr><i><nobr>2</nobr></i>"
    +      }
    +    },
    +    {
    +      "data": "<p><code x</code></p>\n",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,11): invalid-character-in-attribute-name",
    +        "(1,12): unexpected-character-after-solidus-in-tag",
    +        "(1,21): unexpected-end-tag",
    +        "(2,0): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "code": true
    +          },
    +          "attrWithFunnyChar": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "code",
    +                        "attrs": [
    +                          {
    +                            "name": "code",
    +                            "value": ""
    +                          },
    +                          {
    +                            "name": "x<",
    +                            "value": ""
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "code",
    +                    "attrs": [
    +                      {
    +                        "name": "code",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "x<",
    +                        "value": ""
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><code x<=\"\" code=\"\"></code></p><code x<=\"\" code=\"\">\n</code></body></html>",
    +        "noQuirksBodyHtml": "<p><code x<=\"\" code=\"\"></code></p><code x<=\"\" code=\"\">\n</code>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><svg><foreignObject><p><i></p>a",
    +      "errors": [
    +        "(1,45): unexpected-end-tag",
    +        "(1,46): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg foreignObject": true,
    +            "p": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "foreignObject",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "tag": "i"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "a"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><svg><foreignObject><p><i></i></p><i>a</i></foreignObject></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><foreignObject><p><i></i></p><i>a</i></foreignObject></svg>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><table><tr><td><svg><foreignObject><p><i></p>a",
    +      "errors": [
    +        "(1,60): unexpected-end-tag",
    +        "(1,61): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "svg svg": true,
    +            "svg foreignObject": true,
    +            "p": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "svg",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "foreignObject",
    +                                        "ns": "http://www.w3.org/2000/svg",
    +                                        "children": [
    +                                          {
    +                                            "tag": "p",
    +                                            "children": [
    +                                              {
    +                                                "tag": "i"
    +                                              }
    +                                            ]
    +                                          },
    +                                          {
    +                                            "tag": "i",
    +                                            "children": [
    +                                              {
    +                                                "text": "a"
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><svg><foreignObject><p><i></i></p><i>a</i></foreignObject></svg></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><foreignObject><p><i></i></p><i>a</i></foreignObject></svg></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><math><mtext><p><i></p>a",
    +      "errors": [
    +        "(1,38): unexpected-end-tag",
    +        "(1,39): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mtext": true,
    +            "p": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mtext",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "tag": "i"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "a"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mtext><p><i></i></p><i>a</i></mtext></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mtext><p><i></i></p><i>a</i></mtext></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><table><tr><td><math><mtext><p><i></p>a",
    +      "errors": [
    +        "(1,53): unexpected-end-tag",
    +        "(1,54): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "math math": true,
    +            "math mtext": true,
    +            "p": true,
    +            "i": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "math",
    +                                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                                    "children": [
    +                                      {
    +                                        "tag": "mtext",
    +                                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                                        "children": [
    +                                          {
    +                                            "tag": "p",
    +                                            "children": [
    +                                              {
    +                                                "tag": "i"
    +                                              }
    +                                            ]
    +                                          },
    +                                          {
    +                                            "tag": "i",
    +                                            "children": [
    +                                              {
    +                                                "text": "a"
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><math><mtext><p><i></i></p><i>a</i></mtext></math></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><math><mtext><p><i></i></p><i>a</i></mtext></math></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><div><!/div>a",
    +      "errors": [
    +        "(1,28): expected-dashes-or-doctype",
    +        "(1,34): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          },
    +          "doctype": true,
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "comment": "/div"
    +                      },
    +                      {
    +                        "text": "a"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><div><!--/div-->a</div></body></html>",
    +        "noQuirksBodyHtml": "<div><!--/div-->a</div>"
    +      }
    +    },
    +    {
    +      "data": "<button><p><button>",
    +      "errors": [
    +        "Line 1 Col 8 Unexpected start tag (button). Expected DOCTYPE.",
    +        "Line 1 Col 19 Unexpected start tag (button) implies end tag (button).",
    +        "Line 1 Col 19 Expected closing tag. Unexpected end of file."
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "button": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "button",
    +                    "children": [
    +                      {
    +                        "tag": "p"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "button"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><button><p></p></button><button></button></body></html>",
    +        "noQuirksBodyHtml": "<button><p></p></button><button></button>"
    +      }
    +    }
    +  ],
    +  "tests3.dat": [
    +    {
    +      "data": "<head></head><style></style>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,20): unexpected-start-tag-out-of-my-head"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style></style></head><body></body></html>",
    +        "noQuirksBodyHtml": "<style></style>"
    +      }
    +    },
    +    {
    +      "data": "<head></head><script></script>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,21): unexpected-start-tag-out-of-my-head"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script></script></head><body></body></html>",
    +        "noQuirksBodyHtml": "<script></script>"
    +      }
    +    },
    +    {
    +      "data": "<head></head><!-- --><style></style><!-- --><script></script>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,28): unexpected-start-tag-out-of-my-head",
    +        "(1,52): unexpected-start-tag-out-of-my-head"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style"
    +                  },
    +                  {
    +                    "tag": "script"
    +                  }
    +                ]
    +              },
    +              {
    +                "comment": " "
    +              },
    +              {
    +                "comment": " "
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style></style><script></script></head><!-- --><!-- --><body></body></html>",
    +        "noQuirksBodyHtml": "<!-- --><style></style><!-- --><script></script>"
    +      }
    +    },
    +    {
    +      "data": "<head></head><!-- -->x<style></style><!-- --><script></script>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "style": true,
    +            "script": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "comment": " "
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "x"
    +                  },
    +                  {
    +                    "tag": "style"
    +                  },
    +                  {
    +                    "comment": " "
    +                  },
    +                  {
    +                    "tag": "script"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><!-- --><body>x<style></style><!-- --><script></script></body></html>",
    +        "noQuirksBodyHtml": "<!-- -->x<style></style><!-- --><script></script>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><head></head><body><pre>\n</pre></body></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre></pre></body></html>",
    +        "noQuirksBodyHtml": "<pre></pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><head></head><body><pre>\nfoo</pre></body></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>foo</pre></body></html>",
    +        "noQuirksBodyHtml": "<pre>foo</pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><head></head><body><pre>\n\nfoo</pre></body></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true,
    +          "extraNL": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "\nfoo",
    +                        "extraNL": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nfoo</pre></body></html>",
    +        "noQuirksBodyHtml": "<pre>\n\nfoo</pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><head></head><body><pre>\nfoo\n</pre></body></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "foo\n"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>foo\n</pre></body></html>",
    +        "noQuirksBodyHtml": "<pre>foo\n</pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><head></head><body><pre>x</pre><span>\n</span></body></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true,
    +            "span": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "x"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "span",
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>x</pre><span>\n</span></body></html>",
    +        "noQuirksBodyHtml": "<pre>x</pre><span>\n</span>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><head></head><body><pre>x\ny</pre></body></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "x\ny"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>x\ny</pre></body></html>",
    +        "noQuirksBodyHtml": "<pre>x\ny</pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><head></head><body><pre>x<div>\ny</pre></body></html>",
    +      "errors": [
    +        "(2,7): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true,
    +            "div": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "x"
    +                      },
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "text": "\ny"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>x<div>\ny</div></pre></body></html>",
    +        "noQuirksBodyHtml": "<pre>x<div>\ny</div></pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><pre>&#x0a;&#x0a;A</pre>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "pre": true
    +          },
    +          "doctype": true,
    +          "extraNL": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "pre",
    +                    "children": [
    +                      {
    +                        "text": "\nA",
    +                        "extraNL": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><pre>\n\nA</pre></body></html>",
    +        "noQuirksBodyHtml": "<pre>\n\nA</pre>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><HTML><META><HEAD></HEAD></HTML>",
    +      "errors": [
    +        "(1,33): two-heads-are-not-better-than-one"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "meta": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "meta"
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><meta></head><body></body></html>",
    +        "noQuirksBodyHtml": "<meta>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><HTML><HEAD><head></HEAD></HTML>",
    +      "errors": [
    +        "(1,33): two-heads-are-not-better-than-one"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<textarea>foo<span>bar</span><i>baz",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,35): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "foo<span>bar</span><i>baz",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><textarea>foo&lt;span&gt;bar&lt;/span&gt;&lt;i&gt;baz</textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea>foo&lt;span&gt;bar&lt;/span&gt;&lt;i&gt;baz</textarea>"
    +      }
    +    },
    +    {
    +      "data": "<title>foo<span>bar</em><i>baz",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,30): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "foo<span>bar</em><i>baz",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title>foo&lt;span&gt;bar&lt;/em&gt;&lt;i&gt;baz</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>foo&lt;span&gt;bar&lt;/em&gt;&lt;i&gt;baz</title>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><textarea>\n</textarea>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><textarea></textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea></textarea>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><textarea>\nfoo</textarea>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><textarea>foo</textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea>foo</textarea>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><textarea>\n\nfoo</textarea>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "doctype": true,
    +          "extraNL": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": "\nfoo",
    +                        "extraNL": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><textarea>\n\nfoo</textarea></body></html>",
    +        "noQuirksBodyHtml": "<textarea>\n\nfoo</textarea>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><html><head></head><body><ul><li><div><p><li></ul></body></html>",
    +      "errors": [
    +        "(1,60): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ul": true,
    +            "li": true,
    +            "div": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ul",
    +                    "children": [
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "tag": "p"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "li"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><ul><li><div><p></p></div></li><li></li></ul></body></html>",
    +        "noQuirksBodyHtml": "<ul><li><div><p></p></div></li><li></li></ul>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><nobr><nobr><nobr>",
    +      "errors": [
    +        "(1,27): unexpected-start-tag-implies-end-tag",
    +        "(1,33): unexpected-start-tag-implies-end-tag",
    +        "(1,33): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "nobr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "nobr"
    +                  },
    +                  {
    +                    "tag": "nobr"
    +                  },
    +                  {
    +                    "tag": "nobr"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><nobr></nobr><nobr></nobr><nobr></nobr></body></html>",
    +        "noQuirksBodyHtml": "<nobr></nobr><nobr></nobr><nobr></nobr>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><nobr><nobr></nobr><nobr>",
    +      "errors": [
    +        "(1,27): unexpected-start-tag-implies-end-tag",
    +        "(1,40): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "nobr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "nobr"
    +                  },
    +                  {
    +                    "tag": "nobr"
    +                  },
    +                  {
    +                    "tag": "nobr"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><nobr></nobr><nobr></nobr><nobr></nobr></body></html>",
    +        "noQuirksBodyHtml": "<nobr></nobr><nobr></nobr><nobr></nobr>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html><body><p><table></table></body></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p></p><table></table></body></html>",
    +        "noQuirksBodyHtml": "<p></p><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<p><table></table>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "table"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><table></table></p></body></html>",
    +        "noQuirksBodyHtml": "<p></p><table></table>"
    +      }
    +    }
    +  ],
    +  "tests4.dat": [
    +    {
    +      "data": "direct div content",
    +      "errors": [],
    +      "fragment": {
    +        "name": "div"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "direct div content"
    +          }
    +        ],
    +        "html": "direct div content",
    +        "noQuirksBodyHtml": "direct div content"
    +      }
    +    },
    +    {
    +      "data": "direct textarea content",
    +      "errors": [],
    +      "fragment": {
    +        "name": "textarea"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {}
    +        },
    +        "tree": [
    +          {
    +            "text": "direct textarea content"
    +          }
    +        ],
    +        "html": "direct textarea content",
    +        "noQuirksBodyHtml": "direct textarea content"
    +      }
    +    },
    +    {
    +      "data": "textarea content with <em>pseudo</em> <foo>markup",
    +      "errors": [],
    +      "fragment": {
    +        "name": "textarea"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {},
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "text": "textarea content with <em>pseudo</em> <foo>markup",
    +            "escaped": true
    +          }
    +        ],
    +        "html": "textarea content with &lt;em&gt;pseudo&lt;/em&gt; &lt;foo&gt;markup",
    +        "noQuirksBodyHtml": "textarea content with <em>pseudo</em> <foo>markup</foo>"
    +      }
    +    },
    +    {
    +      "data": "this is &#x0043;DATA inside a <style> element",
    +      "errors": [],
    +      "fragment": {
    +        "name": "style"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {},
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "text": "this is &#x0043;DATA inside a <style> element",
    +            "no_escape": true
    +          }
    +        ],
    +        "html": "this is &#x0043;DATA inside a <style> element",
    +        "noQuirksBodyHtml": "this is CDATA inside a <style> element</style>"
    +      }
    +    },
    +    {
    +      "data": "</plaintext>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "plaintext"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {},
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "text": "</plaintext>",
    +            "no_escape": true
    +          }
    +        ],
    +        "html": "</plaintext>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "setting html's innerHTML",
    +      "errors": [],
    +      "fragment": {
    +        "name": "html"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "head"
    +          },
    +          {
    +            "tag": "body",
    +            "children": [
    +              {
    +                "text": "setting html's innerHTML"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<head></head><body>setting html's innerHTML</body>",
    +        "noQuirksBodyHtml": "setting html's innerHTML"
    +      }
    +    },
    +    {
    +      "data": "<title>setting head's innerHTML</title>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "head"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "title": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "title",
    +            "children": [
    +              {
    +                "text": "setting head's innerHTML"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<title>setting head's innerHTML</title>",
    +        "noQuirksBodyHtml": "<title>setting head's innerHTML</title>"
    +      }
    +    }
    +  ],
    +  "tests5.dat": [
    +    {
    +      "data": "<style> <!-- </style>x",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": " <!-- ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "x"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style> <!-- </style></head><body>x</body></html>",
    +        "noQuirksBodyHtml": "<style> <!-- </style>x"
    +      }
    +    },
    +    {
    +      "data": "<style> <!-- </style> --> </style>x",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,34): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": " <!-- ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": " "
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "--> x",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style> <!-- </style> </head><body>--&gt; x</body></html>",
    +        "noQuirksBodyHtml": "<style> <!-- </style> --&gt; x"
    +      }
    +    },
    +    {
    +      "data": "<style> <!--> </style>x",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": " <!--> ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "x"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style> <!--> </style></head><body>x</body></html>",
    +        "noQuirksBodyHtml": "<style> <!--> </style>x"
    +      }
    +    },
    +    {
    +      "data": "<style> <!---> </style>x",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": " <!---> ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "x"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style> <!---> </style></head><body>x</body></html>",
    +        "noQuirksBodyHtml": "<style> <!---> </style>x"
    +      }
    +    },
    +    {
    +      "data": "<iframe> <!---> </iframe>x",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "iframe": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "iframe",
    +                    "children": [
    +                      {
    +                        "text": " <!---> ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "x"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><iframe> <!---> </iframe>x</body></html>",
    +        "noQuirksBodyHtml": "<iframe> <!---> </iframe>x"
    +      }
    +    },
    +    {
    +      "data": "<iframe> <!--- </iframe>->x</iframe> --> </iframe>x",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,36): unexpected-end-tag",
    +        "(1,50): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "iframe": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "iframe",
    +                    "children": [
    +                      {
    +                        "text": " <!--- ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "->x --> x",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><iframe> <!--- </iframe>-&gt;x --&gt; x</body></html>",
    +        "noQuirksBodyHtml": "<iframe> <!--- </iframe>-&gt;x --&gt; x"
    +      }
    +    },
    +    {
    +      "data": "<script> <!-- </script> --> </script>x",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,37): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "script": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": " <!-- ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": " "
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "--> x",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><script> <!-- </script> </head><body>--&gt; x</body></html>",
    +        "noQuirksBodyHtml": "<script> <!-- </script> --&gt; x"
    +      }
    +    },
    +    {
    +      "data": "<title> <!-- </title> --> </title>x",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,34): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": " <!-- ",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": " "
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "--> x",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title> &lt;!-- </title> </head><body>--&gt; x</body></html>",
    +        "noQuirksBodyHtml": "<title> &lt;!-- </title> --&gt; x"
    +      }
    +    },
    +    {
    +      "data": "<textarea> <!--- </textarea>->x</textarea> --> </textarea>x",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,42): unexpected-end-tag",
    +        "(1,58): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "textarea": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "textarea",
    +                    "children": [
    +                      {
    +                        "text": " <!--- ",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "->x --> x",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><textarea> &lt;!--- </textarea>-&gt;x --&gt; x</body></html>",
    +        "noQuirksBodyHtml": "<textarea> &lt;!--- </textarea>-&gt;x --&gt; x"
    +      }
    +    },
    +    {
    +      "data": "<style> <!</-- </style>x",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style",
    +                    "children": [
    +                      {
    +                        "text": " <!</-- ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "x"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style> <!</-- </style></head><body>x</body></html>",
    +        "noQuirksBodyHtml": "<style> <!</-- </style>x"
    +      }
    +    },
    +    {
    +      "data": "<p><xmp></xmp>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "xmp": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p"
    +                  },
    +                  {
    +                    "tag": "xmp"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p></p><xmp></xmp></body></html>",
    +        "noQuirksBodyHtml": "<p></p><xmp></xmp>"
    +      }
    +    },
    +    {
    +      "data": "<xmp> <!-- > --> </xmp>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "xmp": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "xmp",
    +                    "children": [
    +                      {
    +                        "text": " <!-- > --> ",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><xmp> <!-- > --> </xmp></body></html>",
    +        "noQuirksBodyHtml": "<xmp> <!-- > --> </xmp>"
    +      }
    +    },
    +    {
    +      "data": "<title>&amp;</title>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "&",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title>&amp;</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>&amp;</title>"
    +      }
    +    },
    +    {
    +      "data": "<title><!--&amp;--></title>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "<!--&-->",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title>&lt;!--&amp;--&gt;</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>&lt;!--&amp;--&gt;</title>"
    +      }
    +    },
    +    {
    +      "data": "<title><!--</title>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><title>&lt;!--</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>&lt;!--</title>"
    +      }
    +    },
    +    {
    +      "data": "<noscript><!--</noscript>--></noscript>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,39): unexpected-end-tag"
    +      ],
    +      "script": "on",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "no_escape": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "text": "<!--",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "-->",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noscript><!--</noscript></head><body>--&gt;</body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>--&gt;"
    +      }
    +    },
    +    {
    +      "data": "<noscript><!--</noscript>--></noscript>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "script": "off",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "noscript": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "noscript",
    +                    "children": [
    +                      {
    +                        "comment": "</noscript>"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><noscript><!--</noscript>--></noscript></head><body></body></html>",
    +        "noQuirksBodyHtml": "<noscript>&lt;!--</noscript>--&gt;"
    +      }
    +    }
    +  ],
    +  "tests6.dat": [
    +    {
    +      "data": "<!doctype html></head> <head>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "text": " "
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head> <body></body></html>",
    +        "noQuirksBodyHtml": " "
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><form><div></form><div>",
    +      "errors": [
    +        "(1,33): end-tag-too-early-ignored",
    +        "(1,38): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true,
    +            "div": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><form><div><div></div></div></form></body></html>",
    +        "noQuirksBodyHtml": "<form><div><div></div></div></form>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><title>&amp;</title>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "&",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><title>&amp;</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>&amp;</title>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><title><!--&amp;--></title>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "doctype": true,
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "<!--&-->",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><title>&lt;!--&amp;--&gt;</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>&lt;!--&amp;--&gt;</title>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype>",
    +      "errors": [
    +        "(1,9): need-space-after-doctype",
    +        "(1,10): expected-doctype-name-but-got-right-bracket",
    +        "(1,10): unknown-doctype"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": ""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE ><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!---x",
    +      "errors": [
    +        "(1,6): eof-in-comment",
    +        "(1,6): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": "-x"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!---x--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!---x-->"
    +      }
    +    },
    +    {
    +      "data": "<body>\n<div>",
    +      "errors": [
    +        "(1,6): unexpected-start-tag",
    +        "(2,5): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "div"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "text": "\n"
    +          },
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "\n<div></div>",
    +        "noQuirksBodyHtml": "\n<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<frameset></frameset>\nfoo",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(2,1): unexpected-char-after-frameset",
    +        "(2,2): unexpected-char-after-frameset",
    +        "(2,3): unexpected-char-after-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "text": "\n"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset>\n</html>",
    +        "noQuirksBodyHtml": "\nfoo"
    +      }
    +    },
    +    {
    +      "data": "<frameset></frameset>\n<noframes>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(2,10): expected-named-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "noframes": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "text": "\n"
    +              },
    +              {
    +                "tag": "noframes"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset>\n<noframes></noframes></html>",
    +        "noQuirksBodyHtml": "\n<noframes></noframes>"
    +      }
    +    },
    +    {
    +      "data": "<frameset></frameset>\n<div>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(2,5): unexpected-start-tag-after-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "text": "\n"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset>\n</html>",
    +        "noQuirksBodyHtml": "\n<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<frameset></frameset>\n</html>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "text": "\n"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset>\n</html>",
    +        "noQuirksBodyHtml": "\n"
    +      }
    +    },
    +    {
    +      "data": "<frameset></frameset>\n</div>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(2,6): unexpected-end-tag-after-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "text": "\n"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset>\n</html>",
    +        "noQuirksBodyHtml": "\n"
    +      }
    +    },
    +    {
    +      "data": "<form><form>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,12): unexpected-start-tag",
    +        "(1,12): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "form": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "form"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><form></form></body></html>",
    +        "noQuirksBodyHtml": "<form></form>"
    +      }
    +    },
    +    {
    +      "data": "<button><button>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,16): unexpected-start-tag-implies-end-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "button": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "button"
    +                  },
    +                  {
    +                    "tag": "button"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><button></button><button></button></body></html>",
    +        "noQuirksBodyHtml": "<button></button><button></button>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><td></th>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,20): unexpected-end-tag",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><caption><td>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,20): unexpected-cell-in-table-body",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption"
    +                      },
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><caption></caption><tbody><tr><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption></caption><tbody><tr><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><caption><div>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,21): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><caption><div></div></caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><div></div></caption></table>"
    +      }
    +    },
    +    {
    +      "data": "</caption><div>",
    +      "errors": [
    +        "(1,10): XXX-undefined-error",
    +        "(1,15): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<table><caption><div></caption>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,31): expected-one-end-tag-but-got-another",
    +        "(1,31): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><caption><div></div></caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><div></div></caption></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><caption></table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><caption></caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption></caption></table>"
    +      }
    +    },
    +    {
    +      "data": "</table><div>",
    +      "errors": [
    +        "(1,8): unexpected-end-tag",
    +        "(1,13): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<table><caption></body></col></colgroup></html></tbody></td></tfoot></th></thead></tr>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,23): unexpected-end-tag",
    +        "(1,29): unexpected-end-tag",
    +        "(1,40): unexpected-end-tag",
    +        "(1,47): unexpected-end-tag",
    +        "(1,55): unexpected-end-tag",
    +        "(1,60): unexpected-end-tag",
    +        "(1,68): unexpected-end-tag",
    +        "(1,73): unexpected-end-tag",
    +        "(1,81): unexpected-end-tag",
    +        "(1,86): unexpected-end-tag",
    +        "(1,86): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><caption></caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption></caption></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><caption><div></div>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,27): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><caption><div></div></caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><div></div></caption></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><td></body></caption></col></colgroup></html>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,22): unexpected-end-tag",
    +        "(1,32): unexpected-end-tag",
    +        "(1,38): unexpected-end-tag",
    +        "(1,49): unexpected-end-tag",
    +        "(1,56): unexpected-end-tag",
    +        "(1,56): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "</table></tbody></tfoot></thead></tr><div>",
    +      "errors": [
    +        "(1,8): unexpected-end-tag",
    +        "(1,16): unexpected-end-tag",
    +        "(1,24): unexpected-end-tag",
    +        "(1,32): unexpected-end-tag",
    +        "(1,37): unexpected-end-tag",
    +        "(1,42): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup>foo",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,18): foster-parenting-character-in-table",
    +        "(1,19): foster-parenting-character-in-table",
    +        "(1,20): foster-parenting-character-in-table",
    +        "(1,20): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "foo"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>foo<table><colgroup></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "foo<table><colgroup></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "foo<col>",
    +      "errors": [
    +        "(1,1): unexpected-character-in-colgroup",
    +        "(1,2): unexpected-character-in-colgroup",
    +        "(1,3): unexpected-character-in-colgroup"
    +      ],
    +      "fragment": {
    +        "name": "colgroup"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "col": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "col"
    +          }
    +        ],
    +        "html": "<col>",
    +        "noQuirksBodyHtml": "foo"
    +      }
    +    },
    +    {
    +      "data": "<table><colgroup></col>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,23): no-end-tag",
    +        "(1,23): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "colgroup": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><colgroup></colgroup></table></body></html>",
    +        "noQuirksBodyHtml": "<table><colgroup></colgroup></table>"
    +      }
    +    },
    +    {
    +      "data": "<frameset><div>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,15): unexpected-start-tag-in-frameset",
    +        "(1,15): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "</frameset><frame>",
    +      "errors": [
    +        "(1,11): unexpected-frameset-in-frameset-innerhtml"
    +      ],
    +      "fragment": {
    +        "name": "frameset"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "frame": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "frame"
    +          }
    +        ],
    +        "html": "<frame>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<frameset></div>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag",
    +        "(1,16): unexpected-end-tag-in-frameset",
    +        "(1,16): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "</body><div>",
    +      "errors": [
    +        "(1,7): unexpected-close-tag",
    +        "(1,12): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "body"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "div"
    +          }
    +        ],
    +        "html": "<div></div>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><div>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,16): unexpected-start-tag-implies-table-voodoo",
    +        "(1,16): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div></div><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<div></div><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "</tr><td>",
    +      "errors": [
    +        "(1,5): unexpected-end-tag"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "</tbody></tfoot></thead><td>",
    +      "errors": [
    +        "(1,8): unexpected-end-tag",
    +        "(1,16): unexpected-end-tag",
    +        "(1,24): unexpected-end-tag"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<table><tr><div><td>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,16): foster-parenting-start-tag",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div></div><table><tbody><tr><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<div></div><table><tbody><tr><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<caption><col><colgroup><tbody><tfoot><thead><tr>",
    +      "errors": [
    +        "(1,9): unexpected-start-tag",
    +        "(1,14): unexpected-start-tag",
    +        "(1,24): unexpected-start-tag",
    +        "(1,31): unexpected-start-tag",
    +        "(1,38): unexpected-start-tag",
    +        "(1,45): unexpected-start-tag"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "tr"
    +          }
    +        ],
    +        "html": "<tr></tr>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<table><tbody></thead>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,22): unexpected-end-tag-in-table-body",
    +        "(1,22): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "</table><tr>",
    +      "errors": [
    +        "(1,8): unexpected-end-tag"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "tr"
    +          }
    +        ],
    +        "html": "<tr></tr>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<table><tbody></body></caption></col></colgroup></html></td></th></tr>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,21): unexpected-end-tag-in-table-body",
    +        "(1,31): unexpected-end-tag-in-table-body",
    +        "(1,37): unexpected-end-tag-in-table-body",
    +        "(1,48): unexpected-end-tag-in-table-body",
    +        "(1,55): unexpected-end-tag-in-table-body",
    +        "(1,60): unexpected-end-tag-in-table-body",
    +        "(1,65): unexpected-end-tag-in-table-body",
    +        "(1,70): unexpected-end-tag-in-table-body",
    +        "(1,70): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tbody></div>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,20): unexpected-end-tag-implies-table-voodoo",
    +        "(1,20): end-tag-too-early",
    +        "(1,20): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-start-tag-implies-end-tag",
    +        "(1,14): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table></table><table></table></body></html>",
    +        "noQuirksBodyHtml": "<table></table><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<table></body></caption></col></colgroup></html></tbody></td></tfoot></th></thead></tr>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-end-tag",
    +        "(1,24): unexpected-end-tag",
    +        "(1,30): unexpected-end-tag",
    +        "(1,41): unexpected-end-tag",
    +        "(1,48): unexpected-end-tag",
    +        "(1,56): unexpected-end-tag",
    +        "(1,61): unexpected-end-tag",
    +        "(1,69): unexpected-end-tag",
    +        "(1,74): unexpected-end-tag",
    +        "(1,82): unexpected-end-tag",
    +        "(1,87): unexpected-end-tag",
    +        "(1,87): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table></table></body></html>",
    +        "noQuirksBodyHtml": "<table></table>"
    +      }
    +    },
    +    {
    +      "data": "</table><tr>",
    +      "errors": [
    +        "(1,8): unexpected-end-tag"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "tbody",
    +            "children": [
    +              {
    +                "tag": "tr"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<tbody><tr></tr></tbody>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<body></body></html>",
    +      "errors": [
    +        "(1,20): unexpected-end-tag-after-body-innerhtml"
    +      ],
    +      "fragment": {
    +        "name": "html"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "head"
    +          },
    +          {
    +            "tag": "body"
    +          }
    +        ],
    +        "html": "<head></head><body></body>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<html><frameset></frameset></html> ",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              },
    +              {
    +                "text": " "
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset> </html>",
    +        "noQuirksBodyHtml": " "
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01//EN\"><html></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html \"-//W3C//DTD HTML 4.01//EN\" \"\""
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<param><frameset></frameset>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,17): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<param>"
    +      }
    +    },
    +    {
    +      "data": "<source><frameset></frameset>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,18): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<source>"
    +      }
    +    },
    +    {
    +      "data": "<track><frameset></frameset>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,17): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<track>"
    +      }
    +    },
    +    {
    +      "data": "</html><frameset></frameset>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-end-tag",
    +        "(1,17): expected-eof-but-got-start-tag",
    +        "(1,17): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "</body><frameset></frameset>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-end-tag",
    +        "(1,17): unexpected-start-tag-after-body",
    +        "(1,17): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    }
    +  ],
    +  "tests7.dat": [
    +    {
    +      "data": "<!doctype html><body><title>X</title>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "title": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><title>X</title></body></html>",
    +        "noQuirksBodyHtml": "<title>X</title>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><title>X</title></table>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag-implies-table-voodoo"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "title": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><title>X</title><table></table></body></html>",
    +        "noQuirksBodyHtml": "<title>X</title><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><head></head><title>X</title>",
    +      "errors": [
    +        "(1,35): unexpected-start-tag-out-of-my-head"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><title>X</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>X</title>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html></head><title>X</title>",
    +      "errors": [
    +        "(1,29): unexpected-start-tag-out-of-my-head"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "title": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "title",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head><title>X</title></head><body></body></html>",
    +        "noQuirksBodyHtml": "<title>X</title>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><meta></table>",
    +      "errors": [
    +        "(1,28): unexpected-start-tag-implies-table-voodoo"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "meta": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "meta"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><meta><table></table></body></html>",
    +        "noQuirksBodyHtml": "<meta><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table>X<tr><td><table> <meta></table></table>",
    +      "errors": [
    +        "unexpected text in table",
    +        "(1,45): unexpected-start-tag-implies-table-voodoo"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "meta": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "meta"
    +                                  },
    +                                  {
    +                                    "tag": "table",
    +                                    "children": [
    +                                      {
    +                                        "text": " "
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>X<table><tbody><tr><td><meta><table> </table></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "X<table><tbody><tr><td><meta><table> </table></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><html> <head>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": " "
    +      }
    +    },
    +    {
    +      "data": "<!doctype html> <head>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": " "
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><style> <tr>x </style> </table>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "style": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "style",
    +                        "children": [
    +                          {
    +                            "text": " <tr>x ",
    +                            "no_escape": true
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": " "
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><style> <tr>x </style> </table></body></html>",
    +        "noQuirksBodyHtml": "<table><style> <tr>x </style> </table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><TBODY><script> <tr>x </script> </table>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "script": true
    +          },
    +          "doctype": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "script",
    +                            "children": [
    +                              {
    +                                "text": " <tr>x ",
    +                                "no_escape": true
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": " "
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><script> <tr>x </script> </tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><script> <tr>x </script> </tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><applet><p>X</p></applet>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "applet": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "applet",
    +                        "children": [
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "text": "X"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><applet><p>X</p></applet></p></body></html>",
    +        "noQuirksBodyHtml": "<p><applet><p>X</p></applet></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><p><object type=\"application/x-non-existant-plugin\"><p>X</p></object>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "object": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "object",
    +                        "attrs": [
    +                          {
    +                            "name": "type",
    +                            "value": "application/x-non-existant-plugin"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "text": "X"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><p><object type=\"application/x-non-existant-plugin\"><p>X</p></object></p></body></html>",
    +        "noQuirksBodyHtml": "<p><object type=\"application/x-non-existant-plugin\"><p>X</p></object></p>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><listing>\nX</listing>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "listing": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "listing",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><listing>X</listing></body></html>",
    +        "noQuirksBodyHtml": "<listing>X</listing>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><input>X",
    +      "errors": [
    +        "(1,30): unexpected-input-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  },
    +                  {
    +                    "tag": "input"
    +                  },
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select><input>X</body></html>",
    +        "noQuirksBodyHtml": "<select></select><input>X"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select><select>X",
    +      "errors": [
    +        "(1,31): unexpected-select-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  },
    +                  {
    +                    "text": "X"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select>X</body></html>",
    +        "noQuirksBodyHtml": "<select></select>X"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><input type=hidDEN></table>",
    +      "errors": [
    +        "(1,41): unexpected-hidden-input-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "input",
    +                        "attrs": [
    +                          {
    +                            "name": "type",
    +                            "value": "hidDEN"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><input type=\"hidDEN\"></table></body></html>",
    +        "noQuirksBodyHtml": "<table><input type=\"hidDEN\"></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table>X<input type=hidDEN></table>",
    +      "errors": [
    +        "(1,23): foster-parenting-character",
    +        "(1,42): unexpected-hidden-input-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "X"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "input",
    +                        "attrs": [
    +                          {
    +                            "name": "type",
    +                            "value": "hidDEN"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body>X<table><input type=\"hidDEN\"></table></body></html>",
    +        "noQuirksBodyHtml": "X<table><input type=\"hidDEN\"></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table>  <input type=hidDEN></table>",
    +      "errors": [
    +        "(1,43): unexpected-hidden-input-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "text": "  "
    +                      },
    +                      {
    +                        "tag": "input",
    +                        "attrs": [
    +                          {
    +                            "name": "type",
    +                            "value": "hidDEN"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table>  <input type=\"hidDEN\"></table></body></html>",
    +        "noQuirksBodyHtml": "<table>  <input type=\"hidDEN\"></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table>  <input type='hidDEN'></table>",
    +      "errors": [
    +        "(1,45): unexpected-hidden-input-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "text": "  "
    +                      },
    +                      {
    +                        "tag": "input",
    +                        "attrs": [
    +                          {
    +                            "name": "type",
    +                            "value": "hidDEN"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table>  <input type=\"hidDEN\"></table></body></html>",
    +        "noQuirksBodyHtml": "<table>  <input type=\"hidDEN\"></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><input type=\" hidden\"><input type=hidDEN></table>",
    +      "errors": [
    +        "(1,44): unexpected-start-tag-implies-table-voodoo",
    +        "(1,63): unexpected-hidden-input-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "input": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "input",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": " hidden"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "input",
    +                        "attrs": [
    +                          {
    +                            "name": "type",
    +                            "value": "hidDEN"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><input type=\" hidden\"><table><input type=\"hidDEN\"></table></body></html>",
    +        "noQuirksBodyHtml": "<input type=\" hidden\"><table><input type=\"hidDEN\"></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><table><select>X<tr>",
    +      "errors": [
    +        "(1,30): unexpected-start-tag-implies-table-voodoo",
    +        "(1,35): unexpected-table-element-start-tag-in-select-in-table",
    +        "(1,35): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select>X</select><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<select>X</select><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><select>X</select>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "text": "X"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select>X</select></body></html>",
    +        "noQuirksBodyHtml": "<select>X</select>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE hTmL><html></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE HTML><html></html>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<body>X</body></body>",
    +      "errors": [
    +        "(1,21): unexpected-end-tag-after-body"
    +      ],
    +      "fragment": {
    +        "name": "html"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "head"
    +          },
    +          {
    +            "tag": "body",
    +            "children": [
    +              {
    +                "text": "X"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<head></head><body>X</body>",
    +        "noQuirksBodyHtml": "X"
    +      }
    +    },
    +    {
    +      "data": "<div><p>a</x> b",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,13): unexpected-end-tag",
    +        "(1,15): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "text": "a b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><p>a b</p></div></body></html>",
    +        "noQuirksBodyHtml": "<div><p>a b</p></div>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><td><code></code> </table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "code": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "code"
    +                                  },
    +                                  {
    +                                    "text": " "
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td><code></code> </td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><code></code> </td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><b><tr><td>aaa</td></tr>bbb</table>ccc",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,10): foster-parenting-start-tag",
    +        "(1,32): foster-parenting-character",
    +        "(1,33): foster-parenting-character",
    +        "(1,34): foster-parenting-character",
    +        "(1,45): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "bbb"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "aaa"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "ccc"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b></b><b>bbb</b><table><tbody><tr><td>aaa</td></tr></tbody></table><b>ccc</b></body></html>",
    +        "noQuirksBodyHtml": "<b></b><b>bbb</b><table><tbody><tr><td>aaa</td></tr></tbody></table><b>ccc</b>"
    +      }
    +    },
    +    {
    +      "data": "A<table><tr> B</tr> B</table>",
    +      "errors": [
    +        "(1,1): expected-doctype-but-got-chars",
    +        "(1,13): foster-parenting-character",
    +        "(1,14): foster-parenting-character",
    +        "(1,20): foster-parenting-character",
    +        "(1,21): foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "A B B"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>A B B<table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "A B B<table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "A<table><tr> B</tr> </em>C</table>",
    +      "errors": [
    +        "(1,1): expected-doctype-but-got-chars",
    +        "(1,13): foster-parenting-character",
    +        "(1,14): foster-parenting-character",
    +        "(1,20): foster-parenting-character",
    +        "(1,25): unexpected-end-tag",
    +        "(1,26): foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "A BC"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          },
    +                          {
    +                            "text": " "
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>A BC<table><tbody><tr></tr> </tbody></table></body></html>",
    +        "noQuirksBodyHtml": "A BC<table><tbody><tr></tr> </tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<select><keygen>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,16): unexpected-input-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "keygen": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  },
    +                  {
    +                    "tag": "keygen"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select></select><keygen></body></html>",
    +        "noQuirksBodyHtml": "<select></select><keygen>"
    +      }
    +    }
    +  ],
    +  "tests8.dat": [
    +    {
    +      "data": "<div>\n<div></div>\n</span>x",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(3,7): unexpected-end-tag",
    +        "(3,8): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      },
    +                      {
    +                        "tag": "div"
    +                      },
    +                      {
    +                        "text": "\nx"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>\n<div></div>\nx</div></body></html>",
    +        "noQuirksBodyHtml": "<div>\n<div></div>\nx</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>x<div></div>\n</span>x",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(2,7): unexpected-end-tag",
    +        "(2,8): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "x"
    +                      },
    +                      {
    +                        "tag": "div"
    +                      },
    +                      {
    +                        "text": "\nx"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>x<div></div>\nx</div></body></html>",
    +        "noQuirksBodyHtml": "<div>x<div></div>\nx</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>x<div></div>x</span>x",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,25): unexpected-end-tag",
    +        "(1,26): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "x"
    +                      },
    +                      {
    +                        "tag": "div"
    +                      },
    +                      {
    +                        "text": "xx"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>x<div></div>xx</div></body></html>",
    +        "noQuirksBodyHtml": "<div>x<div></div>xx</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>x<div></div>y</span>z",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,25): unexpected-end-tag",
    +        "(1,26): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "x"
    +                      },
    +                      {
    +                        "tag": "div"
    +                      },
    +                      {
    +                        "text": "yz"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>x<div></div>yz</div></body></html>",
    +        "noQuirksBodyHtml": "<div>x<div></div>yz</div>"
    +      }
    +    },
    +    {
    +      "data": "<table><div>x<div></div>x</span>x",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,12): foster-parenting-start-tag",
    +        "(1,13): foster-parenting-character",
    +        "(1,18): foster-parenting-start-tag",
    +        "(1,24): foster-parenting-end-tag",
    +        "(1,25): foster-parenting-start-tag",
    +        "(1,32): foster-parenting-end-tag",
    +        "(1,32): unexpected-end-tag",
    +        "(1,33): foster-parenting-character",
    +        "(1,33): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "x"
    +                      },
    +                      {
    +                        "tag": "div"
    +                      },
    +                      {
    +                        "text": "xx"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>x<div></div>xx</div><table></table></body></html>",
    +        "noQuirksBodyHtml": "<div>x<div></div>xx</div><table></table>"
    +      }
    +    },
    +    {
    +      "data": "x<table>x",
    +      "errors": [
    +        "(1,1): expected-doctype-but-got-chars",
    +        "(1,9): foster-parenting-character",
    +        "(1,9): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "xx"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>xx<table></table></body></html>",
    +        "noQuirksBodyHtml": "xx<table></table>"
    +      }
    +    },
    +    {
    +      "data": "x<table><table>x",
    +      "errors": [
    +        "(1,1): expected-doctype-but-got-chars",
    +        "(1,15): unexpected-start-tag-implies-end-tag",
    +        "(1,16): foster-parenting-character",
    +        "(1,16): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "x"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  },
    +                  {
    +                    "text": "x"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>x<table></table>x<table></table></body></html>",
    +        "noQuirksBodyHtml": "x<table></table>x<table></table>"
    +      }
    +    },
    +    {
    +      "data": "<b>a<div></div><div></b>y",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,24): adoption-agency-1.3",
    +        "(1,25): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "a"
    +                      },
    +                      {
    +                        "tag": "div"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      },
    +                      {
    +                        "text": "y"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b>a<div></div></b><div><b></b>y</div></body></html>",
    +        "noQuirksBodyHtml": "<b>a<div></div></b><div><b></b>y</div>"
    +      }
    +    },
    +    {
    +      "data": "<a><div><p></a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,15): adoption-agency-1.3",
    +        "(1,15): adoption-agency-1.3",
    +        "(1,15): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "div": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a"
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      },
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "tag": "a"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a></a><div><a></a><p><a></a></p></div></body></html>",
    +        "noQuirksBodyHtml": "<a></a><div><a></a><p><a></a></p></div>"
    +      }
    +    }
    +  ],
    +  "tests9.dat": [
    +    {
    +      "data": "<!DOCTYPE html><math></math>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math></math></body></html>",
    +        "noQuirksBodyHtml": "<math></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><math></math>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math></math></body></html>",
    +        "noQuirksBodyHtml": "<math></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><math><mi>",
    +      "errors": [
    +        "(1,25) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mi></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mi></mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><math><annotation-xml><svg><u>",
    +      "errors": [
    +        "(1,45) unexpected-html-element-in-foreign-content",
    +        "(1,45) expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math annotation-xml": true,
    +            "svg svg": true,
    +            "u": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "annotation-xml",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "u"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><annotation-xml><svg></svg></annotation-xml></math><u></u></body></html>",
    +        "noQuirksBodyHtml": "<math><annotation-xml><svg><u></u></svg></annotation-xml></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><select><math></math></select>",
    +      "errors": [
    +        "(1,35) unexpected-start-tag-in-select",
    +        "(1,42) unexpected-end-tag-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select></select></body></html>",
    +        "noQuirksBodyHtml": "<select></select>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><select><option><math></math></option></select>",
    +      "errors": [
    +        "(1,43) unexpected-start-tag-in-select",
    +        "(1,50) unexpected-end-tag-in-select"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select><option></option></select></body></html>",
    +        "noQuirksBodyHtml": "<select><option></option></select>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><math></math></table>",
    +      "errors": [
    +        "(1,34) unexpected-start-tag-implies-table-voodoo"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math></math><table></table></body></html>",
    +        "noQuirksBodyHtml": "<math></math><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><math><mi>foo</mi></math></table>",
    +      "errors": [
    +        "(1,34) foster-parenting-start-token",
    +        "(1,39) foster-parenting-character",
    +        "(1,40) foster-parenting-character",
    +        "(1,41) foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi></math><table></table></body></html>",
    +        "noQuirksBodyHtml": "<math><mi>foo</mi></math><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><math><mi>foo</mi><mi>bar</mi></math></table>",
    +      "errors": [
    +        "(1,34) foster-parenting-start-tag",
    +        "(1,39) foster-parenting-character",
    +        "(1,40) foster-parenting-character",
    +        "(1,41) foster-parenting-character",
    +        "(1,51) foster-parenting-character",
    +        "(1,52) foster-parenting-character",
    +        "(1,53) foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "table": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><table></table></body></html>",
    +        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi></math><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tbody><math><mi>foo</mi><mi>bar</mi></math></tbody></table>",
    +      "errors": [
    +        "(1,41) foster-parenting-start-tag",
    +        "(1,46) foster-parenting-character",
    +        "(1,47) foster-parenting-character",
    +        "(1,48) foster-parenting-character",
    +        "(1,58) foster-parenting-character",
    +        "(1,59) foster-parenting-character",
    +        "(1,60) foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "table": true,
    +            "tbody": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><table><tbody></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi></math><table><tbody></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tbody><tr><math><mi>foo</mi><mi>bar</mi></math></tr></tbody></table>",
    +      "errors": [
    +        "(1,45) foster-parenting-start-tag",
    +        "(1,50) foster-parenting-character",
    +        "(1,51) foster-parenting-character",
    +        "(1,52) foster-parenting-character",
    +        "(1,62) foster-parenting-character",
    +        "(1,63) foster-parenting-character",
    +        "(1,64) foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi></math><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "math math": true,
    +            "math mi": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "math",
    +                                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                                    "children": [
    +                                      {
    +                                        "tag": "mi",
    +                                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                                        "children": [
    +                                          {
    +                                            "text": "foo"
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "mi",
    +                                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                                        "children": [
    +                                          {
    +                                            "text": "bar"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</td></tr></tbody></table>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "math math": true,
    +            "math mi": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "math",
    +                                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                                    "children": [
    +                                      {
    +                                        "tag": "mi",
    +                                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                                        "children": [
    +                                          {
    +                                            "text": "foo"
    +                                          }
    +                                        ]
    +                                      },
    +                                      {
    +                                        "tag": "mi",
    +                                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                                        "children": [
    +                                          {
    +                                            "text": "bar"
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  },
    +                                  {
    +                                    "tag": "p",
    +                                    "children": [
    +                                      {
    +                                        "text": "baz"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</caption></table>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "math math": true,
    +            "math mi": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "math",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "mi",
    +                                "ns": "http://www.w3.org/1998/Math/MathML",
    +                                "children": [
    +                                  {
    +                                    "text": "foo"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "mi",
    +                                "ns": "http://www.w3.org/1998/Math/MathML",
    +                                "children": [
    +                                  {
    +                                    "text": "bar"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "text": "baz"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></caption></table></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></caption></table>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux",
    +      "errors": [
    +        "(1,70) unexpected-html-element-in-foreign-content"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "math math": true,
    +            "math mi": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "math",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "mi",
    +                                "ns": "http://www.w3.org/1998/Math/MathML",
    +                                "children": [
    +                                  {
    +                                    "text": "foo"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "mi",
    +                                "ns": "http://www.w3.org/1998/Math/MathML",
    +                                "children": [
    +                                  {
    +                                    "text": "bar"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "p",
    +                            "children": [
    +                              {
    +                                "text": "baz"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></caption></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><math><mi>foo</mi><mi>bar</mi><p>baz</p></math></caption></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</table><p>quux",
    +      "errors": [
    +        "(1,78) unexpected-end-tag",
    +        "(1,78) expected-one-end-tag-but-got-another"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "caption": true,
    +            "math math": true,
    +            "math mi": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "caption",
    +                        "children": [
    +                          {
    +                            "tag": "math",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "mi",
    +                                "ns": "http://www.w3.org/1998/Math/MathML",
    +                                "children": [
    +                                  {
    +                                    "text": "foo"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "mi",
    +                                "ns": "http://www.w3.org/1998/Math/MathML",
    +                                "children": [
    +                                  {
    +                                    "text": "bar"
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "text": "baz"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><caption><math><mi>foo</mi><mi>bar</mi>baz</math></caption></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<table><caption><math><mi>foo</mi><mi>bar</mi>baz</math></caption></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><colgroup><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux",
    +      "errors": [
    +        "(1,44) foster-parenting-start-tag",
    +        "(1,49) foster-parenting-character",
    +        "(1,50) foster-parenting-character",
    +        "(1,51) foster-parenting-character",
    +        "(1,61) foster-parenting-character",
    +        "(1,62) foster-parenting-character",
    +        "(1,63) foster-parenting-character",
    +        "(1,71) unexpected-html-element-in-foreign-content",
    +        "(1,71) foster-parenting-start-tag",
    +        "(1,63) foster-parenting-character",
    +        "(1,63) foster-parenting-character",
    +        "(1,63) foster-parenting-character"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "p": true,
    +            "table": true,
    +            "colgroup": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "baz"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "colgroup"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><p>baz</p><table><colgroup></colgroup></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi><p>baz</p></math><table><colgroup></colgroup></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><tr><td><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux",
    +      "errors": [
    +        "(1,50) unexpected-start-tag-in-select",
    +        "(1,54) unexpected-start-tag-in-select",
    +        "(1,62) unexpected-end-tag-in-select",
    +        "(1,66) unexpected-start-tag-in-select",
    +        "(1,74) unexpected-end-tag-in-select",
    +        "(1,77) unexpected-start-tag-in-select",
    +        "(1,88) unexpected-table-element-end-tag-in-select-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "select": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "select",
    +                                    "children": [
    +                                      {
    +                                        "text": "foobarbaz"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><table><tbody><tr><td><select>foobarbaz</select></td></tr></tbody></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><select>foobarbaz</select></td></tr></tbody></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body><table><select><math><mi>foo</mi><mi>bar</mi><p>baz</table><p>quux",
    +      "errors": [
    +        "(1,36) unexpected-start-tag-implies-table-voodoo",
    +        "(1,42) unexpected-start-tag-in-select",
    +        "(1,46) unexpected-start-tag-in-select",
    +        "(1,54) unexpected-end-tag-in-select",
    +        "(1,58) unexpected-start-tag-in-select",
    +        "(1,66) unexpected-end-tag-in-select",
    +        "(1,69) unexpected-start-tag-in-select",
    +        "(1,80) unexpected-table-element-end-tag-in-select-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "table": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "text": "foobarbaz"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "quux"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><select>foobarbaz</select><table></table><p>quux</p></body></html>",
    +        "noQuirksBodyHtml": "<select>foobarbaz</select><table></table><p>quux</p>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body></body></html><math><mi>foo</mi><mi>bar</mi><p>baz",
    +      "errors": [
    +        "(1,41) expected-eof-but-got-start-tag",
    +        "(1,68) unexpected-html-element-in-foreign-content"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "baz"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></body></html>",
    +        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi><p>baz</p></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body></body><math><mi>foo</mi><mi>bar</mi><p>baz",
    +      "errors": [
    +        "(1,34) unexpected-start-tag-after-body",
    +        "(1,61) unexpected-html-element-in-foreign-content"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true,
    +            "p": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "foo"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "text": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "baz"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><math><mi>foo</mi><mi>bar</mi></math><p>baz</p></body></html>",
    +        "noQuirksBodyHtml": "<math><mi>foo</mi><mi>bar</mi><p>baz</p></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><frameset><math><mi></mi><mi></mi><p><span>",
    +      "errors": [
    +        "(1,31) unexpected-start-tag-in-frameset",
    +        "(1,35) unexpected-start-tag-in-frameset",
    +        "(1,40) unexpected-end-tag-in-frameset",
    +        "(1,44) unexpected-start-tag-in-frameset",
    +        "(1,49) unexpected-end-tag-in-frameset",
    +        "(1,52) unexpected-start-tag-in-frameset",
    +        "(1,58) unexpected-start-tag-in-frameset",
    +        "(1,58) eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<math><mi></mi><mi></mi><p><span></span></p></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><frameset></frameset><math><mi></mi><mi></mi><p><span>",
    +      "errors": [
    +        "(1,42) unexpected-start-tag-after-frameset",
    +        "(1,46) unexpected-start-tag-after-frameset",
    +        "(1,51) unexpected-end-tag-after-frameset",
    +        "(1,55) unexpected-start-tag-after-frameset",
    +        "(1,60) unexpected-end-tag-after-frameset",
    +        "(1,63) unexpected-start-tag-after-frameset",
    +        "(1,69) unexpected-start-tag-after-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<math><mi></mi><mi></mi><p><span></span></p></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body xlink:href=foo><math xlink:href=foo></math>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "xlink:href",
    +                    "value": "foo"
    +                  }
    +                ],
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "attrs": [
    +                      {
    +                        "name": "href",
    +                        "ns": "http://www.w3.org/1999/xlink",
    +                        "value": "foo"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\"><math xlink:href=\"foo\"></math></body></html>",
    +        "noQuirksBodyHtml": "<math xlink:href=\"foo\"></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo></mi></math>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "xlink:href",
    +                    "value": "foo"
    +                  },
    +                  {
    +                    "name": "xml:lang",
    +                    "value": "en"
    +                  }
    +                ],
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "ns": "http://www.w3.org/1999/xlink",
    +                            "value": "foo"
    +                          },
    +                          {
    +                            "name": "lang",
    +                            "ns": "http://www.w3.org/XML/1998/namespace",
    +                            "value": "en"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo /></math>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "xlink:href",
    +                    "value": "foo"
    +                  },
    +                  {
    +                    "name": "xml:lang",
    +                    "value": "en"
    +                  }
    +                ],
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "ns": "http://www.w3.org/1999/xlink",
    +                            "value": "foo"
    +                          },
    +                          {
    +                            "name": "lang",
    +                            "ns": "http://www.w3.org/XML/1998/namespace",
    +                            "value": "en"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi></math>"
    +      }
    +    },
    +    {
    +      "data": "<!DOCTYPE html><body xlink:href=foo xml:lang=en><math><mi xml:lang=en xlink:href=foo />bar</math>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mi": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "xlink:href",
    +                    "value": "foo"
    +                  },
    +                  {
    +                    "name": "xml:lang",
    +                    "value": "en"
    +                  }
    +                ],
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mi",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "attrs": [
    +                          {
    +                            "name": "href",
    +                            "ns": "http://www.w3.org/1999/xlink",
    +                            "value": "foo"
    +                          },
    +                          {
    +                            "name": "lang",
    +                            "ns": "http://www.w3.org/XML/1998/namespace",
    +                            "value": "en"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "bar"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body xlink:href=\"foo\" xml:lang=\"en\"><math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi>bar</math></body></html>",
    +        "noQuirksBodyHtml": "<math><mi xml:lang=\"en\" xlink:href=\"foo\"></mi>bar</math>"
    +      }
    +    }
    +  ],
    +  "tests_innerHTML_1.dat": [
    +    {
    +      "data": "<body><span>",
    +      "errors": [
    +        "(1,6): unexpected-start-tag",
    +        "(1,12): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "body"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span"
    +          }
    +        ],
    +        "html": "<span></span>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><body>",
    +      "errors": [
    +        "(1,12): unexpected-start-tag",
    +        "(1,12): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "body"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span"
    +          }
    +        ],
    +        "html": "<span></span>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><body>",
    +      "errors": [
    +        "(1,12): unexpected-start-tag",
    +        "(1,12): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "div"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span"
    +          }
    +        ],
    +        "html": "<span></span>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<body><span>",
    +      "errors": [
    +        "(1,12): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "html"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "head": true,
    +            "body": true,
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "head"
    +          },
    +          {
    +            "tag": "body",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<head></head><body><span></span></body>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<frameset><span>",
    +      "errors": [
    +        "(1,10): unexpected-start-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "body"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span"
    +          }
    +        ],
    +        "html": "<span></span>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><frameset>",
    +      "errors": [
    +        "(1,16): unexpected-start-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "body"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span"
    +          }
    +        ],
    +        "html": "<span></span>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><frameset>",
    +      "errors": [
    +        "(1,16): unexpected-start-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "div"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span"
    +          }
    +        ],
    +        "html": "<span></span>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<frameset><span>",
    +      "errors": [
    +        "(1,16): unexpected-start-tag-in-frameset",
    +        "(1,16): eof-in-frameset"
    +      ],
    +      "fragment": {
    +        "name": "html"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "head": true,
    +            "frameset": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "head"
    +          },
    +          {
    +            "tag": "frameset"
    +          }
    +        ],
    +        "html": "<head></head><frameset></frameset>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr>",
    +      "errors": [
    +        "(1,7): unexpected-start-tag"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "tbody",
    +            "children": [
    +              {
    +                "tag": "tr"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<tbody><tr></tr></tbody>",
    +        "noQuirksBodyHtml": "<table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "</table><tr>",
    +      "errors": [
    +        "(1,8): unexpected-end-tag"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "tbody",
    +            "children": [
    +              {
    +                "tag": "tr"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<tbody><tr></tr></tbody>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<a>",
    +      "errors": [
    +        "(1,3): unexpected-start-tag-implies-table-voodoo",
    +        "(1,3): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a>",
    +      "errors": [
    +        "(1,3): unexpected-start-tag-implies-table-voodoo",
    +        "(1,3): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><caption>a",
    +      "errors": [
    +        "(1,3): unexpected-start-tag-implies-table-voodoo",
    +        "(1,13): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "caption": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "caption",
    +            "children": [
    +              {
    +                "text": "a"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><caption>a</caption>",
    +        "noQuirksBodyHtml": "<a>a</a>"
    +      }
    +    },
    +    {
    +      "data": "<a><colgroup><col>",
    +      "errors": [
    +        "(1,3): foster-parenting-start-token",
    +        "(1,18): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "colgroup": true,
    +            "col": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "colgroup",
    +            "children": [
    +              {
    +                "tag": "col"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><colgroup><col></colgroup>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><tbody><tr>",
    +      "errors": [
    +        "(1,3): foster-parenting-start-tag"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "tbody",
    +            "children": [
    +              {
    +                "tag": "tr"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><tbody><tr></tr></tbody>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><tfoot><tr>",
    +      "errors": [
    +        "(1,3): foster-parenting-start-tag"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "tfoot": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "tfoot",
    +            "children": [
    +              {
    +                "tag": "tr"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><tfoot><tr></tr></tfoot>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><thead><tr>",
    +      "errors": [
    +        "(1,3): foster-parenting-start-tag"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "thead": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "thead",
    +            "children": [
    +              {
    +                "tag": "tr"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><thead><tr></tr></thead>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><tr>",
    +      "errors": [
    +        "(1,3): foster-parenting-start-tag"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "tbody",
    +            "children": [
    +              {
    +                "tag": "tr"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><tbody><tr></tr></tbody>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><th>",
    +      "errors": [
    +        "(1,3): unexpected-start-tag-implies-table-voodoo",
    +        "(1,7): unexpected-cell-in-table-body"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "tbody": true,
    +            "tr": true,
    +            "th": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "tbody",
    +            "children": [
    +              {
    +                "tag": "tr",
    +                "children": [
    +                  {
    +                    "tag": "th"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><tbody><tr><th></th></tr></tbody>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><td>",
    +      "errors": [
    +        "(1,3): unexpected-start-tag-implies-table-voodoo",
    +        "(1,7): unexpected-cell-in-table-body"
    +      ],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "tbody",
    +            "children": [
    +              {
    +                "tag": "tr",
    +                "children": [
    +                  {
    +                    "tag": "td"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><tbody><tr><td></td></tr></tbody>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<table></table><tbody>",
    +      "errors": [
    +        "(1,22): unexpected-start-tag"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "table"
    +          }
    +        ],
    +        "html": "<table></table>",
    +        "noQuirksBodyHtml": "<table></table>"
    +      }
    +    },
    +    {
    +      "data": "</table><span>",
    +      "errors": [
    +        "(1,8): unexpected-end-tag",
    +        "(1,14): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span"
    +          }
    +        ],
    +        "html": "<span></span>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span></table>",
    +      "errors": [
    +        "(1,14): unexpected-end-tag",
    +        "(1,14): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span"
    +          }
    +        ],
    +        "html": "<span></span>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "</caption><span>",
    +      "errors": [
    +        "(1,10): XXX-undefined-error",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span"
    +          }
    +        ],
    +        "html": "<span></span>",
    +        "noQuirksBodyHtml": "<span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span></caption><span>",
    +      "errors": [
    +        "(1,16): XXX-undefined-error",
    +        "(1,22): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><caption><span>",
    +      "errors": [
    +        "(1,15): unexpected-start-tag",
    +        "(1,21): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><col><span>",
    +      "errors": [
    +        "(1,11): unexpected-start-tag",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><colgroup><span>",
    +      "errors": [
    +        "(1,16): unexpected-start-tag",
    +        "(1,22): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><html><span>",
    +      "errors": [
    +        "(1,12): non-html-root",
    +        "(1,18): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><tbody><span>",
    +      "errors": [
    +        "(1,13): unexpected-start-tag",
    +        "(1,19): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><td><span>",
    +      "errors": [
    +        "(1,10): unexpected-start-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><tfoot><span>",
    +      "errors": [
    +        "(1,13): unexpected-start-tag",
    +        "(1,19): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><thead><span>",
    +      "errors": [
    +        "(1,13): unexpected-start-tag",
    +        "(1,19): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><th><span>",
    +      "errors": [
    +        "(1,10): unexpected-start-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span><tr><span>",
    +      "errors": [
    +        "(1,10): unexpected-start-tag",
    +        "(1,16): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "<span></table><span>",
    +      "errors": [
    +        "(1,14): unexpected-end-tag",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "caption"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "span",
    +            "children": [
    +              {
    +                "tag": "span"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<span><span></span></span>",
    +        "noQuirksBodyHtml": "<span><span></span></span>"
    +      }
    +    },
    +    {
    +      "data": "</colgroup><col>",
    +      "errors": [
    +        "(1,11): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "colgroup"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "col": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "col"
    +          }
    +        ],
    +        "html": "<col>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<a><col>",
    +      "errors": [
    +        "(1,3): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "colgroup"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "col": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "col"
    +          }
    +        ],
    +        "html": "<col>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<caption><a>",
    +      "errors": [
    +        "(1,9): XXX-undefined-error",
    +        "(1,12): unexpected-start-tag-implies-table-voodoo",
    +        "(1,12): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<col><a>",
    +      "errors": [
    +        "(1,5): XXX-undefined-error",
    +        "(1,8): unexpected-start-tag-implies-table-voodoo",
    +        "(1,8): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<colgroup><a>",
    +      "errors": [
    +        "(1,10): XXX-undefined-error",
    +        "(1,13): unexpected-start-tag-implies-table-voodoo",
    +        "(1,13): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<tbody><a>",
    +      "errors": [
    +        "(1,7): XXX-undefined-error",
    +        "(1,10): unexpected-start-tag-implies-table-voodoo",
    +        "(1,10): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<tfoot><a>",
    +      "errors": [
    +        "(1,7): XXX-undefined-error",
    +        "(1,10): unexpected-start-tag-implies-table-voodoo",
    +        "(1,10): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<thead><a>",
    +      "errors": [
    +        "(1,7): XXX-undefined-error",
    +        "(1,10): unexpected-start-tag-implies-table-voodoo",
    +        "(1,10): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "</table><a>",
    +      "errors": [
    +        "(1,8): XXX-undefined-error",
    +        "(1,11): unexpected-start-tag-implies-table-voodoo",
    +        "(1,11): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><tr>",
    +      "errors": [
    +        "(1,3): unexpected-start-tag-implies-table-voodoo"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "tr"
    +          }
    +        ],
    +        "html": "<a></a><tr></tr>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><td>",
    +      "errors": [
    +        "(1,3): unexpected-start-tag-implies-table-voodoo",
    +        "(1,7): unexpected-cell-in-table-body"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "tr",
    +            "children": [
    +              {
    +                "tag": "td"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><tr><td></td></tr>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><td>",
    +      "errors": [
    +        "(1,3): unexpected-start-tag-implies-table-voodoo",
    +        "(1,7): unexpected-cell-in-table-body"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "tr",
    +            "children": [
    +              {
    +                "tag": "td"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><tr><td></td></tr>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<a><td>",
    +      "errors": [
    +        "(1,3): unexpected-start-tag-implies-table-voodoo",
    +        "(1,7): unexpected-cell-in-table-body"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          },
    +          {
    +            "tag": "tr",
    +            "children": [
    +              {
    +                "tag": "td"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<a></a><tr><td></td></tr>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<td><table><tbody><a><tr>",
    +      "errors": [
    +        "(1,4): unexpected-cell-in-table-body",
    +        "(1,21): unexpected-start-tag-implies-table-voodoo",
    +        "(1,25): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "tbody"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "tr": true,
    +            "td": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "tr",
    +            "children": [
    +              {
    +                "tag": "td",
    +                "children": [
    +                  {
    +                    "tag": "a"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<tr><td><a></a><table><tbody><tr></tr></tbody></table></td></tr>",
    +        "noQuirksBodyHtml": "<a></a><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "</tr><td>",
    +      "errors": [
    +        "(1,5): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<td><table><a><tr></tr><tr>",
    +      "errors": [
    +        "(1,14): unexpected-start-tag-implies-table-voodoo",
    +        "(1,27): eof-in-table"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td",
    +            "children": [
    +              {
    +                "tag": "a"
    +              },
    +              {
    +                "tag": "table",
    +                "children": [
    +                  {
    +                    "tag": "tbody",
    +                    "children": [
    +                      {
    +                        "tag": "tr"
    +                      },
    +                      {
    +                        "tag": "tr"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<td><a></a><table><tbody><tr></tr><tr></tr></tbody></table></td>",
    +        "noQuirksBodyHtml": "<a></a><table><tbody><tr></tr><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<caption><td>",
    +      "errors": [
    +        "(1,9): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<col><td>",
    +      "errors": [
    +        "(1,5): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<colgroup><td>",
    +      "errors": [
    +        "(1,10): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<tbody><td>",
    +      "errors": [
    +        "(1,7): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<tfoot><td>",
    +      "errors": [
    +        "(1,7): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<thead><td>",
    +      "errors": [
    +        "(1,7): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<tr><td>",
    +      "errors": [
    +        "(1,4): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "</table><td>",
    +      "errors": [
    +        "(1,8): XXX-undefined-error"
    +      ],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td></td>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<td><table></table><td>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td",
    +            "children": [
    +              {
    +                "tag": "table"
    +              }
    +            ]
    +          },
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td><table></table></td><td></td>",
    +        "noQuirksBodyHtml": "<table></table>"
    +      }
    +    },
    +    {
    +      "data": "<td><table></table><td>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "tr"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "td": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "td",
    +            "children": [
    +              {
    +                "tag": "table"
    +              }
    +            ]
    +          },
    +          {
    +            "tag": "td"
    +          }
    +        ],
    +        "html": "<td><table></table></td><td></td>",
    +        "noQuirksBodyHtml": "<table></table>"
    +      }
    +    },
    +    {
    +      "data": "<caption><a>",
    +      "errors": [
    +        "(1,9): XXX-undefined-error",
    +        "(1,12): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<col><a>",
    +      "errors": [
    +        "(1,5): XXX-undefined-error",
    +        "(1,8): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<colgroup><a>",
    +      "errors": [
    +        "(1,10): XXX-undefined-error",
    +        "(1,13): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<tbody><a>",
    +      "errors": [
    +        "(1,7): XXX-undefined-error",
    +        "(1,10): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<tfoot><a>",
    +      "errors": [
    +        "(1,7): XXX-undefined-error",
    +        "(1,10): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<th><a>",
    +      "errors": [
    +        "(1,4): XXX-undefined-error",
    +        "(1,7): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<thead><a>",
    +      "errors": [
    +        "(1,7): XXX-undefined-error",
    +        "(1,10): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<tr><a>",
    +      "errors": [
    +        "(1,4): XXX-undefined-error",
    +        "(1,7): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "</table><a>",
    +      "errors": [
    +        "(1,8): XXX-undefined-error",
    +        "(1,11): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "</tbody><a>",
    +      "errors": [
    +        "(1,8): XXX-undefined-error",
    +        "(1,11): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "</td><a>",
    +      "errors": [
    +        "(1,5): unexpected-end-tag",
    +        "(1,8): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "</tfoot><a>",
    +      "errors": [
    +        "(1,8): XXX-undefined-error",
    +        "(1,11): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "</thead><a>",
    +      "errors": [
    +        "(1,8): XXX-undefined-error",
    +        "(1,11): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "</th><a>",
    +      "errors": [
    +        "(1,5): unexpected-end-tag",
    +        "(1,8): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "</tr><a>",
    +      "errors": [
    +        "(1,5): XXX-undefined-error",
    +        "(1,8): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "a"
    +          }
    +        ],
    +        "html": "<a></a>",
    +        "noQuirksBodyHtml": "<a></a>"
    +      }
    +    },
    +    {
    +      "data": "<table><td><td>",
    +      "errors": [
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,15): expected-closing-tag-but-got-eof"
    +      ],
    +      "fragment": {
    +        "name": "td"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "table",
    +            "children": [
    +              {
    +                "tag": "tbody",
    +                "children": [
    +                  {
    +                    "tag": "tr",
    +                    "children": [
    +                      {
    +                        "tag": "td"
    +                      },
    +                      {
    +                        "tag": "td"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<table><tbody><tr><td></td><td></td></tr></tbody></table>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td></td><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "</select><option>",
    +      "errors": [
    +        "(1,9): XXX-undefined-error",
    +        "(1,17): eof-in-select"
    +      ],
    +      "fragment": {
    +        "name": "select"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "option": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "option"
    +          }
    +        ],
    +        "html": "<option></option>",
    +        "noQuirksBodyHtml": "<option></option>"
    +      }
    +    },
    +    {
    +      "data": "<input><option>",
    +      "errors": [
    +        "(1,7): unexpected-input-in-select",
    +        "(1,15): eof-in-select"
    +      ],
    +      "fragment": {
    +        "name": "select"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "option": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "option"
    +          }
    +        ],
    +        "html": "<option></option>",
    +        "noQuirksBodyHtml": "<input><option></option>"
    +      }
    +    },
    +    {
    +      "data": "<keygen><option>",
    +      "errors": [
    +        "(1,8): unexpected-input-in-select",
    +        "(1,16): eof-in-select"
    +      ],
    +      "fragment": {
    +        "name": "select"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "option": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "option"
    +          }
    +        ],
    +        "html": "<option></option>",
    +        "noQuirksBodyHtml": "<keygen><option></option>"
    +      }
    +    },
    +    {
    +      "data": "<textarea><option>",
    +      "errors": [
    +        "(1,10): unexpected-input-in-select",
    +        "(1,18): eof-in-select"
    +      ],
    +      "fragment": {
    +        "name": "select"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "option": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "option"
    +          }
    +        ],
    +        "html": "<option></option>",
    +        "noQuirksBodyHtml": "<textarea>&lt;option&gt;</textarea>"
    +      }
    +    },
    +    {
    +      "data": "</html><!--abc-->",
    +      "errors": [
    +        "(1,7): unexpected-end-tag-after-body-innerhtml"
    +      ],
    +      "fragment": {
    +        "name": "html"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "head"
    +          },
    +          {
    +            "tag": "body"
    +          },
    +          {
    +            "comment": "abc"
    +          }
    +        ],
    +        "html": "<head></head><body></body><!--abc-->",
    +        "noQuirksBodyHtml": "<!--abc-->"
    +      }
    +    },
    +    {
    +      "data": "</frameset><frame>",
    +      "errors": [
    +        "(1,11): unexpected-frameset-in-frameset-innerhtml"
    +      ],
    +      "fragment": {
    +        "name": "frameset"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "frame": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "frame"
    +          }
    +        ],
    +        "html": "<frame>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "",
    +      "errors": [],
    +      "fragment": {
    +        "name": "html"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "head"
    +          },
    +          {
    +            "tag": "body"
    +          }
    +        ],
    +        "html": "<head></head><body></body>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    }
    +  ],
    +  "tricky01.dat": [
    +    {
    +      "data": "<b><p>Bold </b> Not bold</p>\nAlso not bold.",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,15): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "text": "Bold "
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": " Not bold"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "\nAlso not bold."
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b></b><p><b>Bold </b> Not bold</p>\nAlso not bold.</body></html>",
    +        "noQuirksBodyHtml": "<b></b><p><b>Bold </b> Not bold</p>\nAlso not bold."
    +      }
    +    },
    +    {
    +      "data": "<html>\n<font color=red><i>Italic and Red<p>Italic and Red </font> Just italic.</p> Italic only.</i> Plain\n<p>I should not be red. <font color=red>Red. <i>Italic and red.</p>\n<p>Italic and red. </i> Red.</font> I should not be red.</p>\n<b>Bold <i>Bold and italic</b> Only Italic </i> Plain",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(2,58): adoption-agency-1.3",
    +        "(3,67): unexpected-end-tag",
    +        "(4,23): adoption-agency-1.3",
    +        "(4,35): adoption-agency-1.3",
    +        "(5,30): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "font": true,
    +            "i": true,
    +            "p": true,
    +            "b": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "font",
    +                    "attrs": [
    +                      {
    +                        "name": "color",
    +                        "value": "red"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "text": "Italic and Red"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "tag": "font",
    +                            "attrs": [
    +                              {
    +                                "name": "color",
    +                                "value": "red"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "text": "Italic and Red "
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": " Just italic."
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": " Italic only."
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": " Plain\n"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "I should not be red. "
    +                      },
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "color",
    +                            "value": "red"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "text": "Red. "
    +                          },
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "Italic and red."
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "font",
    +                    "attrs": [
    +                      {
    +                        "name": "color",
    +                        "value": "red"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "text": "\n"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "color",
    +                            "value": "red"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "Italic and red. "
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": " Red."
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": " I should not be red."
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "\n"
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "Bold "
    +                      },
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "text": "Bold and italic"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "i",
    +                    "children": [
    +                      {
    +                        "text": " Only Italic "
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": " Plain"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><font color=\"red\"><i>Italic and Red</i></font><i><p><font color=\"red\">Italic and Red </font> Just italic.</p> Italic only.</i> Plain\n<p>I should not be red. <font color=\"red\">Red. <i>Italic and red.</i></font></p><font color=\"red\"><i>\n</i></font><p><font color=\"red\"><i>Italic and red. </i> Red.</font> I should not be red.</p>\n<b>Bold <i>Bold and italic</i></b><i> Only Italic </i> Plain</body></html>",
    +        "noQuirksBodyHtml": "\n<font color=\"red\"><i>Italic and Red</i></font><i><p><font color=\"red\">Italic and Red </font> Just italic.</p> Italic only.</i> Plain\n<p>I should not be red. <font color=\"red\">Red. <i>Italic and red.</i></font></p><font color=\"red\"><i>\n</i></font><p><font color=\"red\"><i>Italic and red. </i> Red.</font> I should not be red.</p>\n<b>Bold <i>Bold and italic</i></b><i> Only Italic </i> Plain"
    +      }
    +    },
    +    {
    +      "data": "<html><body>\n<p><font size=\"7\">First paragraph.</p>\n<p>Second paragraph.</p></font>\n<b><p><i>Bold and Italic</b> Italic</p>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(2,38): unexpected-end-tag",
    +        "(4,28): adoption-agency-1.3",
    +        "(4,28): adoption-agency-1.3",
    +        "(4,39): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "font": true,
    +            "b": true,
    +            "i": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "\n"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "attrs": [
    +                          {
    +                            "name": "size",
    +                            "value": "7"
    +                          }
    +                        ],
    +                        "children": [
    +                          {
    +                            "text": "First paragraph."
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "font",
    +                    "attrs": [
    +                      {
    +                        "name": "size",
    +                        "value": "7"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      },
    +                      {
    +                        "tag": "p",
    +                        "children": [
    +                          {
    +                            "text": "Second paragraph."
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "\n"
    +                  },
    +                  {
    +                    "tag": "b"
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "i",
    +                            "children": [
    +                              {
    +                                "text": "Bold and Italic"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "i",
    +                        "children": [
    +                          {
    +                            "text": " Italic"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>\n<p><font size=\"7\">First paragraph.</font></p><font size=\"7\">\n<p>Second paragraph.</p></font>\n<b></b><p><b><i>Bold and Italic</i></b><i> Italic</i></p></body></html>",
    +        "noQuirksBodyHtml": "\n<p><font size=\"7\">First paragraph.</font></p><font size=\"7\">\n<p>Second paragraph.</p></font>\n<b></b><p><b><i>Bold and Italic</i></b><i> Italic</i></p>"
    +      }
    +    },
    +    {
    +      "data": "<html>\n<dl>\n<dt><b>Boo\n<dd>Goo?\n</dl>\n</html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(4,4): end-tag-too-early",
    +        "(5,5): end-tag-too-early",
    +        "(6,7): expected-one-end-tag-but-got-another"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "dl": true,
    +            "dt": true,
    +            "b": true,
    +            "dd": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "dl",
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      },
    +                      {
    +                        "tag": "dt",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "text": "Boo\n"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "dd",
    +                        "children": [
    +                          {
    +                            "tag": "b",
    +                            "children": [
    +                              {
    +                                "text": "Goo?\n"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><dl>\n<dt><b>Boo\n</b></dt><dd><b>Goo?\n</b></dd></dl><b>\n</b></body></html>",
    +        "noQuirksBodyHtml": "\n<dl>\n<dt><b>Boo\n</b></dt><dd><b>Goo?\n</b></dd></dl><b>\n</b>"
    +      }
    +    },
    +    {
    +      "data": "<html><body>\n<label><a><div>Hello<div>World</div></a></label>  \n</body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(2,40): adoption-agency-1.3",
    +        "(2,48): unexpected-end-tag",
    +        "(3,7): expected-one-end-tag-but-got-another"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "label": true,
    +            "a": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "\n"
    +                  },
    +                  {
    +                    "tag": "label",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      },
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "a",
    +                            "children": [
    +                              {
    +                                "text": "Hello"
    +                              },
    +                              {
    +                                "tag": "div",
    +                                "children": [
    +                                  {
    +                                    "text": "World"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": "  \n"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>\n<label><a></a><div><a>Hello<div>World</div></a>  \n</div></label></body></html>",
    +        "noQuirksBodyHtml": "\n<label><a></a><div><a>Hello<div>World</div></a>  \n</div></label>"
    +      }
    +    },
    +    {
    +      "data": "<table><center> <font>a</center> <img> <tr><td> </td> </tr> </table>",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,15): foster-parenting-start-tag",
    +        "(1,16): foster-parenting-character",
    +        "(1,22): foster-parenting-start-tag",
    +        "(1,23): foster-parenting-character",
    +        "(1,32): foster-parenting-end-tag",
    +        "(1,32): end-tag-too-early",
    +        "(1,33): foster-parenting-character",
    +        "(1,38): foster-parenting-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "center": true,
    +            "font": true,
    +            "img": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "center",
    +                    "children": [
    +                      {
    +                        "text": " "
    +                      },
    +                      {
    +                        "tag": "font",
    +                        "children": [
    +                          {
    +                            "text": "a"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "font",
    +                    "children": [
    +                      {
    +                        "tag": "img"
    +                      },
    +                      {
    +                        "text": " "
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "text": " "
    +                      },
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": " "
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "text": " "
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": " "
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><center> <font>a</font></center><font><img> </font><table> <tbody><tr><td> </td> </tr> </tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<center> <font>a</font></center><font><img> </font><table> <tbody><tr><td> </td> </tr> </tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><p><a><p>You should see this text.",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,14): unexpected-start-tag-implies-table-voodoo",
    +        "(1,17): unexpected-start-tag-implies-table-voodoo",
    +        "(1,20): unexpected-start-tag-implies-table-voodoo",
    +        "(1,20): closing-non-current-p-element",
    +        "(1,21): foster-parenting-character",
    +        "(1,22): foster-parenting-character",
    +        "(1,23): foster-parenting-character",
    +        "(1,24): foster-parenting-character",
    +        "(1,25): foster-parenting-character",
    +        "(1,26): foster-parenting-character",
    +        "(1,27): foster-parenting-character",
    +        "(1,28): foster-parenting-character",
    +        "(1,29): foster-parenting-character",
    +        "(1,30): foster-parenting-character",
    +        "(1,31): foster-parenting-character",
    +        "(1,32): foster-parenting-character",
    +        "(1,33): foster-parenting-character",
    +        "(1,34): foster-parenting-character",
    +        "(1,35): foster-parenting-character",
    +        "(1,36): foster-parenting-character",
    +        "(1,37): foster-parenting-character",
    +        "(1,38): foster-parenting-character",
    +        "(1,39): foster-parenting-character",
    +        "(1,40): foster-parenting-character",
    +        "(1,41): foster-parenting-character",
    +        "(1,42): foster-parenting-character",
    +        "(1,43): foster-parenting-character",
    +        "(1,44): foster-parenting-character",
    +        "(1,45): foster-parenting-character",
    +        "(1,45): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "a": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "a"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "text": "You should see this text."
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p><a></a></p><p><a>You should see this text.</a></p><table><tbody><tr></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<p><a></a></p><p><a>You should see this text.</a></p><table><tbody><tr></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<TABLE>\n<TR>\n<CENTER><CENTER><TD></TD></TR><TR>\n<FONT>\n<TABLE><tr></tr></TABLE>\n</P>\n<a></font><font></a>\nThis page contains an insanely badly-nested tag sequence.",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(3,8): unexpected-start-tag-implies-table-voodoo",
    +        "(3,16): unexpected-start-tag-implies-table-voodoo",
    +        "(4,6): unexpected-start-tag-implies-table-voodoo",
    +        "(4,6): unexpected character token in table (the newline)",
    +        "(5,7): unexpected-start-tag-implies-end-tag",
    +        "(6,4): unexpected p end tag",
    +        "(7,10): adoption-agency-1.3",
    +        "(7,20): adoption-agency-1.3",
    +        "(8,57): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "center": true,
    +            "font": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "p": true,
    +            "a": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "center",
    +                    "children": [
    +                      {
    +                        "tag": "center"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "font",
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      },
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "text": "\n"
    +                              },
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "text": "\n"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "font",
    +                    "children": [
    +                      {
    +                        "text": "\n"
    +                      },
    +                      {
    +                        "tag": "p"
    +                      },
    +                      {
    +                        "text": "\n"
    +                      },
    +                      {
    +                        "tag": "a"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "tag": "font"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "font",
    +                    "children": [
    +                      {
    +                        "text": "\nThis page contains an insanely badly-nested tag sequence."
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><center><center></center></center><font>\n</font><table>\n<tbody><tr>\n<td></td></tr><tr>\n</tr></tbody></table><table><tbody><tr></tr></tbody></table><font>\n<p></p>\n<a></a></font><a><font></font></a><font>\nThis page contains an insanely badly-nested tag sequence.</font></body></html>",
    +        "noQuirksBodyHtml": "<center><center></center></center><font>\n</font><table>\n<tbody><tr>\n<td></td></tr><tr>\n</tr></tbody></table><table><tbody><tr></tr></tbody></table><font>\n<p></p>\n<a></a></font><a><font></font></a><font>\nThis page contains an insanely badly-nested tag sequence.</font>"
    +      }
    +    },
    +    {
    +      "data": "<html>\n<body>\n<b><nobr><div>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the\nnobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre>\n</body>\n</html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(3,56): adoption-agency-1.3",
    +        "(4,58): adoption-agency-1.3",
    +        "(5,7): expected-one-end-tag-but-got-another"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "nobr": true,
    +            "div": true,
    +            "pre": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "\n"
    +                  },
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "nobr"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "nobr",
    +                            "children": [
    +                              {
    +                                "text": "This text is in a div inside a nobr"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "text": "More text that should not be in the nobr, i.e., the\nnobr should have closed the div inside it implicitly. "
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "pre",
    +                        "children": [
    +                          {
    +                            "text": "A pre tag outside everything else."
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "text": "\n\n"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>\n<b><nobr></nobr></b><div><b><nobr>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the\nnobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre>\n\n</div></body></html>",
    +        "noQuirksBodyHtml": "\n\n<b><nobr></nobr></b><div><b><nobr>This text is in a div inside a nobr</nobr>More text that should not be in the nobr, i.e., the\nnobr should have closed the div inside it implicitly. </b><pre>A pre tag outside everything else.</pre>\n\n</div>"
    +      }
    +    }
    +  ],
    +  "webkit01.dat": [
    +    {
    +      "data": "Test",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "Test"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>Test</body></html>",
    +        "noQuirksBodyHtml": "Test"
    +      }
    +    },
    +    {
    +      "data": "<div></div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div></div></body></html>",
    +        "noQuirksBodyHtml": "<div></div>"
    +      }
    +    },
    +    {
    +      "data": "<div>Test</div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "Test"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>Test</div></body></html>",
    +        "noQuirksBodyHtml": "<div>Test</div>"
    +      }
    +    },
    +    {
    +      "data": "<di",
    +      "errors": [
    +        "(1,3): eof-in-tag-name",
    +        "(1,3): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<div>Hello</div>\n<script>\nconsole.log(\"PASS\");\n</script>\n<div>Bye</div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "Hello"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "\n"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "\nconsole.log(\"PASS\");\n",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "\n"
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "Bye"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>Hello</div>\n<script>\nconsole.log(\"PASS\");\n</script>\n<div>Bye</div></body></html>",
    +        "noQuirksBodyHtml": "<div>Hello</div>\n<script>\nconsole.log(\"PASS\");\n</script>\n<div>Bye</div>"
    +      }
    +    },
    +    {
    +      "data": "<div foo=\"bar\">Hello</div>",
    +      "errors": [
    +        "(1,15): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "foo",
    +                        "value": "bar"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "text": "Hello"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div foo=\"bar\">Hello</div></body></html>",
    +        "noQuirksBodyHtml": "<div foo=\"bar\">Hello</div>"
    +      }
    +    },
    +    {
    +      "data": "<div>Hello</div>\n<script>\nconsole.log(\"FOO<span>BAR</span>BAZ\");\n</script>\n<div>Bye</div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "script": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "Hello"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "\n"
    +                  },
    +                  {
    +                    "tag": "script",
    +                    "children": [
    +                      {
    +                        "text": "\nconsole.log(\"FOO<span>BAR</span>BAZ\");\n",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "\n"
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "text": "Bye"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div>Hello</div>\n<script>\nconsole.log(\"FOO<span>BAR</span>BAZ\");\n</script>\n<div>Bye</div></body></html>",
    +        "noQuirksBodyHtml": "<div>Hello</div>\n<script>\nconsole.log(\"FOO<span>BAR</span>BAZ\");\n</script>\n<div>Bye</div>"
    +      }
    +    },
    +    {
    +      "data": "<foo bar=\"baz\"></foo><potato quack=\"duck\"></potato>",
    +      "errors": [
    +        "(1,15): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "foo": true,
    +            "potato": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "foo",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "baz"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "potato",
    +                    "attrs": [
    +                      {
    +                        "name": "quack",
    +                        "value": "duck"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><foo bar=\"baz\"></foo><potato quack=\"duck\"></potato></body></html>",
    +        "noQuirksBodyHtml": "<foo bar=\"baz\"></foo><potato quack=\"duck\"></potato>"
    +      }
    +    },
    +    {
    +      "data": "<foo bar=\"baz\"><potato quack=\"duck\"></potato></foo>",
    +      "errors": [
    +        "(1,15): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "foo": true,
    +            "potato": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "foo",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "baz"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "potato",
    +                        "attrs": [
    +                          {
    +                            "name": "quack",
    +                            "value": "duck"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><foo bar=\"baz\"><potato quack=\"duck\"></potato></foo></body></html>",
    +        "noQuirksBodyHtml": "<foo bar=\"baz\"><potato quack=\"duck\"></potato></foo>"
    +      }
    +    },
    +    {
    +      "data": "<foo></foo bar=\"baz\"><potato></potato quack=\"duck\">",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,21): attributes-in-end-tag",
    +        "(1,51): attributes-in-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "foo": true,
    +            "potato": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "foo"
    +                  },
    +                  {
    +                    "tag": "potato"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><foo></foo><potato></potato></body></html>",
    +        "noQuirksBodyHtml": "<foo></foo><potato></potato>"
    +      }
    +    },
    +    {
    +      "data": "</ tttt>",
    +      "errors": [
    +        "(1,2): expected-closing-tag-but-got-char",
    +        "(1,8): expected-doctype-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "comment": " tttt"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!-- tttt--><html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": "<!-- tttt-->"
    +      }
    +    },
    +    {
    +      "data": "<div FOO ><img><img></div>",
    +      "errors": [
    +        "(1,10): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "img": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "attrs": [
    +                      {
    +                        "name": "foo",
    +                        "value": ""
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "img"
    +                      },
    +                      {
    +                        "tag": "img"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div foo=\"\"><img><img></div></body></html>",
    +        "noQuirksBodyHtml": "<div foo=\"\"><img><img></div>"
    +      }
    +    },
    +    {
    +      "data": "<p>Test</p<p>Test2</p>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,13): unexpected-end-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "text": "TestTest2"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p>TestTest2</p></body></html>",
    +        "noQuirksBodyHtml": "<p>TestTest2</p>"
    +      }
    +    },
    +    {
    +      "data": "<rdar://problem/6869687>",
    +      "errors": [
    +        "(1,7): unexpected-character-after-solidus-in-tag",
    +        "(1,8): unexpected-character-after-solidus-in-tag",
    +        "(1,16): unexpected-character-after-solidus-in-tag",
    +        "(1,24): expected-doctype-but-got-start-tag",
    +        "(1,24): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "rdar:": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "rdar:",
    +                    "attrs": [
    +                      {
    +                        "name": "6869687",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "problem",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><rdar: problem=\"\" 6869687=\"\"></rdar:></body></html>",
    +        "noQuirksBodyHtml": "<rdar: problem=\"\" 6869687=\"\"></rdar:>"
    +      }
    +    },
    +    {
    +      "data": "<A>test< /A>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,8): expected-tag-name",
    +        "(1,12): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a",
    +                    "children": [
    +                      {
    +                        "text": "test< /A>",
    +                        "escaped": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a>test&lt; /A&gt;</a></body></html>",
    +        "noQuirksBodyHtml": "<a>test&lt; /A&gt;</a>"
    +      }
    +    },
    +    {
    +      "data": "&lt;",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-chars"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "escaped": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "<",
    +                    "escaped": true
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>&lt;</body></html>",
    +        "noQuirksBodyHtml": "&lt;"
    +      }
    +    },
    +    {
    +      "data": "<body foo='bar'><body foo='baz' yo='mama'>",
    +      "errors": [
    +        "(1,16): expected-doctype-but-got-start-tag",
    +        "(1,42): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "attrs": [
    +                  {
    +                    "name": "foo",
    +                    "value": "bar"
    +                  },
    +                  {
    +                    "name": "yo",
    +                    "value": "mama"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body foo=\"bar\" yo=\"mama\"></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<body></br foo=\"bar\"></body>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,21): attributes-in-end-tag",
    +        "(1,21): unexpected-end-tag-treated-as"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "br": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "br"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><br></body></html>",
    +        "noQuirksBodyHtml": "<br>"
    +      }
    +    },
    +    {
    +      "data": "<bdy><br foo=\"bar\"></body>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,26): expected-one-end-tag-but-got-another"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "bdy": true,
    +            "br": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "bdy",
    +                    "children": [
    +                      {
    +                        "tag": "br",
    +                        "attrs": [
    +                          {
    +                            "name": "foo",
    +                            "value": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><bdy><br foo=\"bar\"></bdy></body></html>",
    +        "noQuirksBodyHtml": "<bdy><br foo=\"bar\"></bdy>"
    +      }
    +    },
    +    {
    +      "data": "<body></body></br foo=\"bar\">",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,28): attributes-in-end-tag",
    +        "(1,28): unexpected-end-tag-after-body",
    +        "(1,28): unexpected-end-tag-treated-as"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "br": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "br"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><br></body></html>",
    +        "noQuirksBodyHtml": "<br>"
    +      }
    +    },
    +    {
    +      "data": "<bdy></body><br foo=\"bar\">",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,12): expected-one-end-tag-but-got-another",
    +        "(1,26): unexpected-start-tag-after-body",
    +        "(1,26): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "bdy": true,
    +            "br": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "bdy",
    +                    "children": [
    +                      {
    +                        "tag": "br",
    +                        "attrs": [
    +                          {
    +                            "name": "foo",
    +                            "value": "bar"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><bdy><br foo=\"bar\"></bdy></body></html>",
    +        "noQuirksBodyHtml": "<bdy><br foo=\"bar\"></bdy>"
    +      }
    +    },
    +    {
    +      "data": "<html><body></body></html><!-- Hi there -->",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          },
    +          {
    +            "comment": " Hi there "
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html><!-- Hi there -->",
    +        "noQuirksBodyHtml": "<!-- Hi there -->"
    +      }
    +    },
    +    {
    +      "data": "<html><body></body></html>x<!-- Hi there -->",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,27): expected-eof-but-got-char"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "x"
    +                  },
    +                  {
    +                    "comment": " Hi there "
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>x<!-- Hi there --></body></html>",
    +        "noQuirksBodyHtml": "x<!-- Hi there -->"
    +      }
    +    },
    +    {
    +      "data": "<html><body></body></html>x<!-- Hi there --></html><!-- Again -->",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,27): expected-eof-but-got-char"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "x"
    +                  },
    +                  {
    +                    "comment": " Hi there "
    +                  }
    +                ]
    +              }
    +            ]
    +          },
    +          {
    +            "comment": " Again "
    +          }
    +        ],
    +        "html": "<html><head></head><body>x<!-- Hi there --></body></html><!-- Again -->",
    +        "noQuirksBodyHtml": "x<!-- Hi there --><!-- Again -->"
    +      }
    +    },
    +    {
    +      "data": "<html><body></body></html>x<!-- Hi there --></body></html><!-- Again -->",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,27): expected-eof-but-got-char"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          },
    +          "comment": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "x"
    +                  },
    +                  {
    +                    "comment": " Hi there "
    +                  }
    +                ]
    +              }
    +            ]
    +          },
    +          {
    +            "comment": " Again "
    +          }
    +        ],
    +        "html": "<html><head></head><body>x<!-- Hi there --></body></html><!-- Again -->",
    +        "noQuirksBodyHtml": "x<!-- Hi there --><!-- Again -->"
    +      }
    +    },
    +    {
    +      "data": "<html><body><ruby><div><rp>xx</rp></div></ruby></body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,27): XXX-undefined-error"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "div": true,
    +            "rp": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "rp",
    +                            "children": [
    +                              {
    +                                "text": "xx"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby><div><rp>xx</rp></div></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby><div><rp>xx</rp></div></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><body><ruby><div><rt>xx</rt></div></ruby></body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,27): XXX-undefined-error"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ruby": true,
    +            "div": true,
    +            "rt": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ruby",
    +                    "children": [
    +                      {
    +                        "tag": "div",
    +                        "children": [
    +                          {
    +                            "tag": "rt",
    +                            "children": [
    +                              {
    +                                "text": "xx"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ruby><div><rt>xx</rt></div></ruby></body></html>",
    +        "noQuirksBodyHtml": "<ruby><div><rt>xx</rt></div></ruby>"
    +      }
    +    },
    +    {
    +      "data": "<html><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--></html><!--5--><noframes>C</noframes><!--6-->",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true,
    +            "noframes": true
    +          },
    +          "comment": true,
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset",
    +                "children": [
    +                  {
    +                    "comment": "1"
    +                  },
    +                  {
    +                    "tag": "noframes",
    +                    "children": [
    +                      {
    +                        "text": "A",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "comment": "2"
    +                  }
    +                ]
    +              },
    +              {
    +                "comment": "3"
    +              },
    +              {
    +                "tag": "noframes",
    +                "children": [
    +                  {
    +                    "text": "B",
    +                    "no_escape": true
    +                  }
    +                ]
    +              },
    +              {
    +                "comment": "4"
    +              },
    +              {
    +                "tag": "noframes",
    +                "children": [
    +                  {
    +                    "text": "C",
    +                    "no_escape": true
    +                  }
    +                ]
    +              }
    +            ]
    +          },
    +          {
    +            "comment": "5"
    +          },
    +          {
    +            "comment": "6"
    +          }
    +        ],
    +        "html": "<html><head></head><frameset><!--1--><noframes>A</noframes><!--2--></frameset><!--3--><noframes>B</noframes><!--4--><noframes>C</noframes></html><!--5--><!--6-->",
    +        "noQuirksBodyHtml": "<!--1--><noframes>A</noframes><!--2--><!--3--><noframes>B</noframes><!--4--><!--5--><noframes>C</noframes><!--6-->"
    +      }
    +    },
    +    {
    +      "data": "<select><option>A<select><option>B<select><option>C<select><option>D<select><option>E<select><option>F<select><option>G<select>",
    +      "errors": [
    +        "(1,8): expected-doctype-but-got-start-tag",
    +        "(1,25): unexpected-select-in-select",
    +        "(1,59): unexpected-select-in-select",
    +        "(1,93): unexpected-select-in-select",
    +        "(1,127): unexpected-select-in-select",
    +        "(1,127): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "select": true,
    +            "option": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "select",
    +                    "children": [
    +                      {
    +                        "tag": "option",
    +                        "children": [
    +                          {
    +                            "text": "A"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "option",
    +                    "children": [
    +                      {
    +                        "text": "B"
    +                      },
    +                      {
    +                        "tag": "select",
    +                        "children": [
    +                          {
    +                            "tag": "option",
    +                            "children": [
    +                              {
    +                                "text": "C"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "option",
    +                    "children": [
    +                      {
    +                        "text": "D"
    +                      },
    +                      {
    +                        "tag": "select",
    +                        "children": [
    +                          {
    +                            "tag": "option",
    +                            "children": [
    +                              {
    +                                "text": "E"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "option",
    +                    "children": [
    +                      {
    +                        "text": "F"
    +                      },
    +                      {
    +                        "tag": "select",
    +                        "children": [
    +                          {
    +                            "tag": "option",
    +                            "children": [
    +                              {
    +                                "text": "G"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><select><option>A</option></select><option>B<select><option>C</option></select></option><option>D<select><option>E</option></select></option><option>F<select><option>G</option></select></option></body></html>",
    +        "noQuirksBodyHtml": "<select><option>A</option></select><option>B<select><option>C</option></select></option><option>D<select><option>E</option></select></option><option>F<select><option>G</option></select></option>"
    +      }
    +    },
    +    {
    +      "data": "<dd><dd><dt><dt><dd><li><li>",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "dd": true,
    +            "dt": true,
    +            "li": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "dd"
    +                  },
    +                  {
    +                    "tag": "dd"
    +                  },
    +                  {
    +                    "tag": "dt"
    +                  },
    +                  {
    +                    "tag": "dt"
    +                  },
    +                  {
    +                    "tag": "dd",
    +                    "children": [
    +                      {
    +                        "tag": "li"
    +                      },
    +                      {
    +                        "tag": "li"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><dd></dd><dd></dd><dt></dt><dt></dt><dd><li></li><li></li></dd></body></html>",
    +        "noQuirksBodyHtml": "<dd></dd><dd></dd><dt></dt><dt></dt><dd><li></li><li></li></dd>"
    +      }
    +    },
    +    {
    +      "data": "<div><b></div><div><nobr>a<nobr>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,14): end-tag-too-early",
    +        "(1,32): unexpected-start-tag-implies-end-tag",
    +        "(1,32): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "b": true,
    +            "nobr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "b",
    +                        "children": [
    +                          {
    +                            "tag": "nobr",
    +                            "children": [
    +                              {
    +                                "text": "a"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "nobr"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><b></b></div><div><b><nobr>a</nobr><nobr></nobr></b></div></body></html>",
    +        "noQuirksBodyHtml": "<div><b></b></div><div><b><nobr>a</nobr><nobr></nobr></b></div>"
    +      }
    +    },
    +    {
    +      "data": "<head></head>\n<body></body>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "text": "\n"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head>\n<body></body></html>",
    +        "noQuirksBodyHtml": "\n"
    +      }
    +    },
    +    {
    +      "data": "<head></head> <style></style>ddd",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,21): unexpected-start-tag-out-of-my-head"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "style": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head",
    +                "children": [
    +                  {
    +                    "tag": "style"
    +                  }
    +                ]
    +              },
    +              {
    +                "text": " "
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "ddd"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head><style></style></head> <body>ddd</body></html>",
    +        "noQuirksBodyHtml": " <style></style>ddd"
    +      }
    +    },
    +    {
    +      "data": "<kbd><table></kbd><col><select><tr>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,18): unexpected-end-tag-implies-table-voodoo",
    +        "(1,18): unexpected-end-tag",
    +        "(1,31): unexpected-start-tag-implies-table-voodoo",
    +        "(1,35): unexpected-table-element-start-tag-in-select-in-table",
    +        "(1,35): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "kbd": true,
    +            "select": true,
    +            "table": true,
    +            "colgroup": true,
    +            "col": true,
    +            "tbody": true,
    +            "tr": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "kbd",
    +                    "children": [
    +                      {
    +                        "tag": "select"
    +                      },
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "colgroup",
    +                            "children": [
    +                              {
    +                                "tag": "col"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><kbd><select></select><table><colgroup><col></colgroup><tbody><tr></tr></tbody></table></kbd></body></html>",
    +        "noQuirksBodyHtml": "<kbd><select></select><table><colgroup><col></colgroup><tbody><tr></tr></tbody></table></kbd>"
    +      }
    +    },
    +    {
    +      "data": "<kbd><table></kbd><col><select><tr></table><div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,18): unexpected-end-tag-implies-table-voodoo",
    +        "(1,18): unexpected-end-tag",
    +        "(1,31): unexpected-start-tag-implies-table-voodoo",
    +        "(1,35): unexpected-table-element-start-tag-in-select-in-table",
    +        "(1,48): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "kbd": true,
    +            "select": true,
    +            "table": true,
    +            "colgroup": true,
    +            "col": true,
    +            "tbody": true,
    +            "tr": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "kbd",
    +                    "children": [
    +                      {
    +                        "tag": "select"
    +                      },
    +                      {
    +                        "tag": "table",
    +                        "children": [
    +                          {
    +                            "tag": "colgroup",
    +                            "children": [
    +                              {
    +                                "tag": "col"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "tbody",
    +                            "children": [
    +                              {
    +                                "tag": "tr"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "div"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><kbd><select></select><table><colgroup><col></colgroup><tbody><tr></tr></tbody></table><div></div></kbd></body></html>",
    +        "noQuirksBodyHtml": "<kbd><select></select><table><colgroup><col></colgroup><tbody><tr></tr></tbody></table><div></div></kbd>"
    +      }
    +    },
    +    {
    +      "data": "<a><li><style></style><title></title></a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,41): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "li": true,
    +            "style": true,
    +            "title": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a"
    +                  },
    +                  {
    +                    "tag": "li",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "tag": "style"
    +                          },
    +                          {
    +                            "tag": "title"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a></a><li><a><style></style><title></title></a></li></body></html>",
    +        "noQuirksBodyHtml": "<a></a><li><a><style></style><title></title></a></li>"
    +      }
    +    },
    +    {
    +      "data": "<font></p><p><meta><title></title></font>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,10): unexpected-end-tag",
    +        "(1,41): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "font": true,
    +            "p": true,
    +            "meta": true,
    +            "title": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "font",
    +                    "children": [
    +                      {
    +                        "tag": "p"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "p",
    +                    "children": [
    +                      {
    +                        "tag": "font",
    +                        "children": [
    +                          {
    +                            "tag": "meta"
    +                          },
    +                          {
    +                            "tag": "title"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><font><p></p></font><p><font><meta><title></title></font></p></body></html>",
    +        "noQuirksBodyHtml": "<font><p></p></font><p><font><meta><title></title></font></p>"
    +      }
    +    },
    +    {
    +      "data": "<a><center><title></title><a>",
    +      "errors": [
    +        "(1,3): expected-doctype-but-got-start-tag",
    +        "(1,29): unexpected-start-tag-implies-end-tag",
    +        "(1,29): adoption-agency-1.3",
    +        "(1,29): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "a": true,
    +            "center": true,
    +            "title": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "a"
    +                  },
    +                  {
    +                    "tag": "center",
    +                    "children": [
    +                      {
    +                        "tag": "a",
    +                        "children": [
    +                          {
    +                            "tag": "title"
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "a"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><a></a><center><a><title></title></a><a></a></center></body></html>",
    +        "noQuirksBodyHtml": "<a></a><center><a><title></title></a><a></a></center>"
    +      }
    +    },
    +    {
    +      "data": "<svg><title><div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,17): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg title": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "title",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><title><div></div></title></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><title><div></div></title></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><title><rect><div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,23): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg title": true,
    +            "rect": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "title",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "rect",
    +                            "children": [
    +                              {
    +                                "tag": "div"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><title><rect><div></div></rect></title></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><title><rect><div></div></rect></title></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><title><svg><div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,22): unexpected-html-element-in-foreign-content",
    +        "(1,22): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg title": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "title",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "svg",
    +                            "ns": "http://www.w3.org/2000/svg"
    +                          },
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><title><svg></svg><div></div></title></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><title><svg><div></div></svg></title></svg>"
    +      }
    +    },
    +    {
    +      "data": "<img <=\"\" FAIL>",
    +      "errors": [
    +        "(1,6): invalid-character-in-attribute-name",
    +        "(1,15): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "img": true
    +          },
    +          "attrWithFunnyChar": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "img",
    +                    "attrs": [
    +                      {
    +                        "name": "<",
    +                        "value": ""
    +                      },
    +                      {
    +                        "name": "fail",
    +                        "value": ""
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><img <=\"\" fail=\"\"></body></html>",
    +        "noQuirksBodyHtml": "<img <=\"\" fail=\"\">"
    +      }
    +    },
    +    {
    +      "data": "<ul><li><div id='foo'/>A</li><li>B<div>C</div></li></ul>",
    +      "errors": [
    +        "(1,4): expected-doctype-but-got-start-tag",
    +        "(1,23): non-void-element-with-trailing-solidus",
    +        "(1,29): end-tag-too-early"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "ul": true,
    +            "li": true,
    +            "div": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "ul",
    +                    "children": [
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "attrs": [
    +                              {
    +                                "name": "id",
    +                                "value": "foo"
    +                              }
    +                            ],
    +                            "children": [
    +                              {
    +                                "text": "A"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "li",
    +                        "children": [
    +                          {
    +                            "text": "B"
    +                          },
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "text": "C"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><ul><li><div id=\"foo\">A</div></li><li>B<div>C</div></li></ul></body></html>",
    +        "noQuirksBodyHtml": "<ul><li><div id=\"foo\">A</div></li><li>B<div>C</div></li></ul>"
    +      }
    +    },
    +    {
    +      "data": "<svg><em><desc></em>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,9): unexpected-html-element-in-foreign-content",
    +        "(1,20): adoption-agency-1.3"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "em": true,
    +            "desc": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg"
    +                  },
    +                  {
    +                    "tag": "em",
    +                    "children": [
    +                      {
    +                        "tag": "desc"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg></svg><em><desc></desc></em></body></html>",
    +        "noQuirksBodyHtml": "<svg><em><desc></desc></em></svg>"
    +      }
    +    },
    +    {
    +      "data": "<table><tr><td><svg><desc><td></desc><circle>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true,
    +            "svg svg": true,
    +            "svg desc": true,
    +            "circle": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "svg",
    +                                    "ns": "http://www.w3.org/2000/svg",
    +                                    "children": [
    +                                      {
    +                                        "tag": "desc",
    +                                        "ns": "http://www.w3.org/2000/svg"
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              },
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "tag": "circle"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td><svg><desc></desc></svg></td><td><circle></circle></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td><svg><desc></desc></svg></td><td><circle></circle></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<svg><tfoot></mi><td>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag",
    +        "(1,17): unexpected-end-tag",
    +        "(1,17): unexpected-end-tag",
    +        "(1,21): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg tfoot": true,
    +            "svg td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "tfoot",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "td",
    +                            "ns": "http://www.w3.org/2000/svg"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><tfoot><td></td></tfoot></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><tfoot><td></td></tfoot></svg>"
    +      }
    +    },
    +    {
    +      "data": "<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "math math": true,
    +            "math mrow": true,
    +            "math mn": true,
    +            "math mi": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "math",
    +                    "ns": "http://www.w3.org/1998/Math/MathML",
    +                    "children": [
    +                      {
    +                        "tag": "mrow",
    +                        "ns": "http://www.w3.org/1998/Math/MathML",
    +                        "children": [
    +                          {
    +                            "tag": "mrow",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "tag": "mn",
    +                                "ns": "http://www.w3.org/1998/Math/MathML",
    +                                "children": [
    +                                  {
    +                                    "text": "1"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "mi",
    +                            "ns": "http://www.w3.org/1998/Math/MathML",
    +                            "children": [
    +                              {
    +                                "text": "a"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math></body></html>",
    +        "noQuirksBodyHtml": "<math><mrow><mrow><mn>1</mn></mrow><mi>a</mi></mrow></math>"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><input type=\"hidden\"><frameset>",
    +      "errors": [
    +        "(1,46): unexpected-start-tag",
    +        "(1,46): eof-in-frameset"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "frameset": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "frameset"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><frameset></frameset></html>",
    +        "noQuirksBodyHtml": "<input type=\"hidden\">"
    +      }
    +    },
    +    {
    +      "data": "<!doctype html><input type=\"button\"><frameset>",
    +      "errors": [
    +        "(1,46): unexpected-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "input": true
    +          },
    +          "doctype": true
    +        },
    +        "tree": [
    +          {
    +            "doctype": "html"
    +          },
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "input",
    +                    "attrs": [
    +                      {
    +                        "name": "type",
    +                        "value": "button"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<!DOCTYPE html><html><head></head><body><input type=\"button\"></body></html>",
    +        "noQuirksBodyHtml": "<input type=\"button\">"
    +      }
    +    }
    +  ],
    +  "webkit02.dat": [
    +    {
    +      "data": "<foo bar=qux/>",
    +      "errors": [
    +        "(1,14): expected-doctype-but-got-start-tag",
    +        "(1,14): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "foo": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "foo",
    +                    "attrs": [
    +                      {
    +                        "name": "bar",
    +                        "value": "qux/"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><foo bar=\"qux/\"></foo></body></html>",
    +        "noQuirksBodyHtml": "<foo bar=\"qux/\"></foo>"
    +      }
    +    },
    +    {
    +      "data": "<p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p>",
    +      "errors": [
    +        "(1,15): expected-doctype-but-got-start-tag"
    +      ],
    +      "script": "on",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "noscript": true,
    +            "span": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "attrs": [
    +                      {
    +                        "name": "id",
    +                        "value": "status"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "noscript",
    +                        "children": [
    +                          {
    +                            "text": "<strong>A</strong>",
    +                            "no_escape": true
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "span",
    +                        "children": [
    +                          {
    +                            "text": "B"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p></body></html>",
    +        "noQuirksBodyHtml": "<p id=\"status\"><noscript>&lt;strong&gt;A&lt;/strong&gt;</noscript><span>B</span></p>"
    +      }
    +    },
    +    {
    +      "data": "<p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p>",
    +      "errors": [
    +        "(1,15): expected-doctype-but-got-start-tag"
    +      ],
    +      "script": "off",
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "p": true,
    +            "noscript": true,
    +            "strong": true,
    +            "span": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "p",
    +                    "attrs": [
    +                      {
    +                        "name": "id",
    +                        "value": "status"
    +                      }
    +                    ],
    +                    "children": [
    +                      {
    +                        "tag": "noscript",
    +                        "children": [
    +                          {
    +                            "tag": "strong",
    +                            "children": [
    +                              {
    +                                "text": "A"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      },
    +                      {
    +                        "tag": "span",
    +                        "children": [
    +                          {
    +                            "text": "B"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><p id=\"status\"><noscript><strong>A</strong></noscript><span>B</span></p></body></html>",
    +        "noQuirksBodyHtml": "<p id=\"status\"><noscript>&lt;strong&gt;A&lt;/strong&gt;</noscript><span>B</span></p>"
    +      }
    +    },
    +    {
    +      "data": "<div><sarcasm><div></div></sarcasm></div>",
    +      "errors": [
    +        "(1,5): expected-doctype-but-got-start-tag"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "div": true,
    +            "sarcasm": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "div",
    +                    "children": [
    +                      {
    +                        "tag": "sarcasm",
    +                        "children": [
    +                          {
    +                            "tag": "div"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><div><sarcasm><div></div></sarcasm></div></body></html>",
    +        "noQuirksBodyHtml": "<div><sarcasm><div></div></sarcasm></div>"
    +      }
    +    },
    +    {
    +      "data": "<html><body><img src=\"\" border=\"0\" alt=\"><div>A</div></body></html>",
    +      "errors": [
    +        "(1,6): expected-doctype-but-got-start-tag",
    +        "(1,67): eof-in-attribute-value-double-quote"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body></body></html>",
    +        "noQuirksBodyHtml": ""
    +      }
    +    },
    +    {
    +      "data": "<table><td></tbody>A",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,20): foster-parenting-character",
    +        "(1,20): eof-in-table"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "text": "A"
    +                  },
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body>A<table><tbody><tr><td></td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "A<table><tbody><tr><td></td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><td></thead>A",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,19): XXX-undefined-error",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "A"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td>A</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td>A</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><td></tfoot>A",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,11): unexpected-cell-in-table-body",
    +        "(1,19): XXX-undefined-error",
    +        "(1,20): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "tbody": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "tbody",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "A"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><tbody><tr><td>A</td></tr></tbody></table></body></html>",
    +        "noQuirksBodyHtml": "<table><tbody><tr><td>A</td></tr></tbody></table>"
    +      }
    +    },
    +    {
    +      "data": "<table><thead><td></tbody>A",
    +      "errors": [
    +        "(1,7): expected-doctype-but-got-start-tag",
    +        "(1,18): unexpected-cell-in-table-body",
    +        "(1,26): XXX-undefined-error",
    +        "(1,27): expected-closing-tag-but-got-eof"
    +      ],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "table": true,
    +            "thead": true,
    +            "tr": true,
    +            "td": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "table",
    +                    "children": [
    +                      {
    +                        "tag": "thead",
    +                        "children": [
    +                          {
    +                            "tag": "tr",
    +                            "children": [
    +                              {
    +                                "tag": "td",
    +                                "children": [
    +                                  {
    +                                    "text": "A"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><table><thead><tr><td>A</td></tr></thead></table></body></html>",
    +        "noQuirksBodyHtml": "<table><thead><tr><td>A</td></tr></thead></table>"
    +      }
    +    },
    +    {
    +      "data": "<legend>test</legend>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "legend": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "legend",
    +                    "children": [
    +                      {
    +                        "text": "test"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><legend>test</legend></body></html>",
    +        "noQuirksBodyHtml": "<legend>test</legend>"
    +      }
    +    },
    +    {
    +      "data": "<table><input>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "input": true,
    +            "table": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "input"
    +                  },
    +                  {
    +                    "tag": "table"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><input><table></table></body></html>",
    +        "noQuirksBodyHtml": "<input><table></table>"
    +      }
    +    },
    +    {
    +      "data": "<b><em><foo><foo><aside></b>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "em": true,
    +            "foo": true,
    +            "aside": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "em",
    +                        "children": [
    +                          {
    +                            "tag": "foo",
    +                            "children": [
    +                              {
    +                                "tag": "foo"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "em",
    +                    "children": [
    +                      {
    +                        "tag": "aside",
    +                        "children": [
    +                          {
    +                            "tag": "b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><em><foo><foo></foo></foo></em></b><em><aside><b></b></aside></em></body></html>",
    +        "noQuirksBodyHtml": "<b><em><foo><foo></foo></foo></em></b><em><aside><b></b></aside></em>"
    +      }
    +    },
    +    {
    +      "data": "<b><em><foo><foo><aside></b></em>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "em": true,
    +            "foo": true,
    +            "aside": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "em",
    +                        "children": [
    +                          {
    +                            "tag": "foo",
    +                            "children": [
    +                              {
    +                                "tag": "foo"
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "em"
    +                  },
    +                  {
    +                    "tag": "aside",
    +                    "children": [
    +                      {
    +                        "tag": "em",
    +                        "children": [
    +                          {
    +                            "tag": "b"
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><em><foo><foo></foo></foo></em></b><em></em><aside><em><b></b></em></aside></body></html>",
    +        "noQuirksBodyHtml": "<b><em><foo><foo></foo></foo></em></b><em></em><aside><em><b></b></em></aside>"
    +      }
    +    },
    +    {
    +      "data": "<b><em><foo><foo><foo><aside></b>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "em": true,
    +            "foo": true,
    +            "aside": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "em",
    +                        "children": [
    +                          {
    +                            "tag": "foo",
    +                            "children": [
    +                              {
    +                                "tag": "foo",
    +                                "children": [
    +                                  {
    +                                    "tag": "foo"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "aside",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><em><foo><foo><foo></foo></foo></foo></em></b><aside><b></b></aside></body></html>",
    +        "noQuirksBodyHtml": "<b><em><foo><foo><foo></foo></foo></foo></em></b><aside><b></b></aside>"
    +      }
    +    },
    +    {
    +      "data": "<b><em><foo><foo><foo><aside></b></em>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "b": true,
    +            "em": true,
    +            "foo": true,
    +            "aside": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "b",
    +                    "children": [
    +                      {
    +                        "tag": "em",
    +                        "children": [
    +                          {
    +                            "tag": "foo",
    +                            "children": [
    +                              {
    +                                "tag": "foo",
    +                                "children": [
    +                                  {
    +                                    "tag": "foo"
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "tag": "aside",
    +                    "children": [
    +                      {
    +                        "tag": "b"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><b><em><foo><foo><foo></foo></foo></foo></em></b><aside><b></b></aside></body></html>",
    +        "noQuirksBodyHtml": "<b><em><foo><foo><foo></foo></foo></foo></em></b><aside><b></b></aside>"
    +      }
    +    },
    +    {
    +      "data": "<b><em><foo><foo><foo><foo><foo><foo><foo><foo><foo><foo><aside></b></em>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "div"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "b": true,
    +            "em": true,
    +            "foo": true,
    +            "aside": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "b",
    +            "children": [
    +              {
    +                "tag": "em",
    +                "children": [
    +                  {
    +                    "tag": "foo",
    +                    "children": [
    +                      {
    +                        "tag": "foo",
    +                        "children": [
    +                          {
    +                            "tag": "foo",
    +                            "children": [
    +                              {
    +                                "tag": "foo",
    +                                "children": [
    +                                  {
    +                                    "tag": "foo",
    +                                    "children": [
    +                                      {
    +                                        "tag": "foo",
    +                                        "children": [
    +                                          {
    +                                            "tag": "foo",
    +                                            "children": [
    +                                              {
    +                                                "tag": "foo",
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "foo",
    +                                                    "children": [
    +                                                      {
    +                                                        "tag": "foo"
    +                                                      }
    +                                                    ]
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          },
    +          {
    +            "tag": "aside",
    +            "children": [
    +              {
    +                "tag": "b"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<b><em><foo><foo><foo><foo><foo><foo><foo><foo><foo><foo></foo></foo></foo></foo></foo></foo></foo></foo></foo></foo></em></b><aside><b></b></aside>",
    +        "noQuirksBodyHtml": "<b><em><foo><foo><foo><foo><foo><foo><foo><foo><foo><foo></foo></foo></foo></foo></foo></foo></foo></foo></foo></foo></em></b><aside><b></b></aside>"
    +      }
    +    },
    +    {
    +      "data": "<b><em><foo><foob><foob><foob><foob><fooc><fooc><fooc><fooc><food><aside></b></em>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "div"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "b": true,
    +            "em": true,
    +            "foo": true,
    +            "foob": true,
    +            "fooc": true,
    +            "food": true,
    +            "aside": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "b",
    +            "children": [
    +              {
    +                "tag": "em",
    +                "children": [
    +                  {
    +                    "tag": "foo",
    +                    "children": [
    +                      {
    +                        "tag": "foob",
    +                        "children": [
    +                          {
    +                            "tag": "foob",
    +                            "children": [
    +                              {
    +                                "tag": "foob",
    +                                "children": [
    +                                  {
    +                                    "tag": "foob",
    +                                    "children": [
    +                                      {
    +                                        "tag": "fooc",
    +                                        "children": [
    +                                          {
    +                                            "tag": "fooc",
    +                                            "children": [
    +                                              {
    +                                                "tag": "fooc",
    +                                                "children": [
    +                                                  {
    +                                                    "tag": "fooc",
    +                                                    "children": [
    +                                                      {
    +                                                        "tag": "food"
    +                                                      }
    +                                                    ]
    +                                                  }
    +                                                ]
    +                                              }
    +                                            ]
    +                                          }
    +                                        ]
    +                                      }
    +                                    ]
    +                                  }
    +                                ]
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          },
    +          {
    +            "tag": "aside",
    +            "children": [
    +              {
    +                "tag": "b"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<b><em><foo><foob><foob><foob><foob><fooc><fooc><fooc><fooc><food></food></fooc></fooc></fooc></fooc></foob></foob></foob></foob></foo></em></b><aside><b></b></aside>",
    +        "noQuirksBodyHtml": "<b><em><foo><foob><foob><foob><foob><fooc><fooc><fooc><fooc><food></food></fooc></fooc></fooc></fooc></foob></foob></foob></foob></foo></em></b><aside><b></b></aside>"
    +      }
    +    },
    +    {
    +      "data": "<isindex action=\"x\">",
    +      "errors": [],
    +      "fragment": {
    +        "name": "table"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "form": true,
    +            "hr": true,
    +            "label": true,
    +            "input": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "form",
    +            "attrs": [
    +              {
    +                "name": "action",
    +                "value": "x"
    +              }
    +            ],
    +            "children": [
    +              {
    +                "tag": "hr"
    +              },
    +              {
    +                "tag": "label",
    +                "children": [
    +                  {
    +                    "text": "This is a searchable index. Enter search keywords: "
    +                  },
    +                  {
    +                    "tag": "input",
    +                    "attrs": [
    +                      {
    +                        "name": "name",
    +                        "value": "isindex"
    +                      }
    +                    ]
    +                  }
    +                ]
    +              },
    +              {
    +                "tag": "hr"
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<form action=\"x\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>",
    +        "noQuirksBodyHtml": "<form action=\"x\"><hr><label>This is a searchable index. Enter search keywords: <input name=\"isindex\"></label><hr></form>"
    +      }
    +    },
    +    {
    +      "data": "<option><XH<optgroup></optgroup>",
    +      "errors": [],
    +      "fragment": {
    +        "name": "select"
    +      },
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "option": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "option"
    +          }
    +        ],
    +        "html": "<option></option>",
    +        "noQuirksBodyHtml": "<option><xh<optgroup></xh<optgroup></option>"
    +      }
    +    },
    +    {
    +      "data": "<svg><foreignObject><div>foo</div><plaintext></foreignObject></svg><div>bar</div>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg foreignObject": true,
    +            "div": true,
    +            "plaintext": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "foreignObject",
    +                        "ns": "http://www.w3.org/2000/svg",
    +                        "children": [
    +                          {
    +                            "tag": "div",
    +                            "children": [
    +                              {
    +                                "text": "foo"
    +                              }
    +                            ]
    +                          },
    +                          {
    +                            "tag": "plaintext",
    +                            "children": [
    +                              {
    +                                "text": "</foreignObject></svg><div>bar</div>",
    +                                "no_escape": true
    +                              }
    +                            ]
    +                          }
    +                        ]
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><foreignObject><div>foo</div><plaintext></foreignObject></svg><div>bar</div></plaintext></foreignObject></svg></body></html>",
    +        "noQuirksBodyHtml": "<svg><foreignObject><div>foo</div><plaintext></foreignObject></svg><div>bar</div></plaintext></foreignObject></svg>"
    +      }
    +    },
    +    {
    +      "data": "<svg><foreignObject></foreignObject><title></svg>foo",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "svg svg": true,
    +            "svg foreignObject": true,
    +            "svg title": true
    +          }
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "svg",
    +                    "ns": "http://www.w3.org/2000/svg",
    +                    "children": [
    +                      {
    +                        "tag": "foreignObject",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      },
    +                      {
    +                        "tag": "title",
    +                        "ns": "http://www.w3.org/2000/svg"
    +                      }
    +                    ]
    +                  },
    +                  {
    +                    "text": "foo"
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><svg><foreignObject></foreignObject><title></title></svg>foo</body></html>",
    +        "noQuirksBodyHtml": "<svg><foreignObject></foreignObject><title></title></svg>foo"
    +      }
    +    },
    +    {
    +      "data": "</foreignObject><plaintext><div>foo</div>",
    +      "errors": [],
    +      "document": {
    +        "props": {
    +          "tags": {
    +            "html": true,
    +            "head": true,
    +            "body": true,
    +            "plaintext": true
    +          },
    +          "no_escape": true
    +        },
    +        "tree": [
    +          {
    +            "tag": "html",
    +            "children": [
    +              {
    +                "tag": "head"
    +              },
    +              {
    +                "tag": "body",
    +                "children": [
    +                  {
    +                    "tag": "plaintext",
    +                    "children": [
    +                      {
    +                        "text": "<div>foo</div>",
    +                        "no_escape": true
    +                      }
    +                    ]
    +                  }
    +                ]
    +              }
    +            ]
    +          }
    +        ],
    +        "html": "<html><head></head><body><plaintext><div>foo</div></plaintext></body></html>",
    +        "noQuirksBodyHtml": "<plaintext><div>foo</div></plaintext>"
    +      }
    +    }
    +  ]
    +}
    diff --git a/tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php b/tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php
    deleted file mode 100644
    index c79471d5e8..0000000000
    --- a/tests/phpunit/includes/title/MediaWikiPageLinkRendererTest.php
    +++ /dev/null
    @@ -1,168 +0,0 @@
    -<?php
    -/**
    - * This program is free software; you can redistribute it and/or modify
    - * it under the terms of the GNU General Public License as published by
    - * the Free Software Foundation; either version 2 of the License, or
    - * (at your option) any later version.
    - *
    - * This program is distributed in the hope that it will be useful,
    - * but WITHOUT ANY WARRANTY; without even the implied warranty of
    - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    - * GNU General Public License for more details.
    - *
    - * You should have received a copy of the GNU General Public License along
    - * with this program; if not, write to the Free Software Foundation, Inc.,
    - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
    - * http://www.gnu.org/copyleft/gpl.html
    - *
    - * @file
    - * @author Daniel Kinzler
    - */
    -
    -/**
    - * @covers MediaWikiPageLinkRenderer
    - *
    - * @group Title
    - * @group Database
    - */
    -class MediaWikiPageLinkRendererTest extends MediaWikiTestCase {
    -
    -	protected function setUp() {
    -		parent::setUp();
    -
    -		$this->setMwGlobals( [
    -			'wgContLang' => Language::factory( 'en' ),
    -		] );
    -	}
    -
    -	/**
    -	 * Returns a mock GenderCache that will return "female" always.
    -	 *
    -	 * @return GenderCache
    -	 */
    -	private function getGenderCache() {
    -		$genderCache = $this->getMockBuilder( 'GenderCache' )
    -			->disableOriginalConstructor()
    -			->getMock();
    -
    -		$genderCache->expects( $this->any() )
    -			->method( 'getGenderOf' )
    -			->will( $this->returnValue( 'female' ) );
    -
    -		return $genderCache;
    -	}
    -
    -	public static function provideGetPageUrl() {
    -		return [
    -			[
    -				new TitleValue( NS_MAIN, 'Foo_Bar' ),
    -				[],
    -				'/Foo_Bar'
    -			],
    -			[
    -				new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
    -				[ 'foo' => 'bar' ],
    -				'/User:Hansi_Maier?foo=bar#stuff'
    -			],
    -		];
    -	}
    -
    -	/**
    -	 * @dataProvider provideGetPageUrl
    -	 */
    -	public function testGetPageUrl( TitleValue $title, $params, $url ) {
    -		// NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
    -		// WikitextTitleFormatter we pass here, and relies on the Linker
    -		// class for generating the link! This may break the test e.g.
    -		// of Linker uses a different language for the namespace names.
    -
    -		$lang = Language::factory( 'en' );
    -
    -		$formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
    -		$renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
    -		$actual = $renderer->getPageUrl( $title, $params );
    -
    -		$this->assertEquals( $url, $actual );
    -	}
    -
    -	public static function provideRenderHtmlLink() {
    -		return [
    -			[
    -				new TitleValue( NS_MAIN, 'Foo_Bar' ),
    -				'Foo Bar',
    -				'!<a .*href=".*?Foo_Bar.*?".*?>Foo Bar</a>!'
    -			],
    -			[
    -				// NOTE: Linker doesn't include fragments in "broken" links
    -				// NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
    -				new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
    -				'Hansi Maier\'s Stuff',
    -				'!<a .*href=".*?User:Hansi_Maier.*?>Hansi Maier\'s Stuff</a>!'
    -			],
    -			[
    -				// NOTE: Linker doesn't include fragments in "broken" links
    -				// NOTE: once this no longer uses Linker, we will get "2" instead of "User" for the namespace.
    -				new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
    -				null,
    -				'!<a .*href=".*?User:Hansi_Maier.*?>User:Hansi Maier#stuff</a>!'
    -			],
    -		];
    -	}
    -
    -	/**
    -	 * @dataProvider provideRenderHtmlLink
    -	 */
    -	public function testRenderHtmlLink( TitleValue $title, $text, $pattern ) {
    -		// NOTE: was of Feb 2014, MediaWikiPageLinkRenderer *ignores* the
    -		// WikitextTitleFormatter we pass here, and relies on the Linker
    -		// class for generating the link! This may break the test e.g.
    -		// of Linker uses a different language for the namespace names.
    -
    -		$lang = Language::factory( 'en' );
    -
    -		$formatter = new MediaWikiTitleCodec( $lang, $this->getGenderCache() );
    -		$renderer = new MediaWikiPageLinkRenderer( $formatter );
    -		$actual = $renderer->renderHtmlLink( $title, $text );
    -
    -		$this->assertRegExp( $pattern, $actual );
    -	}
    -
    -	public static function provideRenderWikitextLink() {
    -		return [
    -			[
    -				new TitleValue( NS_MAIN, 'Foo_Bar' ),
    -				'Foo Bar',
    -				'[[:0:Foo Bar|Foo Bar]]'
    -			],
    -			[
    -				new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
    -				'Hansi Maier\'s Stuff',
    -				'[[:2:Hansi Maier#stuff|Hansi Maier&#39;s Stuff]]'
    -			],
    -			[
    -				new TitleValue( NS_USER, 'Hansi_Maier', 'stuff' ),
    -				null,
    -				'[[:2:Hansi Maier#stuff|2:Hansi Maier#stuff]]'
    -			],
    -		];
    -	}
    -
    -	/**
    -	 * @dataProvider provideRenderWikitextLink
    -	 */
    -	public function testRenderWikitextLink( TitleValue $title, $text, $expected ) {
    -		$formatter = $this->getMock( 'TitleFormatter' );
    -		$formatter->expects( $this->any() )
    -			->method( 'getFullText' )
    -			->will( $this->returnCallback(
    -				function ( TitleValue $title ) {
    -					return str_replace( '_', ' ', "$title" );
    -				}
    -			) );
    -
    -		$renderer = new MediaWikiPageLinkRenderer( $formatter, '/' );
    -		$actual = $renderer->renderWikitextLink( $title, $text );
    -
    -		$this->assertEquals( $expected, $actual );
    -	}
    -}
    diff --git a/tests/phpunit/includes/title/MediaWikiTitleCodecTest.php b/tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
    index 4d914e4680..e7ac940b92 100644
    --- a/tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
    +++ b/tests/phpunit/includes/title/MediaWikiTitleCodecTest.php
    @@ -355,9 +355,9 @@ class MediaWikiTitleCodecTest extends MediaWikiTestCase {
     			// XML/HTML character entity references
     			// Note: Commented out because they are not marked invalid by the PHP test as
     			// Title::newFromText runs Sanitizer::decodeCharReferencesAndNormalize first.
    -			// array( 'A &eacute; B' ),
    -			// array( 'A &#233; B' ),
    -			// array( 'A &#x00E9; B' ),
    +			// [ 'A &eacute; B' ],
    +			// [ 'A &#233; B' ],
    +			// [ 'A &#x00E9; B' ],
     			// Subject of NS_TALK does not roundtrip to NS_MAIN
     			[ 'Talk:File:Example.svg' ],
     			// Directory navigation
    diff --git a/tests/phpunit/includes/upload/UploadStashTest.php b/tests/phpunit/includes/upload/UploadStashTest.php
    index e0b57a797b..9b25505c68 100644
    --- a/tests/phpunit/includes/upload/UploadStashTest.php
    +++ b/tests/phpunit/includes/upload/UploadStashTest.php
    @@ -7,7 +7,7 @@
      */
     class UploadStashTest extends MediaWikiTestCase {
     	/**
    -	 * @var array Array of UploadStashTestUser
    +	 * @var TestUser[] Array of UploadStashTestUser
     	 */
     	public static $users;
     
    @@ -55,7 +55,7 @@ class UploadStashTest extends MediaWikiTestCase {
     	 * @todo give this test a real name explaining what is being tested here
     	 */
     	public function testBug29408() {
    -		$this->setMwGlobals( 'wgUser', self::$users['uploader']->user );
    +		$this->setMwGlobals( 'wgUser', self::$users['uploader']->getUser() );
     
     		$repo = RepoGroup::singleton()->getLocalRepo();
     		$stash = new UploadStash( $repo );
    diff --git a/tests/phpunit/includes/user/BotPasswordTest.php b/tests/phpunit/includes/user/BotPasswordTest.php
    index 1ef50824f0..cfd5f7890a 100644
    --- a/tests/phpunit/includes/user/BotPasswordTest.php
    +++ b/tests/phpunit/includes/user/BotPasswordTest.php
    @@ -290,7 +290,7 @@ class BotPasswordTest extends MediaWikiTestCase {
     
     		// Wrong password
     		$status = BotPassword::login(
    -			"{$this->testUserName}@BotPassword", $this->testUser->password, new FauxRequest );
    +			"{$this->testUserName}@BotPassword", $this->testUser->getPassword(), new FauxRequest );
     		$this->assertEquals( Status::newFatal( 'wrongpassword' ), $status );
     
     		// Success!
    diff --git a/tests/phpunit/languages/LanguageTest.php b/tests/phpunit/languages/LanguageTest.php
    index 9e41a4eabb..e2e64920ef 100644
    --- a/tests/phpunit/languages/LanguageTest.php
    +++ b/tests/phpunit/languages/LanguageTest.php
    @@ -638,6 +638,24 @@ class LanguageTest extends LanguageClassesTestCase {
     		);
     	}
     
    +	/**
    +	 * sprintfDate should only calculate a TTL if the caller is going to use it.
    +	 * @covers Language::sprintfDate
    +	 */
    +	public function testSprintfDateNoTtlIfNotNeeded() {
    +		$noTtl = 'unused'; // Value used to represent that the caller didn't pass a variable in.
    +		$ttl = null;
    +		$this->getLang()->sprintfDate( 'YmdHis', wfTimestampNow(), null, $noTtl );
    +		$this->getLang()->sprintfDate( 'YmdHis', wfTimestampNow(), null, $ttl );
    +
    +		$this->assertSame(
    +			'unused',
    +			$noTtl,
    +			'If the caller does not set the $ttl variable, do not compute it.'
    +		);
    +		$this->assertInternalType( 'int', $ttl, 'TTL should have been computed.' );
    +	}
    +
     	public static function provideSprintfDateSamples() {
     		return [
     			[
    diff --git a/tests/phpunit/mocks/media/MockOggHandler.php b/tests/phpunit/mocks/media/MockOggHandler.php
    index b110e2137f..99992fe3d8 100644
    --- a/tests/phpunit/mocks/media/MockOggHandler.php
    +++ b/tests/phpunit/mocks/media/MockOggHandler.php
    @@ -76,18 +76,30 @@ class MockOggHandler extends OggHandlerTMH {
     	}
     
     	function getLength( $file ) {
    +		if ( $this->isAudio( $file ) ) {
    +			return 0.99875;
    +		}
     		return 4.3666666666667;
     	}
     
     	function getBitRate( $file ) {
    +		if ( $this->isAudio( $file ) ) {
    +			return 41107;
    +		}
     		return 590013;
     	}
     
     	function getWebType( $file ) {
    +		if ( $this->isAudio( $file ) ) {
    +			return "audio/ogg; codecs=\"vorbis\"";
    +		}
     		return "video/ogg; codecs=\"theora\"";
     	}
     
     	function getFramerate( $file ) {
    +		if ( $this->isAudio( $file ) ) {
    +			return 0;
    +		}
     		return 30;
     	}
     }
    diff --git a/tests/phpunit/structure/ResourcesTest.php b/tests/phpunit/structure/ResourcesTest.php
    index 5c65c1ef89..6446416109 100644
    --- a/tests/phpunit/structure/ResourcesTest.php
    +++ b/tests/phpunit/structure/ResourcesTest.php
    @@ -40,7 +40,7 @@ class ResourcesTest extends MediaWikiTestCase {
     		$data = self::getAllModules();
     		foreach ( $data['modules'] as $moduleName => $module ) {
     			$version = $module->getVersionHash( $data['context'] );
    -			$this->assertEquals( 8, strlen( $version ), "$moduleName must use ResourceLoader::makeHash" );
    +			$this->assertEquals( 7, strlen( $version ), "$moduleName must use ResourceLoader::makeHash" );
     		}
     	}
     
    diff --git a/tests/qunit/QUnitTestResources.php b/tests/qunit/QUnitTestResources.php
    index a2d76e01b0..95f28c85b9 100644
    --- a/tests/qunit/QUnitTestResources.php
    +++ b/tests/qunit/QUnitTestResources.php
    @@ -84,6 +84,7 @@ return [
     			'tests/qunit/suites/resources/mediawiki/mediawiki.viewport.test.js',
     			'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js',
     			'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js',
    +			'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js',
     			'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js',
     			'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js',
     			'tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js',
    diff --git a/tests/qunit/data/testrunner.js b/tests/qunit/data/testrunner.js
    index 1091d093f2..79f37dca44 100644
    --- a/tests/qunit/data/testrunner.js
    +++ b/tests/qunit/data/testrunner.js
    @@ -1,5 +1,4 @@
     /*global CompletenessTest, sinon */
    -/*jshint evil: true */
     ( function ( $, mw, QUnit ) {
     	'use strict';
     
    diff --git a/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js
    new file mode 100644
    index 0000000000..f83f66cc34
    --- /dev/null
    +++ b/tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js
    @@ -0,0 +1,153 @@
    +( function ( mw, $ ) {
    +	QUnit.module( 'mediawiki.api.edit', QUnit.newMwEnvironment( {
    +		setup: function () {
    +			this.server = this.sandbox.useFakeServer();
    +			this.server.respondImmediately = true;
    +		}
    +	} ) );
    +
    +	QUnit.test( 'edit( title, transform String )', function ( assert ) {
    +		this.server.respond( function ( req ) {
    +			if ( /query.+titles=Sandbox/.test( req.url ) ) {
    +				req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
    +					curtimestamp: '2016-01-02T12:00:00Z',
    +					query: {
    +						pages: [ {
    +							pageid: 1,
    +							ns: 0,
    +							title:  'Sandbox',
    +							revisions: [ {
    +								timestamp: '2016-01-01T12:00:00Z',
    +								contentformat: 'text/x-wiki',
    +								contentmodel: 'wikitext',
    +								content: 'Sand.'
    +							} ]
    +						} ]
    +					}
    +				} ) );
    +			}
    +			if ( /edit.+basetimestamp=2016-01-01.+starttimestamp=2016-01-02.+text=Box%2E/.test( req.requestBody ) ) {
    +				req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
    +					edit: {
    +						result: 'Success',
    +						oldrevid: 11,
    +						newrevid: 13,
    +						newtimestamp: '2016-01-03T12:00:00Z'
    +					}
    +				} ) );
    +			}
    +		} );
    +
    +		return new mw.Api()
    +			.edit( 'Sandbox', function ( revision ) {
    +				return revision.content.replace( 'Sand', 'Box' );
    +			} )
    +			.then( function ( edit ) {
    +				assert.equal( edit.newrevid, 13 );
    +			} );
    +	} );
    +
    +	QUnit.test( 'edit( title, transform Promise )', function ( assert ) {
    +		this.server.respond( function ( req ) {
    +			if ( /query.+titles=Async/.test( req.url ) ) {
    +				req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
    +					curtimestamp: '2016-02-02T12:00:00Z',
    +					query: {
    +						pages: [ {
    +							pageid: 4,
    +							ns: 0,
    +							title:  'Async',
    +							revisions: [ {
    +								timestamp: '2016-02-01T12:00:00Z',
    +								contentformat: 'text/x-wiki',
    +								contentmodel: 'wikitext',
    +								content: 'Async.'
    +							} ]
    +						} ]
    +					}
    +				} ) );
    +			}
    +			if ( /edit.+basetimestamp=2016-02-01.+starttimestamp=2016-02-02.+text=Promise%2E/.test( req.requestBody ) ) {
    +				req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
    +					edit: {
    +						result: 'Success',
    +						oldrevid: 21,
    +						newrevid: 23,
    +						newtimestamp: '2016-02-03T12:00:00Z'
    +					}
    +				} ) );
    +			}
    +		} );
    +
    +		return new mw.Api()
    +			.edit( 'Async', function ( revision ) {
    +				return $.Deferred().resolve( revision.content.replace( 'Async', 'Promise' ) );
    +			} )
    +			.then( function ( edit ) {
    +				assert.equal( edit.newrevid, 23 );
    +			} );
    +	} );
    +
    +	QUnit.test( 'edit( title, transform Object )', function ( assert ) {
    +		this.server.respond( function ( req ) {
    +			if ( /query.+titles=Param/.test( req.url ) ) {
    +				req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
    +					curtimestamp: '2016-03-02T12:00:00Z',
    +					query: {
    +						pages: [ {
    +							pageid: 3,
    +							ns: 0,
    +							title:  'Param',
    +							revisions: [ {
    +								timestamp: '2016-03-01T12:00:00Z',
    +								contentformat: 'text/x-wiki',
    +								contentmodel: 'wikitext',
    +								content: '...'
    +							} ]
    +						} ]
    +					}
    +				} ) );
    +			}
    +			if ( /edit.+basetimestamp=2016-03-01.+starttimestamp=2016-03-02.+text=Content&summary=Sum/.test( req.requestBody ) ) {
    +				req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
    +					edit: {
    +						result: 'Success',
    +						oldrevid: 31,
    +						newrevid: 33,
    +						newtimestamp: '2016-03-03T12:00:00Z'
    +					}
    +				} ) );
    +			}
    +		} );
    +
    +		return new mw.Api()
    +			.edit( 'Param', function () {
    +				return { text: 'Content', summary: 'Sum' };
    +			} )
    +			.then( function ( edit ) {
    +				assert.equal( edit.newrevid, 33 );
    +			} );
    +	} );
    +
    +	QUnit.test( 'create( title, content )', function ( assert ) {
    +		this.server.respond( function ( req ) {
    +			if ( /edit.+text=Sand/.test( req.requestBody ) ) {
    +				req.respond( 200, { 'Content-Type': 'application/json' }, JSON.stringify( {
    +					edit: {
    +						'new': true,
    +						result: 'Success',
    +						newrevid: 41,
    +						newtimestamp: '2016-04-01T12:00:00Z'
    +					}
    +				} ) );
    +			}
    +		} );
    +
    +		return new mw.Api()
    +			.create( 'Sandbox', { summary: 'Load sand particles.' }, 'Sand.' )
    +			.then( function ( page ) {
    +				assert.equal( page.newrevid, 41 );
    +			} );
    +	} );
    +
    +}( mediaWiki, jQuery ) );
    diff --git a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
    index aa68bb2ee6..71330398a0 100644
    --- a/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
    +++ b/tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
    @@ -1,6 +1,6 @@
     ( function ( mw, $ ) {
     	var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers,
    -		expectedListUsersSitename, expectedEntrypoints,
    +		expectedListUsersSitename, expectedLinkPagenamee, expectedEntrypoints,
     		mwLanguageCache = {},
     		hasOwn = Object.hasOwnProperty;
     
    @@ -16,6 +16,8 @@
     			this.parserDefaults = mw.jqueryMsg.getParserDefaults();
     			mw.jqueryMsg.setParserDefaults( {
     				magic: {
    +					PAGENAME: '2 + 2',
    +					PAGENAMEE: mw.util.wikiUrlencode( '2 + 2' ),
     					SITENAME: 'Wiki'
     				}
     			} );
    @@ -25,6 +27,7 @@
     			expectedListUsers = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户</a>';
     			expectedListUsersSitename = '注册<a title="Special:ListUsers" href="/wiki/Special:ListUsers">用户' +
     				'Wiki</a>';
    +			expectedLinkPagenamee = '<a href="https://example.org/wiki/Foo?bar=baz#val/2_%2B_2">Test</a>';
     
     			expectedEntrypoints = '<a href="https://www.mediawiki.org/wiki/Manual:index.php">index.php</a>';
     
    @@ -77,6 +80,7 @@
     
     			'jquerymsg-test-statistics-users': '注册[[Special:ListUsers|用户]]',
     			'jquerymsg-test-statistics-users-sitename': '注册[[Special:ListUsers|用户{{SITENAME}}]]',
    +			'jquerymsg-test-link-pagenamee': '[https://example.org/wiki/Foo?bar=baz#val/{{PAGENAMEE}} Test]',
     
     			'jquerymsg-test-version-entrypoints-index-php': '[https://www.mediawiki.org/wiki/Manual:index.php index.php]',
     
    @@ -385,7 +389,7 @@
     		process( tasks );
     	} );
     
    -	QUnit.test( 'Links', 14, function ( assert ) {
    +	QUnit.test( 'Links', 15, function ( assert ) {
     		var testCases,
     			expectedDisambiguationsText,
     			expectedMultipleBars,
    @@ -468,6 +472,12 @@
     			'Piped wikilink with parser function in the text'
     		);
     
    +		assert.htmlEqual(
    +			formatParse( 'jquerymsg-test-link-pagenamee' ),
    +			expectedLinkPagenamee,
    +			'External link with parser function in the URL'
    +		);
    +
     		testCases = [
     			[
     				'extlink-html-full',