<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://theportalwiki.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BRNSystems</id>
	<title>Portal Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://theportalwiki.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BRNSystems"/>
	<link rel="alternate" type="text/html" href="https://theportalwiki.com/wiki/Special:Contributions/BRNSystems"/>
	<updated>2026-04-28T08:16:19Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://theportalwiki.com/w/index.php?title=User:BRNSystems/common.js&amp;diff=179238</id>
		<title>User:BRNSystems/common.js</title>
		<link rel="alternate" type="text/html" href="https://theportalwiki.com/w/index.php?title=User:BRNSystems/common.js&amp;diff=179238"/>
		<updated>2022-08-22T13:24:58Z</updated>

		<summary type="html">&lt;p&gt;BRNSystems: test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/** &amp;lt;nowiki&amp;gt;&lt;br /&gt;
 * Install this script by pasting the following in your personal JavaScript file:&lt;br /&gt;
&lt;br /&gt;
mw.loader.load(&#039;//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.js/load.js&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;);&lt;br /&gt;
&lt;br /&gt;
 * Or for users on en.wikipedia.org:&lt;br /&gt;
&lt;br /&gt;
{{subst:lusc|User:Joeytje50/JWB.js/load.js}}&lt;br /&gt;
&lt;br /&gt;
 * Note that this script will only run on the &#039;Project:AutoWikiBrowser/Script&#039; page.&lt;br /&gt;
 * This script is based on the downloadable AutoWikiBrowser.&lt;br /&gt;
 * &lt;br /&gt;
 * @licence&lt;br /&gt;
 * This program is free software; you can redistribute it and/or modify&lt;br /&gt;
 * it under the terms of the GNU General Public License as published by&lt;br /&gt;
 * the Free Software Foundation; either version 2 of the License, or&lt;br /&gt;
 * (at your option) any later version.&lt;br /&gt;
 *&lt;br /&gt;
 * This program is distributed in the hope that it will be useful,&lt;br /&gt;
 * but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the&lt;br /&gt;
 * GNU General Public License for more details.&lt;br /&gt;
 *&lt;br /&gt;
 * You should have received a copy of the GNU General Public License along&lt;br /&gt;
 * with this program; if not, write to the Free Software Foundation, Inc.,&lt;br /&gt;
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.&lt;br /&gt;
 * http://www.gnu.org/copyleft/gpl.html&lt;br /&gt;
 * @version 4.4.0&lt;br /&gt;
 * @author Joeytje50&lt;br /&gt;
 * &amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
window.JWBdeadman = false; // ADMINS: in case of fire, set this variable to true to disable this entire tool for all users&lt;br /&gt;
&lt;br /&gt;
//TODO: more advanced pagelist-generating options&lt;br /&gt;
//TODO: generate page list based on images on a page&lt;br /&gt;
//TODO: Add feature to perform general cleanup (&amp;lt;table&amp;gt; to {|, fullurl-links to wikilinks, removing underscores from wikilinks)&lt;br /&gt;
//TODO: Add report button to AJAX error alert box&lt;br /&gt;
//TODO: Re-add errored pages to the page list&lt;br /&gt;
//TODO: Automatically generate full list of protection levels&lt;br /&gt;
//TODO: Add &#039;Ignore quotes&#039; alongside &#039;Ignore unparsed content&#039;; for example: Ignore [] Unparsed content [] Quotes&lt;br /&gt;
//TODO: Read Wikipedia:AutoWikiBrowser/Config for when not to apply typo fixes&lt;br /&gt;
&lt;br /&gt;
//Cleanup / modernize:&lt;br /&gt;
// .indexOf(&#039;&#039;) != -1 -&amp;gt; .includes()&lt;br /&gt;
// mw for requests, instead of ajax&lt;br /&gt;
// Optional?.chaining?.properties&lt;br /&gt;
&lt;br /&gt;
/***** Global object/variables *****/&lt;br /&gt;
window.JWB = {}; //The main global object for the script.&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
	// Easier way to change import location for local debugging etc.&lt;br /&gt;
	JWB.imports = {&lt;br /&gt;
		&#039;JWB.css&#039;:	&#039;//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.css&amp;amp;action=raw&amp;amp;ctype=text/css&#039;,&lt;br /&gt;
		&#039;i18n.js&#039;:	&#039;//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.js/i18n.js&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
		&#039;i18n&#039;:		{},&lt;br /&gt;
		&#039;RETF.js&#039;:	&#039;//en.wikipedia.org/w/index.php?title=User:Joeytje50/RETF.js&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
		&#039;worker.js&#039;:&#039;//en.wikipedia.org/w/index.php?title=User:Joeytje50/JWB.js/worker.js&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039;,&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	let objs = [&#039;page&#039;, &#039;api&#039;, &#039;worker&#039;, &#039;fn&#039;, &#039;pl&#039;, &#039;messages&#039;, &#039;setup&#039;, &#039;settings&#039;, &#039;ns&#039;];&lt;br /&gt;
	for (let i=0;i&amp;lt;objs.length;i++) {&lt;br /&gt;
		JWB[objs[i]] = {};&lt;br /&gt;
	}&lt;br /&gt;
	JWB.summarySuffix = &#039; (via JWB)&#039;;&lt;br /&gt;
	if (document.location.hostname == &#039;en.wikipedia.org&#039;) JWB.summarySuffix = &#039; (via [[WP:JWB]])&#039;;&lt;br /&gt;
	JWB.lang = mw.config.get(&#039;wgUserLanguage&#039;).replace(&#039;-&#039;, &#039;_&#039;);&lt;br /&gt;
	JWB.contentLang = mw.config.get(&#039;wgContentLanguage&#039;).replace(&#039;-&#039;, &#039;_&#039;);&lt;br /&gt;
	JWB.index_php = mw.config.get(&#039;wgScript&#039;);&lt;br /&gt;
	JWB.isStopped = true;&lt;br /&gt;
	JWB.tooltip = window.tooltipAccessKeyPrefix || &#039;&#039;;&lt;br /&gt;
	let configext = &#039;js&#039;;&lt;br /&gt;
	if (document.location.hostname.split(&#039;.&#039;).slice(-2).join(&#039;.&#039;) == &#039;wikia.com&#039; || document.location.hostname.split(&#039;.&#039;).slice(-2).join(&#039;.&#039;) == &#039;fandom.com&#039;) {&lt;br /&gt;
		//LEGACY: fallback to settings on css for Wikia; uses JSON now.&lt;br /&gt;
		configext = &#039;css&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	JWB.settingspage = &#039;JWB-settings.&#039;+configext;&lt;br /&gt;
	if (window.hasOwnProperty(&#039;JWBSETTINGS&#039;)) {&lt;br /&gt;
		JWB.settingspage = JWBSETTINGS+&#039;-settings.&#039;+configext;&lt;br /&gt;
		delete window.JWBSETTINGS; //clean up the global variable&lt;br /&gt;
	}&lt;br /&gt;
	JWB.hasJSON = false; // whether or not the wiki supports JSON userpages (mw 1.31+).&lt;br /&gt;
	JWB.hasSMW = false; // whether or not the wiki has SMW installed.&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/***** User verification *****/&lt;br /&gt;
&lt;br /&gt;
(function() {&lt;br /&gt;
	if (mw.config.get(&#039;wgCanonicalNamespace&#039;)+&#039;:&#039;+mw.config.get(&#039;wgTitle&#039;) !== &#039;Project:AutoWikiBrowser/Script&#039; || JWB.allowed === false || mw.config.get(&#039;wgUserName&#039;) === null) {&lt;br /&gt;
		JWB.allowed = false;&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	mw.loader.load(JWB.imports[&#039;JWB.css&#039;], &#039;text/css&#039;);&lt;br /&gt;
	mw.loader.load(&#039;mediawiki.diff.styles&#039;);&lt;br /&gt;
	new mw.Api().loadMessagesIfMissing( [ &#039;pagecategorieslink&#039;, &#039;pagecategorieslink&#039; ] );&lt;br /&gt;
	&lt;br /&gt;
	$.getScript(JWB.imports[&#039;i18n.js&#039;], function() {&lt;br /&gt;
		if (JWB.allowed === false) {&lt;br /&gt;
			alert(JWB.msg(&#039;not-on-list&#039;));&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		let langs = [];&lt;br /&gt;
		if (JWB.lang !== &#039;en&#039; &amp;amp;&amp;amp; JWB.imports.i18n.hasOwnProperty(JWB.lang)) {&lt;br /&gt;
			langs.push(JWB.imports.i18n[JWB.lang]);&lt;br /&gt;
			JWB.messages[JWB.lang] = JWB.messages[JWB.lang] || null;&lt;br /&gt;
		} else if (JWB.lang !== &#039;en&#039; &amp;amp;&amp;amp; JWB.lang !== &#039;qqx&#039;) {&lt;br /&gt;
			// this only happens if the language file does not exist.&lt;br /&gt;
			JWB.lang = &#039;en&#039;;&lt;br /&gt;
		}&lt;br /&gt;
		if (JWB.contentLang !== &#039;en&#039; &amp;amp;&amp;amp; JWB.contentLang !== JWB.lang &amp;amp;&amp;amp; JWB.imports.i18n.hasOwnProperty(JWB.contentLang)) {&lt;br /&gt;
			langs.push(JWB.imports.i18n[JWB.contentLang]);&lt;br /&gt;
			JWB.messages[JWB.contentLang] = JWB.messages[JWB.contentLang] || null;&lt;br /&gt;
		}&lt;br /&gt;
		if (langs.length) {&lt;br /&gt;
			$.when.apply($, langs.map(url =&amp;gt; $.getScript(url))).done(function(r) {&lt;br /&gt;
				if (JWB.allowed === true &amp;amp;&amp;amp; JWB.messages.length == langs + 1) { // if there are two languages to load, wait for them both.&lt;br /&gt;
					console.log(&#039;langs loaded&#039;);&lt;br /&gt;
					JWB.init(); //init if verification has already returned true&lt;br /&gt;
				} else if (JWB.allowed === false) {&lt;br /&gt;
					alert(JWB.msg(&#039;not-on-list&#039;));&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
		} else if (JWB.allowed === true) { // no more languages to load.&lt;br /&gt;
			console.log(&#039;no langs loaded&#039;);&lt;br /&gt;
			JWB.init();&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	//RegEx Typo Fixing&lt;br /&gt;
	$.getScript(JWB.imports[&#039;RETF.js&#039;], function() {&lt;br /&gt;
			$(&#039;#refreshRETF&#039;).click(RETF.load);&lt;br /&gt;
	});&lt;br /&gt;
&lt;br /&gt;
	if (window.JWBdeadman === true) {&lt;br /&gt;
		window.JWB = false; // disable all access&lt;br /&gt;
		alert(&amp;quot;This tool has been temporarily been disabled by Wikipedia admins due to issues it would otherwise cause. Please check back soon to see if it is working again.&amp;quot;);&lt;br /&gt;
		return false;&lt;br /&gt;
	} else if (!window.Worker) {&lt;br /&gt;
		// https://caniuse.com/webworkers - this should not happen for any sensible human being. Either you&#039;re on IE&amp;lt;10, or you&#039;re just testing my patience.&lt;br /&gt;
		alert(&amp;quot;Web Workers are not supported in this browser. Please use a more modern browser to use JWB. Most matching and replacing features are not supported in this browser.&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	(new mw.Api()).get({&lt;br /&gt;
		action: &#039;query&#039;,&lt;br /&gt;
		titles: &#039;Project:AutoWikiBrowser/CheckPageJSON&#039;,&lt;br /&gt;
		prop: &#039;info|revisions&#039;,&lt;br /&gt;
		meta: &#039;userinfo|siteinfo&#039;,&lt;br /&gt;
		rvprop: &#039;content&#039;,&lt;br /&gt;
		rvlimit: 1,&lt;br /&gt;
		uiprop: &#039;groups&#039;,&lt;br /&gt;
		siprop: &#039;namespaces|usergroups|extensions&#039;,&lt;br /&gt;
		indexpageids: true,&lt;br /&gt;
		format: &#039;json&#039;,&lt;br /&gt;
	}).done(function(response) {&lt;br /&gt;
		if (response.error) {&lt;br /&gt;
			alert(&#039;API error: &#039; + response.error.info);&lt;br /&gt;
			JWB = false; //preventing further access. No verification =&amp;gt; no access.&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		JWB.ns = response.query.namespaces; //saving for later&lt;br /&gt;
		&lt;br /&gt;
		// This will execute before JWB.init() and therefore before JWB.setup.load() loading the user&#039;s settings.&lt;br /&gt;
		let wikigroups = response.query.usergroups;&lt;br /&gt;
		for (var u of wikigroups) {&lt;br /&gt;
			if (u.rights.indexOf(&#039;edituserjson&#039;) !== -1) {&lt;br /&gt;
				JWB.hasJSON = true;&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		// Check if we&#039;ve got SMW on this wiki&lt;br /&gt;
		let extensions = response.query.extensions;&lt;br /&gt;
		for (var e of extensions) {&lt;br /&gt;
			if (e.name == &amp;quot;SemanticMediaWiki&amp;quot;) {&lt;br /&gt;
				JWB.hasSMW = true;&lt;br /&gt;
				break;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
		JWB.username = response.query.userinfo.name; //preventing any &amp;quot;hacks&amp;quot; that change wgUserName or mw.config.wgUserName&lt;br /&gt;
		var groups = response.query.userinfo.groups;&lt;br /&gt;
		var page = response.query.pages[response.query.pageids[0]];&lt;br /&gt;
		var users = [];&lt;br /&gt;
		var bots = [];&lt;br /&gt;
		JWB.sysop = groups.indexOf(&#039;sysop&#039;) !== -1;&lt;br /&gt;
		if (response.query.pageids[0] !== &#039;-1&#039;) {&lt;br /&gt;
			var checkPageData = JSON.parse(page.revisions[0][&#039;*&#039;]);&lt;br /&gt;
			users = checkPageData.enabledusers;&lt;br /&gt;
			if (&amp;quot;enabledbots&amp;quot; in checkPageData) {&lt;br /&gt;
				bots = checkPageData.enabledbots;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			users = false; //fallback when page doesn&#039;t exist&lt;br /&gt;
			if (JWB.sysop) { // Check and inform admins if their checkpage is the unsupported format.&lt;br /&gt;
				(new mw.Api()).get({&lt;br /&gt;
					action: &#039;query&#039;,&lt;br /&gt;
					titles: &#039;Project:AutoWikiBrowser/CheckPage&#039;,&lt;br /&gt;
					prop: &#039;info&#039;,&lt;br /&gt;
					indexpageids: true,&lt;br /&gt;
				}).done(function(oldpage){&lt;br /&gt;
					var q = oldpage.query;&lt;br /&gt;
					if (q.pageids[0] != &#039;-1&#039; &amp;amp;&amp;amp; !q.pages[q.pageids[0]].hasOwnProperty(&#039;redirect&#039;)) {&lt;br /&gt;
						// CheckPageJSON does not exist, and CheckPage does exist, and is not a redirect.&lt;br /&gt;
						// This indicates the checkpage needs to be ported to JSON. Notify admins.&lt;br /&gt;
						prompt(&#039;Warning: The AWB checkpage found at Project:AutoWikiBrowser/CheckPage is no longer supported.\n&#039;+&lt;br /&gt;
								&#039;Please convert this checkpage to a JSON checkpage. See the URL below for more information.\n&#039;+&lt;br /&gt;
								&#039;After creating the JSON checkpage, you can use &amp;quot;Special:ChangeContentModel&amp;quot; to change the content model to JSON.&#039;,&lt;br /&gt;
								&#039;https://en.wikipedia.org/wiki/Wikipedia:AutoWikiBrowser/CheckPage_format&#039;);&lt;br /&gt;
					}&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		JWB.bot = groups.indexOf(&#039;bot&#039;) !== -1 &amp;amp;&amp;amp; (users === false || bots.includes(JWB.username));&lt;br /&gt;
		// Temporary global debugging variables&lt;br /&gt;
		JWB.debug = [groups.indexOf(&#039;bot&#039;), users === false, bots &amp;amp;&amp;amp; bots.indexOf(JWB.username)];&lt;br /&gt;
		if (JWB.username === &amp;quot;Joeytje50&amp;quot; &amp;amp;&amp;amp; response.query.userinfo.id === 13299994) {//TEMP: Dev full access to entire interface.&lt;br /&gt;
			JWB.bot = true;&lt;br /&gt;
			users.push(&amp;quot;Joeytje50&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		var allLoaded = true;&lt;br /&gt;
		for (var m in JWB.messages) if (JWB.messages[m] === null) allLoaded = false;&lt;br /&gt;
		if (JWB.sysop || response.query.pageids[0] === &#039;-1&#039; || users === false || users.includes(JWB.username) || bots.includes(JWB.username)) {&lt;br /&gt;
			JWB.allowed = true;&lt;br /&gt;
			if (allLoaded) JWB.init(); //init if messages have already loaded&lt;br /&gt;
		} else {&lt;br /&gt;
			if (allLoaded) {&lt;br /&gt;
				//run this after messages have loaded, so the message that shows is in the user&#039;s language&lt;br /&gt;
				alert(JWB.msg(&#039;not-on-list&#039;));&lt;br /&gt;
			}&lt;br /&gt;
			JWB = false; //prevent further access&lt;br /&gt;
		}&lt;br /&gt;
	}).fail(function(xhr, error) {&lt;br /&gt;
		alert(JWB.msg(&#039;verify-error&#039;) + &#039;\n&#039; + error);&lt;br /&gt;
		JWB = false; //preventing further access. No verification =&amp;gt; no access.&lt;br /&gt;
	});&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
/***** API functions *****/&lt;br /&gt;
&lt;br /&gt;
//Main template for API calls&lt;br /&gt;
JWB.api.call = function(data, callback, onerror) {&lt;br /&gt;
	data.format = &#039;json&#039;;&lt;br /&gt;
	if (data.action !== &#039;query&#039; &amp;amp;&amp;amp; data.action !== &#039;compare&#039; &amp;amp;&amp;amp; data.action !== &#039;ask&#039;) {&lt;br /&gt;
		data.bot = true; // mark edits as bot&lt;br /&gt;
	}&lt;br /&gt;
	$.ajax({&lt;br /&gt;
		data: data,&lt;br /&gt;
		dataType: &#039;json&#039;,&lt;br /&gt;
		url: mw.config.get(&#039;wgScriptPath&#039;) + &#039;/api.php&#039;,&lt;br /&gt;
		type: &#039;POST&#039;,&lt;br /&gt;
		success: function(response) {&lt;br /&gt;
			if (response.error) {&lt;br /&gt;
				if (onerror &amp;amp;&amp;amp; onerror(response, &#039;API&#039;) === false) return;&lt;br /&gt;
				alert(&#039;API error: &#039; + response.error.info);&lt;br /&gt;
				JWB.stop();&lt;br /&gt;
			} else {&lt;br /&gt;
				callback(response);&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		// onerror: if it exists and returns false, do not show error alert. Otherwise, do show alert.&lt;br /&gt;
		error: function(xhr, error) {&lt;br /&gt;
			if (onerror &amp;amp;&amp;amp; onerror(error, &#039;AJAX&#039;) === false) return;&lt;br /&gt;
			alert(&#039;AJAX error: &#039; + error);&lt;br /&gt;
			JWB.stop();&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Get page diff, and process it for more interactivity&lt;br /&gt;
JWB.api.diff = function(callback) {&lt;br /&gt;
	if (JWB.isStopped) return; // prevent new API calls when stopped&lt;br /&gt;
	JWB.status(&#039;diff&#039;);&lt;br /&gt;
	var editBoxInput = $(&#039;#editBoxArea&#039;).val();&lt;br /&gt;
	var redirect = $(&#039;input.redirects:checked&#039;).val();&lt;br /&gt;
	var data = {&lt;br /&gt;
		action: &#039;compare&#039;,&lt;br /&gt;
		indexpageids: true,&lt;br /&gt;
		fromtitle: JWB.page.name,&lt;br /&gt;
		//toslots: &#039;main&#039;, // TODO: Once this gets supported more widely, convert to the non-deprecated toslots system.&lt;br /&gt;
		//&#039;totext-main&#039;: editBoxInput,&lt;br /&gt;
		totext: editBoxInput,&lt;br /&gt;
		topst: true,&lt;br /&gt;
	};&lt;br /&gt;
	if (redirect==&#039;follow&#039;) data.redirects = true;&lt;br /&gt;
	JWB.api.call(data, function(response) {&lt;br /&gt;
		var diff;&lt;br /&gt;
		diff = response.compare[&#039;*&#039;];&lt;br /&gt;
		if (diff === &#039;&#039;) {&lt;br /&gt;
			diff = &#039;&amp;lt;h2&amp;gt;&#039;+JWB.msg(&#039;no-changes-made&#039;)+&#039;&amp;lt;/h2&amp;gt;&#039;;&lt;br /&gt;
		} else {&lt;br /&gt;
			diff = &#039;&amp;lt;table class=&amp;quot;diff&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;colgroup&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;col class=&amp;quot;diff-marker&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;col class=&amp;quot;diff-content&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;col class=&amp;quot;diff-marker&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;col class=&amp;quot;diff-content&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;/colgroup&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;tbody&amp;gt;&#039;+diff+&#039;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
		$(&#039;#resultWindow&#039;).html(diff);&lt;br /&gt;
		$(&#039;.diff-lineno&#039;).each(function() {&lt;br /&gt;
			var lineNumMatch = $(this).html().match(/\d+/);&lt;br /&gt;
			if (lineNumMatch) {&lt;br /&gt;
				$(this).parent().attr(&#039;data-line&#039;,parseInt(lineNumMatch[0])-1).addClass(&#039;lineheader&#039;);&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		$(&#039;table.diff tr&#039;).each(function() { //add data-line attribute to every line, relative to the previous one. Used for click event.&lt;br /&gt;
			if (!$(this).next().is(&#039;[data-line]&#039;) &amp;amp;&amp;amp; !$(this).next().has(&#039;td.diff-deletedline + td.diff-empty&#039;)) {&lt;br /&gt;
				$(this).next().attr(&#039;data-line&#039;,parseInt($(this).data(&#039;line&#039;))+1);&lt;br /&gt;
			} else if ($(this).next().has(&#039;td.diff-deletedline + td.diff-empty&#039;)) {&lt;br /&gt;
				$(this).next().attr(&#039;data-line&#039;,$(this).data(&#039;line&#039;)); //copy over current data-line for deleted lines to prevent them from messing up counting.&lt;br /&gt;
			}&lt;br /&gt;
		});&lt;br /&gt;
		JWB.status(&#039;done&#039;, true);&lt;br /&gt;
		if (typeof(callback) === &#039;function&#039;) {&lt;br /&gt;
			callback();&lt;br /&gt;
		}&lt;br /&gt;
	}, function(err, type) {&lt;br /&gt;
		if (type == &#039;API&#039; &amp;amp;&amp;amp; err.error.code == &#039;missingtitle&#039;) {&lt;br /&gt;
			// missingtitle is to be expected when editing a page that doesn&#039;t exist; just show a message and move on.&lt;br /&gt;
			$(&#039;#resultWindow&#039;).html(&#039;&amp;lt;span style=&amp;quot;font-weight:bold;color:red;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;page-not-exists&#039;)+&#039;&amp;lt;/span&amp;gt;&#039;);&lt;br /&gt;
			JWB.status(&#039;done&#039;, true);&lt;br /&gt;
			if (typeof(callback) === &#039;function&#039;) {&lt;br /&gt;
				callback();&lt;br /&gt;
			}&lt;br /&gt;
			return false; // stop propagation of error; do not show alerts.&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Retrieve page contents/info, process them, and store information in JWB.page object.&lt;br /&gt;
JWB.api.get = function(pagename) {&lt;br /&gt;
	if (JWB.isStopped) return; // prevent new API calls when stopped&lt;br /&gt;
	JWB.pageCount();&lt;br /&gt;
	if (!JWB.list[0] || JWB.isStopped) {&lt;br /&gt;
		return JWB.stop();&lt;br /&gt;
	}&lt;br /&gt;
	if (pagename === &#039;#PRE-PARSE-STOP&#039;) {&lt;br /&gt;
		var curval = $(&#039;#articleList&#039;).val();&lt;br /&gt;
		$(&#039;#articleList&#039;).val(curval.substr(curval.indexOf(&#039;\n&#039;) + 1));&lt;br /&gt;
		$(&#039;#preparse&#039;).prop(&#039;checked&#039;, false);&lt;br /&gt;
		JWB.stop();&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	let cgns = JWB.ns[14][&#039;*&#039;];&lt;br /&gt;
	let skipcg = $(&#039;#skipCategories&#039;).val();&lt;br /&gt;
	// prepend Category: before all categories and turn CSV(,) into CSV(|).&lt;br /&gt;
	skipcg = skipcg.replace(new RegExp(&#039;(^|,|\\|)(&#039;+cgns+&#039;:)?&#039;, &#039;gi&#039;), &#039;|&#039;+cgns+&#039;:&#039;).substr(1);&lt;br /&gt;
	var redirect = $(&#039;input.redirects:checked&#039;).val();&lt;br /&gt;
	var data = {&lt;br /&gt;
		action: &#039;query&#039;,&lt;br /&gt;
		prop: &#039;info|revisions|categories&#039;,&lt;br /&gt;
		inprop: &#039;watched|protection&#039;,&lt;br /&gt;
		type: &#039;csrf|watch&#039;,&lt;br /&gt;
		titles: pagename,&lt;br /&gt;
		rvprop: &#039;content|timestamp|ids&#039;,&lt;br /&gt;
		rvlimit: &#039;1&#039;,&lt;br /&gt;
		cllimit: &#039;max&#039;,&lt;br /&gt;
		clcategories: skipcg,&lt;br /&gt;
		indexpageids: true,&lt;br /&gt;
		meta: &#039;userinfo|tokens&#039;,&lt;br /&gt;
		uiprop: &#039;hasmsg&#039;&lt;br /&gt;
	};&lt;br /&gt;
	if (redirect==&#039;follow&#039;||redirect==&#039;skip&#039;) data.redirects = true;&lt;br /&gt;
	if (JWB.sysop) {&lt;br /&gt;
		data.list = &#039;deletedrevs&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	JWB.status(&#039;load-page&#039;);&lt;br /&gt;
	JWB.api.call(data, function(response) {&lt;br /&gt;
		if (response.query.userinfo.hasOwnProperty(&#039;messages&#039;)) {&lt;br /&gt;
			var view = mw.config.get(&#039;wgScriptPath&#039;) + &#039;?title=Special:MyTalk&#039;;&lt;br /&gt;
			var viewNew = view + &#039;&amp;amp;diff=cur&#039;;&lt;br /&gt;
			JWB.status(&lt;br /&gt;
				&#039;&amp;lt;span style=&amp;quot;color:red;font-weight:bold;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
					JWB.msg(&#039;status-newmsg&#039;, &lt;br /&gt;
						&#039;&amp;lt;a href=&amp;quot;&#039;+view+&#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;status-talklink&#039;)+&#039;&amp;lt;/a&amp;gt;&#039;,&lt;br /&gt;
						&#039;&amp;lt;a href=&amp;quot;&#039;+viewNew+&#039;&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;status-difflink&#039;)+&#039;&amp;lt;/a&amp;gt;&#039;)+&lt;br /&gt;
				&#039;&amp;lt;/span&amp;gt;&#039;, true);&lt;br /&gt;
			alert(JWB.msg(&#039;new-message&#039;));&lt;br /&gt;
			JWB.stop();&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		JWB.page = response.query.pages[response.query.pageids[0]];&lt;br /&gt;
		JWB.page.token = response.query.tokens.csrftoken;&lt;br /&gt;
		JWB.page.watchtoken = response.query.tokens.watchtoken;&lt;br /&gt;
		JWB.page.name = JWB.list[0].split(&#039;|&#039;)[0];&lt;br /&gt;
	 	var varOffset = JWB.list[0].indexOf(&#039;|&#039;) !== -1 ? JWB.list[0].indexOf(&#039;|&#039;) + 1 : 0;&lt;br /&gt;
	 	JWB.page.pagevar = JWB.list[0].substr(varOffset);&lt;br /&gt;
		JWB.page.content = JWB.page.revisions ? JWB.page.revisions[0][&#039;*&#039;] : &#039;&#039;;&lt;br /&gt;
		JWB.page.exists = !response.query.pages[&amp;quot;-1&amp;quot;];&lt;br /&gt;
		JWB.page.deletedrevs = response.query.deletedrevs;&lt;br /&gt;
		JWB.page.watched = JWB.page.hasOwnProperty(&#039;watched&#039;);&lt;br /&gt;
		JWB.page.protections = JWB.page.restrictiontypes;&lt;br /&gt;
&lt;br /&gt;
		if (response.query.redirects) {&lt;br /&gt;
			JWB.page.name = response.query.redirects[0].to;&lt;br /&gt;
		}&lt;br /&gt;
		// check for skips that can be determined before replacing&lt;br /&gt;
		if (!JWB.fn.allowBots(JWB.page.content, JWB.username) || !JWB.fn.allowBots(JWB.page.content)) {&lt;br /&gt;
			// skip if {{bots}} template forbids editing on this page by user OR by JWB in general&lt;br /&gt;
			JWB.log(&#039;nobots&#039;, JWB.page.name);&lt;br /&gt;
			return JWB.next();&lt;br /&gt;
		} else if (JWB.page.categories !== undefined || // skip because of a matching category as passed via clcategories.&lt;br /&gt;
				($(&#039;#exists-no&#039;).prop(&#039;checked&#039;) &amp;amp;&amp;amp; !JWB.page.exists) ||&lt;br /&gt;
				($(&#039;#exists-yes&#039;).prop(&#039;checked&#039;) &amp;amp;&amp;amp; JWB.page.exists) ||&lt;br /&gt;
				(redirect===&#039;skip&#039; &amp;amp;&amp;amp; response.query.redirects) // variable  redirect  is defined outside this callback function.&lt;br /&gt;
		) {&lt;br /&gt;
			// simple skip rules&lt;br /&gt;
			JWB.log(&#039;skip&#039;, JWB.page.name);&lt;br /&gt;
			return JWB.next();&lt;br /&gt;
		}&lt;br /&gt;
		// Check skip contains rules.&lt;br /&gt;
		var containRegex = $(&#039;#containRegex&#039;).prop(&#039;checked&#039;),&lt;br /&gt;
			containFlags = $(&#039;#containFlags&#039;).val();&lt;br /&gt;
		var skipContains, skipNotContains;&lt;br /&gt;
		if (containRegex) {&lt;br /&gt;
			JWB.status(&#039;check-skips&#039;);&lt;br /&gt;
			var skipping = false; // for tracking if match is found in synchronous calls.&lt;br /&gt;
			if ($(&#039;#skipContains&#039;).val().length) {&lt;br /&gt;
				JWB.worker.match(JWB.page.content, $(&#039;#skipContains&#039;).val(), containFlags, function(result, err) {&lt;br /&gt;
					console.log(&#039;Contains&#039;, result, err);&lt;br /&gt;
					if (result !== null &amp;amp;&amp;amp; err === undefined) {&lt;br /&gt;
						JWB.log(&#039;skip&#039;, JWB.page.name);&lt;br /&gt;
						JWB.next(); // next() also cancels the skipNotContains.&lt;br /&gt;
						skipping = true;&lt;br /&gt;
						return;&lt;br /&gt;
					} // else continue with the queued worker job that checks skipNotContains&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
			if (skipping) {&lt;br /&gt;
				console.log(&#039;skipped page before replaces&#039;);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			if ($(&#039;#skipNotContains&#039;).val().length) {&lt;br /&gt;
				JWB.worker.match(JWB.page.content, $(&#039;#skipNotContains&#039;).val(), containFlags, function(result, err) {&lt;br /&gt;
					console.log(&#039;Not contains&#039;, result, err);&lt;br /&gt;
					if (result === null &amp;amp;&amp;amp; err === undefined) {&lt;br /&gt;
						JWB.log(&#039;skip&#039;, JWB.page.name);&lt;br /&gt;
						JWB.next(); // also cancels the replace&lt;br /&gt;
						skipping = true;&lt;br /&gt;
						return;&lt;br /&gt;
					} // else move on to replacing&lt;br /&gt;
				});&lt;br /&gt;
			}&lt;br /&gt;
			if (skipping) {&lt;br /&gt;
				console.log(&#039;skipped page before replaces&#039;);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			skipContains = $(&#039;#skipContains&#039;).val();&lt;br /&gt;
			skipNotContains = $(&#039;#skipNotContains&#039;).val();&lt;br /&gt;
			if ((skipContains &amp;amp;&amp;amp; JWB.page.content.includes(skipContains)) ||&lt;br /&gt;
				(skipNotContains &amp;amp;&amp;amp; !JWB.page.content.includes(skipNotContains))) {&lt;br /&gt;
				console.log(&#039;skipped page before replaces&#039;);&lt;br /&gt;
				return JWB.next();&lt;br /&gt;
			}&lt;br /&gt;
			JWB.status(&#039;done&#039;, true);&lt;br /&gt;
		}&lt;br /&gt;
		JWB.replace(JWB.page.content, function(newContent) {&lt;br /&gt;
			if (JWB.isStopped === true) return;&lt;br /&gt;
			if ($(&#039;#skipNoChange&#039;).prop(&#039;checked&#039;) &amp;amp;&amp;amp; JWB.page.content === newContent) { //skip if no changes are made&lt;br /&gt;
				JWB.log(&#039;skip&#039;, JWB.page.name);&lt;br /&gt;
				return JWB.next();&lt;br /&gt;
			} else {&lt;br /&gt;
				JWB.editPage(newContent);&lt;br /&gt;
			}&lt;br /&gt;
			JWB.updateButtons();&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Some functions with self-explanatory names:&lt;br /&gt;
JWB.api.submit = function(page) {&lt;br /&gt;
	if (JWB.isStopped) return; // prevent new API calls when stopped&lt;br /&gt;
	JWB.status(&#039;submit&#039;);&lt;br /&gt;
	var summary = $(&#039;#summary&#039;).val();&lt;br /&gt;
	if ($(&#039;#summary&#039;).parent(&#039;label&#039;).hasClass(&#039;viaJWB&#039;)) summary += JWB.summarySuffix;&lt;br /&gt;
	if ((typeof page === &#039;string&#039; &amp;amp;&amp;amp; page !== JWB.page.name) || $(&#039;#currentpage a&#039;).html().replace(/&amp;amp;amp;/g, &#039;&amp;amp;&#039;) !== JWB.page.name) {&lt;br /&gt;
		console.log(page, JWB.page.name, $(&#039;#currentpage a&#039;).html());&lt;br /&gt;
		JWB.stop();&lt;br /&gt;
		alert(JWB.msg(&#039;autosave-error&#039;, JWB.msg(&#039;tab-log&#039;)));&lt;br /&gt;
		$(&#039;#currentpage&#039;).html(JWB.msg(&#039;editbox-currentpage&#039;, &#039; &#039;, &#039; &#039;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	var newval = $(&#039;#editBoxArea&#039;).val();&lt;br /&gt;
	var diffsize = newval.length - JWB.page.content.length;&lt;br /&gt;
	if ($(&#039;#sizelimit&#039;).val() != 0 &amp;amp;&amp;amp; Math.abs(diffsize) &amp;gt; parseInt($(&#039;#sizelimit&#039;).val())){&lt;br /&gt;
		alert(JWB.msg(&#039;size-limit-exceeded&#039;, diffsize &amp;gt; 0 ? &#039;+&#039;+diffsize : diffsize));&lt;br /&gt;
		JWB.status(&#039;done&#039;, true);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	var data = {&lt;br /&gt;
		title: JWB.page.name,&lt;br /&gt;
		summary: summary,&lt;br /&gt;
		action: &#039;edit&#039;,&lt;br /&gt;
		//tags: &#039;JWB&#039;,&lt;br /&gt;
		basetimestamp: JWB.page.revisions ? JWB.page.revisions[0].timestamp : &#039;&#039;,&lt;br /&gt;
		token: JWB.page.token,&lt;br /&gt;
		text: newval,&lt;br /&gt;
		watchlist: $(&#039;#watchPage&#039;).val()&lt;br /&gt;
	};&lt;br /&gt;
	if ($(&#039;#minorEdit&#039;).prop(&#039;checked&#039;)) data.minor = true;&lt;br /&gt;
	JWB.api.call(data, function(response) {&lt;br /&gt;
		JWB.log(&#039;edit&#039;, response.edit.title, response.edit.newrevid);&lt;br /&gt;
	}, function(error, errtype) {&lt;br /&gt;
		var cont = false;&lt;br /&gt;
		if (errtype == &#039;API&#039;) {&lt;br /&gt;
			cont = confirm(&amp;quot;API error: &amp;quot; + error.error.info + &amp;quot;\n&amp;quot; + JWB.msg(&#039;confirm-continue&#039;));&lt;br /&gt;
		} else {&lt;br /&gt;
			cont = confirm(&amp;quot;AJAX error: &amp;quot; + error + &amp;quot;\n&amp;quot; + JWB.msg(&#039;confirm-continue&#039;));&lt;br /&gt;
		}&lt;br /&gt;
		if (!cont) {&lt;br /&gt;
			JWB.stop();&lt;br /&gt;
		}&lt;br /&gt;
		return false; // do not fall back on default error handling&lt;br /&gt;
	});&lt;br /&gt;
	// While the edit is submitting, continue to the next page to edit.&lt;br /&gt;
	JWB.status(&#039;done&#039;, true);&lt;br /&gt;
	JWB.next();&lt;br /&gt;
};&lt;br /&gt;
JWB.api.preview = function() {&lt;br /&gt;
	if (JWB.isStopped) return; // prevent new API calls when stopped&lt;br /&gt;
	JWB.status(&#039;preview&#039;);&lt;br /&gt;
	JWB.api.call({&lt;br /&gt;
		title: JWB.page.name,&lt;br /&gt;
		action: &#039;parse&#039;,&lt;br /&gt;
		pst: true,&lt;br /&gt;
		text: $(&#039;#editBoxArea&#039;).val()&lt;br /&gt;
	}, function(response) {&lt;br /&gt;
		$(&#039;#resultWindow&#039;).html(response.parse.text[&#039;*&#039;]);&lt;br /&gt;
		$(&#039;#resultWindow div.previewnote&#039;).remove();&lt;br /&gt;
		var cglist = response.parse.categories;&lt;br /&gt;
		if (cglist.length &amp;gt; 0) {&lt;br /&gt;
			var cgtext = mw.message(&#039;pagecategories&#039;, cglist.length).text(),&lt;br /&gt;
				cglink = mw.message(&#039;pagecategorieslink&#039;).text();&lt;br /&gt;
			// set defaults if MediaWiki:Pagecategories(link) have not loaded correctly:&lt;br /&gt;
			if (cgtext[0] == &#039;\u29FC&#039;) cgtext = &#039;Categories&#039;;&lt;br /&gt;
			if (cglink[0] == &#039;\u29FC&#039;) cglink = &#039;Special:Categories&#039;;&lt;br /&gt;
			var $footer = $(&#039;&amp;lt;footer/&amp;gt;&#039;).addClass(&#039;catlinks&#039;)&lt;br /&gt;
										.append(&#039;&amp;lt;a href=&amp;quot;/wiki/&#039;+encodeURIComponent(cglink)+&#039;&amp;quot; title=&amp;quot;&#039;+cglink+&#039;&amp;quot;&amp;gt;&#039;+cgtext+&#039;&amp;lt;/a&amp;gt;: &amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;&#039;);&lt;br /&gt;
			var $ul = $footer.children(&#039;ul&#039;);&lt;br /&gt;
			for (var i=0;i&amp;lt;cglist.length;i++) {&lt;br /&gt;
				var redlink = cglist[i].missing === undefined ? &#039;&#039; : &#039; class=&amp;quot;new&amp;quot;&#039;;&lt;br /&gt;
				var cg = cglist[i][&#039;*&#039;];&lt;br /&gt;
				$ul.append(&#039;&amp;lt;li&amp;gt;&amp;lt;a href=&amp;quot;/wiki/&#039; + encodeURIComponent(cg) + &#039;&amp;quot; title=&amp;quot;&#039; + cg + &#039;&amp;quot;&#039; + redlink + &#039;&amp;gt;&#039; + cg + &#039;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&#039;);&lt;br /&gt;
			}&lt;br /&gt;
			$footer.appendTo(&#039;#resultWindow&#039;);&lt;br /&gt;
		}&lt;br /&gt;
		JWB.status(&#039;done&#039;, true);&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
JWB.api.move = function() {&lt;br /&gt;
	if (JWB.isStopped) return; // prevent new API calls when stopped&lt;br /&gt;
	JWB.status(&#039;move&#039;);&lt;br /&gt;
	var topage = $(&#039;#moveTo&#039;).val().replace(/\$x/gi, JWB.page.pagevar);&lt;br /&gt;
	var summary = $(&#039;#summary&#039;).val();&lt;br /&gt;
	if ($(&#039;#summary&#039;).parent(&#039;label&#039;).hasClass(&#039;viaJWB&#039;)) summary += JWB.summarySuffix;&lt;br /&gt;
	var data = {&lt;br /&gt;
		action: &#039;move&#039;,&lt;br /&gt;
		from: JWB.page.name,&lt;br /&gt;
		to: topage,&lt;br /&gt;
		token: JWB.page.token,&lt;br /&gt;
		reason: summary,&lt;br /&gt;
		ignorewarnings: &#039;yes&#039;&lt;br /&gt;
	};&lt;br /&gt;
	if ($(&#039;#moveTalk&#039;).prop(&#039;checked&#039;)) data.movetalk = true;&lt;br /&gt;
	if ($(&#039;#moveSubpage&#039;).prop(&#039;checked&#039;)) data.movesubpages = true;&lt;br /&gt;
	if ($(&#039;#suppressRedir&#039;).prop(&#039;checked&#039;)) data.noredirect = true;&lt;br /&gt;
	JWB.api.call(data, function(response) {&lt;br /&gt;
		JWB.log(&#039;move&#039;, response.move.from, response.move.to);&lt;br /&gt;
		JWB.status(&#039;done&#039;, true);&lt;br /&gt;
		if (!$(&#039;#moveTo&#039;).val().match(/\$x/i)) $(&#039;#moveTo&#039;).val(&#039;&#039;)[0].focus(); //clear entered move-to pagename if it&#039;s not based on the pagevar&lt;br /&gt;
		JWB.next(topage);&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
JWB.api.del = function() {&lt;br /&gt;
	if (JWB.isStopped) return; // prevent new API calls when stopped&lt;br /&gt;
	JWB.status(($(&#039;#deletePage&#039;).is(&#039;.undelete&#039;) ? &#039;un&#039; : &#039;&#039;) + &#039;delete&#039;);&lt;br /&gt;
	var summary = $(&#039;#summary&#039;).val();&lt;br /&gt;
	if ($(&#039;#summary&#039;).parent(&#039;label&#039;).hasClass(&#039;viaJWB&#039;)) summary += JWB.summarySuffix;&lt;br /&gt;
	JWB.api.call({&lt;br /&gt;
		action: (!JWB.page.exists ? &#039;un&#039; : &#039;&#039;) + &#039;delete&#039;,&lt;br /&gt;
		title: JWB.page.name,&lt;br /&gt;
		token: JWB.page.token,&lt;br /&gt;
		reason: summary&lt;br /&gt;
	}, function(response) {&lt;br /&gt;
		JWB.log((!JWB.page.exists ? &#039;un&#039; : &#039;&#039;) + &#039;delete&#039;, (response[&#039;delete&#039;]||response.undelete).title);&lt;br /&gt;
		JWB.status(&#039;done&#039;, true);&lt;br /&gt;
		JWB.next(response.undelete &amp;amp;&amp;amp; response.undelete.title);&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
JWB.api.protect = function() {&lt;br /&gt;
	if (JWB.isStopped) return; // prevent new API calls when stopped&lt;br /&gt;
	JWB.status(&#039;protect&#039;);&lt;br /&gt;
	var summary = $(&#039;#summary&#039;).val();&lt;br /&gt;
	if ($(&#039;#summary&#039;).parent(&#039;label&#039;).hasClass(&#039;viaJWB&#039;)) summary += JWB.summarySuffix;&lt;br /&gt;
	var editprot = $(&#039;#editProt&#039;).val();&lt;br /&gt;
	var moveprot = $(&#039;#moveProt&#039;).val() || editprot;&lt;br /&gt;
	var uploadprot = $(&#039;#uploadProt&#039;).val() || editprot;&lt;br /&gt;
	var protstring = &#039;edit=&#039;+editprot+&#039;|move=&#039;+moveprot;&lt;br /&gt;
	if (!JWB.page.exists)&lt;br /&gt;
		protstring = &#039;create=&#039;+editprot;&lt;br /&gt;
	if (JWB.page.protections.includes(&#039;upload&#039;))&lt;br /&gt;
		protstring += &#039;|upload=&#039;+uploadprot;&lt;br /&gt;
	JWB.api.call({&lt;br /&gt;
		action: &#039;protect&#039;,&lt;br /&gt;
		title: JWB.page.name,&lt;br /&gt;
		token: JWB.page.token,&lt;br /&gt;
		reason: summary,&lt;br /&gt;
		expiry: $(&#039;#protectExpiry&#039;).val()!==&#039;&#039;?$(&#039;#protectExpiry&#039;).val():&#039;infinite&#039;,&lt;br /&gt;
		protections: protstring,&lt;br /&gt;
	}, function(response) {&lt;br /&gt;
		var protactions = &#039;&#039;;&lt;br /&gt;
		var prots = response.protect.protections;&lt;br /&gt;
		for (var i=0;i&amp;lt;prots.length;i++) {&lt;br /&gt;
			if (typeof prots[i].edit == &#039;string&#039;) {&lt;br /&gt;
				protactions += &#039; edit: &#039;+(prots[i].edit || &#039;all&#039;);&lt;br /&gt;
			} else if (typeof prots[i].move == &#039;string&#039;) {&lt;br /&gt;
				protactions += &#039; move: &#039;+(prots[i].move || &#039;all&#039;);&lt;br /&gt;
			} else if (typeof prots[i].create == &#039;string&#039;) {&lt;br /&gt;
				protactions += &#039; create: &#039;+(prots[i].create || &#039;all&#039;);&lt;br /&gt;
			} else if (typeof prots[i].upload == &#039;string&#039;) {&lt;br /&gt;
				protactions += &#039; upload: &#039;+(prots[i].upload || &#039;all&#039;);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		protactions += &#039; expires: &#039;+prots[0].expiry;&lt;br /&gt;
		JWB.log(&#039;protect&#039;, response.protect.title, protactions);&lt;br /&gt;
		JWB.status(&#039;done&#039;, false);&lt;br /&gt;
		JWB.next(response.protect.title);&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.api.watch = function() {&lt;br /&gt;
	JWB.status(&#039;watch&#039;);&lt;br /&gt;
	var data = {&lt;br /&gt;
		action: &#039;watch&#039;,&lt;br /&gt;
		title: JWB.page.name,&lt;br /&gt;
		token: JWB.page.watchtoken&lt;br /&gt;
	};&lt;br /&gt;
	if (JWB.page.watched) data.unwatch = true;&lt;br /&gt;
	JWB.api.call(data, function(response) {&lt;br /&gt;
		JWB.status(&#039;&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			JWB.msg(&#039;status-watch-&#039;+(JWB.page.watched ? &#039;removed&#039; : &#039;added&#039;), &amp;quot;&#039;&amp;quot;+JWB.page.name+&amp;quot;&#039;&amp;quot;)+&lt;br /&gt;
		&#039;&amp;lt;/span&amp;gt;&#039;, true);&lt;br /&gt;
		JWB.page.watched = !JWB.page.watched;&lt;br /&gt;
		$(&#039;#watchNow&#039;).html( JWB.msg(&#039;watch-&#039; + (JWB.page.watched ? &#039;remove&#039; : &#039;add&#039;)) );&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/***** Pagelist functions *****/&lt;br /&gt;
&lt;br /&gt;
JWB.pl.iterations = 0;&lt;br /&gt;
JWB.pl.done = true;&lt;br /&gt;
&lt;br /&gt;
JWB.pl.stop = function() {&lt;br /&gt;
	if (JWB.pl.done) {&lt;br /&gt;
		JWB.pl.iterations = 0;&lt;br /&gt;
		$(&#039;#pagelistPopup [disabled]:not(fieldset [disabled]), #pagelistPopup legend input, #pagelistPopup button&#039;).prop(&#039;disabled&#039;, false);&lt;br /&gt;
		$(&#039;#pagelistPopup legend input&#039;).trigger(&#039;change&#039;);&lt;br /&gt;
		$(&#039;#pagelistPopup button img&#039;).remove();&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.pl.getNSpaces = function() {&lt;br /&gt;
	var list = $(&#039;#pagelistPopup [name=&amp;quot;namespace&amp;quot;]&#039;)[0];&lt;br /&gt;
	return $(&#039;#pagelistPopup [name=&amp;quot;namespace&amp;quot;]&#039;).val().join(&#039;|&#039;); //.val() returns an array of selected options.&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.pl.getList = function(abbrs, lists, data) {&lt;br /&gt;
	$(&#039;#pagelistPopup button, #pagelistPopup input, #pagelistPopup select, #pagelistPopup button&#039;).prop(&#039;disabled&#039;, true);&lt;br /&gt;
	JWB.pl.iterations++;&lt;br /&gt;
	if (data.ask !== undefined) {&lt;br /&gt;
		JWB.pl.SMW(data.ask); // execute SMW call in parallel&lt;br /&gt;
		JWB.pl.done = false;&lt;br /&gt;
		data.ask = undefined;&lt;br /&gt;
	}&lt;br /&gt;
	if (!abbrs.length) {&lt;br /&gt;
		JWB.pl.done = true;&lt;br /&gt;
		return; // don&#039;t execute the rest; only a SMW query was entered.&lt;br /&gt;
	}&lt;br /&gt;
	data.action = &#039;query&#039;;&lt;br /&gt;
	var nspaces = JWB.pl.getNSpaces();&lt;br /&gt;
	for (let i=0;i&amp;lt;abbrs.length;i++) {&lt;br /&gt;
		if (nspaces) data[abbrs[i]+&#039;namespace&#039;] = data[abbrs[i]+&#039;namespace&#039;] || nspaces; // if namespaces are already set, use that instead (for apnamespace)&lt;br /&gt;
		data[abbrs[i]+&#039;limit&#039;] = &#039;max&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	let linksList = lists.indexOf(&#039;links&#039;);&lt;br /&gt;
	if (linksList !== -1) {&lt;br /&gt;
		data.prop = &#039;links&#039;;&lt;br /&gt;
		lists.splice(linksList, 1);&lt;br /&gt;
	}&lt;br /&gt;
	data.list = lists.join(&#039;|&#039;);&lt;br /&gt;
	console.log(&#039;generating:&#039;, data);&lt;br /&gt;
	JWB.api.call(data, function(response) {&lt;br /&gt;
		var maxiterate = 100; //allow up to 100 consecutive requests at a time to avoid overloading the server.&lt;br /&gt;
		if (!response.query) response.query = {};&lt;br /&gt;
		if (response.watchlistraw) response.query.watchlistraw = response.watchlistraw; //adding some consistency&lt;br /&gt;
		var plist = [];&lt;br /&gt;
		if (response.query.pages) {&lt;br /&gt;
			var links;&lt;br /&gt;
			for (var id in response.query.pages) {&lt;br /&gt;
				links = response.query.pages[id].links;&lt;br /&gt;
				for (let i=0;i&amp;lt;links.length;i++) {&lt;br /&gt;
					plist.push(links[i].title);&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		for (var l in response.query) {&lt;br /&gt;
			if (l === &#039;pages&#039;) continue;&lt;br /&gt;
			for (let i=0;i&amp;lt;response.query[l].length;i++) {&lt;br /&gt;
				plist.push(response.query[l][i].title);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		//add the result to the pagelist immediately, as opposed to saving it all up and adding in 1 go like AWB does&lt;br /&gt;
		$(&#039;#articleList&#039;).val($.trim($(&#039;#articleList&#039;).val()) + &#039;\n&#039; + plist.join(&#039;\n&#039;));&lt;br /&gt;
		JWB.pageCount();&lt;br /&gt;
		var cont = response.continue;&lt;br /&gt;
		console.log(&amp;quot;Continue&amp;quot;,JWB.pl.iterations, cont);&lt;br /&gt;
		if (cont &amp;amp;&amp;amp; JWB.pl.iterations &amp;lt;= maxiterate) {&lt;br /&gt;
			var lists = [];&lt;br /&gt;
			if (response.query) { //compatibility with the code I wrote for the old query-continue. TODO: make this unnecessary?&lt;br /&gt;
				for (var list in response.query) {&lt;br /&gt;
					lists.push(list); //add to the new array of &amp;amp;list= values&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			var abbrs = [];&lt;br /&gt;
			for (var abbr in cont) {&lt;br /&gt;
				data[abbr] = cont[abbr]; //add the &amp;amp;xxcontinue= value to the data&lt;br /&gt;
				if (abbr != &#039;continue&#039;) {&lt;br /&gt;
					abbrs.push(abbr.replace(&#039;continue&#039;,&#039;&#039;)); //find out what xx is and add it to the list of abbrs&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
			JWB.pl.getList(abbrs, lists, data); //recursive function to get every page of a list&lt;br /&gt;
		} else {&lt;br /&gt;
			if (JWB.pl.iterations &amp;gt; maxiterate) {&lt;br /&gt;
				JWB.status(&#039;pl-over-lim&#039;, true);&lt;br /&gt;
			} else {&lt;br /&gt;
				JWB.status(&#039;done&#039;, true);&lt;br /&gt;
			}&lt;br /&gt;
			JWB.pl.stop(); // if JWB.pl.done == true show stopped interface. Otherwise mark as done.&lt;br /&gt;
			JWB.pl.done = true;&lt;br /&gt;
		}&lt;br /&gt;
	}, function() { //on error, simply reset and let the user work with what he has&lt;br /&gt;
		JWB.status(&#039;done&#039;, true);&lt;br /&gt;
		JWB.pl.stop();&lt;br /&gt;
		JWB.pl.done = true;&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.pl.SMW = function(query) {&lt;br /&gt;
	var data = {&lt;br /&gt;
		action: &#039;ask&#039;,&lt;br /&gt;
		query: query&lt;br /&gt;
	};&lt;br /&gt;
	JWB.api.call(data, function(response) {&lt;br /&gt;
		console.log(response);&lt;br /&gt;
		let list = response.query.results;&lt;br /&gt;
		let pagevar = response.query.printrequests[1];&lt;br /&gt;
		let pagevar_type = pagevar &amp;amp;&amp;amp; pagevar.typeid;&lt;br /&gt;
		if (pagevar) {&lt;br /&gt;
			// either pagevar === undefined, or it&#039;s the first printrequest.&lt;br /&gt;
			pagevar = pagevar.label;&lt;br /&gt;
		}&lt;br /&gt;
		let plist = [];&lt;br /&gt;
		for (let l in list) {&lt;br /&gt;
			let page = list[l];&lt;br /&gt;
			let name = page.fulltext;&lt;br /&gt;
			let suff;&lt;br /&gt;
			if (pagevar) try {&lt;br /&gt;
				let val = page.printouts[pagevar][0];&lt;br /&gt;
				if (!val) continue; // this page does not contain this property.&lt;br /&gt;
				switch (pagevar_type) {&lt;br /&gt;
					case &#039;_boo&#039;:&lt;br /&gt;
						suff = val == &#039;t&#039;; // true if &#039;t&#039; else false;&lt;br /&gt;
						break;&lt;br /&gt;
					case &#039;_wpg&#039;:&lt;br /&gt;
						suff = val.fulltext;&lt;br /&gt;
						break;&lt;br /&gt;
					case &#039;_dat&#039;:&lt;br /&gt;
						// val.raw is also available but the unconventional format makes it a lot less convenient.&lt;br /&gt;
						suff = val.timestamp;&lt;br /&gt;
						break;&lt;br /&gt;
					case &#039;_qty&#039;:&lt;br /&gt;
						suff = val.value + &#039; &#039; + val.unit;&lt;br /&gt;
						break;&lt;br /&gt;
					case &#039;_mlt_rec&#039;:&lt;br /&gt;
						// I doubt this is used anywhere, but it&#039;s not too hard to support.&lt;br /&gt;
						suff = val.Text.item[0];&lt;br /&gt;
						break;&lt;br /&gt;
					case &#039;_ref_rec&#039;:&lt;br /&gt;
						// not supported; references contain too many properties.&lt;br /&gt;
						break;&lt;br /&gt;
					default:&lt;br /&gt;
						suff = val;&lt;br /&gt;
				}&lt;br /&gt;
			} catch(e) {&lt;br /&gt;
				console.error(e); // show error but ignore. Something is wrong in SMW query/api.&lt;br /&gt;
			}&lt;br /&gt;
			if (suff) {&lt;br /&gt;
				plist.push(name + &#039;|&#039; + suff);&lt;br /&gt;
			} else {&lt;br /&gt;
				plist.push(name);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		$(&#039;#articleList&#039;).val($.trim($(&#039;#articleList&#039;).val()) + &#039;\n&#039; + plist.join(&#039;\n&#039;));&lt;br /&gt;
		JWB.pageCount();&lt;br /&gt;
		JWB.pl.stop(); // if JWB.pl.done == true show stopped interface. Otherwise mark as done.&lt;br /&gt;
		JWB.pl.done = true;&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//JWB.pl.getList([&#039;wr&#039;], [&#039;watchlistraw&#039;], {}) for watchlists&lt;br /&gt;
JWB.pl.generate = function() {&lt;br /&gt;
	var $fields = $(&#039;#pagelistPopup fieldset&#039;).not(&#039;[disabled]&#039;);&lt;br /&gt;
	$(&#039;#pagelistPopup&#039;).find(&#039;button[type=&amp;quot;submit&amp;quot;]&#039;).append(&#039;&amp;lt;img src=&amp;quot;//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif&amp;quot; width=&amp;quot;15&amp;quot; height=&amp;quot;15&amp;quot; alt=&amp;quot;&#039;+JWB.msg(&#039;status-alt&#039;)+&#039;&amp;quot;/&amp;gt;&#039;);&lt;br /&gt;
	var abbrs = [],&lt;br /&gt;
		lists = [],&lt;br /&gt;
		data = {&#039;continue&#039;: &#039;&#039;};&lt;br /&gt;
	$fields.each(function() {&lt;br /&gt;
		var list = $(this).find(&#039;legend input&#039;).attr(&#039;name&#039;);&lt;br /&gt;
		var abbr;&lt;br /&gt;
		if (list === &#039;linksto&#039;) { //Special case since this fieldset features 3 merged lists in 1 fieldset&lt;br /&gt;
			if (!$(&#039;[name=&amp;quot;title&amp;quot;]&#039;).val()) return;&lt;br /&gt;
			$(&#039;[name=&amp;quot;backlinks&amp;quot;], [name=&amp;quot;embeddedin&amp;quot;], [name=&amp;quot;imageusage&amp;quot;]&#039;).filter(&#039;:checked&#039;).each(function() {&lt;br /&gt;
				var val = this.value;&lt;br /&gt;
				abbrs.push(val);&lt;br /&gt;
				lists.push(this.name);&lt;br /&gt;
				data[val+&#039;title&#039;] = $(&#039;[name=&amp;quot;title&amp;quot;]&#039;).val();&lt;br /&gt;
				data[val+&#039;filterredir&#039;] = $(&#039;[name=&amp;quot;filterredir&amp;quot;]:checked&#039;).val();&lt;br /&gt;
				if ($(&#039;[name=&amp;quot;redirect&amp;quot;]&#039;).prop(&#039;checked&#039;)) data[val+&#039;redirect&#039;] = true;&lt;br /&gt;
			});&lt;br /&gt;
		} else if (list === &#039;smwask&#039;) {&lt;br /&gt;
			data.ask = $(this).find(&#039;#smwquery&#039;).val();&lt;br /&gt;
		} else { //default input system&lt;br /&gt;
			if ($(this).find(&#039;#psstrict&#039;).prop(&#039;checked&#039;)) {&lt;br /&gt;
				// different list if prefixsearch is strict&lt;br /&gt;
				let $input = $(this).find(&#039;#psstrict&#039;);&lt;br /&gt;
				list = $input.attr(&#039;name&#039;);&lt;br /&gt;
				abbr = $input.val();&lt;br /&gt;
			} else {&lt;br /&gt;
				abbr = $(this).find(&#039;legend input&#039;).val();&lt;br /&gt;
			}&lt;br /&gt;
			lists.push(list);&lt;br /&gt;
			abbrs.push(abbr);&lt;br /&gt;
			$(this).find(&#039;input&#039;).not(&#039;legend input&#039;).each(function() {&lt;br /&gt;
				if ((this.type === &#039;checkbox&#039; || this.type === &#039;radio&#039;) &amp;amp;&amp;amp; this.checked === false) return;&lt;br /&gt;
				if (this.id == &#039;psstrict&#039;) return; // ignore psstrict; it only affects how pssearch is handled&lt;br /&gt;
				var name, val;&lt;br /&gt;
				if (this.id == &#039;cmtitle&#039;) {&lt;br /&gt;
					// making sure the page has a Category: prefix, in case the user left it out&lt;br /&gt;
					let cgns = JWB.ns[14][&#039;*&#039;]; // name for Category: namespace&lt;br /&gt;
					if (!this.value.startsWith(cgns+&#039;:&#039;)) {&lt;br /&gt;
						this.value = cgns+&#039;:&#039;+this.value;&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				if (this.id == &#039;pssearch&#039; &amp;amp;&amp;amp; this.name == &#039;apprefix&#039;) {&lt;br /&gt;
					// apprefix needs namespace separate from pagename&lt;br /&gt;
					name = this.name;&lt;br /&gt;
					let split = this.value.split(&#039;:&#039;);&lt;br /&gt;
					val = split[1] || split[0];&lt;br /&gt;
					let nsid = 0;&lt;br /&gt;
					if (split[1]) { // if a namespace is given&lt;br /&gt;
						for (let ns in JWB.ns) {&lt;br /&gt;
							if (JWB.ns[ns][&#039;*&#039;] == split[0]) {&lt;br /&gt;
								nsid = JWB.ns[ns].id;&lt;br /&gt;
								break;&lt;br /&gt;
							}&lt;br /&gt;
						}&lt;br /&gt;
					}&lt;br /&gt;
					data.apnamespace = nsid;&lt;br /&gt;
				} else {&lt;br /&gt;
					name = this.name;&lt;br /&gt;
					val = this.value;&lt;br /&gt;
				}&lt;br /&gt;
				if (data.hasOwnProperty(name)) {&lt;br /&gt;
					data[name] += &#039;|&#039;+val;&lt;br /&gt;
				} else {&lt;br /&gt;
					data[name] = val;&lt;br /&gt;
				}&lt;br /&gt;
			});&lt;br /&gt;
			console.log(abbrs, lists, data);&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	if (abbrs.length || data.ask) JWB.pl.getList(abbrs, lists, data);&lt;br /&gt;
	else JWB.pl.stop();&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/***** Setup functions *****/&lt;br /&gt;
&lt;br /&gt;
JWB.setup.save = function(name) {&lt;br /&gt;
	name = name || prompt(JWB.msg(&#039;setup-prompt&#039;, JWB.msg(&#039;setup-prompt-store&#039;)), $(&#039;#loadSettings&#039;).val());&lt;br /&gt;
	if (name === null) return;&lt;br /&gt;
	var self = JWB.settings[name] = {&lt;br /&gt;
		string: {},&lt;br /&gt;
		bool: {},&lt;br /&gt;
		replaces: []&lt;br /&gt;
	};&lt;br /&gt;
	//inputs with a text value&lt;br /&gt;
	$(&#039;textarea, input[type=&amp;quot;text&amp;quot;], input[type=&amp;quot;number&amp;quot;], select&#039;).not(&#039;.replaces input, #editBoxArea, #settings *&#039;).each(function() {&lt;br /&gt;
		if (typeof $(this).val() == &#039;string&#039;) { &lt;br /&gt;
			self.string[this.id] = this.value.replace(/\n{2,}/g,&#039;\n&#039;);&lt;br /&gt;
		} else {&lt;br /&gt;
			self.string[this.id] = $(this).val();&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	self.replaces = [];&lt;br /&gt;
	$(&#039;.replaces&#039;).each(function() {&lt;br /&gt;
		if ($(this).find(&#039;.replaceText&#039;).val() || $(this).find(&#039;.replaceWith&#039;).val()) {&lt;br /&gt;
			self.replaces.push({&lt;br /&gt;
				replaceText: $(this).find(&#039;.replaceText&#039;).val(),&lt;br /&gt;
				replaceWith: $(this).find(&#039;.replaceWith&#039;).val(),&lt;br /&gt;
				useRegex: $(this).find(&#039;.useRegex&#039;).prop(&#039;checked&#039;),&lt;br /&gt;
				regexFlags: $(this).find(&#039;.regexFlags&#039;).val(),&lt;br /&gt;
				ignoreNowiki: $(this).find(&#039;.ignoreNowiki&#039;).prop(&#039;checked&#039;)&lt;br /&gt;
			});&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;input[type=&amp;quot;radio&amp;quot;], input[type=&amp;quot;checkbox&amp;quot;]&#039;).not(&#039;.replaces input&#039;).each(function() {&lt;br /&gt;
		self.bool[this.id] = this.checked;&lt;br /&gt;
	});&lt;br /&gt;
	if (!$(&#039;#loadSettings option[value=&amp;quot;&#039;+name+&#039;&amp;quot;]&#039;).length) {&lt;br /&gt;
		$(&#039;#loadSettings&#039;).append(&#039;&amp;lt;option value=&amp;quot;&#039;+name+&#039;&amp;quot;&amp;gt;&#039;+name+&#039;&amp;lt;/option&amp;gt;&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	$(&#039;#loadSettings&#039;).val(name);&lt;br /&gt;
	console.log(self);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.setup.apply = function(name) {&lt;br /&gt;
	name = name &amp;amp;&amp;amp; JWB.settings[name] ? name : &#039;default&#039;;&lt;br /&gt;
	var self = JWB.settings[name];&lt;br /&gt;
	$(&#039;#loadSettings&#039;).val(name);&lt;br /&gt;
	$(&#039;.replaces + .replaces&#039;).remove(); //reset find&amp;amp;replace inputs&lt;br /&gt;
	$(&#039;.replaces input[type=&amp;quot;text&amp;quot;]&#039;).val(&#039;&#039;);&lt;br /&gt;
	$(&#039;.useRegex&#039;).each(function() {this.checked = false;});&lt;br /&gt;
	$(&#039;#pagelistPopup legend input&#039;).trigger(&#039;change&#039;); //fix checked state of pagelist generating inputs&lt;br /&gt;
	for (var a in self.string) {&lt;br /&gt;
		$(&#039;#&#039;+a).val(self.string[a]);&lt;br /&gt;
	}&lt;br /&gt;
	for (var b in self.bool) {&lt;br /&gt;
		$(&#039;#&#039;+b).prop(&#039;checked&#039;, self.bool[b]);&lt;br /&gt;
	}&lt;br /&gt;
	var cur;&lt;br /&gt;
	for (var c=0;c&amp;lt;self.replaces.length;c++) {&lt;br /&gt;
		if ($(&#039;.replaces&#039;).length &amp;lt;= c) $(&#039;.moreReplaces[data-insert=&amp;quot;before&amp;quot;&#039;)[0].click();&lt;br /&gt;
		cur = self.replaces[c];&lt;br /&gt;
		for (var d in cur) {&lt;br /&gt;
			if (cur[d] === true || cur[d] === false) {&lt;br /&gt;
				$(&#039;.replaces&#039;).eq(c).find(&#039;.&#039;+d).prop(&#039;checked&#039;, cur[d]);&lt;br /&gt;
			} else {&lt;br /&gt;
				$(&#039;.replaces&#039;).eq(c).find(&#039;.&#039;+d).val(cur[d]);&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	$(&#039;.useRegex, #containRegex,&#039;+&lt;br /&gt;
	  &#039;#pagelistPopup legend input,&#039;+&lt;br /&gt;
	  &#039;#viaJWB, #enableRETF&#039;).trigger(&#039;change&#039;); //reset disabled inputs&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.setup.getObj = function() {&lt;br /&gt;
	var settings = [];&lt;br /&gt;
	for (var i in JWB.settings) {&lt;br /&gt;
		if (i != &#039;_blank&#039;) {&lt;br /&gt;
			settings.push(&#039;&amp;quot;&#039; + i + &#039;&amp;quot;: &#039; + JSON.stringify(JWB.settings[i]));&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return &#039;{\n\t&#039; + settings.join(&#039;,\n\t&#039;).split(&#039;{{subst:&#039;).join(&#039;{{#JWB-SAFESUBST:#&#039;) + &#039;\n}&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.setup.submit = function() {&lt;br /&gt;
	var name = prompt(JWB.msg(&#039;setup-prompt&#039;, JWB.msg(&#039;setup-prompt-save&#039;)), $(&#039;#loadSettings&#039;).val());&lt;br /&gt;
	if (name === null) return;&lt;br /&gt;
	if ($.trim(name) === &#039;&#039;) name = &#039;default&#039;;&lt;br /&gt;
	JWB.setup.save(name);&lt;br /&gt;
	JWB.status(&#039;setup-submit&#039;);&lt;br /&gt;
	JWB.api.call({&lt;br /&gt;
		action: &#039;query&#039;,&lt;br /&gt;
		meta: &#039;tokens&#039;,&lt;br /&gt;
	}, function(response) {&lt;br /&gt;
		let edittoken = response.query.tokens.csrftoken;&lt;br /&gt;
		JWB.api.call({&lt;br /&gt;
			title: &#039;User:&#039;+JWB.username+&#039;/&#039;+JWB.settingspage,&lt;br /&gt;
			summary: JWB.msg([&#039;setup-summary&#039;, JWB.contentLang]),&lt;br /&gt;
			action: &#039;edit&#039;,&lt;br /&gt;
			token: edittoken,&lt;br /&gt;
			text: JWB.setup.getObj(),&lt;br /&gt;
			minor: true&lt;br /&gt;
		}, function(response) {&lt;br /&gt;
			JWB.status(&#039;done&#039;, true);&lt;br /&gt;
			JWB.log(&#039;edit&#039;, response.edit.title, response.edit.newrevid);&lt;br /&gt;
		});&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//TODO: use blob uri&lt;br /&gt;
JWB.setup.download = function() {&lt;br /&gt;
	var name = prompt(JWB.msg(&#039;setup-prompt&#039;, JWB.msg(&#039;setup-prompt-save&#039;)), $(&#039;#loadSettings&#039;).val());&lt;br /&gt;
	if (name === null) return;&lt;br /&gt;
	if ($.trim(name) === &#039;&#039;) name = &#039;default&#039;;&lt;br /&gt;
	JWB.setup.save(name);&lt;br /&gt;
	JWB.status(&#039;setup-dload&#039;);&lt;br /&gt;
	var url = &#039;data:application/json;base64,&#039; + btoa(unescape(encodeURIComponent(JWB.setup.getObj())));&lt;br /&gt;
	var elem = $(&#039;#download-anchor&#039;)[0];&lt;br /&gt;
	if (HTMLAnchorElement.prototype.hasOwnProperty(&#039;download&#039;)) { //use download attribute when possible, for its ability to specify a filename&lt;br /&gt;
		elem.href = url;&lt;br /&gt;
		elem.click();&lt;br /&gt;
		setTimeout(function() {elem.removeAttribute(&#039;href&#039;);}, 2000);&lt;br /&gt;
	} else { //fallback to iframes for browsers with no support for download=&amp;quot;&amp;quot; attributes&lt;br /&gt;
		elem = $(&#039;#download-iframe&#039;)[0];&lt;br /&gt;
		elem.src = url.replace(&#039;application/json&#039;, &#039;application/octet-stream&#039;);&lt;br /&gt;
		setTimeout(function() {elem.removeAttribute(&#039;src&#039;);}, 2000);&lt;br /&gt;
	}&lt;br /&gt;
	JWB.status(&#039;done&#039;, true);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.setup.import = function(e) {&lt;br /&gt;
	e.preventDefault();&lt;br /&gt;
	file = (e.dataTransfer||this).files[0];&lt;br /&gt;
	if ($(this).is(&#039;#import&#039;)) { //reset input&lt;br /&gt;
		this.outerHTML = this.outerHTML;&lt;br /&gt;
		$(&#039;#import&#039;).change(JWB.setup.import);&lt;br /&gt;
	}&lt;br /&gt;
	if (!window.hasOwnProperty(&#039;FileReader&#039;)) {&lt;br /&gt;
		alert(JWB.msg(&#039;old-browser&#039;));&lt;br /&gt;
		JWB.status(&#039;old-browser&#039;, &#039;&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;&#039;+JWB.index_php+&#039;?title=Special:MyPage/&#039;+JWB.settingspage+&#039;&amp;quot;&amp;gt;/&#039;+JWB.settingspage+&#039;&amp;lt;/a&amp;gt;&#039;);&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	if (file.name.split(&#039;.&#039;).pop().toLowerCase() !== &#039;json&#039;) {&lt;br /&gt;
		alert(JWB.msg(&#039;not-json&#039;));&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
	JWB.status(&#039;Processing file&#039;);&lt;br /&gt;
	var reader = new FileReader();&lt;br /&gt;
	reader.readAsText(file);&lt;br /&gt;
	reader.onload = function(e) {&lt;br /&gt;
		JWB.status(&#039;done&#039;, true);&lt;br /&gt;
		try {&lt;br /&gt;
			//Exclusion regex based on http://stackoverflow.com/a/23589204/1256925&lt;br /&gt;
			//Removes all JS comments from the file, except when they&#039;re between quotes.&lt;br /&gt;
			var c = reader.result;&lt;br /&gt;
			var data = JSON.parse(c.replace(/(&amp;quot;[^&amp;quot;]*&amp;quot;)|(\/\*[\w\W]*\*\/|\/\/[^\n]*)/g, function(match, g1, g2) {&lt;br /&gt;
				if (g1) return g1;&lt;br /&gt;
			}));&lt;br /&gt;
			JWB.setup.extend(data);&lt;br /&gt;
		} catch(e) {&lt;br /&gt;
			alert(JWB.msg(&#039;json-err&#039;, e.message, JWB.msg(&#039;json-err-upload&#039;)));&lt;br /&gt;
			console.log(e); //also log the error for further info&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
	};&lt;br /&gt;
	&lt;br /&gt;
	JWB.status(&#039;Processing file&#039;);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.setup.load = function() {&lt;br /&gt;
	JWB.status(&#039;setup-load&#039;);&lt;br /&gt;
	var user = JWB.username||mw.config.get(&#039;wgUserName&#039;);&lt;br /&gt;
	var oldtitle = &amp;quot;User:&amp;quot; + user + &#039;/&#039;+JWB.settingspage; // page title for what was used before version 4.0&lt;br /&gt;
	var newtitle = &amp;quot;User:&amp;quot; + user + &#039;/JWB-settings.json&#039;; // new page title for all settings pages.&lt;br /&gt;
	var titles = oldtitle;&lt;br /&gt;
	// if the old title isn&#039;t JWB-settings.json, also query the new title.&lt;br /&gt;
	if (oldtitle !== newtitle &amp;amp;&amp;amp; JWB.hasJSON) {&lt;br /&gt;
		titles += &#039;|&#039; + newtitle;&lt;br /&gt;
	}&lt;br /&gt;
	JWB.api.call({&lt;br /&gt;
		action: &#039;query&#039;,&lt;br /&gt;
		titles: titles,&lt;br /&gt;
		prop: &#039;info|revisions&#039;,&lt;br /&gt;
		meta: &#039;tokens&#039;,&lt;br /&gt;
		rvprop: &#039;content&#039;,&lt;br /&gt;
		indexpageids: true&lt;br /&gt;
	}, function(response) {&lt;br /&gt;
		if (JWB === false) return; //user is not allowed to use JWB&lt;br /&gt;
		var firstrun = !JWB.setup.initialised;&lt;br /&gt;
		JWB.setup.initialised = true;&lt;br /&gt;
		var edittoken = response.query.tokens.csrftoken;&lt;br /&gt;
&lt;br /&gt;
		// determine correct page to get settings from&lt;br /&gt;
		var pages = response.query.pages,&lt;br /&gt;
			ids = response.query.pageids;&lt;br /&gt;
		var page, exists = true;&lt;br /&gt;
		if (ids.length == 2) {&lt;br /&gt;
			var page0 = pages[ids[0]],&lt;br /&gt;
				page1 = pages[ids[1]];&lt;br /&gt;
			var oldpage, newpage;&lt;br /&gt;
			if (page0.title == oldtitle) {&lt;br /&gt;
				oldpage = page0;&lt;br /&gt;
				newpage = page1;&lt;br /&gt;
			} else {&lt;br /&gt;
				oldpage = page1;&lt;br /&gt;
				newpage = page0;&lt;br /&gt;
			}&lt;br /&gt;
			if (oldpage.missing === undefined &amp;amp;&amp;amp; oldpage.redirect === undefined) {&lt;br /&gt;
				// old page exists and is not a redirect&lt;br /&gt;
				if (newpage.missing === undefined) {&lt;br /&gt;
					// both old AND new page exist; throw error and load neither page.&lt;br /&gt;
					let jsredir = &amp;quot;https://www.mediawiki.org/wiki/Help:Redirects#JavaScript_page_redirect&amp;quot;;&lt;br /&gt;
					prompt(JWB.msg(&#039;duplicate-settings&#039;, oldtitle, newtitle, jsredir), jsredir);&lt;br /&gt;
					exists = false;&lt;br /&gt;
				} else {&lt;br /&gt;
					// old page exists but new page doesn&#039;t; move the page to the new location.&lt;br /&gt;
					JWB.setup.moveNew(oldtitle, newtitle, edittoken);&lt;br /&gt;
					JWB.settingspage = &#039;JWB-settings.json&#039;;&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			} else {&lt;br /&gt;
				// Old page either doesn&#039;t exist or is a redirect. Don&#039;t bother with it.&lt;br /&gt;
				page = newpage;&lt;br /&gt;
				exists = (page.missing === undefined);&lt;br /&gt;
				JWB.settingspage = &#039;JWB-settings.json&#039;;&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			page = pages[ids[0]];&lt;br /&gt;
			exists = (page.missing === undefined);&lt;br /&gt;
		}&lt;br /&gt;
		if (!exists) {&lt;br /&gt;
			// settings page does not exist; don&#039;t load anything&lt;br /&gt;
			if (JWB.allowed &amp;amp;&amp;amp; firstrun) JWB.setup.save(&#039;default&#039;); //this runs when this callback returns after the init has loaded.&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		var data = page.revisions[0][&#039;*&#039;].split(&#039;{{#JWB-SAFESUBST:#&#039;).join(&#039;{{subst:&#039;);&lt;br /&gt;
		if (!data) {&lt;br /&gt;
			// settings page is empty; don&#039;t load anything.&lt;br /&gt;
			if (JWB.allowed &amp;amp;&amp;amp; firstrun) JWB.setup.save(&#039;default&#039;); //this runs when this callback returns after the init has loaded.&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		try {&lt;br /&gt;
			data = JSON.parse(data);&lt;br /&gt;
		} catch(e) {&lt;br /&gt;
			alert(JWB.msg(&#039;json-err&#039;, e.message, JWB.msg(&#039;json-err-page&#039;, JWB.settingspage)) || &#039;JSON error:\n&#039;+e.message);&lt;br /&gt;
			JWB.setup.save(&#039;default&#039;);&lt;br /&gt;
			return;&lt;br /&gt;
		}&lt;br /&gt;
		JWB.setup.extend(data);&lt;br /&gt;
		JWB.status(&#039;done&#039;, true);&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.setup.moveNew = function(from, to, token) {&lt;br /&gt;
	(new mw.Api()).post({&lt;br /&gt;
		action: &#039;move&#039;,&lt;br /&gt;
		from: from,&lt;br /&gt;
		to: to,&lt;br /&gt;
		token: token,&lt;br /&gt;
		reason: JWB.msg([&#039;setup-move-summary&#039;, JWB.contentLang]),&lt;br /&gt;
		noredirect: true, // if possible, suppress redirects; the old page will no longer be needed if the new page exists.&lt;br /&gt;
		movesubpages: true, // if any&lt;br /&gt;
		movetalk: true, // if any&lt;br /&gt;
		ignorewarnings: true,&lt;br /&gt;
	}).done(function(response) {&lt;br /&gt;
		if (response.error === undefined) {&lt;br /&gt;
			JWB.log(&#039;move&#039;, from, to);&lt;br /&gt;
			JWB.settingspage = to.split(&#039;/&#039;)[1];&lt;br /&gt;
			alert(JWB.msg(&#039;moved-settings&#039;, from, to, JWB.msg(&#039;tab-log&#039;)));&lt;br /&gt;
			JWB.setup.load(); // load settings from newly moved page.&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.setup.extend = function(obj) {&lt;br /&gt;
	$.extend(JWB.settings, obj);&lt;br /&gt;
	if (!JWB.settings.hasOwnProperty(&#039;default&#039;)) {&lt;br /&gt;
		JWB.setup.save(&#039;default&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	for (var i in JWB.settings) {&lt;br /&gt;
		if ($(&#039;#loadSettings&#039;).find(&#039;option[value=&amp;quot;&#039;+i+&#039;&amp;quot;]&#039;).length) continue;&lt;br /&gt;
		$(&#039;#loadSettings&#039;).append(&#039;&amp;lt;option value=&amp;quot;&#039;+i+&#039;&amp;quot;&amp;gt;&#039;+i+&#039;&amp;lt;/option&amp;gt;&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	JWB.setup.apply($(&#039;#loadSettings&#039;).val());&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.setup.del = function() {&lt;br /&gt;
	var name = $(&#039;#loadSettings&#039;).val();&lt;br /&gt;
	if (name === &#039;_blank&#039;) return alert(JWB.msg(&#039;setup-delete-blank&#039;));&lt;br /&gt;
	var temp = {};&lt;br /&gt;
	temp[name] = JWB.settings[name];&lt;br /&gt;
	JWB.setup.temp = $.extend({}, temp);&lt;br /&gt;
	delete JWB.settings[name];&lt;br /&gt;
	$(&#039;#loadSettings&#039;).val(&#039;default&#039;);&lt;br /&gt;
	if (name === &#039;default&#039;) {&lt;br /&gt;
		JWB.setup.apply(&#039;_blank&#039;);&lt;br /&gt;
		JWB.setup.save(&#039;default&#039;);&lt;br /&gt;
		JWB.status([&#039;del-default&#039;, &#039;&amp;lt;a href=&amp;quot;javascript:JWB.setup.undelete();&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;status-del-undo&#039;)+&#039;&amp;lt;/a&amp;gt;&#039;], true);&lt;br /&gt;
	} else {&lt;br /&gt;
		$(&#039;#loadSettings&#039;).find(&#039;[value=&amp;quot;&#039;+name+&#039;&amp;quot;]&#039;).remove();&lt;br /&gt;
		JWB.setup.apply();&lt;br /&gt;
		JWB.status([&#039;del-setup&#039;, name, &#039;&amp;lt;a href=&amp;quot;javascript:JWB.setup.undelete();&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;status-del-undo&#039;)+&#039;&amp;lt;/a&amp;gt;&#039;], true);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
JWB.setup.undelete = function() {&lt;br /&gt;
	JWB.setup.extend(JWB.setup.temp);&lt;br /&gt;
	JWB.status(&#039;done&#039;, true);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/***** Main other functions *****/&lt;br /&gt;
&lt;br /&gt;
//Show status message status-`action`, or status-`action[0]` with arguments `action[1:]`&lt;br /&gt;
JWB.status = function(action, done) {&lt;br /&gt;
	if (JWB.bot &amp;amp;&amp;amp; $(&#039;#autosave&#039;).prop(&#039;checked&#039;) &amp;amp;&amp;amp; !JWB.isStopped) {&lt;br /&gt;
		$(&#039;#summary, .editbutton, #movePage, #deletePage, #protectPage, #skipPage&#039;).prop(&#039;disabled&#039;, true); //Disable summary when auto-saving&lt;br /&gt;
	} else {&lt;br /&gt;
		$(&#039;#summary, .editbutton, #movePage, #deletePage, #protectPage, #skipPage&#039;).prop(&#039;disabled&#039;, !done); //Disable box when not done (so busy loading). re-enable when done loading.&lt;br /&gt;
	}&lt;br /&gt;
	var status;&lt;br /&gt;
	if (action instanceof Array) {&lt;br /&gt;
		action[0] = &#039;status-&#039;+action[0];&lt;br /&gt;
		status = JWB.msg.apply(this, action);&lt;br /&gt;
	} else {&lt;br /&gt;
		status = JWB.msg(&#039;status-&#039;+action);&lt;br /&gt;
	}&lt;br /&gt;
	if (status === false) return;&lt;br /&gt;
	if (status) {&lt;br /&gt;
		if (!done) { //spinner if not done&lt;br /&gt;
			status += &#039; &amp;lt;img src=&amp;quot;//upload.wikimedia.org/wikipedia/commons/d/de/Ajax-loader.gif&amp;quot; width=&amp;quot;15&amp;quot; height=&amp;quot;15&amp;quot; alt=&amp;quot;&#039;+JWB.msg(&#039;status-alt&#039;)+&#039;&amp;quot;/&amp;gt;&#039;;&lt;br /&gt;
		}&lt;br /&gt;
	} else {&lt;br /&gt;
		status = action;&lt;br /&gt;
	}&lt;br /&gt;
	$(&#039;#status&#039;).html(status);&lt;br /&gt;
	JWB.pageCount();&lt;br /&gt;
	return action==&#039;done&#039;;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.pageCount = function() {&lt;br /&gt;
	if (JWB.allowed === false||!$(&#039;#articleList&#039;).length) return;&lt;br /&gt;
	$(&#039;#articleList&#039;).val(($(&#039;#articleList&#039;).val()||&#039;&#039;).replace(/(^[ \t]*$\n)*/gm, &#039;&#039;));&lt;br /&gt;
	JWB.list = $(&#039;#articleList&#039;).val().split(&#039;\n&#039;);&lt;br /&gt;
	var count = JWB.list.length;&lt;br /&gt;
	if (count === 1 &amp;amp;&amp;amp; JWB.list[0] === &#039;&#039;) count = 0;&lt;br /&gt;
	$(&#039;#totPages&#039;).html(count);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Generate list of replaces to be performed&lt;br /&gt;
JWB.listReplaces = function() {&lt;br /&gt;
	JWB.replaces = [];&lt;br /&gt;
	$(&#039;.replaces&#039;).each(function() {&lt;br /&gt;
		var $this = $(this);&lt;br /&gt;
		var r = [];&lt;br /&gt;
		r[0] = $this.find(&#039;.replaceText&#039;).val()&lt;br /&gt;
					.replace(/\$x/gi, JWB.page.pagevar) // fill in pagevar&lt;br /&gt;
					.replace(/\\{2}/g, &#039;\\&#039;).replace(/\\n/g,&#039;\n&#039;); // handle \n -&amp;gt; newline;&lt;br /&gt;
		r[1] = $this.find(&#039;.replaceWith&#039;).val();&lt;br /&gt;
		if (r[0].length == 0 &amp;amp;&amp;amp; r[1].length == 0) return; // don&#039;t bother replacing 2 empty strings.&lt;br /&gt;
		r[2] = $this.find(&#039;.regexFlags&#039;).val();&lt;br /&gt;
		r[3] = $this;&lt;br /&gt;
		JWB.replaces.push(r);&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Perform all specified find&amp;amp;replace actions&lt;br /&gt;
JWB.replace = function(input, callback) {&lt;br /&gt;
	JWB.status(&#039;replacing&#039;);&lt;br /&gt;
	if (!JWB.worker.isWorking() &amp;amp;&amp;amp; JWB.worker.supported) {&lt;br /&gt;
		// if the worker is not already working, then re-init to make sure we&#039;ve not got any broken leftovers from the previous page&lt;br /&gt;
		JWB.worker.init();&lt;br /&gt;
	}&lt;br /&gt;
	JWB.newContent = input;&lt;br /&gt;
	JWB.pageCount();&lt;br /&gt;
 	var varOffset = JWB.list[0].indexOf(&#039;|&#039;) !== -1 ? JWB.list[0].indexOf(&#039;|&#039;) + 1 : 0;&lt;br /&gt;
 	JWB.page.pagevar = JWB.list[0].substr(varOffset);&lt;br /&gt;
	$.each(JWB.replaces, function(i, r) {&lt;br /&gt;
		var replaceText = r[0], replaceWith = r[1], regexFlags = r[2];&lt;br /&gt;
		var $this = r[3];&lt;br /&gt;
		var useRegex = replaceText.length == 0 || $this.find(&#039;.useRegex&#039;).prop(&#039;checked&#039;);&lt;br /&gt;
		var replace = replaceText || &#039;$&#039;; // empty string =&amp;gt; append (replace /$/ with text)&lt;br /&gt;
		if (useRegex &amp;amp;&amp;amp; regexFlags.indexOf(&#039;_&#039;) !== -1) {&lt;br /&gt;
			replace = replace.replace(/[ _]/g, &#039;[ _]&#039;); //replaces any of [Space OR underscore] with a match for spaces or underscores.&lt;br /&gt;
			replace = replace.replace(/(\[[^\]]*)\[ _\]/g, &#039;$1 _&#039;); //in case a [ _] was placed inside another [] match, remove the [].&lt;br /&gt;
			regexFlags = regexFlags.replace(&#039;_&#039;, &#039;&#039;);&lt;br /&gt;
		}&lt;br /&gt;
		//apply replaces where \n and \\ work in both regular text and regex mode.&lt;br /&gt;
		var rWith = replaceWith.replace(/\$x/gi, JWB.page.pagevar).replace(/\\{2}/g, &#039;\\&#039;).replace(/\\n/g,&#039;\n&#039;);&lt;br /&gt;
		if (rWith.length === 0 &amp;amp;&amp;amp; replace === &#039;$&#039;) return;&lt;br /&gt;
		try {&lt;br /&gt;
			let replaceDone = function(result, err) {&lt;br /&gt;
				console.log(&#039;done replacing&#039;, result, err);&lt;br /&gt;
				if (err === undefined) {&lt;br /&gt;
					JWB.newContent = result;&lt;br /&gt;
					if (JWB.worker.queue.length == 0 &amp;amp;&amp;amp; JWB.worker.supported) {&lt;br /&gt;
						// all workers are done&lt;br /&gt;
						JWB.status(&#039;done&#039;, true);&lt;br /&gt;
						callback(JWB.newContent);&lt;br /&gt;
					}&lt;br /&gt;
				} else if (err == &#039;Timeout exceeded&#039;) {&lt;br /&gt;
					if (JWB.worker.queue.length == 0 &amp;amp;&amp;amp; JWB.worker.supported) {&lt;br /&gt;
						// all workers have exceeded their time and/or have finished&lt;br /&gt;
						JWB.status(&#039;done&#039;, true);&lt;br /&gt;
						callback(JWB.newContent); // newContent remains unmodified due to timeout.&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			};&lt;br /&gt;
			if ($this.find(&#039;.ignoreNowiki&#039;).prop(&#039;checked&#039;)) {&lt;br /&gt;
				if (!useRegex) {&lt;br /&gt;
					replace = replace.replace(/[-\/\\^$*+?.()|[\]{}]/g, &#039;\\$&amp;amp;&#039;);&lt;br /&gt;
					regexFlags = &#039;g&#039;;&lt;br /&gt;
				}&lt;br /&gt;
				JWB.worker.unparsedReplace(&amp;quot;~&amp;quot;+&amp;quot;~~JWB.newContent&amp;quot;, replace, regexFlags, rWith, replaceDone);&lt;br /&gt;
			} else if (useRegex) {&lt;br /&gt;
				JWB.worker.replace(&amp;quot;~&amp;quot;+&amp;quot;~~JWB.newContent&amp;quot;, replace, regexFlags, rWith, replaceDone);&lt;br /&gt;
			} else {&lt;br /&gt;
				JWB.newContent = JWB.newContent.split(replace).join(rWith); //global replacement without having to escape all special chars.&lt;br /&gt;
			}&lt;br /&gt;
		} catch(e) {&lt;br /&gt;
			console.log(&#039;Regex error:&#039;, e);&lt;br /&gt;
			JWB.stop();&lt;br /&gt;
			return JWB.status(&#039;regex-err&#039;, false);&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	if ($(&#039;#enableRETF&#039;).prop(&#039;checked&#039;)) {&lt;br /&gt;
		JWB.newContent = RETF.replace(JWB.newContent);&lt;br /&gt;
	}&lt;br /&gt;
	if (!JWB.worker.isWorking()) {&lt;br /&gt;
		// no workers were called&lt;br /&gt;
		JWB.status(&#039;done&#039;, true);&lt;br /&gt;
		callback(JWB.newContent);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.skipRETF = function() {&lt;br /&gt;
	if (!$(&#039;#enableRETF&#039;).prop(&#039;checked&#039;)) return; // RETF is not enabled to begin with&lt;br /&gt;
	if (JWB.isStopped === true) return; // don&#039;t mess with the edit box when stopped&lt;br /&gt;
	$(&#039;#enableRETF&#039;).prop(&#039;checked&#039;, false);&lt;br /&gt;
	JWB.replace(JWB.page.content, function(newContent) {&lt;br /&gt;
		JWB.editPage(newContent);&lt;br /&gt;
		JWB.updateButtons();&lt;br /&gt;
		$(&#039;#enableRETF&#039;).prop(&#039;checked&#039;, true);&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Edit the current page and pre-fill the newContent.&lt;br /&gt;
JWB.editPage = function(newContent) {&lt;br /&gt;
	$(&#039;#editBoxArea&#039;).val(newContent);&lt;br /&gt;
	$(&#039;#currentpage&#039;).html(JWB.msg(&#039;editbox-currentpage&#039;, JWB.page.name, encodeURIComponent(JWB.page.name)));&lt;br /&gt;
	if ($(&#039;#preparse&#039;).prop(&#039;checked&#039;)) {&lt;br /&gt;
		$(&#039;#articleList&#039;).val($.trim($(&#039;#articleList&#039;).val()) + &#039;\n&#039; + JWB.list[0]); //move current page to the bottom&lt;br /&gt;
		JWB.next();&lt;br /&gt;
		return;&lt;br /&gt;
	} else if (JWB.bot &amp;amp;&amp;amp; $(&#039;#autosave&#039;).prop(&#039;checked&#039;)) {&lt;br /&gt;
		JWB.api.diff(function() {&lt;br /&gt;
			//timeout will take #throttle&#039;s value * 1000, if it&#039;s a number above 0. Currently defaults to 0.&lt;br /&gt;
			setTimeout(JWB.api.submit, Math.max(+$(&#039;#throttle&#039;).val() || 0, 0) * 1000, JWB.page.name);&lt;br /&gt;
		});&lt;br /&gt;
	} else {&lt;br /&gt;
		JWB.api.diff();&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Adds a line to the logs tab.&lt;br /&gt;
JWB.log = function(action, page, info) {&lt;br /&gt;
	var d = new Date();&lt;br /&gt;
	var pagee = encodeURIComponent(page);&lt;br /&gt;
	var extraInfo = &#039;&#039;, actionStat = &#039;&#039;;&lt;br /&gt;
	switch (action) {&lt;br /&gt;
		case &#039;edit&#039;:&lt;br /&gt;
			if (typeof info === &#039;undefined&#039;) {&lt;br /&gt;
				action = &#039;null-edit&#039;;&lt;br /&gt;
				actionStat = &#039;nullEdits&#039;;&lt;br /&gt;
			} else {&lt;br /&gt;
				extraInfo = &#039; (&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;&#039;+JWB.index_php+&#039;?title=&#039;+pagee+&#039;&amp;amp;diff=&#039;+info+&#039;&amp;quot;&amp;gt;diff&amp;lt;/a&amp;gt;)&#039;;&lt;br /&gt;
				actionStat = &#039;pagesSaved&#039;;&lt;br /&gt;
			}&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;nobots&#039;:&lt;br /&gt;
			action = &#039;bot-skip&#039;;&lt;br /&gt;
			extraInfo = &#039; (&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;https://en.wikipedia.org/wiki/Template:Bots&amp;quot;&amp;gt;{{bots}}&amp;lt;/a&amp;gt;)&#039;;&lt;br /&gt;
			// no break;&lt;br /&gt;
		case &#039;skip&#039;:&lt;br /&gt;
			actionStat = &#039;pagesSkipped&#039;;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;move&#039;:&lt;br /&gt;
			extraInfo = &#039; to &amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;/wiki/&#039;+encodeURIComponent(info)+&#039;&amp;quot; title=&amp;quot;&#039;+info+&#039;&amp;quot;&amp;gt;&#039;+info+&#039;&amp;lt;/a&amp;gt;&#039;;&lt;br /&gt;
			break;&lt;br /&gt;
		case &#039;protect&#039;:&lt;br /&gt;
			extraInfo = info;&lt;br /&gt;
			break;&lt;br /&gt;
	}&lt;br /&gt;
	actionStat = &#039;#&#039; + (actionStat || &#039;otherActions&#039;);&lt;br /&gt;
	$(actionStat).html(+$(actionStat).html() + 1);&lt;br /&gt;
	$(&#039;#actionlog tbody&#039;)&lt;br /&gt;
		.append(&#039;&amp;lt;tr&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;td&amp;gt;&#039;+(JWB.fn.pad0(d.getHours())+&#039;:&#039;+JWB.fn.pad0(d.getMinutes())+&#039;:&#039;+JWB.fn.pad0(d.getSeconds()))+&#039;&amp;lt;/td&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;th&amp;gt;&#039;+action+&#039;&amp;lt;/th&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;td&amp;gt;&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;/wiki/&#039;+pagee+&#039;&amp;quot; title=&amp;quot;&#039;+page+&#039;&amp;quot;&amp;gt;&#039;+page+&#039;&amp;lt;/a&amp;gt;&#039;+ extraInfo +&#039;&amp;lt;/td&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/tr&amp;gt;&#039;)&lt;br /&gt;
		.parents(&#039;.JWBtabc&#039;).scrollTop($(&#039;#actionlog tbody&#039;).parents(&#039;.JWBtabc&#039;)[0].scrollHeight);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Move to the next page in the list&lt;br /&gt;
JWB.next = function(nextPage) {&lt;br /&gt;
	// cancel any still ongoing regex match/replace functions, since we&#039;re moving on to another page.&lt;br /&gt;
	JWB.worker.cancelAll();&lt;br /&gt;
	if ($.trim(nextPage) &amp;amp;&amp;amp; !$(&#039;#skipAfterAction&#039;).prop(&#039;checked&#039;)) {&lt;br /&gt;
		nextPage = $.trim(nextPage) + &#039;\n&#039;;&lt;br /&gt;
	} else {&lt;br /&gt;
		nextPage = &#039;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	$(&#039;#articleList&#039;).val($(&#039;#articleList&#039;).val().replace(/^.*\n?/, nextPage));&lt;br /&gt;
	JWB.list.splice(0,1);&lt;br /&gt;
	JWB.pageCount();&lt;br /&gt;
	JWB.api.get(JWB.list[0].split(&#039;|&#039;)[0]);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Stop everything, reset inputs and editor&lt;br /&gt;
JWB.stop = function() {&lt;br /&gt;
	console.trace(&#039;stopped&#039;);&lt;br /&gt;
	$(&#039;#stopbutton,&#039;+&lt;br /&gt;
	  &#039;.editbutton,&#039;+&lt;br /&gt;
	  &#039;#watchNow,&#039;+&lt;br /&gt;
	  &#039;.JWBtabc[data-tab=&amp;quot;2&amp;quot;] .editbutton,&#039;+&lt;br /&gt;
	  &#039;#watchNow&#039;+&lt;br /&gt;
	  &#039;.JWBtabc[data-tab=&amp;quot;4&amp;quot;] button,&#039;+&lt;br /&gt;
	  &#039;#skipRETF&#039;).prop(&#039;disabled&#039;, true);&lt;br /&gt;
	$(&#039;#startbutton, #articleList,&#039;+&lt;br /&gt;
	  &#039;.JWBtabc[data-tab=&amp;quot;1&amp;quot;] button,&#039;+&lt;br /&gt;
	  &#039;#replacesPopup button,&#039;+&lt;br /&gt;
	  &#039;#replacesPopup input,&#039;+&lt;br /&gt;
	  &#039;.JWBtabc input, select&#039;).prop(&#039;disabled&#039;, false);&lt;br /&gt;
	$(&#039;#resultWindow&#039;).html(&#039;&#039;);&lt;br /&gt;
	$(&#039;#editBoxArea&#039;).val(&#039;&#039;);&lt;br /&gt;
	$(&#039;#currentpage&#039;).html(JWB.msg(&#039;editbox-currentpage&#039;, &#039; &#039;, &#039; &#039;));&lt;br /&gt;
	JWB.pl.done = true;&lt;br /&gt;
	JWB.pl.stop();&lt;br /&gt;
	JWB.status(&#039;done&#039;, true);&lt;br /&gt;
	JWB.isStopped = true;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Start AutoWikiBrowsing&lt;br /&gt;
JWB.start = function() {&lt;br /&gt;
	JWB.pageCount();&lt;br /&gt;
	JWB.listReplaces(); // generate list of replacements to make&lt;br /&gt;
	if (JWB.list.length === 0 || (JWB.list.length === 1 &amp;amp;&amp;amp; !JWB.list[0])) {&lt;br /&gt;
		alert(JWB.msg(&#039;no-pages-listed&#039;));&lt;br /&gt;
	} else if ($(&#039;#skipNoChange&#039;).prop(&#039;checked&#039;) &amp;amp;&amp;amp; JWB.replaces.length === 0 &amp;amp;&amp;amp; !$(&#039;#enableRETF&#039;).prop(&#039;checked&#039;)) {&lt;br /&gt;
		alert(JWB.msg(&#039;infinite-skip-notice&#039;));&lt;br /&gt;
	} else {&lt;br /&gt;
		JWB.isStopped = false;&lt;br /&gt;
		if ($(&#039;#preparse&#039;).prop(&#039;checked&#039;)) {&lt;br /&gt;
			if (!$(&#039;#articleList&#039;).val().match(&#039;#PRE-PARSE-STOP&#039;)) {&lt;br /&gt;
				$(&#039;#articleList&#039;).val($.trim($(&#039;#articleList&#039;).val()) + &#039;\n#PRE-PARSE-STOP&#039;); //mark where to stop pre-parsing&lt;br /&gt;
			}&lt;br /&gt;
		} else {&lt;br /&gt;
			$(&#039;#preparse-reset&#039;).click();&lt;br /&gt;
		}&lt;br /&gt;
		$(&#039;#stopbutton, .editbutton, #watchNow, .JWBtabc[data-tab=&amp;quot;2&amp;quot;] button, .JWBtabc[data-tab=&amp;quot;4&amp;quot;] button, #skipRETF&#039;).prop(&#039;disabled&#039;, false);&lt;br /&gt;
		$(&#039;#startbutton, #articleList, .JWBtabc[data-tab=&amp;quot;1&amp;quot;] button, #replacesPopup button, #replacesPopup input, .JWBtabc input, select&#039;).prop(&#039;disabled&#039;, true);&lt;br /&gt;
		if (!JWB.bot || !$(&#039;#autosave&#039;).prop(&#039;checked&#039;)) {&lt;br /&gt;
			// keep summary / watchlist options enabled when not in autosave mode&lt;br /&gt;
			$(&#039;#minorEdit, #summary, #viaJWB, #watchPage&#039;).prop(&#039;disabled&#039;, false);&lt;br /&gt;
		}&lt;br /&gt;
		JWB.api.get(JWB.list[0].split(&#039;|&#039;)[0]);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.updateButtons = function() {&lt;br /&gt;
	if (!JWB.page.exists &amp;amp;&amp;amp; $(&#039;#deletePage&#039;).is(&#039;.delete&#039;)) {&lt;br /&gt;
		$(&#039;#deletePage&#039;).removeClass(&#039;delete&#039;).addClass(&#039;undelete&#039;).html(&#039;Undelete&#039;);&lt;br /&gt;
		JWB.fn.blink(&#039;#deletePage&#039;); //Indicate the button has changed&lt;br /&gt;
	} else if (JWB.page.exists &amp;amp;&amp;amp; $(&#039;#deletePage&#039;).is(&#039;.undelete&#039;)) {&lt;br /&gt;
		$(&#039;#deletePage&#039;).removeClass(&#039;undelete&#039;).addClass(&#039;delete&#039;).html(&#039;Delete&#039;);&lt;br /&gt;
		JWB.fn.blink(&#039;#deletePage&#039;); //Indicate the button has changed&lt;br /&gt;
	}&lt;br /&gt;
	if (!JWB.page.exists) {&lt;br /&gt;
		$(&#039;#movePage&#039;).prop(&#039;disabled&#039;, true);&lt;br /&gt;
	} else {&lt;br /&gt;
		$(&#039;#movePage&#039;).prop(&#039;disabled&#039;, false);&lt;br /&gt;
	}&lt;br /&gt;
	$(&#039;#watchNow&#039;).html( JWB.msg(&#039;watch-&#039; + (JWB.page.watched ? &#039;remove&#039; : &#039;add&#039;)) );&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/***** Web Worker functions *****/&lt;br /&gt;
JWB.worker.supported = !!window.Worker; // if window.Worker exists, we can use workers. Unless CSP blocks us.&lt;br /&gt;
JWB.worker.queue = [];&lt;br /&gt;
&lt;br /&gt;
// Load function required to properly load the worker, since directly using `new Worker(url)` for cross-origin URLs does not work even with CORS/CSP rules all allowing it.&lt;br /&gt;
// See https://stackoverflow.com/q/66188950/1256925 for this exact question&lt;br /&gt;
JWB.worker.load = function(callback) {&lt;br /&gt;
	if (JWB.worker.blob) return callback(); // already successfully built&lt;br /&gt;
	$.getScript(JWB.imports[&#039;worker.js&#039;], function() {&lt;br /&gt;
		// Firefox does not understand try..catch for content security policy violations, so define the worker functions regardless of the blob support.&lt;br /&gt;
		JWB.worker.functions = JWB.worker.function();&lt;br /&gt;
		// the loaded script just defined JWB.worker.function; convert it to a blob url&lt;br /&gt;
		// Based on https://stackoverflow.com/a/33432215/1256925&lt;br /&gt;
		if (JWB.worker.supported) try {&lt;br /&gt;
			let blob = new Blob([&#039;(&#039;+JWB.worker.function.toString()+&#039;)()&#039;], {type: &#039;text/javascript&#039;});&lt;br /&gt;
			JWB.worker.blob = URL.createObjectURL(blob);&lt;br /&gt;
			callback();&lt;br /&gt;
		} catch(e) {&lt;br /&gt;
			if (e.code == 18) {&lt;br /&gt;
				JWB.worker.supported = false;&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Create a worker to be able to preform regex operations without hanging the current process.&lt;br /&gt;
// Based on https://stackoverflow.com/q/66153487/1256925&lt;br /&gt;
JWB.worker.init = function() {&lt;br /&gt;
	JWB.worker.load(function() {&lt;br /&gt;
		JWB.worker.worker = new Worker(JWB.worker.blob);&lt;br /&gt;
		JWB.worker.callback = undefined; // explicitly set to the implicit value of undefined.&lt;br /&gt;
		JWB.worker.timeout = 0;&lt;br /&gt;
		JWB.worker.queue = [];&lt;br /&gt;
		JWB.worker.worker.onmessage = function(e) {&lt;br /&gt;
			clearTimeout(JWB.worker.timeout);&lt;br /&gt;
			JWB.worker.timeout = 0;&lt;br /&gt;
			if (JWB.isStopped) {&lt;br /&gt;
				// we&#039;re stopped; clear the queue and stop.&lt;br /&gt;
				JWB.worker.queue = [];&lt;br /&gt;
			} else if (JWB.worker.callback !== undefined) {&lt;br /&gt;
				JWB.worker.callback(e.data.result, e.data.err);&lt;br /&gt;
			} else {&lt;br /&gt;
				console.error(&amp;quot;Worker finished without callback set:&amp;quot;, e.data, e);&lt;br /&gt;
			}&lt;br /&gt;
			JWB.worker.next(true);&lt;br /&gt;
		};&lt;br /&gt;
	});&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Boolean; check if the worker is currently occupied. &lt;br /&gt;
JWB.worker.isWorking = function() {&lt;br /&gt;
	return JWB.worker.callback !== undefined;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Cancel current worker&#039;s task (e.g. due to timeout)&lt;br /&gt;
JWB.worker.terminate = function() {&lt;br /&gt;
	console.log(&#039;terminating&#039;);&lt;br /&gt;
	let w = JWB.worker;&lt;br /&gt;
	w.worker.terminate();&lt;br /&gt;
	w.callback(undefined, &#039;Timeout exceeded&#039;);&lt;br /&gt;
	let queue = w.queue; // save old queue&lt;br /&gt;
	w.init(); // re-init this worker, since the previous one is presumed dead (and terminated).&lt;br /&gt;
	w.queue = queue; // restore queue&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Cancel all workers (e.g. due to no longer needing the worker&#039;s queued services)&lt;br /&gt;
JWB.worker.cancelAll = function() {&lt;br /&gt;
	JWB.worker.queue = [];&lt;br /&gt;
	if (JWB.worker.worker) JWB.worker.worker.terminate(); // do not call the callback.&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Set worker to work, or queue the worker task.&lt;br /&gt;
JWB.worker.do = function(msg, callback) {&lt;br /&gt;
	if (JWB.worker.isWorking()) {&lt;br /&gt;
		JWB.worker.queue.push({msg: msg, callback: callback});&lt;br /&gt;
	} else {&lt;br /&gt;
		var timelimit = parseInt($(&#039;#timelimit&#039;).val()) || 3000;&lt;br /&gt;
		JWB.worker.callback = callback;&lt;br /&gt;
		// Expand &amp;quot;JWB.string&amp;quot; into JWB[&#039;string&#039;]; to allow the string to be loaded at execution time instead of queue time.&lt;br /&gt;
		// Start with 3x ~ because that cannot exist as the start of an actual page&lt;br /&gt;
		if (msg.str &amp;amp;&amp;amp; msg.str.indexOf(&#039;~&#039;+&#039;~~JWB.&#039;) === 0) msg.str = JWB[msg.str.substr(7)]; // For now, 1-deep expansion is sufficient.&lt;br /&gt;
		JWB.worker.worker.postMessage(msg);&lt;br /&gt;
		JWB.worker.timeout = setTimeout(function() {&lt;br /&gt;
			if (!JWB.worker.isWorking()) {&lt;br /&gt;
				console.error(&#039;Worker error&#039;);&lt;br /&gt;
				JWB.worker.next(true);&lt;br /&gt;
				return;&lt;br /&gt;
			}&lt;br /&gt;
			JWB.worker.terminate();&lt;br /&gt;
			JWB.worker.next(true);&lt;br /&gt;
		}, timelimit);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// Execute the next task in the queue&lt;br /&gt;
JWB.worker.next = function(force = false) {&lt;br /&gt;
	if (force) {&lt;br /&gt;
		// force means the function that&#039;s calling next() has handled the previous worker task. Clean up after it.&lt;br /&gt;
		JWB.worker.callback = undefined;&lt;br /&gt;
	} else if (JWB.worker.isWorking()) {&lt;br /&gt;
		// still working and the calling function did not specify proper exit of the previous task yet.&lt;br /&gt;
		return false;&lt;br /&gt;
	}&lt;br /&gt;
	if (JWB.worker.queue.length === 0) return true;&lt;br /&gt;
	var q = JWB.worker.queue.shift();&lt;br /&gt;
	JWB.worker.do(q.msg, q.callback);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/***** Functions using workers *****/&lt;br /&gt;
JWB.worker.match = function(str, pattern, flags, callback) {&lt;br /&gt;
	if (JWB.worker.supported) {&lt;br /&gt;
		JWB.worker.do({cmd: &#039;match&#039;, str, pattern, flags}, callback);&lt;br /&gt;
	} else {&lt;br /&gt;
		if (str &amp;amp;&amp;amp; str.indexOf(&#039;~&#039;+&#039;~~JWB.&#039;) === 0) str = JWB[str.substr(7)]; // For now, 1-deep expansion is sufficient.&lt;br /&gt;
		JWB.worker.functions.match(str, pattern, flags, callback);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.worker.replace = function(str, pattern, flags, rWith, callback) {&lt;br /&gt;
	if (JWB.worker.supported) {&lt;br /&gt;
		JWB.worker.do({cmd: &#039;replace&#039;, str, pattern, flags, rWith}, callback);&lt;br /&gt;
	} else {&lt;br /&gt;
		if (str &amp;amp;&amp;amp; str.indexOf(&#039;~&#039;+&#039;~~JWB.&#039;) === 0) str = JWB[str.substr(7)]; // For now, 1-deep expansion is sufficient.&lt;br /&gt;
		JWB.worker.functions.replace(str, pattern, flags, rWith, callback);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.worker.unparsedReplace = function(str, pattern, flags, rWith, callback) {&lt;br /&gt;
	if (JWB.worker.supported) {&lt;br /&gt;
		JWB.worker.do({cmd: &#039;unparsedreplace&#039;, str, pattern, flags, rWith}, callback);&lt;br /&gt;
	} else {&lt;br /&gt;
		if (str &amp;amp;&amp;amp; str.indexOf(&#039;~&#039;+&#039;~~JWB.&#039;) === 0) str = JWB[str.substr(7)]; // For now, 1-deep expansion is sufficient.&lt;br /&gt;
		JWB.worker.functions.unparsedreplace(str, pattern, flags, rWith, callback);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/***** General functions *****/&lt;br /&gt;
//Clear all existing timers to prevent them from getting errors&lt;br /&gt;
JWB.fn.clearAllTimeouts = function() {&lt;br /&gt;
	var i = setTimeout(function() {&lt;br /&gt;
		return void(0);&lt;br /&gt;
	}, 1000);&lt;br /&gt;
	for (var n=0;n&amp;lt;=i;n++) {&lt;br /&gt;
		clearTimeout(n);&lt;br /&gt;
		clearInterval(n);&lt;br /&gt;
	}&lt;br /&gt;
	console.log(&#039;Cleared all running intervals up to index&#039;,i);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Filter an array to only contain unique values.&lt;br /&gt;
JWB.fn.uniques = function(arr) {&lt;br /&gt;
	var a = [];&lt;br /&gt;
	for (var i=0, l=arr.length; i&amp;lt;l; i++) {&lt;br /&gt;
		if (a.indexOf(arr[i]) === -1 &amp;amp;&amp;amp; arr[i] !== &#039;&#039;) {&lt;br /&gt;
			a.push(arr[i]);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return a;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
// code taken directly from [[Template:Bots]] and changed structurally (not functionally) for readability. The user in this case is &amp;quot;JWB&amp;quot; to deny this script.&lt;br /&gt;
// the user parameter is still kept as an optional parameter to maintain functionality as given on that template page.&lt;br /&gt;
JWB.fn.allowBots = function(text, user = &amp;quot;JWB&amp;quot;) {&lt;br /&gt;
	var usr = user.replace(/([\(\)\*\+\?\.\-\:\!\=\/\^\$])/g, &amp;quot;\\$1&amp;quot;);&lt;br /&gt;
	if (!new RegExp(&amp;quot;\\{\\{\\s*(nobots|bots[^}]*)\\s*\\}\\}&amp;quot;, &amp;quot;i&amp;quot;).test(text))&lt;br /&gt;
		return true;&lt;br /&gt;
	if (new RegExp(&amp;quot;\\{\\{\\s*bots\\s*\\|\\s*deny\\s*=\\s*([^}]*,\\s*)*&amp;quot; + usr + &amp;quot;\\s*(?=[,\\}])[^}]*\\s*\\}\\}&amp;quot;, &amp;quot;i&amp;quot;).test(text))&lt;br /&gt;
		return false;&lt;br /&gt;
	else&lt;br /&gt;
		return new RegExp(&amp;quot;\\{\\{\\s*((?!nobots)|bots(\\s*\\|\\s*allow\\s*=\\s*((?!none)|([^}]*,\\s*)*&amp;quot; + usr +&lt;br /&gt;
			&amp;quot;\\s*(?=[,\\}])[^}]*|all))?|bots\\s*\\|\\s*deny\\s*=\\s*(?!all)[^}]*|bots\\s*\\|\\s*optout=(?!all)[^}]*)\\s*\\}\\}&amp;quot;, &amp;quot;i&amp;quot;).test(text);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//Prepends zeroes until the number has the desired length of len (default 2)&lt;br /&gt;
JWB.fn.pad0 = function(n, len = 2) {&lt;br /&gt;
	n = n.toString();&lt;br /&gt;
	return n.length &amp;lt; len ? Array(len-n.length+1).join(&#039;0&#039;)+n : n;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.fn.blink = function(el,t) {&lt;br /&gt;
	t=t?t:500;&lt;br /&gt;
	$(el).prop(&#039;disabled&#039;, true)&lt;br /&gt;
	.children().animate({opacity:&#039;0.1&#039;},t-100)&lt;br /&gt;
	.animate({opacity:&#039;1&#039;},t)&lt;br /&gt;
	.animate({opacity:&#039;0.1&#039;},t-100)&lt;br /&gt;
	.animate({opacity:&#039;1&#039;},t);&lt;br /&gt;
	setTimeout(&amp;quot;$(&#039;&amp;quot;+el+&amp;quot;&#039;).prop(&#039;disabled&#039;, false)&amp;quot;,t*4-400);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.fn.setSelection = function(el, start, end, dir) {&lt;br /&gt;
    dir = dir||&#039;none&#039;; //Default value&lt;br /&gt;
    end = end||start; //If no end is specified, assume the caret is placed without creating text selection.&lt;br /&gt;
    if (el.setSelectionRange) {&lt;br /&gt;
        el.focus();&lt;br /&gt;
        el.setSelectionRange(start, end, dir);&lt;br /&gt;
    } else if (el.createTextRange) {&lt;br /&gt;
        var rng = el.createTextRange();&lt;br /&gt;
        rng.collapse(true);&lt;br /&gt;
        rng.moveStart(&#039;character&#039;, start);&lt;br /&gt;
        rng.moveEnd(&#039;character&#039;, end);&lt;br /&gt;
        rng.select();&lt;br /&gt;
    }&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
JWB.fn.scrollSelection = function(el, index) { //function to fix scrolling to selection - doesn&#039;t do that automatically.&lt;br /&gt;
	var newEl = document.createElement(&#039;textarea&#039;); //create a new textarea to simulate the same conditions&lt;br /&gt;
	var elStyle = getComputedStyle(el);&lt;br /&gt;
	newEl.style.height = elStyle.height; //copy over size-influencing styles&lt;br /&gt;
	newEl.style.width = elStyle.width;&lt;br /&gt;
	newEl.style.lineHeight = elStyle.lineHeight;&lt;br /&gt;
	newEl.style.fontSize = elStyle.fontSize;&lt;br /&gt;
	newEl.value = el.value.substr(0,index);&lt;br /&gt;
	document.body.appendChild(newEl); //needs to be added to the HTML for the scrollHeight and clientHeight to work.&lt;br /&gt;
	if (newEl.scrollHeight != newEl.clientHeight) {&lt;br /&gt;
		el.scrollTop = newEl.scrollHeight - 2;&lt;br /&gt;
	} else {&lt;br /&gt;
		el.scrollTop = 0;&lt;br /&gt;
	}&lt;br /&gt;
	newEl.remove(); //clean up the mess I&#039;ve made&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//i18n function&lt;br /&gt;
JWB.msg = function(message) {&lt;br /&gt;
	var args = arguments;&lt;br /&gt;
	var lang = JWB.lang;&lt;br /&gt;
	if (typeof message === &#039;object&#039;) {&lt;br /&gt;
		lang = message[1];&lt;br /&gt;
		message = message[0];&lt;br /&gt;
	}&lt;br /&gt;
	if (lang == &#039;qqx&#039;) return message;&lt;br /&gt;
	if (!JWB.messages || !JWB.messages.en) return &#039;\u29FC&#039;+message+&#039;\u29FD&#039;; // same surrounding &amp;lt;&amp;gt; as used in mw.msg();&lt;br /&gt;
	var msg;&lt;br /&gt;
	if (JWB.messages.hasOwnProperty(lang) &amp;amp;&amp;amp; JWB.messages[lang].hasOwnProperty(message)) {&lt;br /&gt;
		msg = JWB.messages[lang][message];&lt;br /&gt;
	} else {&lt;br /&gt;
		msg = (JWB.messages.en.hasOwnProperty(message)) ? JWB.messages.en[message] : &#039;\u29FC&#039;+message+&#039;\u29FD&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	msg = msg.replace(/\$(\d+)/g, function(match, num) {&lt;br /&gt;
		return args[+num] || match;&lt;br /&gt;
	});&lt;br /&gt;
	return msg;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/***** Init *****/&lt;br /&gt;
&lt;br /&gt;
JWB.init = function() {&lt;br /&gt;
	console.log(JWB.messages.en, !!JWB.messages.en);&lt;br /&gt;
	JWB.setup.load();&lt;br /&gt;
	JWB.worker.init();&lt;br /&gt;
	JWB.fn.clearAllTimeouts();&lt;br /&gt;
&lt;br /&gt;
	var findreplace = &#039;&amp;lt;div class=&amp;quot;replaces&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;label style=&amp;quot;display:block;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;label-replace&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;replaceText&amp;quot;/&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;label style=&amp;quot;display:block;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;label-rwith&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;replaceWith&amp;quot;/&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;div class=&amp;quot;regexswitch&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;useRegex&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;label-useregex&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;a class=&amp;quot;re101&amp;quot; href=&amp;quot;http://regex101.com/#javascript&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;?&amp;lt;/a&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label class=&amp;quot;divisor&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-regex-flags&#039;)+&#039;&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				JWB.msg(&#039;label-regex-flags&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; class=&amp;quot;regexFlags&amp;quot; value=&amp;quot;g&amp;quot;/&amp;gt;&#039;+ //default: global replacement&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br/&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/div&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-ignore-comment&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;input type=&amp;quot;checkbox&amp;quot; class=&amp;quot;ignoreNowiki&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;label-ignore-comment&#039;)+&lt;br /&gt;
		&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
	&#039;&amp;lt;/div&amp;gt;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	var NSList = &#039;&amp;lt;select multiple name=&amp;quot;namespace&amp;quot; id=&amp;quot;namespacelist&amp;quot;&amp;gt;&#039;;&lt;br /&gt;
	for (var i in JWB.ns) {&lt;br /&gt;
		if (parseInt(i) &amp;lt; 0) continue; //No Special: or Media: in the list&lt;br /&gt;
		NSList += &#039;&amp;lt;option value=&amp;quot;&#039;+JWB.ns[i].id+&#039;&amp;quot; selected&amp;gt;&#039;+(JWB.ns[i][&#039;*&#039;] || &#039;(&#039;+JWB.msg(&#039;namespace-main&#039;)+&#039;)&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;;&lt;br /&gt;
	}&lt;br /&gt;
	NSList += &#039;&amp;lt;/select&amp;gt;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	/***** Interface *****/&lt;br /&gt;
	&lt;br /&gt;
	document.title = &#039;AutoWikiBrowser Script&#039;+(document.title.split(&#039;-&#039;)[1] ? &#039; -&#039;+document.title.split(&#039;-&#039;)[1] : &#039;&#039;);&lt;br /&gt;
	$(&#039;body&#039;).html(&lt;br /&gt;
		&#039;&amp;lt;article id=&amp;quot;resultWindow&amp;quot;&amp;gt;&amp;lt;/article&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;main id=&amp;quot;inputsWindow&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;div id=&amp;quot;inputsBox&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;aside id=&amp;quot;articleBox&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;b&amp;gt;&#039;+JWB.msg(&#039;pagelist-caption&#039;)+&#039;&amp;lt;/b&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;textarea id=&amp;quot;articleList&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;/aside&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;section id=&amp;quot;tabs&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;nav class=&amp;quot;tabholder&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
						&#039;&amp;lt;span class=&amp;quot;JWBtab active&amp;quot; data-tab=&amp;quot;1&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;tab-setup&#039;)+&#039;&amp;lt;/span&amp;gt; &#039;+&lt;br /&gt;
						&#039;&amp;lt;span class=&amp;quot;JWBtab&amp;quot; data-tab=&amp;quot;2&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;tab-editing&#039;)+&#039;&amp;lt;/span&amp;gt; &#039;+&lt;br /&gt;
						&#039;&amp;lt;span class=&amp;quot;JWBtab&amp;quot; data-tab=&amp;quot;3&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;tab-skip&#039;)+&#039;&amp;lt;/span&amp;gt; &#039;+&lt;br /&gt;
						(JWB.sysop?&#039;&amp;lt;span class=&amp;quot;JWBtab&amp;quot; data-tab=&amp;quot;4&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;tab-other&#039;)+&#039;&amp;lt;/span&amp;gt; &#039;:&#039;&#039;)+&lt;br /&gt;
						&#039; &amp;lt;span class=&amp;quot;JWBtab log&amp;quot; data-tab=&amp;quot;5&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;tab-log&#039;)+&#039;&amp;lt;/span&amp;gt; &#039;+&lt;br /&gt;
					&#039;&amp;lt;/nav&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;section class=&amp;quot;JWBtabc active&amp;quot; data-tab=&amp;quot;1&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;section class=&amp;quot;JWBtabc&amp;quot; data-tab=&amp;quot;2&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;section class=&amp;quot;JWBtabc&amp;quot; data-tab=&amp;quot;3&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&#039;+&lt;br /&gt;
					(JWB.sysop?&#039;&amp;lt;section class=&amp;quot;JWBtabc&amp;quot; data-tab=&amp;quot;4&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&#039;:&#039;&#039;)+&lt;br /&gt;
					&#039;&amp;lt;section class=&amp;quot;JWBtabc log&amp;quot; data-tab=&amp;quot;5&amp;quot;&amp;gt;&amp;lt;/section&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;footer id=&amp;quot;status&amp;quot;&amp;gt;done&amp;lt;/footer&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;/section&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;aside id=&amp;quot;editBox&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;b&amp;gt;&#039;+JWB.msg(&#039;editbox-caption&#039;)+&#039; - &amp;lt;span id=&amp;quot;currentpage&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbox-currentpage&#039;, &#039; &#039;, &#039; &#039;)+&#039;&amp;lt;/span&amp;gt;&amp;lt;/b&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;textarea id=&amp;quot;editBoxArea&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;/aside&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/div&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/main&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;footer id=&amp;quot;stats&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			JWB.msg(&#039;stat-pages&#039;)+&#039; &amp;lt;span id=&amp;quot;totPages&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;;&amp;amp;emsp;&#039;+&lt;br /&gt;
			JWB.msg(&#039;stat-save&#039;)+&#039; &amp;lt;span id=&amp;quot;pagesSaved&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;;&amp;amp;emsp;&#039;+&lt;br /&gt;
			JWB.msg(&#039;stat-null&#039;)+&#039; &amp;lt;span id=&amp;quot;nullEdits&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;;&amp;amp;emsp;&#039;+&lt;br /&gt;
			JWB.msg(&#039;stat-skip&#039;)+&#039; &amp;lt;span id=&amp;quot;pagesSkipped&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;;&amp;amp;emsp;&#039;+&lt;br /&gt;
			JWB.msg(&#039;stat-other&#039;)+&#039; &amp;lt;span id=&amp;quot;otherActions&amp;quot;&amp;gt;0&amp;lt;/span&amp;gt;;&amp;amp;emsp;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/footer&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;div id=&amp;quot;overlay&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;section class=&amp;quot;JWBpopup&amp;quot; id=&amp;quot;replacesPopup&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button class=&amp;quot;moreReplaces&amp;quot; data-insert=&amp;quot;after&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;button-more-fields&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+findreplace+&lt;br /&gt;
			&#039;&amp;lt;button class=&amp;quot;moreReplaces&amp;quot; data-insert=&amp;quot;before&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;button-more-fields&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/section&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;section class=&amp;quot;JWBpopup&amp;quot; id=&amp;quot;pagelistPopup&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;form action=&amp;quot;#&amp;quot; id=&amp;quot;pl-form&amp;quot;&amp;gt;&amp;lt;/form&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/section&amp;gt;&#039;&lt;br /&gt;
	);&lt;br /&gt;
	&lt;br /&gt;
	$(&#039;.JWBtabc[data-tab=&amp;quot;1&amp;quot;]&#039;).html(&lt;br /&gt;
		&#039;&amp;lt;fieldset id=&amp;quot;pagelist&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&#039;+JWB.msg(&#039;label-pagelist&#039;)+&#039;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;removeDupes&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;button-remove-dupes&#039;)+&#039;&amp;lt;/button&amp;gt; &#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;sortArticles&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;button-sort&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-preparse&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;preparse&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;preparse&#039;)+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;span class=&amp;quot;divisor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;preparse-reset&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-preparse-reset&#039;)+&#039;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;preparse-reset&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;pagelistButton&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;pagelist-generate&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset id=&amp;quot;settings&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&#039;+JWB.msg(&#039;label-settings&#039;)+&#039;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;saveAs&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-store-setup&#039;)+&#039;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;store-setup&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&#039;+&lt;br /&gt;
				JWB.msg(&#039;load-settings&#039;) + &#039; &#039;+&lt;br /&gt;
				&#039;&amp;lt;select id=&amp;quot;loadSettings&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;option value=&amp;quot;default&amp;quot; selected&amp;gt;default&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
					&#039;&amp;lt;option value=&amp;quot;_blank&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;blank-setup&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;/select&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;span class=&amp;quot;divisor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;deleteSetup&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-delete-setup&#039;)+&#039;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;delete-setup&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;hr&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;saveToWiki&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;save-setup&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;span class=&amp;quot;divisor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;download&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;download-setup&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;hr&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label class=&amp;quot;button&amp;quot; id=&amp;quot;importLabel&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-import-setup&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;input type=&amp;quot;file&amp;quot; id=&amp;quot;import&amp;quot; accept=&amp;quot;.json&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				JWB.msg(&#039;import-setup&#039;)+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;span class=&amp;quot;divisor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;updateSetups&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-update-setup&#039;, JWB.settingspage)+&#039;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;update-setup&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;div id=&amp;quot;downloads&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;a download=&amp;quot;JWB-settings.json&amp;quot; target=&amp;quot;_blank&amp;quot; id=&amp;quot;download-anchor&amp;quot;&amp;gt;&amp;lt;/a&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;iframe id=&amp;quot;download-iframe&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/div&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset id=&amp;quot;limits&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&#039;+JWB.msg(&#039;label-limits&#039;)+&#039;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label class=&amp;quot;timelimit-label&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-time-limit&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				JWB.msg(&#039;time-limit&#039;)+&lt;br /&gt;
				&#039;&amp;lt;input type=&amp;quot;number&amp;quot; id=&amp;quot;timelimit&amp;quot; value=&amp;quot;3000&amp;quot; min=&amp;quot;0&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-diff-size-limit&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				JWB.msg(&#039;diff-size-limit&#039;)+&lt;br /&gt;
				&#039;&amp;lt;input type=&amp;quot;number&amp;quot; id=&amp;quot;sizelimit&amp;quot; value=&amp;quot;0&amp;quot; min=&amp;quot;0&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;&lt;br /&gt;
	);&lt;br /&gt;
	$(&#039;.JWBtabc[data-tab=&amp;quot;2&amp;quot;]&#039;).html(&lt;br /&gt;
		&#039;&amp;lt;label class=&amp;quot;minorEdit&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;minorEdit&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;minor-edit&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;label class=&amp;quot;editSummary viaJWB&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;edit-summary&#039;)+&#039;&amp;lt;br/&amp;gt; &amp;lt;input class=&amp;quot;fullwidth&amp;quot; type=&amp;quot;text&amp;quot; id=&amp;quot;summary&amp;quot; maxlength=&amp;quot;500&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039; &amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;viaJWB&amp;quot; checked title=&amp;quot;&#039;+JWB.msg(&#039;tip-via-JWB&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;select id=&amp;quot;watchPage&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;option value=&amp;quot;watch&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;watch-watch&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;option value=&amp;quot;unwatch&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;watch-unwatch&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;option value=&amp;quot;nochange&amp;quot; selected&amp;gt;&#039;+JWB.msg(&#039;watch-nochange&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;option value=&amp;quot;preferences&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;watch-preferences&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/select&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;span class=&amp;quot;divisor&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;button id=&amp;quot;watchNow&amp;quot; disabled accesskey=&amp;quot;w&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			JWB.msg(&#039;watch-add&#039;)+&lt;br /&gt;
		&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
		(JWB.bot?&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;autosave&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;auto-save&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-save-interval&#039;)+&#039;&amp;quot; class=&amp;quot;divisor&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				JWB.msg(&#039;save-interval&#039;, &#039;&amp;lt;input type=&amp;quot;number&amp;quot; min=&amp;quot;0&amp;quot; value=&amp;quot;0&amp;quot; style=&amp;quot;width:50px&amp;quot; id=&amp;quot;throttle&amp;quot; disabled&amp;gt;&#039;)+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;&lt;br /&gt;
		:&#039;&#039;)+&lt;br /&gt;
		&#039;&amp;lt;span id=&amp;quot;startstop&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;startbutton&amp;quot; accesskey=&amp;quot;a&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-start&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;button id=&amp;quot;stopbutton&amp;quot; disabled accesskey=&amp;quot;q&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-stop&#039;)+&#039;&amp;lt;/button&amp;gt; &#039;+&lt;br /&gt;
		&#039;&amp;lt;/span&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;button class=&amp;quot;editbutton&amp;quot; id=&amp;quot;skipButton&amp;quot; disabled accesskey=&amp;quot;n&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-skip&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;button class=&amp;quot;editbutton&amp;quot; id=&amp;quot;submitButton&amp;quot; disabled accesskey=&amp;quot;s&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-save&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;button class=&amp;quot;editbutton&amp;quot; id=&amp;quot;previewButton&amp;quot; disabled accesskey=&amp;quot;p&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-preview&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;button class=&amp;quot;editbutton&amp;quot; id=&amp;quot;diffButton&amp;quot; disabled accesskey=&amp;quot;d&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-diff&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;button id=&amp;quot;replacesButton&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;button-open-popup&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;+&lt;br /&gt;
		findreplace+&lt;br /&gt;
		&#039;&amp;lt;hr&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;enableRETF&amp;quot;&amp;gt; &#039;+&lt;br /&gt;
			JWB.msg(&#039;label-enable-RETF&#039;, &lt;br /&gt;
				&#039;&amp;lt;a href=&amp;quot;/wiki/Project:AutoWikiBrowser/Typos&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
					JWB.msg(&#039;label-RETF&#039;)+&lt;br /&gt;
				&#039;&amp;lt;/a&amp;gt;&#039;)+&lt;br /&gt;
		&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039; &amp;lt;img src=&amp;quot;https://upload.wikimedia.org/wikipedia/commons/thumb/2/2a/Gnome-view-refresh.svg/20px-Gnome-view-refresh.svg.png&amp;quot;&#039;+&lt;br /&gt;
		&#039;id=&amp;quot;refreshRETF&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-refresh-RETF&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;br/&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;button id=&amp;quot;skipRETF&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-skip-RETF&#039;)+&#039;&amp;quot; disabled&amp;gt;&#039;+JWB.msg(&#039;skip-RETF&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;&lt;br /&gt;
	);&lt;br /&gt;
	$(&#039;.JWBtabc[data-tab=&amp;quot;3&amp;quot;]&#039;).html(&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&#039;+JWB.msg(&#039;label-redirects&#039;)+&#039;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-redirects-follow&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;input type=&amp;quot;radio&amp;quot; class=&amp;quot;redirects&amp;quot; value=&amp;quot;follow&amp;quot; name=&amp;quot;redir&amp;quot; id=&amp;quot;redir-follow&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;redirects-follow&#039;)+&#039; &#039;+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-redirects-skip&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				 &#039;&amp;lt;input type=&amp;quot;radio&amp;quot; class=&amp;quot;redirects&amp;quot; value=&amp;quot;skip&amp;quot; name=&amp;quot;redir&amp;quot; id=&amp;quot;redir-skip&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;redirects-skip&#039;)+&#039; &#039;+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-redirects-edit&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;input type=&amp;quot;radio&amp;quot; class=&amp;quot;redirects&amp;quot; value=&amp;quot;edit&amp;quot; name=&amp;quot;redir&amp;quot; id=&amp;quot;redir-edit&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;redirects-edit&#039;)+&#039;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&#039;+JWB.msg(&#039;label-skip-when&#039;)+&#039;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;skipNoChange&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;skip-no-change&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;exists-yes&amp;quot; name=&amp;quot;exists&amp;quot; value=&amp;quot;yes&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;skip-exists-yes&#039;)+&#039;&amp;lt;/label&amp;gt; &#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;exists-no&amp;quot; name=&amp;quot;exists&amp;quot; value=&amp;quot;no&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;skip-exists-no&#039;)+&#039;&amp;lt;/label&amp;gt; &#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;exists-neither&amp;quot; name=&amp;quot;exists&amp;quot; value=&amp;quot;neither&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;skip-exists-neither&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			(JWB.sysop?&#039;&amp;lt;br&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;skipAfterAction&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;skip-after-action&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;:&#039;&#039;)+&lt;br /&gt;
			&#039;&amp;lt;hr/&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;label&amp;gt;&#039;+JWB.msg(&#039;skip-contains&#039;)+&#039; &amp;lt;input class=&amp;quot;fullwidth&amp;quot; type=&amp;quot;text&amp;quot; id=&amp;quot;skipContains&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;label&amp;gt;&#039;+JWB.msg(&#039;skip-not-contains&#039;)+&#039; &amp;lt;input class=&amp;quot;fullwidth&amp;quot; type=&amp;quot;text&amp;quot; id=&amp;quot;skipNotContains&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;div class=&amp;quot;regexswitch&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;containRegex&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;label-useregex&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;a class=&amp;quot;re101&amp;quot; href=&amp;quot;http://regex101.com/#javascript&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;?&amp;lt;/a&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label class=&amp;quot;divisor&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-regex-flags&#039;)+&#039;&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				JWB.msg(&#039;label-regex-flags&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;containFlags&amp;quot;/&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/div&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;hr/&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;skip-cg-prefix&#039;)+&#039;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;skip-category&#039;)+&#039; &amp;lt;input class=&amp;quot;fullwidth&amp;quot; type=&amp;quot;text&amp;quot; id=&amp;quot;skipCategories&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;&lt;br /&gt;
	);&lt;br /&gt;
	if (JWB.sysop) $(&#039;.JWBtabc[data-tab=&amp;quot;4&amp;quot;]&#039;).html(&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&#039;+JWB.msg(&#039;move-header&#039;)+&#039;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;suppressRedir&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;move-redir-suppress&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			JWB.msg(&#039;move-also&#039;)+&#039; &#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;movetalk&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;move-talk-page&#039;)+&#039;&amp;lt;/label&amp;gt; &#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;movesubpage&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;move-subpage&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&#039;+JWB.msg(&#039;move-new-name&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;moveTo&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;legend&amp;gt;&#039;+JWB.msg(&#039;protect-header&#039;)+&#039;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			JWB.msg(&#039;protect-edit&#039;)+&lt;br /&gt;
			&#039; &amp;lt;select id=&amp;quot;editProt&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;all&amp;quot; selected&amp;gt;&#039;+JWB.msg(&#039;protect-none&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;autoconfirmed&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;protect-autoconf&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;sysop&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;protect-sysop&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/select&amp;gt; &#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			JWB.msg(&#039;protect-move&#039;)+&lt;br /&gt;
			&#039; &amp;lt;select id=&amp;quot;moveProt&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;&amp;quot; selected&amp;gt;(&#039;+JWB.msg(&#039;protect-like-edit&#039;)+&#039;)&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;all&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;protect-none&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;autoconfirmed&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;protect-autoconf&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;sysop&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;protect-sysop&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/select&amp;gt; &#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			JWB.msg(&#039;protect-upload&#039;)+&lt;br /&gt;
			&#039; &amp;lt;select id=&amp;quot;uploadProt&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;&amp;quot; selected&amp;gt;(&#039;+JWB.msg(&#039;protect-like-edit&#039;)+&#039;)&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;all&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;protect-none&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;autoconfirmed&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;protect-autoconf&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;option value=&amp;quot;sysop&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;protect-sysop&#039;)+&#039;&amp;lt;/option&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/select&amp;gt; &#039;+&lt;br /&gt;
			&#039;&amp;lt;br&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&#039;+JWB.msg(&#039;protect-expiry&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;protectExpiry&amp;quot;/&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;button id=&amp;quot;movePage&amp;quot; disabled accesskey=&amp;quot;m&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-move&#039;)+&#039;&amp;lt;/button&amp;gt; &#039;+&lt;br /&gt;
		&#039;&amp;lt;button id=&amp;quot;deletePage&amp;quot; disabled accesskey=&amp;quot;x&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-delete&#039;)+&#039;&amp;lt;/button&amp;gt; &#039;+&lt;br /&gt;
		&#039;&amp;lt;button id=&amp;quot;protectPage&amp;quot; disabled accesskey=&amp;quot;z&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-protect&#039;)+&#039;&amp;lt;/button&amp;gt; &#039;+&lt;br /&gt;
		&#039;&amp;lt;button id=&amp;quot;skipPage&amp;quot; disabled title=&amp;quot;[&#039;+JWB.tooltip+&#039;n]&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;editbutton-skip&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;&lt;br /&gt;
	);&lt;br /&gt;
	$(&#039;.JWBtabc[data-tab=&amp;quot;5&amp;quot;]&#039;).html(&#039;&amp;lt;table id=&amp;quot;actionlog&amp;quot;&amp;gt;&amp;lt;tbody&amp;gt;&amp;lt;/tbody&amp;gt;&amp;lt;/table&amp;gt;&#039;);&lt;br /&gt;
	$(&#039;#pagelistPopup form&#039;).html(&lt;br /&gt;
		&#039;&amp;lt;div id=&amp;quot;ns-filter&amp;quot; title=&amp;quot;&#039;+JWB.msg(&#039;tip-ns-select&#039;)+&#039;&amp;quot;&amp;gt;&#039; + JWB.msg(&#039;label-ns-select&#039;) + NSList + &#039;&amp;lt;/div&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;categorymembers&amp;quot; name=&amp;quot;categorymembers&amp;quot; value=&amp;quot;cm&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;legend-cm&#039;)+&#039;&amp;lt;/label&amp;gt;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-cm&#039;)+&#039;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;label-cm&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;cmtitle&amp;quot; id=&amp;quot;cmtitle&amp;quot; class=&amp;quot;fullwidth&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;div&amp;gt;&#039;+JWB.msg(&#039;cm-include&#039;)+&#039; &#039;+&lt;br /&gt;
				&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;cmtype-page&amp;quot; name=&amp;quot;cmtype&amp;quot; value=&amp;quot;page&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;cm-include-pages&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;cmtype-subcg&amp;quot; name=&amp;quot;cmtype&amp;quot; value=&amp;quot;subcat&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;cm-include-subcgs&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;cmtype-file&amp;quot; name=&amp;quot;cmtype&amp;quot; value=&amp;quot;file&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;cm-include-files&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/div&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;linksto&amp;quot; id=&amp;quot;linksto&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;legend-linksto&#039;)+&#039;&amp;lt;/label&amp;gt;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&#039;+JWB.msg(&#039;label-linksto&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;title&amp;quot; id=&amp;quot;linksto-title&amp;quot; class=&amp;quot;fullwidth&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;div&amp;gt;&#039;+JWB.msg(&#039;links-include&#039;)+&#039; &#039;+&lt;br /&gt;
				&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;backlinks&amp;quot; name=&amp;quot;backlinks&amp;quot; value=&amp;quot;bl&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;links-include-links&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;embeddedin&amp;quot; name=&amp;quot;embeddedin&amp;quot; value=&amp;quot;ei&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;links-include-templ&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;imageusage&amp;quot; name=&amp;quot;imageusage&amp;quot; value=&amp;quot;iu&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;links-include-files&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/div&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;div&amp;gt;&#039;+JWB.msg(&#039;links-redir&#039;)+&#039; &#039;+&lt;br /&gt;
				&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;rfilter-redir&amp;quot; name=&amp;quot;filterredir&amp;quot; value=&amp;quot;redirects&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;links-redir-redirs&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;rfilter-nonredir&amp;quot; name=&amp;quot;filterredir&amp;quot; value=&amp;quot;nonredirects&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;links-redir-noredirs&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;radio&amp;quot; id=&amp;quot;rfilter-all&amp;quot; name=&amp;quot;filterredir&amp;quot; value=&amp;quot;all&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;links-redir-all&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/div&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-link-redir&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				&#039;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;redirect&amp;quot; value=&amp;quot;true&amp;quot; checked id=&amp;quot;linksto-redir&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;label-link-redir&#039;)+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;prefixsearch&amp;quot; name=&amp;quot;prefixsearch&amp;quot; value=&amp;quot;ps&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;legend-ps&#039;)+&#039;&amp;lt;/label&amp;gt;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label&amp;gt;&#039;+JWB.msg(&#039;label-ps&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;pssearch&amp;quot; id=&amp;quot;pssearch&amp;quot; class=&amp;quot;fullwidth&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-ps-strict&#039;)+&#039;&amp;quot;&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; name=&amp;quot;allpages&amp;quot; value=&amp;quot;ap&amp;quot; id=&amp;quot;psstrict&amp;quot; checked&amp;gt; &#039;+JWB.msg(&#039;label-ps-strict&#039;)+&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;watchlistraw&amp;quot; name=&amp;quot;watchlistraw&amp;quot; value=&amp;quot;wr&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;legend-wr&#039;)+&#039;&amp;lt;/label&amp;gt;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			JWB.msg(&#039;label-wr&#039;)+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;proplinks&amp;quot; name=&amp;quot;links&amp;quot; value=&amp;quot;pl&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;legend-pl&#039;)+&#039;&amp;lt;/label&amp;gt;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-pl&#039;)+&#039;&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;label-pl&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;titles&amp;quot; name=&amp;quot;titles&amp;quot; class=&amp;quot;fullwidth&amp;quot;&amp;gt;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;proplinks&amp;quot; name=&amp;quot;search&amp;quot; value=&amp;quot;sr&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;legend-sr&#039;)+&#039;&amp;lt;/label&amp;gt;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;label title=&amp;quot;&#039;+JWB.msg(&#039;tip-sr&#039;)+&#039;\n&#039;+JWB.msg(&#039;placeholder-sr&#039;, &#039;insource:&#039;, &#039;intitle:&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
				JWB.msg(&#039;label-sr&#039;)+&#039; &amp;lt;input type=&amp;quot;text&amp;quot; id=&amp;quot;srsearch&amp;quot; name=&amp;quot;srsearch&amp;quot; placeholder=&amp;quot;&#039;+JWB.msg(&#039;placeholder-sr&#039;, &#039;insource:&#039;, &#039;intitle:&#039;)+&#039;&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;/label&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;fieldset class=&amp;quot;listSMW&amp;quot;&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;legend&amp;gt;&amp;lt;label&amp;gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot; id=&amp;quot;smwask&amp;quot; name=&amp;quot;smwask&amp;quot; value=&amp;quot;smw&amp;quot;&amp;gt; &#039;+JWB.msg(&#039;legend-smw&#039;, JWB.msg(&#039;smw-slow&#039;))+&#039;&amp;lt;/label&amp;gt;&amp;lt;/legend&amp;gt;&#039;+&lt;br /&gt;
			&#039;&amp;lt;textarea id=&amp;quot;smwquery&amp;quot; name=&amp;quot;smwquery&amp;quot; placeholder=&amp;quot;&#039;+JWB.msg(&#039;label-smw&#039;, &#039;\n|limit=500&#039;)+&#039;&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;/fieldset&amp;gt;&#039;+&lt;br /&gt;
		&#039;&amp;lt;button type=&amp;quot;submit&amp;quot;&amp;gt;&#039;+JWB.msg(&#039;pagelist-generate&#039;)+&#039;&amp;lt;/button&amp;gt;&#039;&lt;br /&gt;
	);&lt;br /&gt;
	if (JWB.hasSMW) {&lt;br /&gt;
		$(&#039;#pagelistPopup&#039;).addClass(&#039;hasSMW&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	$(&#039;body&#039;).addClass(&#039;AutoWikiBrowser&#039;); //allow easier custom styling of JWB.&lt;br /&gt;
	$(&#039;[accesskey]&#039;).each(function() {&lt;br /&gt;
		let lbl = this.accessKeyLabel || this.accessKey; // few browsers support accessKeyLabel, so fallback to accessKey.&lt;br /&gt;
		$(this).attr(&#039;title&#039;, &#039;[&#039;+lbl+&#039;]&#039;);&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	/***** Setup *****/&lt;br /&gt;
	JWB.setup.save(&#039;_blank&#039;); //default setup&lt;br /&gt;
	if (JWB.settings.hasOwnProperty(&#039;default&#039;)) {&lt;br /&gt;
		JWB.setup.apply();&lt;br /&gt;
	} else if (JWB.setup.initialised) {&lt;br /&gt;
		// If we already initialised, create the default settings profile.&lt;br /&gt;
		JWB.setup.save(&#039;default&#039;);&lt;br /&gt;
	}&lt;br /&gt;
	JWB.setup.extend({});&lt;br /&gt;
&lt;br /&gt;
	/***** Event handlers *****/&lt;br /&gt;
	&lt;br /&gt;
	//Alert user when leaving the tab, to prevent accidental closing.&lt;br /&gt;
	onbeforeunload = function() {&lt;br /&gt;
		return &amp;quot;Closing this tab will cause you to lose all progress.&amp;quot;;&lt;br /&gt;
	};&lt;br /&gt;
	ondragover = function(e) {&lt;br /&gt;
		e.preventDefault();&lt;br /&gt;
	};&lt;br /&gt;
	document.addEventListener(&amp;quot;securitypolicyviolation&amp;quot;, function(e) {&lt;br /&gt;
		console.log(&#039;violated CSP:&#039;, e);&lt;br /&gt;
		if (e.blockedURI == &#039;blob&#039;) {&lt;br /&gt;
			JWB.worker.supported = false; // tell the next JWB.worker.init() that it shouldn&#039;t even try.&lt;br /&gt;
		} else if (JWB &amp;amp;&amp;amp; JWB.msg) {&lt;br /&gt;
			alert(JWB.msg(&#039;csp-error&#039;, e.violatedDirective));&lt;br /&gt;
		}&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	$(&#039;.JWBtab&#039;).click(function() {&lt;br /&gt;
		$(&#039;.active&#039;).removeClass(&#039;active&#039;);&lt;br /&gt;
		$(this).addClass(&#039;active&#039;);&lt;br /&gt;
		$(&#039;.JWBtabc[data-tab=&amp;quot;&#039;+$(this).attr(&#039;data-tab&#039;)+&#039;&amp;quot;]&#039;).addClass(&#039;active&#039;);&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	function showRegexFlags() {&lt;br /&gt;
		// &amp;gt;&amp;gt;this&amp;lt;&amp;lt; is the element that&#039;s triggered&lt;br /&gt;
		$(this).parent().nextAll(&#039;label&#039;).toggle(this.checked);&lt;br /&gt;
	}&lt;br /&gt;
	$(&#039;body&#039;).on(&#039;change&#039;, &#039;#useRegex, #containRegex, .useRegex&#039;, showRegexFlags);&lt;br /&gt;
	&lt;br /&gt;
	$(&#039;#preparse-reset&#039;).click(function() {&lt;br /&gt;
		$(&#039;#articleList&#039;).val($(&#039;#articleList&#039;).val().replace(/#PRE-PARSE-STOP/g,&#039;&#039;).replace(/\n\n/g, &#039;\n&#039;));&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;#saveAs&#039;).click(function() {&lt;br /&gt;
		JWB.setup.save();&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;#loadSettings&#039;).change(function() {&lt;br /&gt;
		JWB.setup.apply(this.value);&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;#download&#039;).click(JWB.setup.download);&lt;br /&gt;
	$(&#039;#saveToWiki&#039;).click(JWB.setup.submit);&lt;br /&gt;
	$(&#039;#import&#039;).change(JWB.setup.import);&lt;br /&gt;
	ondrop = JWB.setup.import;&lt;br /&gt;
	$(&#039;#updateSetups&#039;).click(JWB.setup.load);&lt;br /&gt;
	$(&#039;#deleteSetup&#039;).click(JWB.setup.del);&lt;br /&gt;
	&lt;br /&gt;
	if (window.RETF) {&lt;br /&gt;
		$(&#039;#refreshRETF&#039;).click(RETF.load);&lt;br /&gt;
		$(&#039;#skipRETF&#039;).click(JWB.skipRETF);&lt;br /&gt;
		$(&#039;#enableRETF&#039;).change(function() {&lt;br /&gt;
			$(&#039;#skipRETF&#039;).css(&#039;visibility&#039;, this.checked ? &#039;visible&#039; : &#039;hidden&#039;);&lt;br /&gt;
		});&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	$(&#039;#replacesButton, #pagelistButton&#039;).click(function() {&lt;br /&gt;
		var popup = this.id.slice(0, -6); //omits the &#039;Button&#039; in the id by cutting off the last 6 characters&lt;br /&gt;
		$(&#039;#&#039;+popup+&#039;Popup, #overlay&#039;).show();&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;#overlay&#039;).click(function() {&lt;br /&gt;
		$(&#039;#replacesPopup, #pagelistPopup, #overlay&#039;).hide();&lt;br /&gt;
		JWB.pl.done = true;&lt;br /&gt;
		JWB.pl.stop();&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;.moreReplaces&#039;).click(function() {&lt;br /&gt;
		var location = $(this).data(&#039;insert&#039;); // either call $(this).before() or $(this).after()&lt;br /&gt;
		$(this)[location](findreplace);&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;#replacesPopup&#039;).on(&#039;keydown&#039;, &#039;.replaces:last&#039;, function(e) {&lt;br /&gt;
		if (e.which === 9) $(&#039;.moreReplaces[data-insert=&amp;quot;before&amp;quot;]&#039;)[0].click();&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	$(&#039;#pl-form&#039;).submit(function(e) {&lt;br /&gt;
		e.preventDefault();&lt;br /&gt;
		JWB.pl.generate();&lt;br /&gt;
		return false;&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;#pagelistPopup legend input&#039;).change(function() {&lt;br /&gt;
		//remove disabled attr when checked, add when not.&lt;br /&gt;
		$(this).parents(&#039;fieldset&#039;).find(&#039;input&#039;).not(&#039;legend input&#039;).prop(&#039;disabled&#039;, !this.checked);&lt;br /&gt;
		$(this).parents(&#039;fieldset&#039;).prop(&#039;disabled&#039;, !this.checked);&lt;br /&gt;
	}).trigger(&#039;change&#039;);&lt;br /&gt;
	$(&#039;#psstrict&#039;).change(function() {&lt;br /&gt;
		if (this.checked) {&lt;br /&gt;
			$(&#039;#pssearch&#039;).attr(&#039;name&#039;, &#039;apprefix&#039;);&lt;br /&gt;
		} else {&lt;br /&gt;
			$(&#039;#pssearch&#039;).attr(&#039;name&#039;, &#039;pssearch&#039;);&lt;br /&gt;
		}&lt;br /&gt;
	}).trigger(&#039;change&#039;);&lt;br /&gt;
	&lt;br /&gt;
	$(&#039;#resultWindow&#039;).on(&#039;click&#039;, &#039;tr[data-line]:not(.lineheader) *&#039;, function(e) {&lt;br /&gt;
		var line = +$(e.target).closest(&#039;tr[data-line]&#039;).data(&#039;line&#039;);&lt;br /&gt;
		var index = $(&#039;#editBoxArea&#039;).val().split(&#039;\n&#039;).slice(0, line-1).join(&#039;\n&#039;).length;&lt;br /&gt;
		$(&#039;#editBoxArea&#039;)[0].focus();&lt;br /&gt;
		JWB.fn.setSelection($(&#039;#editBoxArea&#039;)[0], index+1);&lt;br /&gt;
		JWB.fn.scrollSelection($(&#039;#editBoxArea&#039;)[0], index);&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	$(&#039;#removeDupes&#039;).click(function() {&lt;br /&gt;
		$(&#039;#articleList&#039;).val(JWB.fn.uniques($(&#039;#articleList&#039;).val().split(&#039;\n&#039;)).join(&#039;\n&#039;));&lt;br /&gt;
		JWB.pageCount();&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;#sortArticles&#039;).click(function() {&lt;br /&gt;
		$(&#039;#articleList&#039;).val($(&#039;#articleList&#039;).val().split(&#039;\n&#039;).sort().join(&#039;\n&#039;));&lt;br /&gt;
		JWB.pageCount();&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	$(&#039;#watchNow&#039;).click(JWB.api.watch);&lt;br /&gt;
	$(&#039;#autosave&#039;).change(function() {&lt;br /&gt;
		$(&#039;#throttle&#039;).prop(&#039;disabled&#039;, !this.checked);&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	$(&#039;#viaJWB&#039;).change(function() {&lt;br /&gt;
		$(&#039;#summary&#039;).parent(&#039;label&#039;)&lt;br /&gt;
			.toggleClass(&#039;viaJWB&#039;, this.checked)&lt;br /&gt;
			.attr(&#039;maxlength&#039;, 500 - this.checked*JWB.summarySuffix.length); // Change the max size of the allowed summary according to having a suffix or not.&lt;br /&gt;
	});&lt;br /&gt;
	$(&#039;#startbutton&#039;).click(JWB.start);&lt;br /&gt;
	$(&#039;#stopbutton&#039;).click(JWB.stop);&lt;br /&gt;
	$(&#039;#submitButton&#039;).click(JWB.api.submit);&lt;br /&gt;
	$(&#039;#previewButton&#039;).click(JWB.api.preview);&lt;br /&gt;
	$(&#039;#diffButton&#039;).click(JWB.api.diff);&lt;br /&gt;
	&lt;br /&gt;
	$(&#039;#skipButton, #skipPage&#039;).click(function() {&lt;br /&gt;
		JWB.log(&#039;skip&#039;, JWB.list[0].split(&#039;|&#039;)[0]);&lt;br /&gt;
		JWB.next();&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	if (JWB.sysop) {&lt;br /&gt;
		$(&#039;#movePage&#039;).click(function() {&lt;br /&gt;
			if ($(&#039;#moveTo&#039;).val().length === 0) {&lt;br /&gt;
				return alert(JWB.msg(&#039;alert-no-move&#039;));&lt;br /&gt;
			}&lt;br /&gt;
			JWB.api.move();&lt;br /&gt;
		});&lt;br /&gt;
		$(&#039;#protectPage&#039;).click(JWB.api.protect);&lt;br /&gt;
		$(&#039;#deletePage&#039;).click(JWB.api.del);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
//Disable JWB altogether when it&#039;s loaded on a page other than Project:AutoWikiBrowser/Script. This script shouldn&#039;t be loaded on any other page in the first place.&lt;br /&gt;
if (JWB.allowed === false) JWB = false;&lt;/div&gt;</summary>
		<author><name>BRNSystems</name></author>
	</entry>
	<entry>
		<id>https://theportalwiki.com/w/index.php?title=User:BRNSystems/common.css&amp;diff=179237</id>
		<title>User:BRNSystems/common.css</title>
		<link rel="alternate" type="text/html" href="https://theportalwiki.com/w/index.php?title=User:BRNSystems/common.css&amp;diff=179237"/>
		<updated>2022-08-22T12:53:11Z</updated>

		<summary type="html">&lt;p&gt;BRNSystems: add dark mode&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* WikimediaUI Dark Mode&lt;br /&gt;
 *&lt;br /&gt;
 * Wikimedia Design Team 2019-2021&lt;br /&gt;
 * Original authors:&lt;br /&gt;
 * - Volker E. – [[User:Volker_E._(WMF)]]&lt;br /&gt;
 * - Alex Hollender&lt;br /&gt;
 * - MusikAnimal&lt;br /&gt;
 * - Carolyn Li-Madeo&lt;br /&gt;
 * - Jdlrobson&lt;br /&gt;
 *&lt;br /&gt;
 * Original at https://en.wikipedia.org/wiki/User:Volker_E._(WMF)/dark-mode.css&lt;br /&gt;
 * Version for Gadget CSS skin override usage only.&lt;br /&gt;
 * Basically removed of all interaction element styles and&lt;br /&gt;
 * set to `html` instead of JS injected `.client-dark-mode` class.&lt;br /&gt;
 *&lt;br /&gt;
 * Last updated: 2021-04-20&lt;br /&gt;
 *&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/** To prevent &#039;jumping&#039; effect within #p-personal in Vector/Monobook. Overrides [[MediaWiki:Gadget-dark-mode-toggle-pagestyles.css]] **/&lt;br /&gt;
body.skin-vector-legacy :not(#pt-darkmode) + #pt-watchlist::before,&lt;br /&gt;
body.skin-monobook :not(#pt-darkmode) + #pt-watchlist::before {&lt;br /&gt;
	content: &amp;quot;Light mode&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media screen {&lt;br /&gt;
	&lt;br /&gt;
/* set height for monobook and timeless, because the filter in FF needs dimensions to get it to apply */&lt;br /&gt;
html {&lt;br /&gt;
    height: 100%;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Filter needs to reside on `html`, see https://phabricator.wikimedia.org/T221425#5153917 */&lt;br /&gt;
html,&lt;br /&gt;
/* All other selectors have `filter` double-applied to turn back to “normal” by inheritance */&lt;br /&gt;
html img,&lt;br /&gt;
html video,&lt;br /&gt;
html ogvjs,&lt;br /&gt;
html svg,&lt;br /&gt;
html iframe,&lt;br /&gt;
html .mw-no-invert,&lt;br /&gt;
html td .diffchange,&lt;br /&gt;
html .mwe-math-element,&lt;br /&gt;
html .wvui-typeahead-suggestion__thumbnail,&lt;br /&gt;
html .skin-minerva .mw-notification-visible .mw-notification-content,&lt;br /&gt;
/* Extensions */&lt;br /&gt;
html .cdx-menu-item__thumbnail, /* T311835 */&lt;br /&gt;
html .cx-slitem__image,&lt;br /&gt;
html .mw-mmv-overlay,&lt;br /&gt;
html .mw-mmv-pre-image,&lt;br /&gt;
html .mw-kartographer-map,&lt;br /&gt;
html .mw-kartographer-mapDialog-map,&lt;br /&gt;
html .ext-related-articles-card-list .ext-related-articles-card-thumb {&lt;br /&gt;
	filter: invert( 1 ) hue-rotate( 180deg );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Reset overrides, needed where double application above isn&#039;t working. */&lt;br /&gt;
/* Vector modern */&lt;br /&gt;
html .skin-vector .mw-logo-wordmark,&lt;br /&gt;
html .skin-vector .mw-logo-tagline,&lt;br /&gt;
html .skin-timeless .mw-wiki-title &amp;gt; img,&lt;br /&gt;
html .wvui-icon svg {&lt;br /&gt;
	filter: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Backgrounds */&lt;br /&gt;
html table,&lt;br /&gt;
html table.ambox-content,&lt;br /&gt;
html table.toccolours,&lt;br /&gt;
html .mw-notification,&lt;br /&gt;
html .mwe-popups,&lt;br /&gt;
html .infobox,&lt;br /&gt;
html .toc,&lt;br /&gt;
html .thumbinner,&lt;br /&gt;
html .wikitable,&lt;br /&gt;
html .cbnnr-main,&lt;br /&gt;
html .cx-callout,&lt;br /&gt;
html #simpleSearch,&lt;br /&gt;
html #simpleSearch #searchInput,&lt;br /&gt;
html #siteNotice #centralNotice .cnotice {&lt;br /&gt;
	background-color: #ddd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Borders */&lt;br /&gt;
html body,&lt;br /&gt;
html h1,&lt;br /&gt;
html h2,&lt;br /&gt;
html h3,&lt;br /&gt;
html h4,&lt;br /&gt;
html h5,&lt;br /&gt;
html h6,&lt;br /&gt;
html table.ambox-content,&lt;br /&gt;
html table.toccolours,&lt;br /&gt;
html .mw-notification,&lt;br /&gt;
html .infobox,&lt;br /&gt;
html .toc,&lt;br /&gt;
html .thumbinner,&lt;br /&gt;
html #mw-head,&lt;br /&gt;
html #mw-panel,&lt;br /&gt;
/* Vector 2022 uses a transparent border for margin collapsing&lt;br /&gt;
(T312822) so don&#039;t apply this rule there */&lt;br /&gt;
.skin-vector-legacy #content.mw-body,&lt;br /&gt;
html #simpleSearch,&lt;br /&gt;
html #simpleSearch #searchInput,&lt;br /&gt;
html #siteNotice #centralNotice .cnotice {&lt;br /&gt;
	border-color: #cdcbc8;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Links */&lt;br /&gt;
/* Links: normal */&lt;br /&gt;
html a,&lt;br /&gt;
html .vector-menu-tabs li a,&lt;br /&gt;
/* Backwards compatible VectorTabs, deprecated in MW v1.35. */&lt;br /&gt;
html .vectorTabs li a,&lt;br /&gt;
html .toctogglelabel,&lt;br /&gt;
html .mw-parser-output a.external,&lt;br /&gt;
html .mw-parser-output a.extiw,&lt;br /&gt;
html .mw-parser-output a.extiw:active,&lt;br /&gt;
html #mw-panel .portal .body li a {&lt;br /&gt;
	/* color: #69f; Proposal below for level AA conformance, see also https://phabricator.wikimedia.org/T233266&lt;br /&gt;
	   `#36c` is transformed by :root `filter` to be closer to chosen `#69f`. */&lt;br /&gt;
	color: #36c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Links: visited */&lt;br /&gt;
html a:visited,&lt;br /&gt;
html .mw-parser-output a.extiw:visited,&lt;br /&gt;
html #mw-panel .portal .body li a:visited {&lt;br /&gt;
	/* color: #709bbd; Proposal below uses to-be-standardized color from https://phabricator.wikimedia.org/T213778 */&lt;br /&gt;
	color: #6b4ba1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Links: red */&lt;br /&gt;
html a.new,&lt;br /&gt;
html .vector-menu-tabs li.new a,&lt;br /&gt;
html .vectorTabs li.new a {&lt;br /&gt;
	color: #ff6e6e;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* ::: Special Element Treatments ::: */&lt;br /&gt;
/* Image thumbnails */&lt;br /&gt;
html .thumbimage {&lt;br /&gt;
	border: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Content image (thumbnail) SVGs */&lt;br /&gt;
/* `*not( .mbox-image )` exception doesn&#039;t work for unclear reasons */&lt;br /&gt;
html .image img[ src*=&#039;svg&#039; ],&lt;br /&gt;
html img[ src*=&#039;Wiktionary-logo&#039;] {&lt;br /&gt;
	background-color: #fff;&lt;br /&gt;
	border-radius: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Dealing with false positives from selector above */&lt;br /&gt;
html .mw-echo-ui-notificationItemWidget-icon img[ src*=&#039;svg&#039; ],&lt;br /&gt;
html .mbox-image .image img[ src*=&#039;svg&#039; ],&lt;br /&gt;
/* Emoji generated by [[Template:Emoji]] */&lt;br /&gt;
html .emoji .image img,&lt;br /&gt;
/* Vote symbols on Talk pages */&lt;br /&gt;
html .image img[ alt^=&amp;quot;Symbol&amp;quot; ] {&lt;br /&gt;
	background-color: transparent;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page previews */&lt;br /&gt;
html .mwe-popups {&lt;br /&gt;
    box-shadow: 0 30px 90px -20px rgba( 0, 0, 0, 0.3 ), 0 0 1px #000;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
html .mwe-popups.flipped-y:after,&lt;br /&gt;
html .mwe-popups.flipped-x-y:after {&lt;br /&gt;
	border-top: 11px solid #ddd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
html .mwe-popups.mwe-popups-no-image-pointer:after {&lt;br /&gt;
	border-bottom: 11px solid #ddd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Contributions menu */&lt;br /&gt;
html .cx-callout-1:after {&lt;br /&gt;
	border-bottom-color: #ddd;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Mobile Wikipedia logo mobile header */&lt;br /&gt;
html .branding-box img {&lt;br /&gt;
	filter: brightness( 0 );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@-moz-document url-prefix() {&lt;br /&gt;
    body {&lt;br /&gt;
        background: #000;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@-moz-document url-prefix() {   &lt;br /&gt;
	@supports (overflow-clip-margin: 1px) {     &lt;br /&gt;
		body {&lt;br /&gt;
			background: #fff;&lt;br /&gt;
		}   &lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>BRNSystems</name></author>
	</entry>
</feed>