<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://thehillside.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maintenance+script</id>
	<title>The HILLSIDE - User contributions [en-gb]</title>
	<link rel="self" type="application/atom+xml" href="https://thehillside.info/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Maintenance+script"/>
	<link rel="alternate" type="text/html" href="https://thehillside.info/index.php/Special:Contributions/Maintenance_script"/>
	<updated>2026-04-06T08:51:16Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://thehillside.info/index.php?title=MediaWiki:Sidebar&amp;diff=2773</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=MediaWiki:Sidebar&amp;diff=2773"/>
		<updated>2020-07-01T10:17:15Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;MediaWiki:Sidebar&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
** EMAILUSER|emailuser&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=MediaWiki:Gadgets-definition&amp;diff=2772</id>
		<title>MediaWiki:Gadgets-definition</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=MediaWiki:Gadgets-definition&amp;diff=2772"/>
		<updated>2020-07-01T10:17:15Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;MediaWiki:Gadgets-definition&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== interface-gadgets ==&lt;br /&gt;
* site[ResourceLoader|default|peers=site-styles|dependencies=mediawiki.util,ext.gadget.site-styles]|site.js|NavFrame.js&lt;br /&gt;
* site-styles[ResourceLoader|default|hidden|targets=desktop,mobile]|site.css|NavFrame.css|enwp-boxes.css&lt;br /&gt;
* collapsibleTables[ResourceLoader|default]|collapsibleTables.js&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=MediaWiki:Gadget-site.js&amp;diff=2771</id>
		<title>MediaWiki:Gadget-site.js</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=MediaWiki:Gadget-site.js&amp;diff=2771"/>
		<updated>2020-07-01T10:17:15Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;MediaWiki:Gadget-site.js&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*global mw, $, importScript */&lt;br /&gt;
&lt;br /&gt;
// Add &amp;quot;mainpage&amp;quot; class to the body element&lt;br /&gt;
if (&lt;br /&gt;
	mw.config.get( &#039;wgIsMainPage&#039; ) &amp;amp;&amp;amp;&lt;br /&gt;
	mw.config.get( &#039;wgAction&#039; ) === &#039;view&#039;&lt;br /&gt;
) {&lt;br /&gt;
	$( function() {&lt;br /&gt;
		document.body.className += &#039; mainpage&#039;;&lt;br /&gt;
	});&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* End of extra pages */&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Hide prefix in category&lt;br /&gt;
 *&lt;br /&gt;
 * @source www.mediawiki.org/wiki/Snippets/Hide_prefix_in_category&lt;br /&gt;
 * @rev 5&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
var prefix = $.trim( $( &#039;#mw-cat-hideprefix&#039; ).text() ) || ( mw.config.get( &#039;wgTitle&#039; ) + &#039;/&#039; );&lt;br /&gt;
$( &#039;#mw-pages&#039; ).find( &#039;a&#039; ).text( function ( i, val ) {&lt;br /&gt;
    return val.slice( 0, prefix.length ) === prefix ? val.slice( prefix.length ) : val;&lt;br /&gt;
} );&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Load the CodeReview &#039;tooltips&#039; gadget on [[MediaWiki roadmap]] subpages,&lt;br /&gt;
 * so it&#039;s available for the revision reports where it&#039;s particularly useful&lt;br /&gt;
 * @author: Happy-melon&lt;br /&gt;
 */&lt;br /&gt;
if ( mw.config.get( &#039;wgPageName&#039; ).match( /^MediaWiki_roadmap/ ) ) {&lt;br /&gt;
	mw.loader.load( &#039;ext.codereview.tooltips&#039; );&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @source https://www.mediawiki.org/wiki/Snippets/Load_JS_and_CSS_by_URL&lt;br /&gt;
 * @revision 2017-05-16&lt;br /&gt;
 */&lt;br /&gt;
mw.loader.using( [&#039;mediawiki.util&#039;], function () {&lt;br /&gt;
	var extraCSS = mw.util.getParamValue( &#039;withCSS&#039; ),&lt;br /&gt;
		extraJS = mw.util.getParamValue( &#039;withJS&#039; ),&lt;br /&gt;
		extraModule = mw.util.getParamValue( &#039;withModule&#039; );&lt;br /&gt;
&lt;br /&gt;
	if ( extraCSS ) {&lt;br /&gt;
		// WARNING: DO NOT REMOVE THIS &amp;quot;IF&amp;quot; - REQUIRED FOR SECURITY (against XSS/CSRF attacks)&lt;br /&gt;
		if ( /^MediaWiki:[^&amp;amp;&amp;lt;&amp;gt;=%#]*\.css$/.test( extraCSS ) ) {&lt;br /&gt;
			mw.loader.load( &#039;/w/index.php?title=&#039; + encodeURIComponent( extraCSS ) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/css&#039;, &#039;text/css&#039; );&lt;br /&gt;
		} else {&lt;br /&gt;
			mw.notify( &#039;Only pages from the MediaWiki namespace are allowed.&#039;, { title: &#039;Invalid withCSS value&#039; } );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ( extraJS ) {&lt;br /&gt;
		// WARNING: DO NOT REMOVE THIS &amp;quot;IF&amp;quot; - REQUIRED FOR SECURITY (against XSS/CSRF attacks)&lt;br /&gt;
		if ( /^MediaWiki:[^&amp;amp;&amp;lt;&amp;gt;=%#]*\.js$/.test( extraJS ) ) {&lt;br /&gt;
			mw.loader.load( &#039;/w/index.php?title=&#039; + encodeURIComponent( extraJS ) + &#039;&amp;amp;action=raw&amp;amp;ctype=text/javascript&#039; );&lt;br /&gt;
		} else {&lt;br /&gt;
			mw.notify( &#039;Only pages from the MediaWiki namespace are allowed.&#039;, { title: &#039;Invalid withJS value&#039; } );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ( extraModule ) {&lt;br /&gt;
		if ( /^ext\.gadget\.[^,\|]+$/.test( extraModule ) ) {&lt;br /&gt;
			mw.loader.load( extraModule );&lt;br /&gt;
		} else {&lt;br /&gt;
			mw.notify( &#039;Only gadget modules are allowed.&#039;, { title: &#039;Invalid withModule value&#039; } );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
});&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Hide specified prefixen&lt;br /&gt;
 *&lt;br /&gt;
 * @rev: 1&lt;br /&gt;
 * @author: MZMcBride&lt;br /&gt;
 */&lt;br /&gt;
$( function () {&lt;br /&gt;
	$(&#039;.hide-prefix&#039;).find(&#039;li a&#039;).text( function( i, val ) { return val.replace($(&#039;.hide-prefix&#039;).data(&#039;prefix&#039;), &#039;&#039;) } );&lt;br /&gt;
});&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=MediaWiki:Gadget-site.css&amp;diff=2770</id>
		<title>MediaWiki:Gadget-site.css</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=MediaWiki:Gadget-site.css&amp;diff=2770"/>
		<updated>2020-07-01T10:17:14Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;MediaWiki:Gadget-site.css&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/*&lt;br /&gt;
This is the CSS for all skins (for all users) on MediaWiki.org.&lt;br /&gt;
&lt;br /&gt;
SECTIONS:&lt;br /&gt;
 1. Indication of namespaces&lt;br /&gt;
 2. Color classes for content&lt;br /&gt;
 3. Special pages&lt;br /&gt;
 4. Main page styling&lt;br /&gt;
 5. Wikitables, warnings, and other such stylings&lt;br /&gt;
 6. Templates&lt;br /&gt;
 7. Some other small things&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 1. INDICATION OF NAMESPACES&lt;br /&gt;
 * -------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* #content for Vector and Monobook, #mw-content for Timeless */&lt;br /&gt;
&lt;br /&gt;
/* NS Help (Public Domain icon) */&lt;br /&gt;
.action-view.ns-12 #bodyContent {&lt;br /&gt;
	background-image: url(//upload.wikimedia.org/wikipedia/mediawiki/6/67/PD-icon-faded.png);&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
	/* @noflip */ background-position: right 5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 2. COLOR CLASSES FOR CONTENT&lt;br /&gt;
 * -------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* Border colors */&lt;br /&gt;
.borderc1 { border-color: #e9e9e9; border-width: thin; }&lt;br /&gt;
.borderc2 { border-color: #a2a9b1; border-width: thin; }&lt;br /&gt;
.borderc3 { border-color: #72777d; border-width: thin; }&lt;br /&gt;
.borderc4 { border-color: #000000; border-width: thin; }&lt;br /&gt;
.borderc5 { border-color: #c00000; border-width: thin; }&lt;br /&gt;
.borderc6 { border-color: #025e9d; border-width: thin; }&lt;br /&gt;
.borderc7 { border-color: #008040; border-width: thin; }&lt;br /&gt;
.borderc8 { border-color: #ffcc33; border-width: thin; } /* Used by [[Template:Welcome]]. */&lt;br /&gt;
&lt;br /&gt;
/* Background colors */&lt;br /&gt;
.backgroundc1 { background-color: #ffffff; } /* Used by [[Template:Welcome]]. */&lt;br /&gt;
.backgroundc2 { background-color: #f8f9fa; }&lt;br /&gt;
.backgroundc3 { background-color: #eaecf0; }&lt;br /&gt;
.backgroundc4 { background-color: #e0e0e0; }&lt;br /&gt;
.backgroundc5 { background-color: #d2d2d2; }&lt;br /&gt;
.backgroundc6 { background-color: #b7b7b7; }&lt;br /&gt;
.backgroundc7 { background-color: #a3a3a3; }&lt;br /&gt;
.backgroundc8 { background-color: #444455; }&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 3. SPECIAL PAGES&lt;br /&gt;
 * -------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* Consistent special page navigation */&lt;br /&gt;
.SpecialPageInfo {&lt;br /&gt;
	background-color: #f8f9fa;&lt;br /&gt;
	background-image: url(//upload.wikimedia.org/wikipedia/commons/thumb/8/89/Exquisite-khelpcenter.png/35px-Exquisite-khelpcenter.png);&lt;br /&gt;
	background-position: 0.8em 0.5em;&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
	padding: 0.3em 0.5em 0.3em 5.0em;&lt;br /&gt;
	border-color: #025e9d;&lt;br /&gt;
	border-width: 1px;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
	border-bottom-width: medium;&lt;br /&gt;
	margin-bottom: 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-viewprevnext {&lt;br /&gt;
	display: block;&lt;br /&gt;
	border: 1px solid #c8ccd1;&lt;br /&gt;
	background-color: #f9f9f2;&lt;br /&gt;
	padding: 0.2em 0.4em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Hide elements on the main page. &lt;br /&gt;
 */&lt;br /&gt;
.page-MediaWiki #lastmod,&lt;br /&gt;
.page-MediaWiki #siteSub,&lt;br /&gt;
.page-MediaWiki #contentSub,&lt;br /&gt;
.page-MediaWiki .subtitle,&lt;br /&gt;
.page-MediaWiki #jump-to-nav,&lt;br /&gt;
.page-MediaWiki .firstHeading {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 5. WIKITABLES, WARNINGS AND OTHER SUCH STYLINGS&lt;br /&gt;
 * -------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* Custom h* styles (blue headings) */&lt;br /&gt;
.wikitable td.hl3,&lt;br /&gt;
.wikitable th.hl3 {&lt;br /&gt;
	background-color: #8da7d6;&lt;br /&gt;
}&lt;br /&gt;
.wikitable td.hl1,&lt;br /&gt;
.wikitable th.hl1 {&lt;br /&gt;
	background: #c5d8fc;&lt;br /&gt;
}&lt;br /&gt;
.wikitable td.hl2,&lt;br /&gt;
.wikitable th.hl2 {&lt;br /&gt;
	background: #a7c1f2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Make entire table valign=top, to replace the |valign=top| on every cell. */&lt;br /&gt;
.vatop tr,&lt;br /&gt;
tr.vatop,&lt;br /&gt;
.vatop td,&lt;br /&gt;
.vatop th {&lt;br /&gt;
	vertical-align: top;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* General purpose &amp;quot;pretty (data) tables&amp;quot; */&lt;br /&gt;
table.datatable tr:hover {&lt;br /&gt;
	background-color: #a7d7f9;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* SideBox styling */&lt;br /&gt;
div.sideBox {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	float: right;&lt;br /&gt;
	background: white;&lt;br /&gt;
	margin-left: 1em;&lt;br /&gt;
	border: 1px solid gray;&lt;br /&gt;
	padding: 0.3em;&lt;br /&gt;
	width: 200px;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	clear: right;&lt;br /&gt;
}&lt;br /&gt;
div.sideBox dl {&lt;br /&gt;
	padding: 0;&lt;br /&gt;
	margin: 0 0 0.3em 0;&lt;br /&gt;
	font-size: 96%;&lt;br /&gt;
}&lt;br /&gt;
div.sideBox dl dt {&lt;br /&gt;
	background: none;&lt;br /&gt;
	margin: 0.4em 0 0 0;&lt;br /&gt;
}&lt;br /&gt;
div.sideBox dl dd {&lt;br /&gt;
	margin: 0.1em 0 0 1.1em;&lt;br /&gt;
	background-color: #f3f3f3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Major warning - used on the main page template to warn against editing carelessly, but can be used elsewhere as well */&lt;br /&gt;
.majorwarning {&lt;br /&gt;
	background: #fef6e7;&lt;br /&gt;
	padding: 0.3em;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	font-size: 125%;&lt;br /&gt;
	border: 1px solid #fc3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Page headings used throughout the wiki (though not very much at the time of writing…) */&lt;br /&gt;
.page-notice,&lt;br /&gt;
.page-warning {&lt;br /&gt;
	border-width: 1px;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
	padding: 0.3em 0.5em;&lt;br /&gt;
	margin-bottom: 1em;&lt;br /&gt;
	width: 95%;&lt;br /&gt;
	margin-left: auto;&lt;br /&gt;
	margin-right: auto;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Informative notices at the top of pages (blue) */&lt;br /&gt;
.page-notice {&lt;br /&gt;
	background-color: #f8f9fa;&lt;br /&gt;
	border-color: #025e9d;&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Warning information at the top of pages (red) */&lt;br /&gt;
.page-warning {&lt;br /&gt;
	background-color: #ffffff;&lt;br /&gt;
	border-color: #c51919;&lt;br /&gt;
	border-width: 2px;&lt;br /&gt;
}&lt;br /&gt;
.pw-head {&lt;br /&gt;
	color: #c51919;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Code conventions examples&lt;br /&gt;
 * Usage: [[mw:CC/JS]], [[mw:CC/CSS]]&lt;br /&gt;
 * &amp;lt;syntaxhighlight lang=&amp;quot;..&amp;quot; class=&amp;quot;tpl-code-positive&amp;quot;&amp;gt;&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
 */&lt;br /&gt;
.tpl-code-positive.mw-highlight pre,&lt;br /&gt;
.tpl-code-negative.mw-highlight pre {&lt;br /&gt;
  /* Reset default browser margin of pre (usually margin: 1em 0;)&lt;br /&gt;
     to be all around */&lt;br /&gt;
  margin: 1em;&lt;br /&gt;
}&lt;br /&gt;
/* Use a double selector to override mw-highlight default background color */&lt;br /&gt;
.tpl-code-positive.mw-highlight {&lt;br /&gt;
  background: #fff;&lt;br /&gt;
  border: 2px solid #00af89;&lt;br /&gt;
}&lt;br /&gt;
.tpl-code-negative.mw-highlight {&lt;br /&gt;
  background: #fff;&lt;br /&gt;
  border: 2px solid #d33;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 6. TEMPLATES&lt;br /&gt;
 * -------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
 &lt;br /&gt;
/* [[Template:Extension]], [[Template:Skin]] */&lt;br /&gt;
.tpl-infobox {&lt;br /&gt;
	box-sizing: border-box;&lt;br /&gt;
	border: 2px solid #a2a9b1;&lt;br /&gt;
	width: 280px;&lt;br /&gt;
	/* @noflip */ clear: right;&lt;br /&gt;
	/* @noflip */ float: right;&lt;br /&gt;
	margin: 0 0 0.5em 0.5em;&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
	background-color: white;&lt;br /&gt;
}&lt;br /&gt;
.tpl-infobox td {&lt;br /&gt;
	border: 2px none #a2a9b1;&lt;br /&gt;
	padding: 0.2em 0.5em;&lt;br /&gt;
	border-bottom: 1px solid #f0f0f0 !important;&lt;br /&gt;
}&lt;br /&gt;
.tpl-infobox-header {&lt;br /&gt;
	background-color: #a2a9b1;&lt;br /&gt;
	color: white;&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
.tpl-infobox-header td {&lt;br /&gt;
	padding-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
.ext-infobox-header img {&lt;br /&gt;
	padding: 0 0.2em 0 0.5em;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-unstable,&lt;br /&gt;
.ext-status-unstable td {&lt;br /&gt;
	border-color: #d33;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-unstable .ext-infobox-header {&lt;br /&gt;
	background-color: #d33;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-unstable .ext-infobox-header a {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-experimental,&lt;br /&gt;
.ext-status-experimental td {&lt;br /&gt;
	border-color: #ff4500;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-experimental .ext-infobox-header {&lt;br /&gt;
	background-color: #ff4500;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-beta,&lt;br /&gt;
.ext-status-beta td {&lt;br /&gt;
	border-color: #fc3;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-beta .ext-infobox-header {&lt;br /&gt;
	color: #000;&lt;br /&gt;
	background-color: #fc3;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ext-status-stable,&lt;br /&gt;
.ext-status-stable td {&lt;br /&gt;
	border-color: #00af89;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-stable .ext-infobox-header {&lt;br /&gt;
	background-color: #00af89;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-stable .ext-infobox-header a {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-unmaintained,&lt;br /&gt;
.ext-status-unmaintained td {&lt;br /&gt;
	border-color: #ac6600;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-unmaintained .ext-infobox-header {&lt;br /&gt;
	background-color: #ac6600;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-unmaintained .ext-infobox-header a {&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-magic,&lt;br /&gt;
.ext-status-magic td {&lt;br /&gt;
	border-color: #fe57a1;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-magic .ext-infobox-header {&lt;br /&gt;
	color: #000;&lt;br /&gt;
	background: #FFDBEB url(//upload.wikimedia.org/wikipedia/commons/thumb/2/20/Magic_wand.svg/60px-Magic_wand.svg.png) 0 0 no-repeat;&lt;br /&gt;
}&lt;br /&gt;
.ext-status-magic .ext-infobox-header img {&lt;br /&gt;
	visibility: hidden;&lt;br /&gt;
	padding-right: 1em;&lt;br /&gt;
}&lt;br /&gt;
.skin-infobox,&lt;br /&gt;
.skin-infobox td {&lt;br /&gt;
	border-color: #a7d7f9;&lt;br /&gt;
}&lt;br /&gt;
.skin-infobox-header {&lt;br /&gt;
	color: #000;&lt;br /&gt;
	background: #e2f4ff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* [[Template:See also]], [[Template:rellink]] etc. */&lt;br /&gt;
.rellink,&lt;br /&gt;
.dablink,&lt;br /&gt;
.mw-tpl-rellink {&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	padding-bottom: 0.4em;&lt;br /&gt;
	padding-left: 0;&lt;br /&gt;
	margin-bottom: 0.4em;&lt;br /&gt;
	color: #555;&lt;br /&gt;
	border-bottom: 1px solid #ccc;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* [[Template:Notice]] */&lt;br /&gt;
.block-note {&lt;br /&gt;
	background-image: url(//upload.wikimedia.org/wikipedia/commons/thumb/6/60/Bulbgraph.png/18px-Bulbgraph.png);&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
/*&lt;br /&gt;
 * Using block-contents in the hope that it can apply to all block-level warning templates,&lt;br /&gt;
 * with different images applied as backgrounds to the wrapping DIV.&lt;br /&gt;
 */&lt;br /&gt;
.block-contents {&lt;br /&gt;
	display: block;&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* [[Template:Documentation]] */&lt;br /&gt;
.template-documentation {&lt;br /&gt;
	clear: both;&lt;br /&gt;
	margin: 1em 0 0 0;&lt;br /&gt;
	border: 1px solid #aaa;&lt;br /&gt;
	background-color: #ecfcf4;&lt;br /&gt;
	padding: 5px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* [[Template:Navbox]] */&lt;br /&gt;
.navbox {&lt;br /&gt;
	/* Navbox container style */&lt;br /&gt;
	border: 1px solid #aaa;&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	margin: auto;&lt;br /&gt;
	clear: both;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	padding: 1px;&lt;br /&gt;
}&lt;br /&gt;
.navbox-inner,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	width: 100%;&lt;br /&gt;
}&lt;br /&gt;
table.navbox + table.navbox {&lt;br /&gt;
	/* Single pixel border between adjacent navboxes */&lt;br /&gt;
	margin-top: -1px;&lt;br /&gt;
	/* (doesn&#039;t work for IE6, but that&#039;s okay) */&lt;br /&gt;
}&lt;br /&gt;
.navbox th,&lt;br /&gt;
.navbox-title,&lt;br /&gt;
.navbox-abovebelow {&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	/* Title and above/below styles */&lt;br /&gt;
	padding-left: 1em;&lt;br /&gt;
	padding-right: 1em;&lt;br /&gt;
}&lt;br /&gt;
th.navbox-group {&lt;br /&gt;
	/* Group style */&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.navbox,&lt;br /&gt;
.navbox-subgroup {&lt;br /&gt;
	background: #fdfdfd;&lt;br /&gt;
}&lt;br /&gt;
.navbox-list {&lt;br /&gt;
	/* Must match background color */&lt;br /&gt;
	border-color: #fdfdfd;&lt;br /&gt;
}&lt;br /&gt;
.navbox th,&lt;br /&gt;
.navbox-title {&lt;br /&gt;
	/* Level 1 color */&lt;br /&gt;
	background: #eaeeff;&lt;br /&gt;
}&lt;br /&gt;
.navbox-abovebelow,&lt;br /&gt;
th.navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-title {&lt;br /&gt;
	/* Level 2 color */&lt;br /&gt;
	background: #ddddff;&lt;br /&gt;
}&lt;br /&gt;
.navbox-subgroup .navbox-group,&lt;br /&gt;
.navbox-subgroup .navbox-abovebelow {&lt;br /&gt;
	/* Level 3 color */&lt;br /&gt;
	background: #e6e6ff;&lt;br /&gt;
}&lt;br /&gt;
.navbox-even {&lt;br /&gt;
	/* Even row striping */&lt;br /&gt;
	background: #f7f7f7;&lt;br /&gt;
}&lt;br /&gt;
.navbox-odd {&lt;br /&gt;
	/* Odd row striping */&lt;br /&gt;
	background: transparent;&lt;br /&gt;
}&lt;br /&gt;
.navbox .hlist td dl,&lt;br /&gt;
.navbox .hlist td ol,&lt;br /&gt;
.navbox .hlist td ul,&lt;br /&gt;
.navbox td.hlist dl,&lt;br /&gt;
.navbox td.hlist ol,&lt;br /&gt;
.navbox td.hlist ul {&lt;br /&gt;
	/* Adjust hlist padding in navboxes */&lt;br /&gt;
	padding: 0.125em 0;&lt;br /&gt;
}&lt;br /&gt;
.navbox .hlist dd,&lt;br /&gt;
.navbox .hlist dt,&lt;br /&gt;
.navbox .hlist li {&lt;br /&gt;
	/* Nowrap list items in navboxes */&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.navbox .hlist dd dl,&lt;br /&gt;
.navbox .hlist dt dl,&lt;br /&gt;
.navbox .hlist li ol,&lt;br /&gt;
.navbox .hlist li ul {&lt;br /&gt;
	/* But allow parent list items to be wrapped */&lt;br /&gt;
	white-space: normal;&lt;br /&gt;
}&lt;br /&gt;
ol + table.navbox,&lt;br /&gt;
ul + table.navbox {&lt;br /&gt;
	/* Prevent lists from clinging to navboxes */&lt;br /&gt;
	margin-top: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* [[Template:Navbar]] */&lt;br /&gt;
.navbar {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	font-size: 88%;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
.navbar ul {&lt;br /&gt;
	display: inline;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.navbar li {&lt;br /&gt;
	word-spacing: -0.125em;&lt;br /&gt;
}&lt;br /&gt;
/* Navbar styling when nested in navbox */&lt;br /&gt;
.navbox .navbar {&lt;br /&gt;
	display: block;&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
.navbox-title .navbar {&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	float: left;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	text-align: left;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	margin-right: 0.5em;&lt;br /&gt;
	width: 6em;&lt;br /&gt;
}&lt;br /&gt;
/* [[Template:Cmd]] */&lt;br /&gt;
.cmd:before {&lt;br /&gt;
	content: &amp;quot;$ &amp;quot;;&lt;br /&gt;
	color: #246;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * 7. SOME OTHER SMALL THINGS&lt;br /&gt;
 * -------------------------------------------------&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
/* Allow people to optionally wrap lines in source listings */&lt;br /&gt;
div.wrapPreLines pre {&lt;br /&gt;
	white-space: pre-wrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Give a bit of space to the TOC */&lt;br /&gt;
#toc {&lt;br /&gt;
	margin: 1em 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Allow limiting of which header levels are shown in a TOC;&lt;br /&gt;
 * &amp;lt;div class=&amp;quot;toclimit-3&amp;quot;&amp;gt;, for instance, will limit to&lt;br /&gt;
 * showing ==headings== and ===headings=== but no further.&lt;br /&gt;
 * Used in [[Template:TOC]]&lt;br /&gt;
 */&lt;br /&gt;
.toclimit-2 .toclevel-1 ul,&lt;br /&gt;
.toclimit-3 .toclevel-2 ul,&lt;br /&gt;
.toclimit-4 .toclevel-3 ul,&lt;br /&gt;
.toclimit-5 .toclevel-4 ul,&lt;br /&gt;
.toclimit-6 .toclevel-5 ul,&lt;br /&gt;
.toclimit-7 .toclevel-6 ul {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* make the list of references look smaller and highlight clicked reference in blue */&lt;br /&gt;
ol.references {&lt;br /&gt;
	font-size: 100%;&lt;br /&gt;
}&lt;br /&gt;
.references-small {&lt;br /&gt;
	font-size: 90%;&lt;br /&gt;
}&lt;br /&gt;
ol.references &amp;gt; li:target {&lt;br /&gt;
	background-color: #ddeeff;&lt;br /&gt;
}&lt;br /&gt;
sup.reference:target {&lt;br /&gt;
	background-color: #ddeeff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Styling for links generated by [[MediaWiki:Edittools]]&lt;br /&gt;
 * @source www.mediawiki.org/wiki/Extension:CharInsert#Styling&lt;br /&gt;
 * @updated 2012-02-29&lt;br /&gt;
 */&lt;br /&gt;
.mw-charinsert-buttons {&lt;br /&gt;
	margin-top: 10px;&lt;br /&gt;
	border: 1px solid #a2a9b1;&lt;br /&gt;
	padding: 1px;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	font-size: 110%;&lt;br /&gt;
}&lt;br /&gt;
.mw-charinsert-buttons a {&lt;br /&gt;
	color: black;&lt;br /&gt;
	background-color: #cde !important;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
	font-size: .9em;&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
	border: thin #069 outset;&lt;br /&gt;
	padding: 0 .1em .1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-charinsert-buttons a:hover,&lt;br /&gt;
.mw-charinsert-buttons a:active {&lt;br /&gt;
	background-color: #bcd;&lt;br /&gt;
	border-style: inset;&lt;br /&gt;
}&lt;br /&gt;
.client-js .mw-edittools-section {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
.client-js .mw-edittools-section input[type=&amp;quot;button&amp;quot;] {&lt;br /&gt;
	font-size: 0.9em;&lt;br /&gt;
	padding-left: 1px;&lt;br /&gt;
	padding-right: 1px;&lt;br /&gt;
	margin-left: 1px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* from [[User:Splarka/Help:Linked images]] */&lt;br /&gt;
.imagelink_wikilogo a {&lt;br /&gt;
	width: 135px;&lt;br /&gt;
	height: 135px;&lt;br /&gt;
	display: block;&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
	background-image: url(//upload.wikimedia.org/wikipedia/mediawiki/b/bc/Wiki.png);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Infoboxes&lt;br /&gt;
 */&lt;br /&gt;
.infobox {&lt;br /&gt;
	float: right;&lt;br /&gt;
	clear: right;&lt;br /&gt;
	margin-bottom: 0.5em;&lt;br /&gt;
	margin-left: 1em;&lt;br /&gt;
	padding: 0.2em;&lt;br /&gt;
	border: 1px solid #AAA;&lt;br /&gt;
	background: #f8f9fa;&lt;br /&gt;
	color: black;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox td,&lt;br /&gt;
.infobox th {&lt;br /&gt;
	vertical-align: top;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox caption {&lt;br /&gt;
	margin-left: inherit;&lt;br /&gt;
	font-size: larger;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.bordered {&lt;br /&gt;
	border-collapse: collapse;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.bordered td,&lt;br /&gt;
.infobox.bordered th {&lt;br /&gt;
	border: 1px solid #AAA;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.infobox.bordered .borderless td,&lt;br /&gt;
.infobox.bordered .borderless th {&lt;br /&gt;
	border: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Apparently the namespaces parameter&lt;br /&gt;
 * for inputbox forces a checkbox.&lt;br /&gt;
 * Let&#039;s hide it in the API sidebar&lt;br /&gt;
 */&lt;br /&gt;
.mw-inputbox-hideapicheck label[for=&amp;quot;mw-inputbox-ns104&amp;quot;],&lt;br /&gt;
#mw-inputbox-ns104 {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Testing for code review */&lt;br /&gt;
div.mw-wordcloud {&lt;br /&gt;
	width: 100%;&lt;br /&gt;
	text-align: justify;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-wordcloud-size-1 {&lt;br /&gt;
	color: #222;&lt;br /&gt;
	font-size: 2.4em;&lt;br /&gt;
}&lt;br /&gt;
.mw-wordcloud-size-2 {&lt;br /&gt;
	color: #333;&lt;br /&gt;
	font-size: 2.2em;&lt;br /&gt;
}&lt;br /&gt;
.mw-wordcloud-size-3 {&lt;br /&gt;
	color: #444;&lt;br /&gt;
	font-size: 2.0em;&lt;br /&gt;
}&lt;br /&gt;
.mw-wordcloud-size-4 {&lt;br /&gt;
	color: #555;&lt;br /&gt;
	font-size: 1.8em;&lt;br /&gt;
}&lt;br /&gt;
.mw-wordcloud-size-5 {&lt;br /&gt;
	color: #666;&lt;br /&gt;
	font-size: 1.6em;&lt;br /&gt;
}&lt;br /&gt;
.mw-wordcloud-size-6 {&lt;br /&gt;
	color: #777;&lt;br /&gt;
	font-size: 1.4em;&lt;br /&gt;
}&lt;br /&gt;
.mw-wordcloud-size-7 {&lt;br /&gt;
	color: #888;&lt;br /&gt;
	font-size: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
.mw-wordcloud-size-8 {&lt;br /&gt;
	color: #999;&lt;br /&gt;
	font-size: 1em;&lt;br /&gt;
}&lt;br /&gt;
.mw-wordcloud-size-9 {&lt;br /&gt;
	color: #aaa;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
	letter-spacing: 3px;&lt;br /&gt;
}&lt;br /&gt;
.mw-wordcloud-size-10,&lt;br /&gt;
.mw-wordcloud-size-0 {&lt;br /&gt;
	color: #bbb;&lt;br /&gt;
	font-size: 0.8em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* @todo FIXME: document me :) */&lt;br /&gt;
#signuptopbox li {&lt;br /&gt;
	float: left;&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	font-family: sans-serif;&lt;br /&gt;
}&lt;br /&gt;
#signuptopbox li {&lt;br /&gt;
	color: #3ca7d4;&lt;br /&gt;
	background: #c2e1f9;&lt;br /&gt;
	line-height: 2.8em;&lt;br /&gt;
	margin-right: .25em;&lt;br /&gt;
	padding-right: .5em;&lt;br /&gt;
}&lt;br /&gt;
#signuptopbox li.pr-active,&lt;br /&gt;
#signuptopbox li.pr-active div {&lt;br /&gt;
	color: #67ca36;&lt;br /&gt;
	background: #d4f9c2;&lt;br /&gt;
	border-color: #fff #fff #fff #67ca36;&lt;br /&gt;
}&lt;br /&gt;
#signuptopbox li div {&lt;br /&gt;
	width: 0;&lt;br /&gt;
	height: 0;&lt;br /&gt;
	border-color: #fff #fff #fff #3CA7D4;&lt;br /&gt;
	border-style: solid;&lt;br /&gt;
	border-width: 1.4em .3em 1.4em 1.4em;&lt;br /&gt;
	float: left;&lt;br /&gt;
}&lt;br /&gt;
#signuptopbox li span.pr-number {&lt;br /&gt;
	display: block;&lt;br /&gt;
	width: 1.8em;&lt;br /&gt;
	line-height: 1.8em;&lt;br /&gt;
	background: #3ca7d4;&lt;br /&gt;
	color: #c2e1f9;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	margin: .5em;&lt;br /&gt;
	-webkit-border-radius: 50%;&lt;br /&gt;
	-moz-border-radius: 50%;&lt;br /&gt;
	-ms-border-radius: 50%;&lt;br /&gt;
	-o-border-radius: 50%;&lt;br /&gt;
	border-radius: 50%;&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	float: left;&lt;br /&gt;
}&lt;br /&gt;
#signuptopbox li.pr-active span.pr-number {&lt;br /&gt;
	background: #67ca36;&lt;br /&gt;
	color: #d4f9c2;&lt;br /&gt;
}&lt;br /&gt;
#signuptopbox li span {&lt;br /&gt;
	float: left;&lt;br /&gt;
}&lt;br /&gt;
#signuptopbox li.pr-spacer {&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Breadcrumb code */&lt;br /&gt;
.breadcrumb {&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	font: 14px Helvetica, Arial, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
.breadcrumb li {&lt;br /&gt;
	float: left;&lt;br /&gt;
	margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
.breadcrumb li a {&lt;br /&gt;
	color: white;&lt;br /&gt;
	text-decoration: none;&lt;br /&gt;
	padding: 10px 0 10px 45px;&lt;br /&gt;
	position: relative;&lt;br /&gt;
	display: block;&lt;br /&gt;
	float: left;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.breadcrumb li a:after {&lt;br /&gt;
	content: &amp;quot; &amp;quot;;&lt;br /&gt;
	display: block;&lt;br /&gt;
	width: 0;&lt;br /&gt;
	height: 0;&lt;br /&gt;
	/* Go big on the size, and let overflow hide */&lt;br /&gt;
	border-top: 50px solid transparent;&lt;br /&gt;
	border-bottom: 50px solid transparent;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	top: 50%;&lt;br /&gt;
	margin-top: -50px;&lt;br /&gt;
	left: 100%;&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.breadcrumb li a:before {&lt;br /&gt;
	content: &amp;quot; &amp;quot;;&lt;br /&gt;
	display: block;&lt;br /&gt;
	width: 0;&lt;br /&gt;
	height: 0;&lt;br /&gt;
	border-top: 50px solid transparent;&lt;br /&gt;
	border-bottom: 50px solid transparent;&lt;br /&gt;
	border-left: 31px solid white;&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	top: 50%;&lt;br /&gt;
	margin-top: -50px;&lt;br /&gt;
	margin-left: 1px;&lt;br /&gt;
	left: 100%;&lt;br /&gt;
	z-index: 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.breadcrumb li:first-child a {&lt;br /&gt;
	padding-left: 20px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.currentcrumb a {&lt;br /&gt;
	background: #069;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.currentcrumb a:after {&lt;br /&gt;
	border-left: 30px solid #069;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.currentcrumb a:hover,&lt;br /&gt;
.prevcrumb a:hover,&lt;br /&gt;
.nextcrumb a:hover {&lt;br /&gt;
	background: #002d44;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.currentcrumb a:hover:after,&lt;br /&gt;
.prevcrumb a:hover:after,&lt;br /&gt;
.nextcrumb a:hover:after {&lt;br /&gt;
	border-left-color: #002d44 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.prevcrumb a {&lt;br /&gt;
	background: #396;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.prevcrumb a:after {&lt;br /&gt;
	border-left: 30px solid #396;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.nextcrumb a {&lt;br /&gt;
	background: #999;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.nextcrumb a:after {&lt;br /&gt;
	border-left: 30px solid #999;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* To facilitate rtl translations */&lt;br /&gt;
#bodyContent .table-RTL a {&lt;br /&gt;
	background: none;&lt;br /&gt;
	padding-right: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#bodyContent .table-RTL ul {&lt;br /&gt;
	margin-right: 10px;&lt;br /&gt;
	display: table;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fix annoying bug where the &amp;quot;date&amp;quot; column in the LQT sometimes&lt;br /&gt;
 * is two rows because of the date being too long even through there is&lt;br /&gt;
 * enough space (otherwise the browser makes it&#039;s own decision on where to cut)&lt;br /&gt;
 */&lt;br /&gt;
.lqt_toc th:nth-child(3),&lt;br /&gt;
.lqt_toc td:nth-child(3) {&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.persian {&lt;br /&gt;
	font-family: Tahoma;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Fonts for Persian language for consistency with other Wikimedia wikis */&lt;br /&gt;
:lang(fa) {&lt;br /&gt;
  font-family: Tahoma, &#039;Iranian Sans&#039;, &#039;DejaVu Sans&#039;, sans-serif;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * Manual:Database_layout&lt;br /&gt;
 */&lt;br /&gt;
.mwmanual-dbview-box img {&lt;br /&gt;
	opacity: 0.5;&lt;br /&gt;
}&lt;br /&gt;
.mwmanual-dbview-box:hover img {&lt;br /&gt;
	opacity: 0.8;&lt;br /&gt;
}&lt;br /&gt;
.mwmanual-dbview-link {&lt;br /&gt;
	background: rgb(198, 212, 235);&lt;br /&gt;
	background: hsla(217, 48%, 85%, 0.8);&lt;br /&gt;
	border: 1px solid #0645AD;&lt;br /&gt;
	border-radius: 4px;&lt;br /&gt;
	padding: 10px 5px;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.mwmanual-dbview-box:hover .mwmanual-dbview-link {&lt;br /&gt;
	background: hsla(215, 46%, 95%, 0.8);&lt;br /&gt;
}&lt;br /&gt;
.mwmanual-dbview-link:hover {&lt;br /&gt;
	background: hsla(215, 46%, 95%, 0.9);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * VisualEditor documentation styles - required for displaying document diagrams&lt;br /&gt;
 */&lt;br /&gt;
.ve-doc-dm-data {&lt;br /&gt;
	list-style: none;&lt;br /&gt;
	cursor: default;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-data li {&lt;br /&gt;
	font-family: sans-serif;&lt;br /&gt;
	text-align: center;&lt;br /&gt;
	line-height: 2.25em;&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	width: 2.25em;&lt;br /&gt;
	height: 2.25em;&lt;br /&gt;
	border: solid 2px white;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-data li.ve-doc-dm-cursor {&lt;br /&gt;
	width: 0.5em;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-cursor:hover {&lt;br /&gt;
	border-color: #c8ccd1;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-open,&lt;br /&gt;
.ve-doc-dm-close {&lt;br /&gt;
	background-color: #50a5f4;&lt;br /&gt;
	color: #7ddcfd;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-open:hover,&lt;br /&gt;
.ve-doc-dm-close:hover {&lt;br /&gt;
	border-color: #7ddcfd;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-close {&lt;br /&gt;
	background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGQAAABkCAYAAABw4pVUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJhJREFUeNrs0UENgEAQBMGThGMkImFBAp8jTVKVjIHptT4yM8eza947F2KIIYYYYoghBmKIgRhiIIYYiCGG18QQQwwxxBBDDMQQAzHEQAwxEEMMMTYHESMWRIwfBhEjFESMUBAxQkHECAURIxREjFAQMUJBxAgFESMURAwa2a9b1a2a9b1a2a9b1a2a9b1a2a9b1GCfW4ABAPk3h3InIbNlAAAAAElFTkSuQmCC);&lt;br /&gt;
	background-size: contain;&lt;br /&gt;
	background-position: left top;&lt;br /&gt;
	background-repeat: no-repeat;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-char,&lt;br /&gt;
.ve-doc-dm-achar {&lt;br /&gt;
	border-radius: 3em;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-char {&lt;br /&gt;
	background-color: #7bcc45;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-char:hover {&lt;br /&gt;
	border-color: #b6f26c;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-achar {&lt;br /&gt;
	background-color: #fa952c;&lt;br /&gt;
	color: #fff;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-achar:hover {&lt;br /&gt;
	border-color: #fed045;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-element-text {&lt;br /&gt;
	color: #50a5f4;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-char-text {&lt;br /&gt;
	color: #7bcc45;&lt;br /&gt;
}&lt;br /&gt;
.ve-doc-dm-achar-text {&lt;br /&gt;
	color: #fa952c;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* For templates in Category:VisualEditor tests templates */&lt;br /&gt;
tt.ve-typing-test {&lt;br /&gt;
	color: white;&lt;br /&gt;
	background-color: black;&lt;br /&gt;
	padding: 0 1em 0 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * Style for horizontal lists (separator following item).&lt;br /&gt;
 * @source mediawiki.org/wiki/Snippets/Horizontal_lists&lt;br /&gt;
 * @revision 6 (2014-05-09)&lt;br /&gt;
 * @author [[User:Edokter]]&lt;br /&gt;
 */&lt;br /&gt;
.hlist dl,&lt;br /&gt;
.hlist ol,&lt;br /&gt;
.hlist ul {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	padding: 0;&lt;br /&gt;
}&lt;br /&gt;
/* Display list items inline */&lt;br /&gt;
.hlist dd,&lt;br /&gt;
.hlist dt,&lt;br /&gt;
.hlist li {&lt;br /&gt;
	margin: 0;&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
/* Display nested lists inline */&lt;br /&gt;
.hlist.inline,&lt;br /&gt;
.hlist.inline dl,&lt;br /&gt;
.hlist.inline ol,&lt;br /&gt;
.hlist.inline ul,&lt;br /&gt;
.hlist dl dl, .hlist dl ol, .hlist dl ul,&lt;br /&gt;
.hlist ol dl, .hlist ol ol, .hlist ol ul,&lt;br /&gt;
.hlist ul dl, .hlist ul ol, .hlist ul ul {&lt;br /&gt;
	display: inline;&lt;br /&gt;
}&lt;br /&gt;
/* Generate interpuncts */&lt;br /&gt;
.hlist dt:after {&lt;br /&gt;
	content: &amp;quot;: &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
.mw-parser-output .hlist dd:after,&lt;br /&gt;
.mw-parser-output .hlist li:after {&lt;br /&gt;
	content: &amp;quot; · &amp;quot;;&lt;br /&gt;
	font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd:last-child:after,&lt;br /&gt;
.hlist dt:last-child:after,&lt;br /&gt;
.hlist li:last-child:after {&lt;br /&gt;
	content: none;&lt;br /&gt;
}&lt;br /&gt;
/* Add parentheses around nested lists */&lt;br /&gt;
.hlist dd dd:first-child:before, .hlist dd dt:first-child:before, .hlist dd li:first-child:before,&lt;br /&gt;
.hlist dt dd:first-child:before, .hlist dt dt:first-child:before, .hlist dt li:first-child:before,&lt;br /&gt;
.hlist li dd:first-child:before, .hlist li dt:first-child:before, .hlist li li:first-child:before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd dd:last-child:after, .hlist dd dt:last-child:after, .hlist dd li:last-child:after,&lt;br /&gt;
.hlist dt dd:last-child:after, .hlist dt dt:last-child:after, .hlist dt li:last-child:after,&lt;br /&gt;
.hlist li dd:last-child:after, .hlist li dt:last-child:after, .hlist li li:last-child:after {&lt;br /&gt;
	content: &amp;quot;) &amp;quot;;&lt;br /&gt;
	font-weight: normal;&lt;br /&gt;
}&lt;br /&gt;
/* Put ordinals in front of ordered list items */&lt;br /&gt;
.hlist ol {&lt;br /&gt;
	counter-reset: listitem;&lt;br /&gt;
}&lt;br /&gt;
.hlist ol &amp;gt; li {&lt;br /&gt;
	counter-increment: listitem;&lt;br /&gt;
}&lt;br /&gt;
.hlist ol &amp;gt; li:before {&lt;br /&gt;
	content: &amp;quot; &amp;quot; counter(listitem) &amp;quot; &amp;quot;;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
}&lt;br /&gt;
.hlist dd ol &amp;gt; li:first-child:before,&lt;br /&gt;
.hlist dt ol &amp;gt; li:first-child:before,&lt;br /&gt;
.hlist li ol &amp;gt; li:first-child:before {&lt;br /&gt;
	content: &amp;quot; (&amp;quot; counter(listitem) &amp;quot; &amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
/* end hlist */&lt;br /&gt;
&lt;br /&gt;
/* Unbulleted lists */&lt;br /&gt;
.plainlist ul {&lt;br /&gt;
    line-height: inherit;&lt;br /&gt;
    list-style: none none;&lt;br /&gt;
    margin: 0;&lt;br /&gt;
}&lt;br /&gt;
.plainlist ul li {&lt;br /&gt;
    margin-bottom: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Banner - Wikivoyage - Used to test MediaWiki/Homepage redesign/Preview */&lt;br /&gt;
 &lt;br /&gt;
.banner-image {&lt;br /&gt;
	position: relative;&lt;br /&gt;
	overflow: hidden;&lt;br /&gt;
	max-width: 1800px;&lt;br /&gt;
	height: auto;&lt;br /&gt;
	margin-bottom: .6em;&lt;br /&gt;
}&lt;br /&gt;
.banner-image img {&lt;br /&gt;
	max-width: 100%;&lt;br /&gt;
	height: auto;&lt;br /&gt;
	width: auto;&lt;br /&gt;
}&lt;br /&gt;
.banner-box {&lt;br /&gt;
	position: absolute;&lt;br /&gt;
	z-index: 2;&lt;br /&gt;
	margin-top: 2.5em;&lt;br /&gt;
	color: white;&lt;br /&gt;
	min-width: 20em;&lt;br /&gt;
	text-shadow: black 0.3em 0.3em 1em,black -0.1em -0.1em 1em;&lt;br /&gt;
}&lt;br /&gt;
.banner-box-wide { width: 80% }&lt;br /&gt;
.banner-box-left {&lt;br /&gt;
	left: 5%;&lt;br /&gt;
	text-align: left;&lt;br /&gt;
}&lt;br /&gt;
.banner-box-right {&lt;br /&gt;
	right: 5%;&lt;br /&gt;
	text-align: right;&lt;br /&gt;
}&lt;br /&gt;
.banner-box .name {&lt;br /&gt;
	font-size: 3em;&lt;br /&gt;
	white-space: nowrap;&lt;br /&gt;
	line-height: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
.banner-box .type {&lt;br /&gt;
	font-size: 2em;&lt;br /&gt;
	line-height: 1.2em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
.mf-mobile-only,&lt;br /&gt;
.lqt-talkpage-search {&lt;br /&gt;
	display: none;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Phabricator-like tag styling */&lt;br /&gt;
.phui-tag {&lt;br /&gt;
    -webkit-font-smoothing: antialiased;&lt;br /&gt;
    background-color: #e7e7e7;&lt;br /&gt;
    border-color: #e7e7e7;&lt;br /&gt;
    border-radius: 3px;&lt;br /&gt;
    border: 1px solid transparent;&lt;br /&gt;
    font: 13px &#039;Segoe UI&#039;,&#039;Segoe UI Web Regular&#039;,&#039;Segoe UI Symbol&#039;,&#039;Lato&#039;,&#039;Helvetica Neue&#039;,Helvetica,Arial,sans-serif;&lt;br /&gt;
    line-height: 1.51em;&lt;br /&gt;
    padding: 0 4px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.mw-body .phui-tag a.external {&lt;br /&gt;
    background-image: none;&lt;br /&gt;
    padding-right: 0;&lt;br /&gt;
    text-decoration: none;&lt;br /&gt;
    color: black;&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=MediaWiki:Gadget-enwp-boxes.css&amp;diff=2769</id>
		<title>MediaWiki:Gadget-enwp-boxes.css</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=MediaWiki:Gadget-enwp-boxes.css&amp;diff=2769"/>
		<updated>2020-07-01T10:17:14Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;MediaWiki:Gadget-enwp-boxes.css&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/** @source http://en.wikipedia.org/wiki/MediaWiki:Common.css | 2012-07-05 */&lt;br /&gt;
/** {{mbox}}, {{ambox}}, {{ombox}}, .. */&lt;br /&gt;
&lt;br /&gt;
/* Messagebox templates */&lt;br /&gt;
.messagebox {&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background-color: #f9f9f9;&lt;br /&gt;
    width: 80%;&lt;br /&gt;
    margin: 0 auto 1em auto;&lt;br /&gt;
    padding: .2em;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.merge {&lt;br /&gt;
    border: 1px solid #c0b8cc;&lt;br /&gt;
    background-color: #f0e5ff;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.cleanup {&lt;br /&gt;
    border: 1px solid #9f9fff;&lt;br /&gt;
    background-color: #efefff;&lt;br /&gt;
    text-align: center;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.standard-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
    margin: 4px auto;&lt;br /&gt;
}&lt;br /&gt;
/* For old WikiProject banners inside banner shells. */&lt;br /&gt;
.mbox-inside .standard-talk,&lt;br /&gt;
.messagebox.nested-talk {&lt;br /&gt;
    border: 1px solid #c0c090;&lt;br /&gt;
    background-color: #f8eaba;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    margin: 2px 0;&lt;br /&gt;
    padding: 2px;&lt;br /&gt;
}&lt;br /&gt;
.messagebox.small {&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 85%;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0 0 1em 1em;&lt;br /&gt;
    line-height: 1.25em; &lt;br /&gt;
}&lt;br /&gt;
.messagebox.small-talk {&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 85%;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    clear: both;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 0 0 1em 1em;&lt;br /&gt;
    line-height: 1.25em; &lt;br /&gt;
    background: #F8EABA;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Cell sizes for ambox/tmbox/imbox/cmbox/ombox/fmbox/dmbox message boxes */&lt;br /&gt;
th.mbox-text, td.mbox-text {   /* The message body cell(s) */&lt;br /&gt;
    border: none; &lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 0.25em 0.9em;     /* 0.9em left/right */&lt;br /&gt;
    width: 100%;               /* Make all mboxes the same width regardless of text length */&lt;br /&gt;
}&lt;br /&gt;
td.mbox-image {                /* The left image cell */&lt;br /&gt;
    border: none; &lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0 2px 0.9em;  /* 0.9em left, 0px right */&lt;br /&gt;
    text-align: center; &lt;br /&gt;
}&lt;br /&gt;
td.mbox-imageright {           /* The right image cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0.9em 2px 0;  /* 0px left, 0.9em right */&lt;br /&gt;
    text-align: center; &lt;br /&gt;
}&lt;br /&gt;
td.mbox-empty-cell {           /* An empty narrow cell */&lt;br /&gt;
    border: none;&lt;br /&gt;
    padding: 0px;&lt;br /&gt;
    width: 1px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Article message box styles */&lt;br /&gt;
table.ambox {&lt;br /&gt;
    margin: 0px 10%;                  /* 10% = Will not overlap with other elements */&lt;br /&gt;
    border: 1px solid #aaa; &lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #1e90ff;  /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
    background: #fbfbfb; &lt;br /&gt;
}&lt;br /&gt;
table.ambox + table.ambox {      /* Single border between stacked boxes. */&lt;br /&gt;
    margin-top: -1px;&lt;br /&gt;
}&lt;br /&gt;
.ambox th.mbox-text, &lt;br /&gt;
.ambox td.mbox-text {            /* The message body cell(s) */&lt;br /&gt;
    padding: 0.25em 0.5em;       /* 0.5em left/right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-image {           /* The left image cell */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0 2px 0.5em;    /* 0.5em left, 0px right */&lt;br /&gt;
}&lt;br /&gt;
.ambox td.mbox-imageright {      /* The right image cell */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    padding: 2px 0.5em 2px 0;    /* 0px left, 0.5em right */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.ambox-notice {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #1e90ff;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-speedy {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;                   /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-delete {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-content {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-style {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-move {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ambox-protection {&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    border-left: 10px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Image message box styles */&lt;br /&gt;
table.imbox {&lt;br /&gt;
    margin: 4px 10%; &lt;br /&gt;
    border-collapse: collapse; &lt;br /&gt;
    border: 3px solid #1e90ff;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
    background: #fbfbfb;&lt;br /&gt;
}&lt;br /&gt;
.imbox .mbox-text .imbox {  /* For imboxes inside imbox-text cells. */&lt;br /&gt;
    margin: 0 -0.5em;       /* 0.9 - 0.5 = 0.4em left/right.        */&lt;br /&gt;
    display: block;         /* Fix for webkit to force 100% width.  */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .imbox {       /* For imboxes inside other templates.  */&lt;br /&gt;
    margin: 4px;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.imbox-notice {&lt;br /&gt;
    border: 3px solid #1e90ff;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-speedy {&lt;br /&gt;
    border: 3px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-delete {&lt;br /&gt;
    border: 3px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-content {&lt;br /&gt;
    border: 3px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-style {&lt;br /&gt;
    border: 3px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-move {&lt;br /&gt;
    border: 3px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-protection {&lt;br /&gt;
    border: 3px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-license {&lt;br /&gt;
    border: 3px solid #88a;       /* Dark gray */&lt;br /&gt;
    background: #f7f8ff;          /* Light gray */&lt;br /&gt;
}&lt;br /&gt;
table.imbox-featured {&lt;br /&gt;
    border: 3px solid #cba135;    /* Brown-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Category message box styles */&lt;br /&gt;
table.cmbox {&lt;br /&gt;
    margin: 3px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #aaa; &lt;br /&gt;
    background: #DFE8FF;    /* Default &amp;quot;notice&amp;quot; blue */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.cmbox-notice {&lt;br /&gt;
    background: #D8E8FF;    /* Blue */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-speedy {&lt;br /&gt;
    margin-top: 4px;&lt;br /&gt;
    margin-bottom: 4px;&lt;br /&gt;
    border: 4px solid #b22222;    /* Red */&lt;br /&gt;
    background: #FFDBDB;          /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-delete {&lt;br /&gt;
    background: #FFDBDB;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-content {&lt;br /&gt;
    background: #FFE7CE;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-style {&lt;br /&gt;
    background: #FFF9DB;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-move {&lt;br /&gt;
    background: #E4D8FF;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.cmbox-protection {&lt;br /&gt;
    background: #EFEFE1;    /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Other pages message box styles */&lt;br /&gt;
table.ombox {&lt;br /&gt;
    margin: 4px 10%; &lt;br /&gt;
    border-collapse: collapse; &lt;br /&gt;
    border: 1px solid #aaa;       /* Default &amp;quot;notice&amp;quot; gray */&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.ombox-notice {&lt;br /&gt;
    border: 1px solid #aaa;       /* Gray */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-speedy {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-delete {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-content {&lt;br /&gt;
    border: 1px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-style {&lt;br /&gt;
    border: 1px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-move {&lt;br /&gt;
    border: 1px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.ombox-protection {&lt;br /&gt;
    border: 2px solid #bba;       /* Gray-gold */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Talk page message box styles */&lt;br /&gt;
table.tmbox {&lt;br /&gt;
    margin: 4px 10%;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    border: 1px solid #c0c090;    /* Default &amp;quot;notice&amp;quot; gray-brown */&lt;br /&gt;
    background: #f8eaba;&lt;br /&gt;
}&lt;br /&gt;
.mediawiki .mbox-inside .tmbox { /* For tmboxes inside other templates. The &amp;quot;mediawiki&amp;quot; class ensures that */&lt;br /&gt;
    margin: 2px 0;               /* this declaration overrides other styles (including mbox-small above)   */&lt;br /&gt;
    width: 100%;                 /* For Safari and Opera */&lt;br /&gt;
}&lt;br /&gt;
.mbox-inside .tmbox.mbox-small { /* &amp;quot;small&amp;quot; tmboxes should not be small when  */&lt;br /&gt;
    line-height: 1.5em;          /* also &amp;quot;nested&amp;quot;, so reset styles that are   */   &lt;br /&gt;
    font-size: 100%;             /* set in &amp;quot;mbox-small&amp;quot; above.                */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
table.tmbox-speedy {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
    background: #fee;             /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-delete {&lt;br /&gt;
    border: 2px solid #b22222;    /* Red */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-content {&lt;br /&gt;
    border: 2px solid #f28500;    /* Orange */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-style {&lt;br /&gt;
    border: 2px solid #f4c430;    /* Yellow */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-move {&lt;br /&gt;
    border: 2px solid #9932cc;    /* Purple */&lt;br /&gt;
}&lt;br /&gt;
table.tmbox-protection,&lt;br /&gt;
table.tmbox-notice {&lt;br /&gt;
    border: 1px solid #c0c090;    /* Gray-brown */&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Disambig and set index box styles */&lt;br /&gt;
table.dmbox {&lt;br /&gt;
    clear: both; &lt;br /&gt;
    margin: 0.9em 1em; &lt;br /&gt;
    border-top: 1px solid #ccc; &lt;br /&gt;
    border-bottom: 1px solid #ccc; &lt;br /&gt;
    background: transparent;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* Footer and header message box styles */&lt;br /&gt;
table.fmbox {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    width: 100%;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #f9f9f9;     /* Default &amp;quot;system&amp;quot; gray */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-system {&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-warning {&lt;br /&gt;
    border: 1px solid #bb7070;  /* Dark pink */&lt;br /&gt;
    background: #ffdbdb;        /* Pink */&lt;br /&gt;
}&lt;br /&gt;
table.fmbox-editnotice {&lt;br /&gt;
    background: transparent;&lt;br /&gt;
}&lt;br /&gt;
/* Div based &amp;quot;warning&amp;quot; style fmbox messages. */&lt;br /&gt;
.mediawiki .mw-warning-with-logexcerpt, /* Prepend .mediawiki to increase selector weight over skin */&lt;br /&gt;
.mw-lag-warn-high,&lt;br /&gt;
.mw-cascadeprotectedwarning,&lt;br /&gt;
#mw-protect-cascadeon {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    border: 1px solid #bb7070;&lt;br /&gt;
    background: #ffdbdb;&lt;br /&gt;
    padding: 0.25em 0.9em;&lt;br /&gt;
}&lt;br /&gt;
/* Div based &amp;quot;system&amp;quot; style fmbox messages. &lt;br /&gt;
   Used in [[MediaWiki:Readonly lag]]. */&lt;br /&gt;
div.mw-lag-warn-normal,&lt;br /&gt;
div.fmbox-system {&lt;br /&gt;
    clear: both;&lt;br /&gt;
    margin: 0.2em 0;&lt;br /&gt;
    border: 1px solid #aaa;&lt;br /&gt;
    background: #f9f9f9;&lt;br /&gt;
    padding: 0.25em 0.9em;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
/* These mbox-small classes must be placed after all other &lt;br /&gt;
   ambox/tmbox/ombox etc classes. &amp;quot;body.mediawiki&amp;quot; is so &lt;br /&gt;
   they override &amp;quot;table.ambox + table.ambox&amp;quot; above. */&lt;br /&gt;
body.mediawiki table.mbox-small {   /* For the &amp;quot;small=yes&amp;quot; option. */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    clear: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    float: right;&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 4px 0 4px 1em;&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;br /&gt;
body.mediawiki table.mbox-small-left {   /* For the &amp;quot;small=left&amp;quot; option. */&lt;br /&gt;
    /* @noflip */&lt;br /&gt;
    margin: 4px 1em 4px 0;&lt;br /&gt;
    width: 238px;&lt;br /&gt;
    border-collapse: collapse;&lt;br /&gt;
    font-size: 88%;&lt;br /&gt;
    line-height: 1.25em;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Yesno&amp;diff=2768</id>
		<title>Module:Yesno</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Yesno&amp;diff=2768"/>
		<updated>2020-07-01T10:17:13Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Yesno&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Function allowing for consistent treatment of boolean-like wikitext input.&lt;br /&gt;
-- It works similarly to the template {{yesno}}.&lt;br /&gt;
&lt;br /&gt;
return function (val, default)&lt;br /&gt;
	-- If your wiki uses non-ascii characters for any of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc., you&lt;br /&gt;
	-- should replace &amp;quot;val:lower()&amp;quot; with &amp;quot;mw.ustring.lower(val)&amp;quot; in the&lt;br /&gt;
	-- following line.&lt;br /&gt;
	val = type(val) == &#039;string&#039; and val:lower() or val&lt;br /&gt;
	if val == nil then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif val == true &lt;br /&gt;
		or val == &#039;yes&#039;&lt;br /&gt;
		or val == &#039;y&#039;&lt;br /&gt;
		or val == &#039;true&#039;&lt;br /&gt;
		or val == &#039;t&#039;&lt;br /&gt;
		or val == &#039;on&#039;&lt;br /&gt;
		or tonumber(val) == 1&lt;br /&gt;
	then&lt;br /&gt;
		return true&lt;br /&gt;
	elseif val == false&lt;br /&gt;
		or val == &#039;no&#039;&lt;br /&gt;
		or val == &#039;n&#039;&lt;br /&gt;
		or val == &#039;false&#039;&lt;br /&gt;
		or val == &#039;f&#039;&lt;br /&gt;
		or val == &#039;off&#039;&lt;br /&gt;
		or tonumber(val) == 0&lt;br /&gt;
	then&lt;br /&gt;
		return false&lt;br /&gt;
	else&lt;br /&gt;
		return default&lt;br /&gt;
	end&lt;br /&gt;
end&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Unsubst&amp;diff=2767</id>
		<title>Module:Unsubst</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Unsubst&amp;diff=2767"/>
		<updated>2020-07-01T10:17:13Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Unsubst&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local BODY_PARAM = &#039;$B&#039;&lt;br /&gt;
&lt;br /&gt;
local specialParams = {&lt;br /&gt;
	[&#039;$params&#039;] = &#039;parameter list&#039;,&lt;br /&gt;
	[&#039;$aliases&#039;] = &#039;parameter aliases&#039;,&lt;br /&gt;
	[&#039;$flags&#039;] = &#039;flags&#039;,&lt;br /&gt;
	[&#039;$B&#039;] = &#039;template content&#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, body)&lt;br /&gt;
	-- If we are substing, this function returns a template invocation, and if&lt;br /&gt;
	-- not, it returns the template body. The template body can be specified in&lt;br /&gt;
	-- the body parameter, or in the template parameter defined in the&lt;br /&gt;
	-- BODY_PARAM variable. This function can be called from Lua or from&lt;br /&gt;
	-- #invoke.&lt;br /&gt;
&lt;br /&gt;
	-- Return the template body if we aren&#039;t substing.&lt;br /&gt;
	if not mw.isSubsting() then&lt;br /&gt;
		if body ~= nil then&lt;br /&gt;
			return body&lt;br /&gt;
		elseif frame.args[BODY_PARAM] ~= nil then&lt;br /&gt;
			return frame.args[BODY_PARAM]&lt;br /&gt;
		else&lt;br /&gt;
			error(string.format(&lt;br /&gt;
				&amp;quot;no template content specified (use parameter &#039;%s&#039; from #invoke)&amp;quot;,&lt;br /&gt;
				BODY_PARAM&lt;br /&gt;
			), 2)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Sanity check for the frame object.&lt;br /&gt;
	if type(frame) ~= &#039;table&#039;&lt;br /&gt;
		or type(frame.getParent) ~= &#039;function&#039;&lt;br /&gt;
		or not frame:getParent()&lt;br /&gt;
	then&lt;br /&gt;
		error(&lt;br /&gt;
			&amp;quot;argument #1 to &#039;main&#039; must be a frame object with a parent &amp;quot; ..&lt;br /&gt;
			&amp;quot;frame available&amp;quot;,&lt;br /&gt;
			2&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Find the invocation name.&lt;br /&gt;
	local mTemplateInvocation = require(&#039;Module:Template invocation&#039;)&lt;br /&gt;
	local name = mTemplateInvocation.name(frame:getParent():getTitle())&lt;br /&gt;
&lt;br /&gt;
	-- Combine passed args with passed defaults&lt;br /&gt;
	local args = {}&lt;br /&gt;
	if string.find( &#039;,&#039;..(frame.args[&#039;$flags&#039;] or &#039;&#039;)..&#039;,&#039;, &#039;,%s*override%s*,&#039; ) then&lt;br /&gt;
		for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( frame.args ) do&lt;br /&gt;
			if not specialParams[k] then&lt;br /&gt;
				if v == &#039;__DATE__&#039; then&lt;br /&gt;
					v = mw.getContentLanguage():formatDate( &#039;F Y&#039; )&lt;br /&gt;
				end&lt;br /&gt;
				args[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for k, v in pairs( frame.args ) do&lt;br /&gt;
			if not specialParams[k] then&lt;br /&gt;
				if v == &#039;__DATE__&#039; then&lt;br /&gt;
					v = mw.getContentLanguage():formatDate( &#039;F Y&#039; )&lt;br /&gt;
				end&lt;br /&gt;
				args[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Trim parameters, if not specified otherwise&lt;br /&gt;
	if not string.find( &#039;,&#039;..(frame.args[&#039;$flags&#039;] or &#039;&#039;)..&#039;,&#039;, &#039;,%s*keep%-whitespace%s*,&#039; ) then&lt;br /&gt;
		for k, v in pairs( args ) do args[k] = mw.ustring.match(v, &#039;^%s*(.*)%s*$&#039;) or &#039;&#039; end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Pull information from parameter aliases&lt;br /&gt;
	local aliases = {}&lt;br /&gt;
	if frame.args[&#039;$aliases&#039;] then&lt;br /&gt;
		local list = mw.text.split( frame.args[&#039;$aliases&#039;], &#039;%s*,%s*&#039; )&lt;br /&gt;
		for k, v in ipairs( list ) do&lt;br /&gt;
			local tmp = mw.text.split( v, &#039;%s*&amp;gt;%s*&#039; )&lt;br /&gt;
			aliases[tonumber(mw.ustring.match(tmp[1], &#039;^[1-9][0-9]*$&#039;)) or tmp[1]] = ((tonumber(mw.ustring.match(tmp[2], &#039;^[1-9][0-9]*$&#039;))) or tmp[2])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs( aliases ) do&lt;br /&gt;
		if args[k] and ( not args[v] or args[v] == &#039;&#039; ) then&lt;br /&gt;
			args[v] = args[k]&lt;br /&gt;
		end&lt;br /&gt;
		args[k] = nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Remove empty parameters, if specified&lt;br /&gt;
	if string.find( &#039;,&#039;..(frame.args[&#039;$flags&#039;] or &#039;&#039;)..&#039;,&#039;, &#039;,%s*remove%-empty%s*,&#039; ) then&lt;br /&gt;
		local tmp = 0&lt;br /&gt;
		for k, v in ipairs( args ) do&lt;br /&gt;
			if v ~= &#039;&#039; or ( args[k+1] and args[k+1] ~= &#039;&#039; ) or ( args[k+2] and args[k+2] ~= &#039;&#039; ) then&lt;br /&gt;
				tmp = k&lt;br /&gt;
			else&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( args ) do&lt;br /&gt;
			if v == &#039;&#039; then&lt;br /&gt;
				if not (type(k) == &#039;number&#039; and k &amp;lt; tmp) then args[k] = nil end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Order parameters&lt;br /&gt;
	if frame.args[&#039;$params&#039;] then&lt;br /&gt;
		local params, tmp = mw.text.split( frame.args[&#039;$params&#039;], &#039;%s*,%s*&#039; ), {}&lt;br /&gt;
		for k, v in ipairs(params) do&lt;br /&gt;
			v = tonumber(mw.ustring.match(v, &#039;^[1-9][0-9]*$&#039;)) or v&lt;br /&gt;
			if args[v] then tmp[v], args[v] = args[v], nil end&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs(args) do tmp[k], args[k] = args[k], nil end&lt;br /&gt;
		args = tmp&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mTemplateInvocation.invocation(name, args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p[&#039;&#039;] = p.main -- For backwards compatibility&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:TableTools&amp;diff=2766</id>
		<title>Module:TableTools</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:TableTools&amp;diff=2766"/>
		<updated>2020-07-01T10:17:12Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:TableTools&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--                               TableTools                                       --&lt;br /&gt;
--                                                                                --&lt;br /&gt;
-- This module includes a number of functions for dealing with Lua tables.        --&lt;br /&gt;
-- It is a meta-module, meant to be called from other Lua modules, and should     --&lt;br /&gt;
-- not be called directly from #invoke.                                           --&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Define often-used variables and functions.&lt;br /&gt;
local floor = math.floor&lt;br /&gt;
local infinity = math.huge&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local checkTypeMulti = libraryUtil.checkTypeMulti&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isPositiveInteger&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given value is a positive integer, and false&lt;br /&gt;
-- if not. Although it doesn&#039;t operate on tables, it is included here as it is&lt;br /&gt;
-- useful for determining whether a given table key is in the array part or the&lt;br /&gt;
-- hash part of a table.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.isPositiveInteger(v)&lt;br /&gt;
	return type(v) == &#039;number&#039; and v &amp;gt;= 1 and floor(v) == v and v &amp;lt; infinity&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- isNan&lt;br /&gt;
--&lt;br /&gt;
-- This function returns true if the given number is a NaN value, and false&lt;br /&gt;
-- if not. Although it doesn&#039;t operate on tables, it is included here as it is&lt;br /&gt;
-- useful for determining whether a value can be a valid table key. Lua will&lt;br /&gt;
-- generate an error if a NaN is used as a table key.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.isNan(v)&lt;br /&gt;
	return type(v) == &#039;number&#039; and tostring(v) == &#039;-nan&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- shallowClone&lt;br /&gt;
--&lt;br /&gt;
-- This returns a clone of a table. The value returned is a new table, but all&lt;br /&gt;
-- subtables and functions are shared. Metamethods are respected, but the returned&lt;br /&gt;
-- table will have no metatable of its own.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.shallowClone(t)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		ret[k] = v&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- removeDuplicates&lt;br /&gt;
--&lt;br /&gt;
-- This removes duplicate values from an array. Non-positive-integer keys are&lt;br /&gt;
-- ignored. The earliest value is kept, and all subsequent duplicate values are&lt;br /&gt;
-- removed, but otherwise the array order is unchanged.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.removeDuplicates(t)&lt;br /&gt;
	checkType(&#039;removeDuplicates&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local isNan = p.isNan&lt;br /&gt;
	local ret, exists = {}, {}&lt;br /&gt;
	for i, v in ipairs(t) do&lt;br /&gt;
		if isNan(v) then&lt;br /&gt;
			-- NaNs can&#039;t be table keys, and they are also unique, so we don&#039;t need to check existence.&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
		else&lt;br /&gt;
			if not exists[v] then&lt;br /&gt;
				ret[#ret + 1] = v&lt;br /&gt;
				exists[v] = true&lt;br /&gt;
			end&lt;br /&gt;
		end	&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end			&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numKeys&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of any numerical&lt;br /&gt;
-- keys that have non-nil values, sorted in numerical order.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.numKeys(t)&lt;br /&gt;
	checkType(&#039;numKeys&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local isPositiveInteger = p.isPositiveInteger&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		if isPositiveInteger(k) then&lt;br /&gt;
			nums[#nums + 1] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- affixNums&lt;br /&gt;
--&lt;br /&gt;
-- This takes a table and returns an array containing the numbers of keys with the&lt;br /&gt;
-- specified prefix and suffix. For example, for the table&lt;br /&gt;
-- {a1 = &#039;foo&#039;, a3 = &#039;bar&#039;, a6 = &#039;baz&#039;} and the prefix &amp;quot;a&amp;quot;, affixNums will&lt;br /&gt;
-- return {1, 3, 6}.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.affixNums(t, prefix, suffix)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 2, prefix, &#039;string&#039;, true)&lt;br /&gt;
	checkType(&#039;affixNums&#039;, 3, suffix, &#039;string&#039;, true)&lt;br /&gt;
&lt;br /&gt;
	local function cleanPattern(s)&lt;br /&gt;
		-- Cleans a pattern so that the magic characters ()%.[]*+-?^$ are interpreted literally.&lt;br /&gt;
		return s:gsub(&#039;([%(%)%%%.%[%]%*%+%-%?%^%$])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	prefix = prefix or &#039;&#039;&lt;br /&gt;
	suffix = suffix or &#039;&#039;&lt;br /&gt;
	prefix = cleanPattern(prefix)&lt;br /&gt;
	suffix = cleanPattern(suffix)&lt;br /&gt;
	local pattern = &#039;^&#039; .. prefix .. &#039;([1-9]%d*)&#039; .. suffix .. &#039;$&#039;&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		if type(k) == &#039;string&#039; then			&lt;br /&gt;
			local num = mw.ustring.match(k, pattern)&lt;br /&gt;
			if num then&lt;br /&gt;
				nums[#nums + 1] = tonumber(num)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(nums)&lt;br /&gt;
	return nums&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- numData&lt;br /&gt;
--&lt;br /&gt;
-- Given a table with keys like (&amp;quot;foo1&amp;quot;, &amp;quot;bar1&amp;quot;, &amp;quot;foo2&amp;quot;, &amp;quot;baz2&amp;quot;), returns a table&lt;br /&gt;
-- of subtables in the format &lt;br /&gt;
-- { [1] = {foo = &#039;text&#039;, bar = &#039;text&#039;}, [2] = {foo = &#039;text&#039;, baz = &#039;text&#039;} }&lt;br /&gt;
-- Keys that don&#039;t end with an integer are stored in a subtable named &amp;quot;other&amp;quot;.&lt;br /&gt;
-- The compress option compresses the table so that it can be iterated over with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.numData(t, compress)&lt;br /&gt;
	checkType(&#039;numData&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;numData&#039;, 2, compress, &#039;boolean&#039;, true)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		local prefix, num = mw.ustring.match(tostring(k), &#039;^([^0-9]*)([1-9][0-9]*)$&#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			num = tonumber(num)&lt;br /&gt;
			local subtable = ret[num] or {}&lt;br /&gt;
			if prefix == &#039;&#039; then&lt;br /&gt;
				-- Positional parameters match the blank string; put them at the start of the subtable instead.&lt;br /&gt;
				prefix = 1&lt;br /&gt;
			end&lt;br /&gt;
			subtable[prefix] = v&lt;br /&gt;
			ret[num] = subtable&lt;br /&gt;
		else&lt;br /&gt;
			local subtable = ret.other or {}&lt;br /&gt;
			subtable[k] = v&lt;br /&gt;
			ret.other = subtable&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if compress then&lt;br /&gt;
		local other = ret.other&lt;br /&gt;
		ret = p.compressSparseArray(ret)&lt;br /&gt;
		ret.other = other&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- compressSparseArray&lt;br /&gt;
--&lt;br /&gt;
-- This takes an array with one or more nil values, and removes the nil values&lt;br /&gt;
-- while preserving the order, so that the array can be safely traversed with&lt;br /&gt;
-- ipairs.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.compressSparseArray(t)&lt;br /&gt;
	checkType(&#039;compressSparseArray&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		ret[#ret + 1] = t[num]&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- sparseIpairs&lt;br /&gt;
--&lt;br /&gt;
-- This is an iterator for sparse arrays. It can be used like ipairs, but can&lt;br /&gt;
-- handle nil values.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
function p.sparseIpairs(t)&lt;br /&gt;
	checkType(&#039;sparseIpairs&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local nums = p.numKeys(t)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	local lim = #nums&lt;br /&gt;
	return function ()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if i &amp;lt;= lim then&lt;br /&gt;
			local key = nums[i]&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
-- size&lt;br /&gt;
--&lt;br /&gt;
-- This returns the size of a key/value pair table. It will also work on arrays,&lt;br /&gt;
-- but for arrays it is more efficient to use the # operator.&lt;br /&gt;
------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
function p.size(t)&lt;br /&gt;
	checkType(&#039;size&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for k in pairs(t) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	return i&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function defaultKeySort(item1, item2)&lt;br /&gt;
	-- &amp;quot;number&amp;quot; &amp;lt; &amp;quot;string&amp;quot;, so numbers will be sorted before strings.&lt;br /&gt;
	local type1, type2 = type(item1), type(item2)&lt;br /&gt;
	if type1 ~= type2 then&lt;br /&gt;
		return type1 &amp;lt; type2&lt;br /&gt;
	else -- This will fail with table, boolean, function.&lt;br /&gt;
		return item1 &amp;lt; item2&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Returns a list of the keys in a table, sorted using either a default&lt;br /&gt;
	comparison function or a custom keySort function.&lt;br /&gt;
]]&lt;br /&gt;
function p.keysToList(t, keySort, checked)&lt;br /&gt;
	if not checked then&lt;br /&gt;
		checkType(&#039;keysToList&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
		checkTypeMulti(&#039;keysToList&#039;, 2, keySort, { &#039;function&#039;, &#039;boolean&#039;, &#039;nil&#039; })&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local list = {}&lt;br /&gt;
	local index = 1&lt;br /&gt;
	for key, value in pairs(t) do&lt;br /&gt;
		list[index] = key&lt;br /&gt;
		index = index + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if keySort ~= false then&lt;br /&gt;
		keySort = type(keySort) == &#039;function&#039; and keySort or defaultKeySort&lt;br /&gt;
		&lt;br /&gt;
		table.sort(list, keySort)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Iterates through a table, with the keys sorted using the keysToList function.&lt;br /&gt;
	If there are only numerical keys, sparseIpairs is probably more efficient.&lt;br /&gt;
]]&lt;br /&gt;
function p.sortedPairs(t, keySort)&lt;br /&gt;
	checkType(&#039;sortedPairs&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;sortedPairs&#039;, 2, keySort, &#039;function&#039;, true)&lt;br /&gt;
	&lt;br /&gt;
	local list = p.keysToList(t, keySort, true)&lt;br /&gt;
	&lt;br /&gt;
	local i = 0&lt;br /&gt;
	return function()&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		local key = list[i]&lt;br /&gt;
		if key ~= nil then&lt;br /&gt;
			return key, t[key]&lt;br /&gt;
		else&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Returns true if all keys in the table are consecutive integers starting at 1.&lt;br /&gt;
--]]&lt;br /&gt;
function p.isArray(t)&lt;br /&gt;
	checkType(&amp;quot;isArray&amp;quot;, 1, t, &amp;quot;table&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local i = 0&lt;br /&gt;
	for k, v in pairs(t) do&lt;br /&gt;
		i = i + 1&lt;br /&gt;
		if t[i] == nil then&lt;br /&gt;
			return false&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- { &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot; } -&amp;gt; { a = 1, b = 2, c = 3 }&lt;br /&gt;
function p.invert(array)&lt;br /&gt;
	checkType(&amp;quot;invert&amp;quot;, 1, array, &amp;quot;table&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local map = {}&lt;br /&gt;
	for i, v in ipairs(array) do&lt;br /&gt;
		map[v] = i&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return map&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	{ &amp;quot;a&amp;quot;, &amp;quot;b&amp;quot;, &amp;quot;c&amp;quot; } -&amp;gt; { [&amp;quot;a&amp;quot;] = true, [&amp;quot;b&amp;quot;] = true, [&amp;quot;c&amp;quot;] = true }&lt;br /&gt;
--]]&lt;br /&gt;
function p.listToSet(t)&lt;br /&gt;
	checkType(&amp;quot;listToSet&amp;quot;, 1, t, &amp;quot;table&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	local set = {}&lt;br /&gt;
	for _, item in ipairs(t) do&lt;br /&gt;
		set[item] = true&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return set&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Recursive deep copy function.&lt;br /&gt;
	Preserves identities of subtables.&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
local function _deepCopy(orig, includeMetatable, already_seen)&lt;br /&gt;
	-- Stores copies of tables indexed by the original table.&lt;br /&gt;
	already_seen = already_seen or {}&lt;br /&gt;
	&lt;br /&gt;
	local copy = already_seen[orig]&lt;br /&gt;
	if copy ~= nil then&lt;br /&gt;
		return copy&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if type(orig) == &#039;table&#039; then&lt;br /&gt;
		copy = {}&lt;br /&gt;
		for orig_key, orig_value in pairs(orig) do&lt;br /&gt;
			copy[deepcopy(orig_key, includeMetatable, already_seen)] = deepcopy(orig_value, includeMetatable, already_seen)&lt;br /&gt;
		end&lt;br /&gt;
		already_seen[orig] = copy&lt;br /&gt;
		&lt;br /&gt;
		if includeMetatable then&lt;br /&gt;
			local mt = getmetatable(orig)&lt;br /&gt;
			if mt ~= nil then&lt;br /&gt;
				local mt_copy = deepcopy(mt, includeMetatable, already_seen)&lt;br /&gt;
				setmetatable(copy, mt_copy)&lt;br /&gt;
				already_seen[mt] = mt_copy&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else -- number, string, boolean, etc&lt;br /&gt;
		copy = orig&lt;br /&gt;
	end&lt;br /&gt;
	return copy&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.deepCopy(orig, noMetatable, already_seen)&lt;br /&gt;
	checkType(&amp;quot;deepCopy&amp;quot;, 3, already_seen, &amp;quot;table&amp;quot;, true)&lt;br /&gt;
	&lt;br /&gt;
	return _deepCopy(orig, not noMetatable, already_seen)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
	Concatenates all values in the table that are indexed by a number, in order.&lt;br /&gt;
	sparseConcat{ a, nil, c, d }  =&amp;gt;  &amp;quot;acd&amp;quot;&lt;br /&gt;
	sparseConcat{ nil, b, c, d }  =&amp;gt;  &amp;quot;bcd&amp;quot;&lt;br /&gt;
]]&lt;br /&gt;
function p.sparseConcat(t, sep, i, j)&lt;br /&gt;
	local list = {}&lt;br /&gt;
	&lt;br /&gt;
	local list_i = 0&lt;br /&gt;
	for _, v in p.sparseIpairs(t) do&lt;br /&gt;
		list_i = list_i + 1&lt;br /&gt;
		list[list_i] = v&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(list, sep, i, j)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- Finds the length of an array, or of a quasi-array with keys such&lt;br /&gt;
-- as &amp;quot;data1&amp;quot;, &amp;quot;data2&amp;quot;, etc., using an exponential search algorithm. &lt;br /&gt;
-- It is similar to the operator #, but may return&lt;br /&gt;
-- a different value when there are gaps in the array portion of the table.&lt;br /&gt;
-- Intended to be used on data loaded with mw.loadData. For other tables, use #.&lt;br /&gt;
-- Note: #frame.args in frame object always be set to 0, regardless of &lt;br /&gt;
-- the number of unnamed template parameters, so use this function for&lt;br /&gt;
-- frame.args.&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
function p.length(t, prefix)&lt;br /&gt;
	-- requiring module inline so that [[Module:Exponential search]]&lt;br /&gt;
	-- which is only needed by this one function&lt;br /&gt;
	-- doesn&#039;t get millions of transclusions&lt;br /&gt;
	local expSearch = require(&amp;quot;Module:Exponential search&amp;quot;)&lt;br /&gt;
	checkType(&#039;length&#039;, 1, t, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;length&#039;, 2, prefix, &#039;string&#039;, true)&lt;br /&gt;
	return expSearch(function(i)&lt;br /&gt;
		local key&lt;br /&gt;
		if prefix then&lt;br /&gt;
			key = prefix .. tostring(i)&lt;br /&gt;
		else&lt;br /&gt;
			key = i&lt;br /&gt;
		end&lt;br /&gt;
		return t[key] ~= nil&lt;br /&gt;
	end) or 0&lt;br /&gt;
end&lt;br /&gt;
function p.inArray(arr, valueToFind)&lt;br /&gt;
	checkType(&amp;quot;inArray&amp;quot;, 1, arr, &amp;quot;table&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
	-- if valueToFind is nil, error?&lt;br /&gt;
	&lt;br /&gt;
	for _, v in ipairs(arr) do&lt;br /&gt;
		if v == valueToFind then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:TNT&amp;diff=2765</id>
		<title>Module:TNT</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:TNT&amp;diff=2765"/>
		<updated>2020-07-01T10:17:11Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:TNT&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- INTRO:   (!!! DO NOT RENAME THIS PAGE !!!)&lt;br /&gt;
--    This module allows any template or module to be copy/pasted between&lt;br /&gt;
--    wikis without any translation changes. All translation text is stored&lt;br /&gt;
--    in the global  Data:*.tab  pages on Commons, and used everywhere.&lt;br /&gt;
--&lt;br /&gt;
-- SEE:   https://www.mediawiki.org/wiki/Multilingual_Templates_and_Modules&lt;br /&gt;
--&lt;br /&gt;
-- ATTENTION:&lt;br /&gt;
--    Please do NOT rename this module - it has to be identical on all wikis.&lt;br /&gt;
--    This code is maintained at https://www.mediawiki.org/wiki/Module:TNT&lt;br /&gt;
--    Please do not modify it anywhere else, as it may get copied and override your changes.&lt;br /&gt;
--    Suggestions can be made at https://www.mediawiki.org/wiki/Module_talk:TNT&lt;br /&gt;
--&lt;br /&gt;
-- DESCRIPTION:&lt;br /&gt;
--    The &amp;quot;msg&amp;quot; function uses a Commons dataset to translate a message&lt;br /&gt;
--    with a given key (e.g. source-table), plus optional arguments&lt;br /&gt;
--    to the wiki markup in the current content language.&lt;br /&gt;
--    Use lang=xx to set language.  Example:&lt;br /&gt;
--&lt;br /&gt;
--    {{#invoke:TNT | msg&lt;br /&gt;
--     | I18n/Template:Graphs.tab  &amp;lt;!-- https://commons.wikimedia.org/wiki/Data:I18n/Template:Graphs.tab --&amp;gt;&lt;br /&gt;
--     | source-table              &amp;lt;!-- uses a translation message with id = &amp;quot;source-table&amp;quot; --&amp;gt;&lt;br /&gt;
--     | param1 }}                 &amp;lt;!-- optional parameter --&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
--&lt;br /&gt;
--    The &amp;quot;doc&amp;quot; function will generate the &amp;lt;templatedata&amp;gt; parameter documentation for templates.&lt;br /&gt;
--    This way all template parameters can be stored and localized in a single Commons dataset.&lt;br /&gt;
--    NOTE: &amp;quot;doc&amp;quot; assumes that all documentation is located in Data:Templatedata/* on Commons.&lt;br /&gt;
--&lt;br /&gt;
--    {{#invoke:TNT | doc | Graph:Lines }}&lt;br /&gt;
--        uses https://commons.wikimedia.org/wiki/Data:Templatedata/Graph:Lines.tab&lt;br /&gt;
--        if the current page is Template:Graph:Lines/doc&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
local i18nDataset = &#039;I18n/Module:TNT.tab&#039;&lt;br /&gt;
&lt;br /&gt;
-- Forward declaration of the local functions&lt;br /&gt;
local sanitizeDataset, loadData, link, formatMessage&lt;br /&gt;
&lt;br /&gt;
function p.msg(frame)&lt;br /&gt;
	local dataset, id&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local lang = nil&lt;br /&gt;
	for k, v in pairs(frame.args) do&lt;br /&gt;
		if k == 1 then&lt;br /&gt;
			dataset = mw.text.trim(v)&lt;br /&gt;
		elseif k == 2 then&lt;br /&gt;
			id = mw.text.trim(v)&lt;br /&gt;
		elseif type(k) == &#039;number&#039; then&lt;br /&gt;
			table.insert(params, mw.text.trim(v))&lt;br /&gt;
		elseif k == &#039;lang&#039; and v ~= &#039;_&#039; then&lt;br /&gt;
			lang = mw.text.trim(v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return formatMessage(dataset, id, params, lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Identical to p.msg() above, but used from other lua modules&lt;br /&gt;
-- Parameters:  name of dataset, message key, optional arguments&lt;br /&gt;
-- Example with 2 params:  format(&#039;I18n/Module:TNT&#039;, &#039;error_bad_msgkey&#039;, &#039;my-key&#039;, &#039;my-dataset&#039;)&lt;br /&gt;
function p.format(dataset, key, ...)&lt;br /&gt;
	local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
	checkType(&#039;format&#039;, 1, dataset, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;format&#039;, 2, key, &#039;string&#039;)&lt;br /&gt;
	return formatMessage(dataset, key, {...})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Identical to p.msg() above, but used from other lua modules with the language param&lt;br /&gt;
-- Parameters:  language code, name of dataset, message key, optional arguments&lt;br /&gt;
-- Example with 2 params:  formatInLanguage(&#039;es&#039;, I18n/Module:TNT&#039;, &#039;error_bad_msgkey&#039;, &#039;my-key&#039;, &#039;my-dataset&#039;)&lt;br /&gt;
function p.formatInLanguage(lang, dataset, key, ...)&lt;br /&gt;
	local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
	checkType(&#039;formatInLanguage&#039;, 1, lang, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;formatInLanguage&#039;, 2, dataset, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;formatInLanguage&#039;, 3, key, &#039;string&#039;)&lt;br /&gt;
	return formatMessage(dataset, key, {...}, lang)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Obsolete function that adds a &#039;c:&#039; prefix to the first param.&lt;br /&gt;
-- &amp;quot;Sandbox/Sample.tab&amp;quot; -&amp;gt; &#039;c:Data:Sandbox/Sample.tab&#039;&lt;br /&gt;
function p.link(frame)&lt;br /&gt;
	return link(frame.args[1])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.doc(frame)&lt;br /&gt;
	local dataset = &#039;Templatedata/&#039; .. sanitizeDataset(frame.args[1])&lt;br /&gt;
	return frame:extensionTag(&#039;templatedata&#039;, p.getTemplateData(dataset)) ..&lt;br /&gt;
		   formatMessage(i18nDataset, &#039;edit_doc&#039;, {link(dataset)})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getTemplateData(dataset)&lt;br /&gt;
	-- TODO: add &#039;_&#039; parameter once lua starts reindexing properly for &amp;quot;all&amp;quot; languages&lt;br /&gt;
	local data = loadData(dataset)&lt;br /&gt;
	local names = {}&lt;br /&gt;
	for _, field in pairs(data.schema.fields) do&lt;br /&gt;
		table.insert(names, field.name)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local params = {}&lt;br /&gt;
	local paramOrder = {}&lt;br /&gt;
	for _, row in pairs(data.data) do&lt;br /&gt;
		local newVal = {}&lt;br /&gt;
		local name = nil&lt;br /&gt;
		for pos, val in pairs(row) do&lt;br /&gt;
			local columnName = names[pos]&lt;br /&gt;
			if columnName == &#039;name&#039; then&lt;br /&gt;
				name = val&lt;br /&gt;
			else&lt;br /&gt;
				newVal[columnName] = val&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if name then&lt;br /&gt;
			params[name] = newVal&lt;br /&gt;
			table.insert(paramOrder, name)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Work around json encoding treating {&amp;quot;1&amp;quot;:{...}} as an [{...}]&lt;br /&gt;
	params[&#039;zzz123&#039;]=&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
	local json = mw.text.jsonEncode({&lt;br /&gt;
		params=params,&lt;br /&gt;
		paramOrder=paramOrder,&lt;br /&gt;
		description=data.description&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	json = string.gsub(json,&#039;&amp;quot;zzz123&amp;quot;:&amp;quot;&amp;quot;,?&#039;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	return json&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Local functions&lt;br /&gt;
&lt;br /&gt;
sanitizeDataset = function(dataset)&lt;br /&gt;
	if not dataset then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	dataset = mw.text.trim(dataset)&lt;br /&gt;
	if dataset == &#039;&#039; then&lt;br /&gt;
		return nil&lt;br /&gt;
	elseif string.sub(dataset,-4) ~= &#039;.tab&#039; then&lt;br /&gt;
		return dataset .. &#039;.tab&#039;&lt;br /&gt;
	else&lt;br /&gt;
		return dataset&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
loadData = function(dataset, lang)&lt;br /&gt;
	dataset = sanitizeDataset(dataset)&lt;br /&gt;
	if not dataset then&lt;br /&gt;
		error(formatMessage(i18nDataset, &#039;error_no_dataset&#039;, {}))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Give helpful error to thirdparties who try and copy this module.&lt;br /&gt;
	if not mw.ext or not mw.ext.data or not mw.ext.data.get then&lt;br /&gt;
		error(&#039;Missing JsonConfig extension; Cannot load https://commons.wikimedia.org/wiki/Data:&#039; .. dataset)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local data = mw.ext.data.get(dataset, lang)&lt;br /&gt;
&lt;br /&gt;
	if data == false then&lt;br /&gt;
		if dataset == i18nDataset then&lt;br /&gt;
			-- Prevent cyclical calls&lt;br /&gt;
			error(&#039;Missing Commons dataset &#039; .. i18nDataset)&lt;br /&gt;
		else&lt;br /&gt;
			error(formatMessage(i18nDataset, &#039;error_bad_dataset&#039;, {link(dataset)}))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Given a dataset name, convert it to a title with the &#039;commons:data:&#039; prefix&lt;br /&gt;
link = function(dataset)&lt;br /&gt;
	return &#039;c:Data:&#039; .. mw.text.trim(dataset or &#039;&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
formatMessage = function(dataset, key, params, lang)&lt;br /&gt;
	for _, row in pairs(loadData(dataset, lang).data) do&lt;br /&gt;
		local id, msg = unpack(row)&lt;br /&gt;
		if id == key then&lt;br /&gt;
			local result = mw.message.newRawMessage(msg, unpack(params or {}))&lt;br /&gt;
			return result:plain()&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if dataset == i18nDataset then&lt;br /&gt;
		-- Prevent cyclical calls&lt;br /&gt;
		error(&#039;Invalid message key &amp;quot;&#039; .. key .. &#039;&amp;quot;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		error(formatMessage(i18nDataset, &#039;error_bad_msgkey&#039;, {key, link(dataset)}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:String/doc&amp;diff=2764</id>
		<title>Module:String/doc</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:String/doc&amp;diff=2764"/>
		<updated>2020-07-01T10:17:11Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:String/doc&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{Shared Template Warning|Module:String|Module:String}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This module is intended to provide access to basic string functions.&lt;br /&gt;
&lt;br /&gt;
Most of the functions provided here can be invoked with named parameters, unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will automatically remove any leading or trailing whitespace from the parameter. Depending on the intended use, it may be advantageous to either preserve or remove such whitespace.&lt;br /&gt;
&lt;br /&gt;
== Global options ==&lt;br /&gt;
&lt;br /&gt;
; ignore_errors&lt;br /&gt;
: If set to &#039;true&#039; or 1, any error condition will result in an empty string being returned rather than an error message.&lt;br /&gt;
; error_category&lt;br /&gt;
: If an error occurs, specifies the name of a category to include with the error message.  The default category is [[:Category:Errors reported by Module String]].&lt;br /&gt;
; no_category&lt;br /&gt;
: If set to &#039;true&#039; or 1, no category will be added if an error is generated.&lt;br /&gt;
&lt;br /&gt;
Unit tests for this module are available at [[Module:String/testcases]].&lt;br /&gt;
&lt;br /&gt;
== len ==&lt;br /&gt;
&lt;br /&gt;
This function returns the length of the target string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|len|&#039;&#039;target_string&#039;&#039;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|len|s= &#039;&#039;target_string&#039;&#039; }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
; s&lt;br /&gt;
: The string whose length to report&lt;br /&gt;
&lt;br /&gt;
== sub ==&lt;br /&gt;
&lt;br /&gt;
: This function returns a substring of the target string at specified indices.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|sub|&#039;&#039;target_string&#039;&#039;|&#039;&#039;start_index&#039;&#039;|&#039;&#039;end_index&#039;&#039;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|sub|s= &#039;&#039;target_string&#039;&#039; |i= &#039;&#039;start_index&#039;&#039; |j= &#039;&#039;end_index&#039;&#039; }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
; s&lt;br /&gt;
: The string to return a subset of&lt;br /&gt;
; i&lt;br /&gt;
: The first index of the substring to return, defaults to 1.&lt;br /&gt;
; j&lt;br /&gt;
: The last index of the string to return, defaults to the last character.&lt;br /&gt;
&lt;br /&gt;
The first character of the string is assigned an index of 1.  If either i or j is a negative value, it is interpreted the same as selecting a character by counting from the end of the string.  Hence, a value of -1 is the same as selecting the last character of the string.&lt;br /&gt;
&lt;br /&gt;
If the requested indices are out of range for the given string, an error is reported.&lt;br /&gt;
&lt;br /&gt;
== sublength ==&lt;br /&gt;
&lt;br /&gt;
This function implements the features of {{tl|Str sub old}} and is kept in order to maintain these older templates.&lt;br /&gt;
&lt;br /&gt;
== match ==&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a specified pattern.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|match|&#039;&#039;source_string&#039;&#039;|&#039;&#039;pattern_string&#039;&#039;|&#039;&#039;start_index&#039;&#039;|&#039;&#039;match_number&#039;&#039;|&#039;&#039;plain_flag&#039;&#039;|&#039;&#039;nomatch_output&#039;&#039;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|match|s= &#039;&#039;source_string&#039;&#039; |pattern= &#039;&#039;pattern_string&#039;&#039; |start= &#039;&#039;start_index&#039;&#039; |match= &#039;&#039;match_number&#039;&#039; |plain= &#039;&#039;plain_flag&#039;&#039; |nomatch= &#039;&#039;nomatch_output&#039;&#039; }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
; s&lt;br /&gt;
: The string to search&lt;br /&gt;
; pattern&lt;br /&gt;
: The pattern or string to find within the string&lt;br /&gt;
; start&lt;br /&gt;
: The index within the source string to start the search.  The first character of the string has index 1.  Defaults to 1.&lt;br /&gt;
; match&lt;br /&gt;
: In some cases it may be possible to make multiple matches on a single string.  This specifies which match to return, where the first match is match= 1.  If a negative number is specified then a match is returned counting from the last match.  Hence match = -1 is the same as requesting the last match.  Defaults to 1.&lt;br /&gt;
; plain&lt;br /&gt;
: Boolean flag indicating that pattern should be understood as plain text and not as a [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]. Defaults to false.&lt;br /&gt;
; nomatch&lt;br /&gt;
: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
If the match_number or start_index are out of range for the string being queried, then this function generates an error.  An error is also generated if no match is found.&lt;br /&gt;
If one adds the parameter ignore_errors=true, then the error will be suppressed and an empty string will be returned on any failure.&lt;br /&gt;
&lt;br /&gt;
For information on constructing [[w:en:Lua (programming language)|Lua]] patterns, a form of [[w:en:regular expression|regular expression]], see:&lt;br /&gt;
&lt;br /&gt;
* [https://www.lua.org/manual/5.1/manual.html#5.4.1 Lua reference: Patterns] (as of version 5.1)&lt;br /&gt;
* [[mw:Extension:Scribunto/Lua_reference_manual#Patterns|Scribunto patterns]]&lt;br /&gt;
* [[mw:Extension:Scribunto/Lua_reference_manual#Ustring_patterns|Scribunto Unicode string patterns]]&lt;br /&gt;
&lt;br /&gt;
== pos ==&lt;br /&gt;
&lt;br /&gt;
This function returns a single character from the target string at position pos.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|pos|&#039;&#039;target_string&#039;&#039;|&#039;&#039;index_value&#039;&#039;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|pos|target= &#039;&#039;target_string&#039;&#039; |pos= &#039;&#039;index_value&#039;&#039; }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
; target&lt;br /&gt;
: The string to search&lt;br /&gt;
; pos&lt;br /&gt;
: The index for the character to return&lt;br /&gt;
&lt;br /&gt;
The first character has an index value of 1.&lt;br /&gt;
&lt;br /&gt;
If one requests a negative value, this function will select a character by counting backwards&lt;br /&gt;
from the end of the string.  In other words pos = -1 is the same as asking for the last character.&lt;br /&gt;
&lt;br /&gt;
A requested value of zero, or a value greater than the length of the string returns an error.&lt;br /&gt;
&lt;br /&gt;
== find ==&lt;br /&gt;
&lt;br /&gt;
This function allows one to search for a target string or pattern within another string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|find|&#039;&#039;source_str&#039;&#039;|&#039;&#039;target_string&#039;&#039;|&#039;&#039;start_index&#039;&#039;|&#039;&#039;plain_flag&#039;&#039;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|find|source= &#039;&#039;source_str&#039;&#039; |target= &#039;&#039;target_str&#039;&#039; |start= &#039;&#039;start_index&#039;&#039; |plain= &#039;&#039;plain_flag&#039;&#039; }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
; source&lt;br /&gt;
: The string to search&lt;br /&gt;
; target&lt;br /&gt;
: The string or pattern to find within source&lt;br /&gt;
; start&lt;br /&gt;
: The index within the source string to start the search, defaults to 1&lt;br /&gt;
; plain&lt;br /&gt;
: Boolean flag indicating that target should be understood as plain text and not as a [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]], defaults to true&lt;br /&gt;
&lt;br /&gt;
This function returns the first index &amp;gt;= &amp;quot;start&amp;quot; where &amp;quot;target&amp;quot; can be found within &amp;quot;source&amp;quot;.  Indices are 1-based.  If &amp;quot;target&amp;quot; is not found, then this function returns 0.  If either &amp;quot;source&amp;quot; or &amp;quot;target&amp;quot; are missing / empty, this function also returns 0.&lt;br /&gt;
&lt;br /&gt;
This function should be safe for UTF-8 strings.&lt;br /&gt;
&lt;br /&gt;
== replace ==&lt;br /&gt;
&lt;br /&gt;
This function allows one to replace a target string or pattern within another string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|replace|&#039;&#039;source_str&#039;&#039;|&#039;&#039;pattern_string&#039;&#039;|&#039;&#039;replace_string&#039;&#039;|&#039;&#039;replacement_count&#039;&#039;|&#039;&#039;plain_flag&#039;&#039;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
OR&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|replace|source= &#039;&#039;source_string&#039;&#039; |pattern= &#039;&#039;pattern_string&#039;&#039; |replace= &#039;&#039;replace_string&#039;&#039; |count= &#039;&#039;replacement_count&#039;&#039; |plain= &#039;&#039;plain_flag&#039;&#039; }}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
; source&lt;br /&gt;
: The string to search&lt;br /&gt;
; pattern&lt;br /&gt;
: The string or pattern to find within source&lt;br /&gt;
; replace&lt;br /&gt;
: The replacement text&lt;br /&gt;
; count&lt;br /&gt;
: The number of occurrences to replace; defaults to all&lt;br /&gt;
; plain&lt;br /&gt;
: Boolean flag indicating that pattern should be understood as plain text and not as a [[mw:Extension:Scribunto/Lua reference manual#Ustring patterns|Scribunto ustring pattern]] (a unicode-friendly [[w:en:Lua (programming language)|Lua]]-style [[w:en:regular expression|regular expression]]); defaults to true&lt;br /&gt;
&lt;br /&gt;
== rep ==&lt;br /&gt;
Repeats a string &#039;&#039;n&#039;&#039; times.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:&amp;lt;/nowiki&amp;gt;String|rep|&#039;&#039;source&#039;&#039;|&#039;&#039;count&#039;&#039;}}&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Parameters:&lt;br /&gt;
&lt;br /&gt;
; source&lt;br /&gt;
: The string to repeat&lt;br /&gt;
; count&lt;br /&gt;
: The number of repetitions.&lt;br /&gt;
&lt;br /&gt;
Example &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{#invoke:String|rep|hello|3}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; gives {{#invoke:String|rep|hello|3}}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:String&amp;diff=2763</id>
		<title>Module:String</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:String&amp;diff=2763"/>
		<updated>2020-07-01T10:17:10Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:String&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[&lt;br /&gt;
&lt;br /&gt;
This module is intended to provide access to basic string functions.&lt;br /&gt;
&lt;br /&gt;
Most of the functions provided here can be invoked with named parameters,&lt;br /&gt;
unnamed parameters, or a mixture.  If named parameters are used, Mediawiki will&lt;br /&gt;
automatically remove any leading or trailing whitespace from the parameter.&lt;br /&gt;
Depending on the intended use, it may be advantageous to either preserve or&lt;br /&gt;
remove such whitespace.&lt;br /&gt;
&lt;br /&gt;
Global options&lt;br /&gt;
    ignore_errors: If set to &#039;true&#039; or 1, any error condition will result in&lt;br /&gt;
        an empty string being returned rather than an error message.&lt;br /&gt;
&lt;br /&gt;
    error_category: If an error occurs, specifies the name of a category to&lt;br /&gt;
        include with the error message.  The default category is&lt;br /&gt;
        [Category:Errors reported by Module String].&lt;br /&gt;
&lt;br /&gt;
    no_category: If set to &#039;true&#039; or 1, no category will be added if an error&lt;br /&gt;
        is generated.&lt;br /&gt;
&lt;br /&gt;
Unit tests for this module are available at Module:String/tests.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local str = {}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
len&lt;br /&gt;
&lt;br /&gt;
This function returns the length of the target string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|len|target_string|}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|len|s=target_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string whose length to report&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.&lt;br /&gt;
]]&lt;br /&gt;
function str.len( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;s&#039;} );&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;;&lt;br /&gt;
	return mw.ustring.len( s )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
sub&lt;br /&gt;
&lt;br /&gt;
This function returns a substring of the target string at specified indices.&lt;br /&gt;
&lt;br /&gt;
Usage:n&lt;br /&gt;
{{#invoke:String|sub|target_string|start_index|end_index}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|sub|s=target_string|i=start_index|j=end_index}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to return a subset of&lt;br /&gt;
    i: The fist index of the substring to return, defaults to 1.&lt;br /&gt;
    j: The last index of the string to return, defaults to the last character.&lt;br /&gt;
&lt;br /&gt;
The first character of the string is assigned an index of 1.  If either i or j&lt;br /&gt;
is a negative value, it is interpreted the same as selecting a character by&lt;br /&gt;
counting from the end of the string.  Hence, a value of -1 is the same as&lt;br /&gt;
selecting the last character of the string.&lt;br /&gt;
&lt;br /&gt;
If the requested indices are out of range for the given string, an error is&lt;br /&gt;
reported.&lt;br /&gt;
]]&lt;br /&gt;
function str.sub( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, { &#039;s&#039;, &#039;i&#039;, &#039;j&#039; } );&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;;&lt;br /&gt;
	local i = tonumber( new_args[&#039;i&#039;] ) or 1;&lt;br /&gt;
	local j = tonumber( new_args[&#039;j&#039;] ) or -1;&lt;br /&gt;
&lt;br /&gt;
	local len = mw.ustring.len( s );&lt;br /&gt;
&lt;br /&gt;
	-- Convert negatives for range checking&lt;br /&gt;
	if i &amp;lt; 0 then&lt;br /&gt;
		i = len + i + 1;&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; 0 then&lt;br /&gt;
		j = len + j + 1;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if i &amp;gt; len or j &amp;gt; len or i &amp;lt; 1 or j &amp;lt; 1 then&lt;br /&gt;
		return str._error( &#039;String subset index out of range&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	if j &amp;lt; i then&lt;br /&gt;
		return str._error( &#039;String subset indices out of order&#039; );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( s, i, j )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
This function implements that features of {{str sub old}} and is kept in order&lt;br /&gt;
to maintain these older templates.&lt;br /&gt;
]]&lt;br /&gt;
function str.sublength( frame )&lt;br /&gt;
	local i = tonumber( frame.args.i ) or 0&lt;br /&gt;
	local len = tonumber( frame.args.len )&lt;br /&gt;
	return mw.ustring.sub( frame.args.s, i + 1, len and ( i + len ) )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
match&lt;br /&gt;
&lt;br /&gt;
This function returns a substring from the source string that matches a&lt;br /&gt;
specified pattern.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|match|source_string|pattern_string|start_index|match_number|plain_flag|nomatch}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|s=source_string|pattern=pattern_string|start=start_index&lt;br /&gt;
    |match=match_number|plain=plain_flag|nomatch=nomatch_output}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    s: The string to search&lt;br /&gt;
    pattern: The pattern or string to find within the string&lt;br /&gt;
    start: The index within the source string to start the search.  The first&lt;br /&gt;
        character of the string has index 1.  Defaults to 1.&lt;br /&gt;
    match: In some cases it may be possible to make multiple matches on a single&lt;br /&gt;
        string.  This specifies which match to return, where the first match is&lt;br /&gt;
        match= 1.  If a negative number is specified then a match is returned&lt;br /&gt;
        counting from the last match.  Hence match = -1 is the same as requesting&lt;br /&gt;
        the last match.  Defaults to 1.&lt;br /&gt;
    plain: A flag indicating that the pattern should be understood as plain&lt;br /&gt;
        text.  Defaults to false.&lt;br /&gt;
    nomatch: If no match is found, output the &amp;quot;nomatch&amp;quot; value rather than an error.&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from each string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
If the match_number or start_index are out of range for the string being queried, then&lt;br /&gt;
this function generates an error.  An error is also generated if no match is found.&lt;br /&gt;
If one adds the parameter ignore_errors=true, then the error will be suppressed and&lt;br /&gt;
an empty string will be returned on any failure.&lt;br /&gt;
&lt;br /&gt;
For information on constructing Lua patterns, a form of [regular expression], see:&lt;br /&gt;
&lt;br /&gt;
* https://www.lua.org/manual/5.1/manual.html#5.4.1&lt;br /&gt;
* https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
* https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Ustring_patterns&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
-- This sub-routine is exported for use in other modules&lt;br /&gt;
function str._match( s, pattern, start, match_index, plain, nomatch )&lt;br /&gt;
	if s == &#039;&#039; then&lt;br /&gt;
		return str._error( &#039;Target string is empty&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	if pattern == &#039;&#039; then&lt;br /&gt;
		return str._error( &#039;Pattern string is empty&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	start = tonumber(start) or 1&lt;br /&gt;
	if math.abs(start) &amp;lt; 1 or math.abs(start) &amp;gt; mw.ustring.len( s ) then&lt;br /&gt;
		return str._error( &#039;Requested start is out of range&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	if match_index == 0 then&lt;br /&gt;
		return str._error( &#039;Match index is out of range&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	if plain_flag then&lt;br /&gt;
		pattern = str._escapePattern( pattern );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result&lt;br /&gt;
	if match_index == 1 then&lt;br /&gt;
		-- Find first match is simple case&lt;br /&gt;
		result = mw.ustring.match( s, pattern, start )&lt;br /&gt;
	else&lt;br /&gt;
		if start &amp;gt; 1 then&lt;br /&gt;
			s = mw.ustring.sub( s, start );&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local iterator = mw.ustring.gmatch(s, pattern);&lt;br /&gt;
		if match_index &amp;gt; 0 then&lt;br /&gt;
			-- Forward search&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				match_index = match_index - 1;&lt;br /&gt;
				if match_index == 0 then&lt;br /&gt;
					result = w;&lt;br /&gt;
					break;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- Reverse search&lt;br /&gt;
			local result_table = {};&lt;br /&gt;
			local count = 1;&lt;br /&gt;
			for w in iterator do&lt;br /&gt;
				result_table[count] = w;&lt;br /&gt;
				count = count + 1;&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			result = result_table[ count + match_index ];&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if result == nil then&lt;br /&gt;
		if nomatch == nil then&lt;br /&gt;
			return str._error( &#039;Match not found&#039; );&lt;br /&gt;
		else&lt;br /&gt;
			return nomatch;&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return result;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
-- This is the entry point for #invoke:String|match&lt;br /&gt;
function str.match( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;s&#039;, &#039;pattern&#039;, &#039;start&#039;, &#039;match&#039;, &#039;plain&#039;, &#039;nomatch&#039;} );&lt;br /&gt;
	local s = new_args[&#039;s&#039;] or &#039;&#039;;&lt;br /&gt;
	local start = tonumber( new_args[&#039;start&#039;] ) or 1;&lt;br /&gt;
	local plain_flag = str._getBoolean( new_args[&#039;plain&#039;] or false );&lt;br /&gt;
	local pattern = new_args[&#039;pattern&#039;] or &#039;&#039;;&lt;br /&gt;
	local match_index = math.floor( tonumber(new_args[&#039;match&#039;]) or 1 );&lt;br /&gt;
	local nomatch = new_args[&#039;nomatch&#039;];&lt;br /&gt;
&lt;br /&gt;
	return str._match( s, pattern, start, match_index, plain, nomatch )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
pos&lt;br /&gt;
&lt;br /&gt;
This function returns a single character from the target string at position pos.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|pos|target_string|index_value}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|pos|target=target_string|pos=index_value}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    target: The string to search&lt;br /&gt;
    pos: The index for the character to return&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the target string.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
The first character has an index value of 1.&lt;br /&gt;
&lt;br /&gt;
If one requests a negative value, this function will select a character by counting backwards&lt;br /&gt;
from the end of the string.  In other words pos = -1 is the same as asking for the last character.&lt;br /&gt;
&lt;br /&gt;
A requested value of zero, or a value greater than the length of the string returns an error.&lt;br /&gt;
]]&lt;br /&gt;
function str.pos( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;target&#039;, &#039;pos&#039;} );&lt;br /&gt;
	local target_str = new_args[&#039;target&#039;] or &#039;&#039;;&lt;br /&gt;
	local pos = tonumber( new_args[&#039;pos&#039;] ) or 0;&lt;br /&gt;
&lt;br /&gt;
	if pos == 0 or math.abs(pos) &amp;gt; mw.ustring.len( target_str ) then&lt;br /&gt;
		return str._error( &#039;String index out of range&#039; );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.ustring.sub( target_str, pos, pos );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
str_find&lt;br /&gt;
&lt;br /&gt;
This function duplicates the behavior of {{str_find}}, including all of its quirks.&lt;br /&gt;
This is provided in order to support existing templates, but is NOT RECOMMENDED for&lt;br /&gt;
new code and templates.  New code is recommended to use the &amp;quot;find&amp;quot; function instead.&lt;br /&gt;
&lt;br /&gt;
Returns the first index in &amp;quot;source&amp;quot; that is a match to &amp;quot;target&amp;quot;.  Indexing is 1-based,&lt;br /&gt;
and the function returns -1 if the &amp;quot;target&amp;quot; string is not present in &amp;quot;source&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Important Note: If the &amp;quot;target&amp;quot; string is empty / missing, this function returns a&lt;br /&gt;
value of &amp;quot;1&amp;quot;, which is generally unexpected behavior, and must be accounted for&lt;br /&gt;
separatetly.&lt;br /&gt;
]]&lt;br /&gt;
function str.str_find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;target&#039;} );&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;;&lt;br /&gt;
	local target_str = new_args[&#039;target&#039;] or &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
	if target_str == &#039;&#039; then&lt;br /&gt;
		return 1;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, target_str, 1, true )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = -1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
find&lt;br /&gt;
&lt;br /&gt;
This function allows one to search for a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|find|source_str|target_string|start_index|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|find|source=source_str|target=target_str|start=start_index|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    target: The string or pattern to find within source&lt;br /&gt;
    start: The index within the source string to start the search, defaults to 1&lt;br /&gt;
    plain: Boolean flag indicating that target should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
&lt;br /&gt;
If invoked using named parameters, Mediawiki will automatically remove any leading or&lt;br /&gt;
trailing whitespace from the parameter.  In some circumstances this is desirable, in&lt;br /&gt;
other cases one may want to preserve the whitespace.&lt;br /&gt;
&lt;br /&gt;
This function returns the first index &amp;gt;= &amp;quot;start&amp;quot; where &amp;quot;target&amp;quot; can be found&lt;br /&gt;
within &amp;quot;source&amp;quot;.  Indices are 1-based.  If &amp;quot;target&amp;quot; is not found, then this&lt;br /&gt;
function returns 0.  If either &amp;quot;source&amp;quot; or &amp;quot;target&amp;quot; are missing / empty, this&lt;br /&gt;
function also returns 0.&lt;br /&gt;
&lt;br /&gt;
This function should be safe for UTF-8 strings.&lt;br /&gt;
]]&lt;br /&gt;
function str.find( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;target&#039;, &#039;start&#039;, &#039;plain&#039; } );&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;;&lt;br /&gt;
	local pattern = new_args[&#039;target&#039;] or &#039;&#039;;&lt;br /&gt;
	local start_pos = tonumber(new_args[&#039;start&#039;]) or 1;&lt;br /&gt;
	local plain = new_args[&#039;plain&#039;] or true;&lt;br /&gt;
&lt;br /&gt;
	if source_str == &#039;&#039; or pattern == &#039;&#039; then&lt;br /&gt;
		return 0;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	plain = str._getBoolean( plain );&lt;br /&gt;
&lt;br /&gt;
	local start = mw.ustring.find( source_str, pattern, start_pos, plain )&lt;br /&gt;
	if start == nil then&lt;br /&gt;
		start = 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return start&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
replace&lt;br /&gt;
&lt;br /&gt;
This function allows one to replace a target string or pattern within another&lt;br /&gt;
string.&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|replace|source_str|pattern_string|replace_string|replacement_count|plain_flag}}&lt;br /&gt;
OR&lt;br /&gt;
{{#invoke:String|replace|source=source_string|pattern=pattern_string|replace=replace_string|&lt;br /&gt;
   count=replacement_count|plain=plain_flag}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    source: The string to search&lt;br /&gt;
    pattern: The string or pattern to find within source&lt;br /&gt;
    replace: The replacement text&lt;br /&gt;
    count: The number of occurences to replace, defaults to all.&lt;br /&gt;
    plain: Boolean flag indicating that pattern should be understood as plain&lt;br /&gt;
        text and not as a Lua style regular expression, defaults to true&lt;br /&gt;
]]&lt;br /&gt;
function str.replace( frame )&lt;br /&gt;
	local new_args = str._getParameters( frame.args, {&#039;source&#039;, &#039;pattern&#039;, &#039;replace&#039;, &#039;count&#039;, &#039;plain&#039; } );&lt;br /&gt;
	local source_str = new_args[&#039;source&#039;] or &#039;&#039;;&lt;br /&gt;
	local pattern = new_args[&#039;pattern&#039;] or &#039;&#039;;&lt;br /&gt;
	local replace = new_args[&#039;replace&#039;] or &#039;&#039;;&lt;br /&gt;
	local count = tonumber( new_args[&#039;count&#039;] );&lt;br /&gt;
	local plain = new_args[&#039;plain&#039;] or true;&lt;br /&gt;
&lt;br /&gt;
	if source_str == &#039;&#039; or pattern == &#039;&#039; then&lt;br /&gt;
		return source_str;&lt;br /&gt;
	end&lt;br /&gt;
	plain = str._getBoolean( plain );&lt;br /&gt;
&lt;br /&gt;
	if plain then&lt;br /&gt;
		pattern = str._escapePattern( pattern );&lt;br /&gt;
		replace = mw.ustring.gsub( replace, &amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot; ); --Only need to escape replacement sequences.&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result;&lt;br /&gt;
&lt;br /&gt;
	if count ~= nil then&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace, count );&lt;br /&gt;
	else&lt;br /&gt;
		result = mw.ustring.gsub( source_str, pattern, replace );&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return result;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
    simple function to pipe string.rep to templates.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
function str.rep( frame )&lt;br /&gt;
	local repetitions = tonumber( frame.args[2] )&lt;br /&gt;
	if not repetitions then&lt;br /&gt;
		return str._error( &#039;function rep expects a number as second parameter, received &amp;quot;&#039; .. ( frame.args[2] or &#039;&#039; ) .. &#039;&amp;quot;&#039; )&lt;br /&gt;
	end&lt;br /&gt;
	return string.rep( frame.args[1] or &#039;&#039;, repetitions )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
escapePattern&lt;br /&gt;
&lt;br /&gt;
This function escapes special characters from a Lua string pattern. See [1]&lt;br /&gt;
for details on how patterns work.&lt;br /&gt;
&lt;br /&gt;
[1] https://www.mediawiki.org/wiki/Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
&lt;br /&gt;
Usage:&lt;br /&gt;
{{#invoke:String|escapePattern|pattern_string}}&lt;br /&gt;
&lt;br /&gt;
Parameters&lt;br /&gt;
    pattern_string: The pattern string to escape.&lt;br /&gt;
]]&lt;br /&gt;
function str.escapePattern( frame )&lt;br /&gt;
	local pattern_str = frame.args[1]&lt;br /&gt;
	if not pattern_str then&lt;br /&gt;
		return str._error( &#039;No pattern string specified&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	local result = str._escapePattern( pattern_str )&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that populates the argument list given that user may need to use a mix of&lt;br /&gt;
named and unnamed parameters.  This is relevant because named parameters are not&lt;br /&gt;
identical to unnamed parameters due to string trimming, and when dealing with strings&lt;br /&gt;
we sometimes want to either preserve or remove that whitespace depending on the application.&lt;br /&gt;
]]&lt;br /&gt;
function str._getParameters( frame_args, arg_list )&lt;br /&gt;
	local new_args = {};&lt;br /&gt;
	local index = 1;&lt;br /&gt;
	local value;&lt;br /&gt;
&lt;br /&gt;
	for i,arg in ipairs( arg_list ) do&lt;br /&gt;
		value = frame_args[arg]&lt;br /&gt;
		if value == nil then&lt;br /&gt;
			value = frame_args[index];&lt;br /&gt;
			index = index + 1;&lt;br /&gt;
		end&lt;br /&gt;
		new_args[arg] = value;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return new_args;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function to handle error messages.&lt;br /&gt;
]]&lt;br /&gt;
function str._error( error_str )&lt;br /&gt;
	local frame = mw.getCurrentFrame();&lt;br /&gt;
	local error_category = frame.args.error_category or &#039;Errors reported by Module String&#039;;&lt;br /&gt;
	local ignore_errors = frame.args.ignore_errors or false;&lt;br /&gt;
	local no_category = frame.args.no_category or false;&lt;br /&gt;
&lt;br /&gt;
	if str._getBoolean(ignore_errors) then&lt;br /&gt;
		return &#039;&#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local error_str = &#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;String Module Error: &#039; .. error_str .. &#039;&amp;lt;/strong&amp;gt;&#039;;&lt;br /&gt;
	if error_category ~= &#039;&#039; and not str._getBoolean( no_category ) then&lt;br /&gt;
		error_str = &#039;[[Category:&#039; .. error_category .. &#039;]]&#039; .. error_str;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return error_str;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper Function to interpret boolean strings&lt;br /&gt;
]]&lt;br /&gt;
function str._getBoolean( boolean_str )&lt;br /&gt;
	local boolean_value;&lt;br /&gt;
&lt;br /&gt;
	if type( boolean_str ) == &#039;string&#039; then&lt;br /&gt;
		boolean_str = boolean_str:lower();&lt;br /&gt;
		if boolean_str == &#039;false&#039; or boolean_str == &#039;no&#039; or boolean_str == &#039;0&#039;&lt;br /&gt;
				or boolean_str == &#039;&#039; then&lt;br /&gt;
			boolean_value = false;&lt;br /&gt;
		else&lt;br /&gt;
			boolean_value = true;&lt;br /&gt;
		end&lt;br /&gt;
	elseif type( boolean_str ) == &#039;boolean&#039; then&lt;br /&gt;
		boolean_value = boolean_str;&lt;br /&gt;
	else&lt;br /&gt;
		error( &#039;No boolean value found&#039; );&lt;br /&gt;
	end&lt;br /&gt;
	return boolean_value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
Helper function that escapes all pattern characters so that they will be treated&lt;br /&gt;
as plain text.&lt;br /&gt;
]]&lt;br /&gt;
function str._escapePattern( pattern_str )&lt;br /&gt;
	return mw.ustring.gsub( pattern_str, &amp;quot;([%(%)%.%%%+%-%*%?%[%^%$%]])&amp;quot;, &amp;quot;%%%1&amp;quot; );&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return str&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Navbox&amp;diff=2762</id>
		<title>Module:Navbox</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Navbox&amp;diff=2762"/>
		<updated>2020-07-01T10:17:08Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Navbox&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--&lt;br /&gt;
-- This module implements {{Navbox}}&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local navbar = require(&#039;Module:Navbar&#039;)._navbar&lt;br /&gt;
local getArgs -- lazily initialized&lt;br /&gt;
&lt;br /&gt;
local args&lt;br /&gt;
local border&lt;br /&gt;
local listnums&lt;br /&gt;
local ODD_EVEN_MARKER = &#039;\127_ODDEVEN_\127&#039;&lt;br /&gt;
local RESTART_MARKER = &#039;\127_ODDEVEN0_\127&#039;&lt;br /&gt;
local REGEX_MARKER = &#039;\127_ODDEVEN(%d?)_\127&#039;&lt;br /&gt;
&lt;br /&gt;
local function striped(wikitext)&lt;br /&gt;
	-- Return wikitext with markers replaced for odd/even striping.&lt;br /&gt;
	-- Child (subgroup) navboxes are flagged with a category that is removed&lt;br /&gt;
	-- by parent navboxes. The result is that the category shows all pages&lt;br /&gt;
	-- where a child navbox is not contained in a parent navbox.&lt;br /&gt;
	local orphanCat = &#039;[[Category:Navbox orphans]]&#039;&lt;br /&gt;
	if border == &#039;subgroup&#039; and args.orphan ~= &#039;yes&#039; then&lt;br /&gt;
		-- No change; striping occurs in outermost navbox.&lt;br /&gt;
		return wikitext .. orphanCat&lt;br /&gt;
	end&lt;br /&gt;
	local first, second = &#039;odd&#039;, &#039;even&#039;&lt;br /&gt;
	if args.evenodd then&lt;br /&gt;
		if args.evenodd == &#039;swap&#039; then&lt;br /&gt;
			first, second = second, first&lt;br /&gt;
		else&lt;br /&gt;
			first = args.evenodd&lt;br /&gt;
			second = first&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local changer&lt;br /&gt;
	if first == second then&lt;br /&gt;
		changer = first&lt;br /&gt;
	else&lt;br /&gt;
		local index = 0&lt;br /&gt;
		changer = function (code)&lt;br /&gt;
			if code == &#039;0&#039; then&lt;br /&gt;
				-- Current occurrence is for a group before a nested table.&lt;br /&gt;
				-- Set it to first as a valid although pointless class.&lt;br /&gt;
				-- The next occurrence will be the first row after a title&lt;br /&gt;
				-- in a subgroup and will also be first.&lt;br /&gt;
				index = 0&lt;br /&gt;
				return first&lt;br /&gt;
			end&lt;br /&gt;
			index = index + 1&lt;br /&gt;
			return index % 2 == 1 and first or second&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local regex = orphanCat:gsub(&#039;([%[%]])&#039;, &#039;%%%1&#039;)&lt;br /&gt;
	return (wikitext:gsub(regex, &#039;&#039;):gsub(REGEX_MARKER, changer))  -- () omits gsub count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function processItem(item, nowrapitems)&lt;br /&gt;
	if item:sub(1, 2) == &#039;{|&#039; then&lt;br /&gt;
		-- Applying nowrap to lines in a table does not make sense.&lt;br /&gt;
		-- Add newlines to compensate for trim of x in |parm=x in a template.&lt;br /&gt;
		return &#039;\n&#039; .. item ..&#039;\n&#039;&lt;br /&gt;
	end&lt;br /&gt;
	if nowrapitems == &#039;yes&#039; then&lt;br /&gt;
		local lines = {}&lt;br /&gt;
		for line in (item .. &#039;\n&#039;):gmatch(&#039;([^\n]*)\n&#039;) do&lt;br /&gt;
			local prefix, content = line:match(&#039;^([*:;#]+)%s*(.*)&#039;)&lt;br /&gt;
			if prefix and not content:match(&#039;^&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039;) then&lt;br /&gt;
				line = prefix .. &#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;&#039; .. content .. &#039;&amp;lt;/span&amp;gt;&#039;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(lines, line)&lt;br /&gt;
		end&lt;br /&gt;
		item = table.concat(lines, &#039;\n&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if item:match(&#039;^[*:;#]&#039;) then&lt;br /&gt;
		return &#039;\n&#039; .. item ..&#039;\n&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return item&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderNavBar(titleCell)&lt;br /&gt;
&lt;br /&gt;
	if args.navbar ~= &#039;off&#039; and args.navbar ~= &#039;plain&#039; and not (not args.name and mw.getCurrentFrame():getParent():getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;) == &#039;Template:Navbox&#039;) then&lt;br /&gt;
		titleCell:wikitext(navbar{&lt;br /&gt;
			args.name,&lt;br /&gt;
			mini = 1,&lt;br /&gt;
			fontstyle = (args.basestyle or &#039;&#039;) .. &#039;;&#039; .. (args.titlestyle or &#039;&#039;) .. &#039;;background:none transparent;border:none;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none; padding:0;&#039;&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Title row&lt;br /&gt;
--&lt;br /&gt;
local function renderTitleRow(tbl)&lt;br /&gt;
	if not args.title then return end&lt;br /&gt;
&lt;br /&gt;
	local titleRow = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
	if args.titlegroup then&lt;br /&gt;
		titleRow&lt;br /&gt;
			:tag(&#039;th&#039;)&lt;br /&gt;
				:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
				:addClass(&#039;navbox-group&#039;)&lt;br /&gt;
				:addClass(args.titlegroupclass)&lt;br /&gt;
				:cssText(args.basestyle)&lt;br /&gt;
				:cssText(args.groupstyle)&lt;br /&gt;
				:cssText(args.titlegroupstyle)&lt;br /&gt;
				:wikitext(args.titlegroup)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local titleCell = titleRow:tag(&#039;th&#039;):attr(&#039;scope&#039;, &#039;col&#039;)&lt;br /&gt;
&lt;br /&gt;
	if args.titlegroup then&lt;br /&gt;
		titleCell&lt;br /&gt;
			:css(&#039;border-left&#039;, &#039;2px solid #fdfdfd&#039;)&lt;br /&gt;
			:css(&#039;width&#039;, &#039;100%&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local titleColspan = 2&lt;br /&gt;
	if args.imageleft then titleColspan = titleColspan + 1 end&lt;br /&gt;
	if args.image then titleColspan = titleColspan + 1 end&lt;br /&gt;
	if args.titlegroup then titleColspan = titleColspan - 1 end&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:cssText(args.basestyle)&lt;br /&gt;
		:cssText(args.titlestyle)&lt;br /&gt;
		:addClass(&#039;navbox-title&#039;)&lt;br /&gt;
		:attr(&#039;colspan&#039;, titleColspan)&lt;br /&gt;
&lt;br /&gt;
	renderNavBar(titleCell)&lt;br /&gt;
&lt;br /&gt;
	titleCell&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			-- id for aria-labelledby attribute&lt;br /&gt;
			:attr(&#039;id&#039;, mw.uri.anchorEncode(args.title))&lt;br /&gt;
			:addClass(args.titleclass)&lt;br /&gt;
			:css(&#039;font-size&#039;, &#039;114%&#039;)&lt;br /&gt;
			:css(&#039;margin&#039;, &#039;0 4em&#039;)&lt;br /&gt;
			:wikitext(processItem(args.title))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Above/Below rows&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local function getAboveBelowColspan()&lt;br /&gt;
	local ret = 2&lt;br /&gt;
	if args.imageleft then ret = ret + 1 end&lt;br /&gt;
	if args.image then ret = ret + 1 end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderAboveRow(tbl)&lt;br /&gt;
	if not args.above then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag(&#039;tr&#039;)&lt;br /&gt;
		:tag(&#039;td&#039;)&lt;br /&gt;
			:addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
			:addClass(args.aboveclass)&lt;br /&gt;
			:cssText(args.basestyle)&lt;br /&gt;
			:cssText(args.abovestyle)&lt;br /&gt;
			:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				-- id for aria-labelledby attribute, if no title&lt;br /&gt;
				:attr(&#039;id&#039;, args.title and nil or mw.uri.anchorEncode(args.above))&lt;br /&gt;
				:wikitext(processItem(args.above, args.nowrapitems))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderBelowRow(tbl)&lt;br /&gt;
	if not args.below then return end&lt;br /&gt;
&lt;br /&gt;
	tbl:tag(&#039;tr&#039;)&lt;br /&gt;
		:tag(&#039;td&#039;)&lt;br /&gt;
			:addClass(&#039;navbox-abovebelow&#039;)&lt;br /&gt;
			:addClass(args.belowclass)&lt;br /&gt;
			:cssText(args.basestyle)&lt;br /&gt;
			:cssText(args.belowstyle)&lt;br /&gt;
			:attr(&#039;colspan&#039;, getAboveBelowColspan())&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				:wikitext(processItem(args.below, args.nowrapitems))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   List rows&lt;br /&gt;
--&lt;br /&gt;
local function renderListRow(tbl, index, listnum)&lt;br /&gt;
	local row = tbl:tag(&#039;tr&#039;)&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args.imageleft then&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(&#039;navbox-image&#039;)&lt;br /&gt;
				:addClass(args.imageclass)&lt;br /&gt;
				:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
				:css(&#039;padding&#039;, &#039;0px 2px 0px 0px&#039;)&lt;br /&gt;
				:cssText(args.imageleftstyle)&lt;br /&gt;
				:attr(&#039;rowspan&#039;, #listnums)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:wikitext(processItem(args.imageleft))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if args[&#039;group&#039; .. listnum] then&lt;br /&gt;
		local groupCell = row:tag(&#039;th&#039;)&lt;br /&gt;
&lt;br /&gt;
		-- id for aria-labelledby attribute, if lone group with no title or above&lt;br /&gt;
		if listnum == 1 and not (args.title or args.above or args.group2) then&lt;br /&gt;
			groupCell&lt;br /&gt;
				:attr(&#039;id&#039;, mw.uri.anchorEncode(args.group1))&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:attr(&#039;scope&#039;, &#039;row&#039;)&lt;br /&gt;
			:addClass(&#039;navbox-group&#039;)&lt;br /&gt;
			:addClass(args.groupclass)&lt;br /&gt;
			:cssText(args.basestyle)&lt;br /&gt;
			:css(&#039;width&#039;, args.groupwidth or &#039;1%&#039;) -- If groupwidth not specified, minimize width&lt;br /&gt;
&lt;br /&gt;
		groupCell&lt;br /&gt;
			:cssText(args.groupstyle)&lt;br /&gt;
			:cssText(args[&#039;group&#039; .. listnum .. &#039;style&#039;])&lt;br /&gt;
			:wikitext(args[&#039;group&#039; .. listnum])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listCell = row:tag(&#039;td&#039;)&lt;br /&gt;
&lt;br /&gt;
	if args[&#039;group&#039; .. listnum] then&lt;br /&gt;
		listCell&lt;br /&gt;
			:css(&#039;text-align&#039;, &#039;left&#039;)&lt;br /&gt;
			:css(&#039;border-left-width&#039;, &#039;2px&#039;)&lt;br /&gt;
			:css(&#039;border-left-style&#039;, &#039;solid&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		listCell:attr(&#039;colspan&#039;, 2)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not args.groupwidth then&lt;br /&gt;
		listCell:css(&#039;width&#039;, &#039;100%&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local rowstyle  -- usually nil so cssText(rowstyle) usually adds nothing&lt;br /&gt;
	if index % 2 == 1 then&lt;br /&gt;
		rowstyle = args.oddstyle&lt;br /&gt;
	else&lt;br /&gt;
		rowstyle = args.evenstyle&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local listText = args[&#039;list&#039; .. listnum]&lt;br /&gt;
	local oddEven = ODD_EVEN_MARKER&lt;br /&gt;
	if listText:sub(1, 12) == &#039;&amp;lt;/div&amp;gt;&amp;lt;table&#039; then&lt;br /&gt;
		-- Assume list text is for a subgroup navbox so no automatic striping for this row.&lt;br /&gt;
		oddEven = listText:find(&#039;&amp;lt;th[^&amp;gt;]*&amp;quot;navbox%-title&amp;quot;&#039;) and RESTART_MARKER or &#039;odd&#039;&lt;br /&gt;
	end&lt;br /&gt;
	listCell&lt;br /&gt;
		:css(&#039;padding&#039;, &#039;0px&#039;)&lt;br /&gt;
		:cssText(args.liststyle)&lt;br /&gt;
		:cssText(rowstyle)&lt;br /&gt;
		:cssText(args[&#039;list&#039; .. listnum .. &#039;style&#039;])&lt;br /&gt;
		:addClass(&#039;navbox-list&#039;)&lt;br /&gt;
		:addClass(&#039;navbox-&#039; .. oddEven)&lt;br /&gt;
		:addClass(args.listclass)&lt;br /&gt;
		:addClass(args[&#039;list&#039; .. listnum .. &#039;class&#039;])&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			:css(&#039;padding&#039;, (index == 1 and args.list1padding) or args.listpadding or &#039;0em 0.25em&#039;)&lt;br /&gt;
			:wikitext(processItem(listText, args.nowrapitems))&lt;br /&gt;
&lt;br /&gt;
	if index == 1 and args.image then&lt;br /&gt;
		row&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:addClass(&#039;navbox-image&#039;)&lt;br /&gt;
				:addClass(args.imageclass)&lt;br /&gt;
				:css(&#039;width&#039;, &#039;1px&#039;)               -- Minimize width&lt;br /&gt;
				:css(&#039;padding&#039;, &#039;0px 0px 0px 2px&#039;)&lt;br /&gt;
				:cssText(args.imagestyle)&lt;br /&gt;
				:attr(&#039;rowspan&#039;, #listnums)&lt;br /&gt;
				:tag(&#039;div&#039;)&lt;br /&gt;
					:wikitext(processItem(args.image))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Tracking categories&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local function needsHorizontalLists()&lt;br /&gt;
	if border == &#039;subgroup&#039; or args.tracking == &#039;no&#039; then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	local listClasses = {&lt;br /&gt;
		[&#039;plainlist&#039;] = true, [&#039;hlist&#039;] = true, [&#039;hlist hnum&#039;] = true,&lt;br /&gt;
		[&#039;hlist hwrap&#039;] = true, [&#039;hlist vcard&#039;] = true, [&#039;vcard hlist&#039;] = true,&lt;br /&gt;
		[&#039;hlist vevent&#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
	return not (listClasses[args.listclass] or listClasses[args.bodyclass])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasBackgroundColors()&lt;br /&gt;
	for _, key in ipairs({&#039;titlestyle&#039;, &#039;groupstyle&#039;, &#039;basestyle&#039;, &#039;abovestyle&#039;, &#039;belowstyle&#039;}) do&lt;br /&gt;
		if tostring(args[key]):find(&#039;background&#039;, 1, true) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function hasBorders()&lt;br /&gt;
	for _, key in ipairs({&#039;groupstyle&#039;, &#039;basestyle&#039;, &#039;abovestyle&#039;, &#039;belowstyle&#039;}) do&lt;br /&gt;
		if tostring(args[key]):find(&#039;border&#039;, 1, true) then&lt;br /&gt;
			return true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isIllegible()&lt;br /&gt;
	local styleratio = require(&#039;Module:Color contrast&#039;)._styleratio&lt;br /&gt;
&lt;br /&gt;
	for key, style in pairs(args) do&lt;br /&gt;
		if tostring(key):match(&amp;quot;style$&amp;quot;) then&lt;br /&gt;
			if styleratio{mw.text.unstripNoWiki(style)} &amp;lt; 4.5 then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getTrackingCategories()&lt;br /&gt;
	local cats = {}&lt;br /&gt;
	if needsHorizontalLists() then table.insert(cats, &#039;Navigational boxes without horizontal lists&#039;) end&lt;br /&gt;
	if hasBackgroundColors() then table.insert(cats, &#039;Navboxes using background colours&#039;) end&lt;br /&gt;
	if isIllegible() then table.insert(cats, &#039;Potentially illegible navboxes&#039;) end&lt;br /&gt;
	if hasBorders() then table.insert(cats, &#039;Navboxes using borders&#039;) end&lt;br /&gt;
	return cats&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function renderTrackingCategories(builder)&lt;br /&gt;
	local title = mw.title.getCurrentTitle()&lt;br /&gt;
	if title.namespace ~= 10 then return end -- not in template space&lt;br /&gt;
	local subpage = title.subpageText&lt;br /&gt;
	if subpage == &#039;doc&#039; or subpage == &#039;sandbox&#039; or subpage == &#039;testcases&#039; then return end&lt;br /&gt;
&lt;br /&gt;
	for _, cat in ipairs(getTrackingCategories()) do&lt;br /&gt;
		builder:wikitext(&#039;[[Category:&#039; .. cat .. &#039;]]&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
--   Main navbox tables&lt;br /&gt;
--&lt;br /&gt;
local function renderMainTable()&lt;br /&gt;
	local tbl = mw.html.create(&#039;table&#039;)&lt;br /&gt;
		:addClass(&#039;nowraplinks&#039;)&lt;br /&gt;
		:addClass(args.bodyclass)&lt;br /&gt;
&lt;br /&gt;
	if args.title and (args.state ~= &#039;plain&#039; and args.state ~= &#039;off&#039;) then&lt;br /&gt;
		if args.state == &#039;collapsed&#039; then args.state = &#039;mw-collapsed&#039; end&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(&#039;mw-collapsible&#039;)&lt;br /&gt;
			:addClass(args.state or &#039;autocollapse&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tbl:css(&#039;border-spacing&#039;, 0)&lt;br /&gt;
	if border == &#039;subgroup&#039; or border == &#039;none&#039; then&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(&#039;navbox-subgroup&#039;)&lt;br /&gt;
			:cssText(args.bodystyle)&lt;br /&gt;
			:cssText(args.style)&lt;br /&gt;
	else  -- regular navbox - bodystyle and style will be applied to the wrapper table&lt;br /&gt;
		tbl&lt;br /&gt;
			:addClass(&#039;navbox-inner&#039;)&lt;br /&gt;
			:css(&#039;background&#039;, &#039;transparent&#039;)&lt;br /&gt;
			:css(&#039;color&#039;, &#039;inherit&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	tbl:cssText(args.innerstyle)&lt;br /&gt;
&lt;br /&gt;
	renderTitleRow(tbl)&lt;br /&gt;
	renderAboveRow(tbl)&lt;br /&gt;
	for i, listnum in ipairs(listnums) do&lt;br /&gt;
		renderListRow(tbl, i, listnum)&lt;br /&gt;
	end&lt;br /&gt;
	renderBelowRow(tbl)&lt;br /&gt;
&lt;br /&gt;
	return tbl&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbox(navboxArgs)&lt;br /&gt;
	args = navboxArgs&lt;br /&gt;
	listnums = {}&lt;br /&gt;
&lt;br /&gt;
	for k, _ in pairs(args) do&lt;br /&gt;
		if type(k) == &#039;string&#039; then&lt;br /&gt;
			local listnum = k:match(&#039;^list(%d+)$&#039;)&lt;br /&gt;
			if listnum then table.insert(listnums, tonumber(listnum)) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(listnums)&lt;br /&gt;
&lt;br /&gt;
	border = mw.text.trim(args.border or args[1] or &#039;&#039;)&lt;br /&gt;
	if border == &#039;child&#039; then&lt;br /&gt;
		border = &#039;subgroup&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- render the main body of the navbox&lt;br /&gt;
	local tbl = renderMainTable()&lt;br /&gt;
&lt;br /&gt;
	-- render the appropriate wrapper around the navbox, depending on the border param&lt;br /&gt;
	local res = mw.html.create()&lt;br /&gt;
	if border == &#039;none&#039; then&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args.title or args.above or (args.group1 and not args.group2) then&lt;br /&gt;
			nav:attr(&#039;aria-labelledby&#039;, mw.uri.anchorEncode(args.title or args.above or args.group1))&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, &#039;Navbox&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	elseif border == &#039;subgroup&#039; then&lt;br /&gt;
		-- We assume that this navbox is being rendered in a list cell of a parent navbox, and is&lt;br /&gt;
		-- therefore inside a div with padding:0em 0.25em. We start with a &amp;lt;/div&amp;gt; to avoid the&lt;br /&gt;
		-- padding being applied, and at the end add a &amp;lt;div&amp;gt; to balance out the parent&#039;s &amp;lt;/div&amp;gt;&lt;br /&gt;
		res&lt;br /&gt;
			:wikitext(&#039;&amp;lt;/div&amp;gt;&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
			:wikitext(&#039;&amp;lt;div&amp;gt;&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		local nav = res:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;role&#039;, &#039;navigation&#039;)&lt;br /&gt;
			:addClass(&#039;navbox&#039;)&lt;br /&gt;
			:addClass(args.navboxclass)&lt;br /&gt;
			:cssText(args.bodystyle)&lt;br /&gt;
			:cssText(args.style)&lt;br /&gt;
			:css(&#039;padding&#039;, &#039;3px&#039;)&lt;br /&gt;
			:node(tbl)&lt;br /&gt;
		-- aria-labelledby title, otherwise above, otherwise lone group&lt;br /&gt;
		if args.title or args.above or (args.group1 and not args.group2) then&lt;br /&gt;
			nav:attr(&#039;aria-labelledby&#039;, mw.uri.anchorEncode(args.title or args.above or args.group1))&lt;br /&gt;
		else&lt;br /&gt;
			nav:attr(&#039;aria-label&#039;, &#039;Navbox&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if (args.nocat or &#039;false&#039;):lower() == &#039;false&#039; then&lt;br /&gt;
		renderTrackingCategories(res)&lt;br /&gt;
	end&lt;br /&gt;
	return striped(tostring(res))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbox(frame)&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	args = getArgs(frame, {wrappers = {&#039;Template:Navbox&#039;, &#039;Template:Navbox subgroup&#039;}})&lt;br /&gt;
	if frame.args.border then&lt;br /&gt;
		-- This allows Template:Navbox_subgroup to use {{#invoke:Navbox|navbox|border=...}}.&lt;br /&gt;
		args.border = frame.args.border&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Read the arguments in the order they&#039;ll be output in, to make references number in the right order.&lt;br /&gt;
	local _&lt;br /&gt;
	_ = args.title&lt;br /&gt;
	_ = args.above&lt;br /&gt;
	for i = 1, 20 do&lt;br /&gt;
		_ = args[&amp;quot;group&amp;quot; .. tostring(i)]&lt;br /&gt;
		_ = args[&amp;quot;list&amp;quot; .. tostring(i)]&lt;br /&gt;
	end&lt;br /&gt;
	_ = args.below&lt;br /&gt;
&lt;br /&gt;
	return p._navbox(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Navbar&amp;diff=2761</id>
		<title>Module:Navbar</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Navbar&amp;diff=2761"/>
		<updated>2020-07-01T10:17:08Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Navbar&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local getArgs&lt;br /&gt;
local ul&lt;br /&gt;
&lt;br /&gt;
function p.addItem (mini, full, link, descrip, args, url)&lt;br /&gt;
	local l&lt;br /&gt;
	if url then&lt;br /&gt;
		l = {&#039;[&#039;, &#039;&#039;, &#039;]&#039;}&lt;br /&gt;
	else&lt;br /&gt;
		l = {&#039;[[&#039;, &#039;|&#039;, &#039;]]&#039;}&lt;br /&gt;
	end&lt;br /&gt;
	ul:tag(&#039;li&#039;)&lt;br /&gt;
		:addClass(&#039;nv-&#039;..full)&lt;br /&gt;
		:wikitext(l[1] .. link .. l[2])&lt;br /&gt;
		:tag(args.mini and &#039;abbr&#039; or &#039;span&#039;)&lt;br /&gt;
			:attr(&#039;title&#039;, descrip..&#039; this template&#039;)&lt;br /&gt;
			:cssText(args.fontstyle)&lt;br /&gt;
			:wikitext(args.mini and mini or full)&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(l[3])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.brackets (position, c, args, div)&lt;br /&gt;
	if args.brackets then&lt;br /&gt;
		div&lt;br /&gt;
			:tag(&#039;span&#039;)&lt;br /&gt;
				:css(&#039;margin-&#039;..position, &#039;-0.125em&#039;)&lt;br /&gt;
				:cssText(args.fontstyle)&lt;br /&gt;
				:wikitext(c)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._navbar(args)&lt;br /&gt;
	local show = {true, true, true, false, false, false}&lt;br /&gt;
	local titleArg = 1&lt;br /&gt;
	&lt;br /&gt;
	if args.collapsible then&lt;br /&gt;
		titleArg = 2&lt;br /&gt;
		if not args.plain then args.mini = 1 end&lt;br /&gt;
		if args.fontcolor then&lt;br /&gt;
			args.fontstyle = &#039;color:&#039; .. args.fontcolor .. &#039;;&#039;&lt;br /&gt;
		end&lt;br /&gt;
		args.style = &#039;float:left; text-align:left&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.template then&lt;br /&gt;
		titleArg = &#039;template&#039;&lt;br /&gt;
		show = {true, false, false, false, false, false}&lt;br /&gt;
		local index = {t = 2, d = 2, e = 3, h = 4, m = 5, w = 6, talk = 2, edit = 3, hist = 4, move = 5, watch = 6}&lt;br /&gt;
		for k,v in ipairs(require (&#039;Module:TableTools&#039;).compressSparseArray(args)) do&lt;br /&gt;
			local num = index[v]&lt;br /&gt;
			if num then show[num] = true end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if args.noedit then show[3] = false end&lt;br /&gt;
	&lt;br /&gt;
	local titleText = args[titleArg] or (&#039;:&#039; .. mw.getCurrentFrame():getParent():getTitle())&lt;br /&gt;
	local title = mw.title.new(mw.text.trim(titleText), &#039;Template&#039;)&lt;br /&gt;
	if not title then&lt;br /&gt;
		error(&#039;Invalid title &#039; .. titleText)&lt;br /&gt;
	end&lt;br /&gt;
	local talkpage = title.talkPageTitle and title.talkPageTitle.fullText or &#039;&#039;&lt;br /&gt;
	&lt;br /&gt;
	local div = mw.html.create():tag(&#039;div&#039;)&lt;br /&gt;
	div&lt;br /&gt;
		:addClass(&#039;plainlinks&#039;)&lt;br /&gt;
		:addClass(&#039;hlist&#039;)&lt;br /&gt;
		:addClass(&#039;navbar&#039;)&lt;br /&gt;
		:cssText(args.style)&lt;br /&gt;
&lt;br /&gt;
	if args.mini then div:addClass(&#039;mini&#039;) end&lt;br /&gt;
&lt;br /&gt;
	if not (args.mini or args.plain) then&lt;br /&gt;
		div&lt;br /&gt;
			:tag(&#039;span&#039;)&lt;br /&gt;
				:css(&#039;word-spacing&#039;, 0)&lt;br /&gt;
				:cssText(args.fontstyle)&lt;br /&gt;
				:wikitext(args.text or &#039;This box:&#039;)&lt;br /&gt;
				:wikitext(&#039; &#039;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	p.brackets(&#039;right&#039;, &#039;&amp;amp;#91; &#039;, args, div)&lt;br /&gt;
	&lt;br /&gt;
	ul = div:tag(&#039;ul&#039;)&lt;br /&gt;
	if show[1] then p.addItem(&#039;v&#039;, &#039;view&#039;, title.fullText, &#039;View&#039;, args) end&lt;br /&gt;
	if show[2] then p.addItem(&#039;t&#039;, &#039;talk&#039;, talkpage, &#039;Discuss&#039;, args) end&lt;br /&gt;
	if show[3] then p.addItem(&#039;e&#039;, &#039;edit&#039;, title:fullUrl(&#039;action=edit&#039;), &#039;Edit&#039;, args, true) end&lt;br /&gt;
	if show[4] then p.addItem(&#039;h&#039;, &#039;hist&#039;, title:fullUrl(&#039;action=history&#039;), &#039;History of&#039;, args, true) end&lt;br /&gt;
	if show[5] then&lt;br /&gt;
		local move = mw.title.new (&#039;Special:Movepage&#039;)&lt;br /&gt;
		p.addItem(&#039;m&#039;, &#039;move&#039;, move:fullUrl(&#039;target=&#039;..title.fullText), &#039;Move&#039;, args, true) end&lt;br /&gt;
	if show[6] then p.addItem(&#039;w&#039;, &#039;watch&#039;, title:fullUrl(&#039;action=watch&#039;), &#039;Watch&#039;, args, true) end&lt;br /&gt;
	&lt;br /&gt;
	p.brackets(&#039;left&#039;, &#039; &amp;amp;#93;&#039;, args, div)&lt;br /&gt;
	&lt;br /&gt;
	if args.collapsible then&lt;br /&gt;
		div&lt;br /&gt;
			:done()&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			:css(&#039;font-size&#039;, &#039;114%&#039;)&lt;br /&gt;
			:css(&#039;margin&#039;, args.mini and &#039;0 4em&#039; or &#039;0 7em&#039;)&lt;br /&gt;
			:cssText(args.fontstyle)&lt;br /&gt;
			:wikitext(args[1])&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(div:done())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.navbar(frame)&lt;br /&gt;
	if not getArgs then&lt;br /&gt;
		getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
	end&lt;br /&gt;
	return p._navbar(getArgs(frame))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:List&amp;diff=2760</id>
		<title>Module:List</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:List&amp;diff=2760"/>
		<updated>2020-07-01T10:17:06Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:List&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module outputs different kinds of lists. At the moment, bulleted,&lt;br /&gt;
-- unbulleted, horizontal, ordered, and horizontal ordered lists are supported.&lt;br /&gt;
&lt;br /&gt;
local libUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libUtil.checkType&lt;br /&gt;
local mTableTools = require(&#039;Module:TableTools&#039;)&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local listTypes = {&lt;br /&gt;
	[&#039;bulleted&#039;] = true,&lt;br /&gt;
	[&#039;unbulleted&#039;] = true,&lt;br /&gt;
	[&#039;horizontal&#039;] = true,&lt;br /&gt;
	[&#039;ordered&#039;] = true,&lt;br /&gt;
	[&#039;horizontal_ordered&#039;] = true&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function p.makeListData(listType, args)&lt;br /&gt;
	-- Constructs a data table to be passed to p.renderList.&lt;br /&gt;
	local data = {}&lt;br /&gt;
&lt;br /&gt;
	-- Classes&lt;br /&gt;
	data.classes = {}&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;hlist&#039;)&lt;br /&gt;
	elseif listType == &#039;unbulleted&#039; then&lt;br /&gt;
		table.insert(data.classes, &#039;plainlist&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	table.insert(data.classes, args.class)&lt;br /&gt;
&lt;br /&gt;
	-- Main div style&lt;br /&gt;
	data.style = args.style&lt;br /&gt;
&lt;br /&gt;
	-- Indent for horizontal lists&lt;br /&gt;
	if listType == &#039;horizontal&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		local indent = tonumber(args.indent)&lt;br /&gt;
		indent = indent and indent * 1.6 or 0&lt;br /&gt;
		if indent &amp;gt; 0 then&lt;br /&gt;
			data.marginLeft = indent .. &#039;em&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List style types for ordered lists&lt;br /&gt;
	-- This could be &amp;quot;1, 2, 3&amp;quot;, &amp;quot;a, b, c&amp;quot;, or a number of others. The list style&lt;br /&gt;
	-- type is either set by the &amp;quot;type&amp;quot; attribute or the &amp;quot;list-style-type&amp;quot; CSS&lt;br /&gt;
	-- property.&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then &lt;br /&gt;
		data.listStyleType = args.list_style_type or args[&#039;list-style-type&#039;]&lt;br /&gt;
		data.type = args[&#039;type&#039;]&lt;br /&gt;
&lt;br /&gt;
		-- Detect invalid type attributes and attempt to convert them to&lt;br /&gt;
		-- list-style-type CSS properties.&lt;br /&gt;
		if data.type &lt;br /&gt;
			and not data.listStyleType&lt;br /&gt;
			and not tostring(data.type):find(&#039;^%s*[1AaIi]%s*$&#039;)&lt;br /&gt;
		then&lt;br /&gt;
			data.listStyleType = data.type&lt;br /&gt;
			data.type = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- List tag type&lt;br /&gt;
	if listType == &#039;ordered&#039; or listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		data.listTag = &#039;ol&#039;&lt;br /&gt;
	else&lt;br /&gt;
		data.listTag = &#039;ul&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Start number for ordered lists&lt;br /&gt;
	data.start = args.start&lt;br /&gt;
	if listType == &#039;horizontal_ordered&#039; then&lt;br /&gt;
		-- Apply fix to get start numbers working with horizontal ordered lists.&lt;br /&gt;
		local startNum = tonumber(data.start)&lt;br /&gt;
		if startNum then&lt;br /&gt;
			data.counterReset = &#039;listitem &#039; .. tostring(startNum - 1)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- List style&lt;br /&gt;
	 -- ul_style and ol_style are included for backwards compatibility. No&lt;br /&gt;
	 -- distinction is made for ordered or unordered lists.&lt;br /&gt;
	data.listStyle = args.list_style&lt;br /&gt;
&lt;br /&gt;
	-- List items&lt;br /&gt;
	-- li_style is included for backwards compatibility. item_style was included&lt;br /&gt;
	-- to be easier to understand for non-coders.&lt;br /&gt;
	data.itemStyle = args.item_style or args.li_style&lt;br /&gt;
	data.items = {}&lt;br /&gt;
	for i, num in ipairs(mTableTools.numKeys(args)) do&lt;br /&gt;
		local item = {}&lt;br /&gt;
		item.content = args[num]&lt;br /&gt;
		item.style = args[&#039;item&#039; .. tostring(num) .. &#039;_style&#039;]&lt;br /&gt;
			or args[&#039;item_style&#039; .. tostring(num)]&lt;br /&gt;
		item.value = args[&#039;item&#039; .. tostring(num) .. &#039;_value&#039;]&lt;br /&gt;
			or args[&#039;item_value&#039; .. tostring(num)]&lt;br /&gt;
		table.insert(data.items, item)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderList(data)&lt;br /&gt;
	-- Renders the list HTML.&lt;br /&gt;
	&lt;br /&gt;
	-- Return the blank string if there are no list items.&lt;br /&gt;
	if type(data.items) ~= &#039;table&#039; or #data.items &amp;lt; 1 then&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Render the main div tag.&lt;br /&gt;
	local root = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	for i, class in ipairs(data.classes or {}) do&lt;br /&gt;
		root:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	root:css{[&#039;margin-left&#039;] = data.marginLeft}&lt;br /&gt;
	if data.style then&lt;br /&gt;
		root:cssText(data.style)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list tag.&lt;br /&gt;
	local list = root:tag(data.listTag or &#039;ul&#039;)&lt;br /&gt;
	list&lt;br /&gt;
		:attr{start = data.start, type = data.type}&lt;br /&gt;
		:css{&lt;br /&gt;
			[&#039;counter-reset&#039;] = data.counterReset,&lt;br /&gt;
			[&#039;list-style-type&#039;] = data.listStyleType&lt;br /&gt;
		}&lt;br /&gt;
	if data.listStyle then&lt;br /&gt;
		list:cssText(data.listStyle)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Render the list items&lt;br /&gt;
	for i, t in ipairs(data.items or {}) do&lt;br /&gt;
		local item = list:tag(&#039;li&#039;)&lt;br /&gt;
		if data.itemStyle then&lt;br /&gt;
			item:cssText(data.itemStyle)&lt;br /&gt;
		end&lt;br /&gt;
		if t.style then&lt;br /&gt;
			item:cssText(t.style)&lt;br /&gt;
		end&lt;br /&gt;
		item&lt;br /&gt;
			:attr{value = t.value}&lt;br /&gt;
			:wikitext(t.content)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeList(listType, args)&lt;br /&gt;
	if not listType or not listTypes[listType] then&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&amp;quot;bad argument #1 to &#039;makeList&#039; (&#039;%s&#039; is not a valid list type)&amp;quot;,&lt;br /&gt;
			tostring(listType)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
	checkType(&#039;makeList&#039;, 2, args, &#039;table&#039;)&lt;br /&gt;
	local data = p.makeListData(listType, args)&lt;br /&gt;
	return p.renderList(data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
for listType in pairs(listTypes) do&lt;br /&gt;
	p[listType] = function (frame)&lt;br /&gt;
		local mArguments = require(&#039;Module:Arguments&#039;)&lt;br /&gt;
		local origArgs = mArguments.getArgs(frame)&lt;br /&gt;
		-- Copy all the arguments to a new table, for faster indexing.&lt;br /&gt;
		local args = {}&lt;br /&gt;
		for k, v in pairs(origArgs) do&lt;br /&gt;
			args[k] = v&lt;br /&gt;
		end&lt;br /&gt;
		return p.makeList(listType, args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Hatnote&amp;diff=2759</id>
		<title>Module:Hatnote</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Hatnote&amp;diff=2759"/>
		<updated>2020-07-01T10:17:05Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Hatnote&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                              Module:Hatnote                                --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module produces hatnote links and links to related articles. It       --&lt;br /&gt;
-- implements the {{hatnote}} and {{format link}} meta-templates and includes --&lt;br /&gt;
-- helper functions for other Lua hatnote modules.                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local checkTypeForNamedArg = libraryUtil.checkTypeForNamedArg&lt;br /&gt;
local mArguments -- lazily initialise [[Module:Arguments]]&lt;br /&gt;
local yesno -- lazily initialise [[Module:Yesno]]&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getArgs(frame)&lt;br /&gt;
	-- Fetches the arguments from the parent frame. Whitespace is trimmed and&lt;br /&gt;
	-- blanks are removed.&lt;br /&gt;
	mArguments = require(&#039;Module:Arguments&#039;)&lt;br /&gt;
	return mArguments.getArgs(frame, {parentOnly = true})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function removeInitialColon(s)&lt;br /&gt;
	-- Removes the initial colon from a string, if present.&lt;br /&gt;
	return s:match(&#039;^:?(.*)&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.findNamespaceId(link, removeColon)&lt;br /&gt;
	-- Finds the namespace id (namespace number) of a link or a pagename. This&lt;br /&gt;
	-- function will not work if the link is enclosed in double brackets. Colons&lt;br /&gt;
	-- are trimmed from the start of the link by default. To skip colon&lt;br /&gt;
	-- trimming, set the removeColon parameter to false.&lt;br /&gt;
	checkType(&#039;findNamespaceId&#039;, 1, link, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;findNamespaceId&#039;, 2, removeColon, &#039;boolean&#039;, true)&lt;br /&gt;
	if removeColon ~= false then&lt;br /&gt;
		link = removeInitialColon(link)&lt;br /&gt;
	end&lt;br /&gt;
	local namespace = link:match(&#039;^(.-):&#039;)&lt;br /&gt;
	if namespace then&lt;br /&gt;
		local nsTable = mw.site.namespaces[namespace]&lt;br /&gt;
		if nsTable then&lt;br /&gt;
			return nsTable.id&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return 0&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatPages(...)&lt;br /&gt;
	-- Formats a list of pages using formatLink and returns it as an array. Nil&lt;br /&gt;
	-- values are not allowed.&lt;br /&gt;
	local pages = {...}&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for i, page in ipairs(pages) do&lt;br /&gt;
		ret[i] = p._formatLink{link = page}&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.formatPageTables(...)&lt;br /&gt;
	-- Takes a list of page/display tables and returns it as a list of&lt;br /&gt;
	-- formatted links. Nil values are not allowed.&lt;br /&gt;
	local pages = {...}&lt;br /&gt;
	local links = {}&lt;br /&gt;
	for i, t in ipairs(pages) do&lt;br /&gt;
		checkType(&#039;formatPageTables&#039;, i, t, &#039;table&#039;)&lt;br /&gt;
		local link = t[1]&lt;br /&gt;
		local display = t[2]&lt;br /&gt;
		links[i] = p._formatLink{link = link, display = display}&lt;br /&gt;
	end&lt;br /&gt;
	return links&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeWikitextError(msg, helpLink, addTrackingCategory, title)&lt;br /&gt;
	-- Formats an error message to be returned to wikitext. If&lt;br /&gt;
	-- addTrackingCategory is not false after being returned from&lt;br /&gt;
	-- [[Module:Yesno]], and if we are not on a talk page, a tracking category&lt;br /&gt;
	-- is added.&lt;br /&gt;
	checkType(&#039;makeWikitextError&#039;, 1, msg, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;makeWikitextError&#039;, 2, helpLink, &#039;string&#039;, true)&lt;br /&gt;
	yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
	title = title or mw.title.getCurrentTitle()&lt;br /&gt;
	-- Make the help link text.&lt;br /&gt;
	local helpText&lt;br /&gt;
	if helpLink then&lt;br /&gt;
		helpText = &#039; ([[&#039; .. helpLink .. &#039;|help]])&#039;&lt;br /&gt;
	else&lt;br /&gt;
		helpText = &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	-- Make the category text.&lt;br /&gt;
	local category&lt;br /&gt;
	if not title.isTalkPage and yesno(addTrackingCategory) ~= false then&lt;br /&gt;
		category = &#039;Hatnote templates with errors&#039;&lt;br /&gt;
		category = string.format(&lt;br /&gt;
			&#039;[[%s:%s]]&#039;,&lt;br /&gt;
			mw.site.namespaces[14].name,&lt;br /&gt;
			category&lt;br /&gt;
		)&lt;br /&gt;
	else&lt;br /&gt;
		category = &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&#039;&amp;lt;strong class=&amp;quot;error&amp;quot;&amp;gt;Error: %s%s.&amp;lt;/strong&amp;gt;%s&#039;,&lt;br /&gt;
		msg,&lt;br /&gt;
		helpText,&lt;br /&gt;
		category&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.disambiguate(page, disambiguator)&lt;br /&gt;
	-- Formats a page title with a disambiguation parenthetical,&lt;br /&gt;
	-- i.e. &amp;quot;Example&amp;quot; → &amp;quot;Example (disambiguation)&amp;quot;.&lt;br /&gt;
	checkType(&#039;disambiguate&#039;, 1, page, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;disambiguate&#039;, 2, disambiguator, &#039;string&#039;, true)&lt;br /&gt;
	disambiguator = disambiguator or &#039;disambiguation&#039;&lt;br /&gt;
	return string.format(&#039;%s (%s)&#039;, page, disambiguator)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Format link&lt;br /&gt;
--&lt;br /&gt;
-- Makes a wikilink from the given link and display values. Links are escaped&lt;br /&gt;
-- with colons if necessary, and links to sections are detected and displayed&lt;br /&gt;
-- with &amp;quot; § &amp;quot; as a separator rather than the standard MediaWiki &amp;quot;#&amp;quot;. Used in&lt;br /&gt;
-- the {{format hatnote link}} template.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.formatLink(frame)&lt;br /&gt;
	-- The formatLink export function, for use in templates.&lt;br /&gt;
	yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local link = args[1]&lt;br /&gt;
	if not link then&lt;br /&gt;
		return p.makeWikitextError(&lt;br /&gt;
			&#039;no link specified&#039;,&lt;br /&gt;
			&#039;Template:Format hatnote link#Errors&#039;,&lt;br /&gt;
			args.category&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	return p._formatLink{&lt;br /&gt;
		link = link,&lt;br /&gt;
		display = args[2],&lt;br /&gt;
		italicizePage = yesno(args.italicizepage),&lt;br /&gt;
		italicizeSection = yesno(args.italicizesection),&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function italicize(s)&lt;br /&gt;
	-- Italicize a string.&lt;br /&gt;
	return &#039;&amp;lt;i&amp;gt;&#039; .. s .. &#039;&amp;lt;/i&amp;gt;&#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function maybeItalicize(s, shouldItalicize)&lt;br /&gt;
	-- italicize s if s is a string and the shouldItalicize parameter is true.&lt;br /&gt;
	if s and shouldItalicize then&lt;br /&gt;
		return italicize(s)&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function parseLink(link)&lt;br /&gt;
	-- Parse a link and return a table with the link&#039;s components.&lt;br /&gt;
	-- These components are:&lt;br /&gt;
	-- - link: the link, stripped of any initial colon (always present)&lt;br /&gt;
	-- - page: the page name (always present)&lt;br /&gt;
	-- - section: the page name (may be nil)&lt;br /&gt;
	-- - display: the display text, if manually entered after a pipe (may be nil)&lt;br /&gt;
	link = removeInitialColon(link)&lt;br /&gt;
&lt;br /&gt;
	-- Find whether a faux display value has been added with the {{!}} magic&lt;br /&gt;
	-- word.&lt;br /&gt;
	local prePipe, display = link:match(&#039;^(.-)|(.*)$&#039;)&lt;br /&gt;
	link = prePipe or link&lt;br /&gt;
&lt;br /&gt;
	-- Find the section, if it exists.&lt;br /&gt;
	local page, section = link:match(&#039;^(.-)#(.*)$&#039;)&lt;br /&gt;
	page = page or link&lt;br /&gt;
	&lt;br /&gt;
	return {&lt;br /&gt;
		link = link,&lt;br /&gt;
		page = page,&lt;br /&gt;
		section = section,&lt;br /&gt;
		display = display,&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._formatLink(options)&lt;br /&gt;
	-- The formatLink export function, for use in modules.&lt;br /&gt;
	checkType(&#039;_formatLink&#039;, 1, options, &#039;table&#039;)&lt;br /&gt;
	checkTypeForNamedArg(&#039;_formatLink&#039;, &#039;link&#039;, options.link, &#039;string&#039;, false)&lt;br /&gt;
	checkTypeForNamedArg(&lt;br /&gt;
		&#039;_formatLink&#039;,&lt;br /&gt;
		&#039;display&#039;,&lt;br /&gt;
		options.display,&lt;br /&gt;
		&#039;string&#039;,&lt;br /&gt;
		true&lt;br /&gt;
	)&lt;br /&gt;
	checkTypeForNamedArg(&lt;br /&gt;
		&#039;_formatLink&#039;,&lt;br /&gt;
		&#039;italicizePage&#039;,&lt;br /&gt;
		options.italicizePage,&lt;br /&gt;
		&#039;boolean&#039;,&lt;br /&gt;
		true&lt;br /&gt;
	)&lt;br /&gt;
	checkTypeForNamedArg(&lt;br /&gt;
		&#039;_formatLink&#039;,&lt;br /&gt;
		&#039;italicizeSection&#039;,&lt;br /&gt;
		options.italicizeSection,&lt;br /&gt;
		&#039;boolean&#039;,&lt;br /&gt;
		true&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	local parsed = parseLink(options.link)&lt;br /&gt;
	local display = options.display or parsed.display&lt;br /&gt;
	&lt;br /&gt;
	-- Deal with the case where we don&#039;t have to pipe the link&lt;br /&gt;
	if not display and not parsed.section and not options.italicizePage then&lt;br /&gt;
		return string.format(&#039;[[:%s]]&#039;, parsed.link)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Find the display text for piped links&lt;br /&gt;
	if not display then&lt;br /&gt;
		local page = maybeItalicize(parsed.page, options.italicizePage)&lt;br /&gt;
		local section = maybeItalicize(parsed.section, options.italicizeSection)&lt;br /&gt;
		if section then&lt;br /&gt;
			display = string.format(&#039;%s §&amp;amp;nbsp;%s&#039;, page, section)&lt;br /&gt;
		else&lt;br /&gt;
			display = page&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return string.format(&#039;[[:%s|%s]]&#039;, parsed.link, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Hatnote&lt;br /&gt;
--&lt;br /&gt;
-- Produces standard hatnote text. Implements the {{hatnote}} template.&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.hatnote(frame)&lt;br /&gt;
	local args = getArgs(frame)&lt;br /&gt;
	local s = args[1]&lt;br /&gt;
	local options = {}&lt;br /&gt;
	if not s then&lt;br /&gt;
		return p.makeWikitextError(&lt;br /&gt;
			&#039;no text specified&#039;,&lt;br /&gt;
			&#039;Template:Hatnote#Errors&#039;,&lt;br /&gt;
			args.category&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
	options.extraclasses = args.extraclasses&lt;br /&gt;
	options.selfref = args.selfref&lt;br /&gt;
	return p._hatnote(s, options)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._hatnote(s, options)&lt;br /&gt;
	checkType(&#039;_hatnote&#039;, 1, s, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;_hatnote&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	options = options or {}&lt;br /&gt;
	local classes = {&#039;hatnote&#039;, &#039;navigation-not-searchable&#039;}&lt;br /&gt;
	local extraclasses = options.extraclasses&lt;br /&gt;
	local selfref = options.selfref&lt;br /&gt;
	if type(extraclasses) == &#039;string&#039; then&lt;br /&gt;
		classes[#classes + 1] = extraclasses&lt;br /&gt;
	end&lt;br /&gt;
	if selfref then&lt;br /&gt;
		classes[#classes + 1] = &#039;selfref&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return string.format(&lt;br /&gt;
		&#039;&amp;lt;div role=&amp;quot;note&amp;quot; class=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/div&amp;gt;&#039;,&lt;br /&gt;
		table.concat(classes, &#039; &#039;),&lt;br /&gt;
		s&lt;br /&gt;
	)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Graph/doc&amp;diff=2758</id>
		<title>Module:Graph/doc</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Graph/doc&amp;diff=2758"/>
		<updated>2020-07-01T10:17:04Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Graph/doc&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Module with helper functions for the [[Extension:Graph|Graph]] extension.&lt;br /&gt;
&lt;br /&gt;
== Functions for templates ==&lt;br /&gt;
=== &amp;lt;tt&amp;gt;map&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Creates a JSON object for &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graph&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; to display a political map with colored highlights. &lt;br /&gt;
&lt;br /&gt;
Maps can be found at [[Special:PrefixIndex/Module:Graph/]] and new maps should also be saved under Modul:Graph/.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parameters:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;basemap:&#039;&#039;&#039; sets the base map. The map definitions must follow the [https://github.com/mbostock/topojson/wiki TopoJSON] format and if saved in Wikipedia are available for this module. Maps in the default directory [[Special:PrefixIndex/Module:Graph/]] should only be referenced by their name while omitting the Module:Graph/ prefix to allow better portability. The parameter also accepts URLs, e.g. maps from other Wikipedia versions (the link should follow the scheme of &amp;lt;tt&amp;gt;//en.wikipedia.org/w/index.php?title=&#039;&#039;mapname&#039;&#039;&amp;amp;action=raw&amp;lt;/tt&amp;gt;, i.e. protocol-relative without leading http/s and a trailing action=raw to fetch the raw content only). &amp;lt;small&amp;gt;URLs to maps on external sites should be avoided for the sake of link stability, performance, security, and should be assumed to be blocked by the software or browser anyway.&amp;lt;/small&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;scale:&#039;&#039;&#039; the scaling factor of the map (default: 100)&lt;br /&gt;
* &#039;&#039;&#039;projection:&#039;&#039;&#039; the [[:en:map projection|map projection]] to use. Supported values are listed at https://github.com/mbostock/d3/wiki/Geo-Projections. The default value is &amp;lt;tt&amp;gt;equirectangular&amp;lt;/tt&amp;gt; for an [[:en:equirectangular projection|equirectangular projection]].&lt;br /&gt;
* ids of geographic entities: The actual parameter names depend on the base map. For example, for the above mentioned world map the ids are [[:en:ISO country codes|ISO country codes]]. The values can be either colors or numbers in case the geographic entities should be associated with numeric data: &amp;lt;tt&amp;gt;DE=lightblue&amp;lt;/tt&amp;gt; marks Germany in light blue color, and &amp;lt;tt&amp;gt;DE=80.6&amp;lt;/tt&amp;gt; assigns Germany the value 80.6 (population in millions). In the latter case, the actual color depends on the following parameters.&lt;br /&gt;
** &#039;&#039;&#039;colorScale:&#039;&#039;&#039; the color palette to use for the color scale. The palette must be provided as a comma-separated list of color values. The color values must be given either as &amp;lt;tt&amp;gt;#rgb&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;#rrggbb&amp;lt;/tt&amp;gt; or by a [[:en:Web colors#X11 colour names|CSS color name]]. Instead of a list, the built-in color palettes [https://github.com/mbostock/d3/wiki/Ordinal-Scales#categorical-colors &amp;lt;tt&amp;gt;category10&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;category20&amp;lt;/tt&amp;gt;] can also be used.&lt;br /&gt;
** &#039;&#039;&#039;scaleType:&#039;&#039;&#039; supported values are &amp;lt;tt&amp;gt;linear&amp;lt;/tt&amp;gt; for a linear mapping between the data values and the color scale, &amp;lt;tt&amp;gt;log&amp;lt;/tt&amp;gt; for a log mapping, &amp;lt;tt&amp;gt;pow&amp;lt;/tt&amp;gt; for a power mapping (the exponent can be provided as &amp;lt;tt&amp;gt;pow 0.5&amp;lt;/tt&amp;gt;), &amp;lt;tt&amp;gt;sqrt&amp;lt;/tt&amp;gt; for a square-root mapping, and &amp;lt;tt&amp;gt;quantize&amp;lt;/tt&amp;gt; for a quantized scale, i.e. the data is grouped in as many classes as the color palette has colors.&lt;br /&gt;
** &#039;&#039;&#039;domainMin:&#039;&#039;&#039; lower boundary of the data values, i.e. smaller data values are mapped to the lower boundary&lt;br /&gt;
** &#039;&#039;&#039;domainMax:&#039;&#039;&#039; upper boundary of the data values, i.e. larger data values are mapped to the upper boundary&lt;br /&gt;
** &#039;&#039;&#039;legend:&#039;&#039;&#039; show color legend (does not work with &amp;lt;tt&amp;gt;quantize&amp;lt;/tt&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;defaultValue:&#039;&#039;&#039; default value for unused geographic entities. In case the id values are colors the default value is &amp;lt;tt&amp;gt;silver&amp;lt;/tt&amp;gt;, in case of numbers it is 0.&lt;br /&gt;
* &#039;&#039;&#039;formatjson:&#039;&#039;&#039; format JSON object for better legibility&lt;br /&gt;
=== &amp;lt;tt&amp;gt;chart&amp;lt;/tt&amp;gt; ===&lt;br /&gt;
Creates a JSON object for &amp;lt;tt&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graph&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/tt&amp;gt; to display charts. In the article namespace the template {{tl|Graph:Chart}} should be used instead. See its page for use cases.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Parameters:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;width:&#039;&#039;&#039; width of the chart&lt;br /&gt;
* &#039;&#039;&#039;height:&#039;&#039;&#039; height of the chart&lt;br /&gt;
* &#039;&#039;&#039;type:&#039;&#039;&#039; type of the chart: &amp;lt;tt&amp;gt;line&amp;lt;/tt&amp;gt; for [[:en:line chart|line chart]]s, &amp;lt;tt&amp;gt;area&amp;lt;/tt&amp;gt; for [[:en:area chart|area chart]]s, and &amp;lt;tt&amp;gt;rect&amp;lt;/tt&amp;gt; for (column) [[:en:bar chart|bar chart]]s, and &amp;lt;tt&amp;gt;pie&amp;lt;/tt&amp;gt; for [[:en:pie chart|pie chart]]s. Multiple series can stacked using the &amp;lt;tt&amp;gt;stacked&amp;lt;/tt&amp;gt; prefix, e.g. &amp;lt;tt&amp;gt;stackedarea&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* &#039;&#039;&#039;interpolate:&#039;&#039;&#039; [[:en:interpolation|interpolation]] method for line and area charts. It is recommended to use &amp;lt;tt&amp;gt;monotone&amp;lt;/tt&amp;gt; for a [[:en:monotone cubic interpolation|monotone cubic interpolation]] – further supported values are listed at https://github.com/vega/vega/wiki/Marks#area.&lt;br /&gt;
* &#039;&#039;&#039;colors:&#039;&#039;&#039; color palette of the chart as a comma-separated list of colors. The color values must be given either as &amp;lt;tt&amp;gt;#rgb&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;#rrggbb&amp;lt;/tt&amp;gt;/&amp;lt;tt&amp;gt;#aarrggbb&amp;lt;/tt&amp;gt; or by a [[:en:Web colors#X11 colour names|CSS color name]]. For &amp;lt;tt&amp;gt;#aarrggbb&amp;lt;/tt&amp;gt; the &amp;lt;tt&amp;gt;aa&amp;lt;/tt&amp;gt; component denotes the [[:en:alpha channel|alpha channel]], i.e. FF=100% opacity, 80=50% opacity/transparency, etc. (The default color palette is [//github.com/mbostock/d3/wiki/Ordinal-Scales#categorical-colors &amp;lt;tt&amp;gt;category10&amp;lt;/tt&amp;gt;]).&lt;br /&gt;
* &#039;&#039;&#039;xAxisTitle&#039;&#039;&#039; and &#039;&#039;&#039;yAxisTitle:&#039;&#039;&#039; captions of the x and y axes&lt;br /&gt;
* &#039;&#039;&#039;xAxisMin, xAxisMax, yAxisMin,&#039;&#039;&#039; and &#039;&#039;&#039;yAxisMax:&#039;&#039;&#039; minimum and maximum values of the x and y axes&lt;br /&gt;
* &#039;&#039;&#039;xAxisFormat&#039;&#039;&#039; and &#039;&#039;&#039;yAxisFormat:&#039;&#039;&#039; changes the formatting of the axis labels. Supported values are listed at https://github.com/d3/d3-3.x-api-reference/blob/master/Formatting.md#numbers for numbers and https://github.com/d3/d3-3.x-api-reference/blob/master/Time-Formatting.md for date/time. For example, the format &amp;lt;tt&amp;gt;%&amp;lt;/tt&amp;gt; can be used to output percentages.&lt;br /&gt;
* &#039;&#039;&#039;xAxisAngle:&#039;&#039;&#039; rotates the x axis labels by the specified angle. Recommended values are: -45, +45, -90, +90&lt;br /&gt;
* &#039;&#039;&#039;xType&#039;&#039;&#039; and &#039;&#039;&#039;yType:&#039;&#039;&#039; Data types of the values, e.g. &amp;lt;tt&amp;gt;integer&amp;lt;/tt&amp;gt; for integers, &amp;lt;tt&amp;gt;number&amp;lt;/tt&amp;gt; for real numbers, &amp;lt;tt&amp;gt;date&amp;lt;/tt&amp;gt; for dates (e.g. YYYY/MM/DD), and &amp;lt;tt&amp;gt;string&amp;lt;/tt&amp;gt; for ordinal values.&lt;br /&gt;
* &#039;&#039;&#039;x&#039;&#039;&#039;: the x-values as a comma-separated list (if a value itself contains a comma it must be escaped with a backslash, i.e. it needs to be written as &amp;lt;tt&amp;gt;\,&amp;lt;/tt&amp;gt;)&lt;br /&gt;
* &#039;&#039;&#039;y&#039;&#039;&#039; or &#039;&#039;&#039;y1, y2,&#039;&#039;&#039; …: the y-values for one or several data series, respectively. For pie charts &amp;lt;tt&amp;gt;y2&amp;lt;/tt&amp;gt; denotes the radiuses of the corresponding sectors.&lt;br /&gt;
* &#039;&#039;&#039;legend:&#039;&#039;&#039; show legend (only works in case of multiple data series)&lt;br /&gt;
* &#039;&#039;&#039;y1Title, y2Title,&#039;&#039;&#039; …: defines the label of the respective data series in the legend&lt;br /&gt;
* &#039;&#039;&#039;linewidth:&#039;&#039;&#039; line width for line charts or distance between the pie segments for pie charts&lt;br /&gt;
* &#039;&#039;&#039;showValues:&#039;&#039;&#039; Additionally, output the y values as text. (Currently, only (non-stacked) bar and pie charts are supported.) The output can be configured used the following parameters provided as &amp;lt;tt&amp;gt;name1:value1, name2:value2&amp;lt;/tt&amp;gt;:&lt;br /&gt;
** &#039;&#039;&#039;format:&#039;&#039;&#039; Format the output according to https://github.com/d3/d3-3.x-api-reference/blob/master/Formatting.md#numbers for numbers and https://github.com/d3/d3-3.x-api-reference/blob/master/Time-Formatting.md for date/time.&lt;br /&gt;
** &#039;&#039;&#039;fontcolor:&#039;&#039;&#039; text color&lt;br /&gt;
** &#039;&#039;&#039;fontsize:&#039;&#039;&#039; text size&lt;br /&gt;
** &#039;&#039;&#039;offset:&#039;&#039;&#039; move text by the given offset. For bar charts and pie charts with &amp;lt;tt&amp;gt;midangle&amp;lt;/tt&amp;gt; this also defines if the text is inside or outside the chart.&lt;br /&gt;
** &#039;&#039;&#039;angle&#039;&#039;&#039; (pie charts only): text angle in degrees or &amp;lt;tt&amp;gt;midangle&amp;lt;/tt&amp;gt; (default) for dynamic angles based on the mid-angle of the pie sector.&lt;br /&gt;
* &#039;&#039;&#039;innerRadius:&#039;&#039;&#039; For pie charts: defines the inner radius to create a &#039;&#039;doughnut chart.&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;formatjson:&#039;&#039;&#039; format JSON object for better legibility&lt;br /&gt;
&lt;br /&gt;
=== Template wrappers ===&lt;br /&gt;
The functions &amp;lt;tt&amp;gt;mapWrapper&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;chartWrapper&amp;lt;/tt&amp;gt; are wrappers to pass all parameters of the calling template to the respective &amp;lt;tt&amp;gt;map&amp;lt;/tt&amp;gt; and &amp;lt;tt&amp;gt;chart&amp;lt;/tt&amp;gt; functions.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; In the editor preview the graph extension creates a [[:en:canvas element|canvas element]] with vector graphics. However, when saving the page a [[:en:Portable Network Graphics|PNG]] raster graphics is generated instead.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note to developers:&#039;&#039;&#039; New functionality can be tested with the [https://vega.github.io/vega-editor/index.html?mode=vega Vega Editor], that also contains a large amount of example code.&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Graph&amp;diff=2757</id>
		<title>Module:Graph</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Graph&amp;diff=2757"/>
		<updated>2020-07-01T10:17:03Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Graph&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- ATTENTION:  Please edit this code at https://de.wikipedia.org/wiki/Modul:Graph&lt;br /&gt;
--             This way all wiki languages can stay in sync. Thank you!&lt;br /&gt;
--&lt;br /&gt;
-- Version History (_PLEASE UPDATE when modifying anything_):&lt;br /&gt;
--   2019-01-24 Allow comma-separated lists to contain values with commas&lt;br /&gt;
--   2018-10-13 Fix browser color-inversion issues via #54595d per [[mw:Template:Graph:PageViews]]&lt;br /&gt;
--   2018-09-16 Allow disabling the legend for templates&lt;br /&gt;
--   2018-09-10 Allow grid lines&lt;br /&gt;
--   2018-08-26 Use user-defined order for stacked charts&lt;br /&gt;
--   2018-02-11 Force usage of explicitely provided x minimum and/or maximum values, rotation of x labels&lt;br /&gt;
--   2017-08-08 Added showSymbols param to show symbols on line charts&lt;br /&gt;
--   2016-05-16 Added encodeTitleForPath() to help all path-based APIs graphs like pageviews&lt;br /&gt;
--   2016-03-20 Allow omitted data for charts, labels for line charts with string (ordinal) scale at point location&lt;br /&gt;
--   2016-01-28 For maps, always use wikiraw:// protocol. https:// will be disabled soon.&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local baseMapDirectory = &amp;quot;Module:Graph/&amp;quot;&lt;br /&gt;
&lt;br /&gt;
local function numericArray(csv)&lt;br /&gt;
	if not csv then return end&lt;br /&gt;
&lt;br /&gt;
	local list = mw.text.split(csv, &amp;quot;%s*,%s*&amp;quot;)&lt;br /&gt;
	local result = {}&lt;br /&gt;
	local isInteger = true&lt;br /&gt;
	for i = 1, #list do&lt;br /&gt;
		if list[i] == &amp;quot;&amp;quot; then&lt;br /&gt;
			result[i] = nil&lt;br /&gt;
		else&lt;br /&gt;
			result[i] = tonumber(list[i])&lt;br /&gt;
			if not result[i] then return end&lt;br /&gt;
			if isInteger then&lt;br /&gt;
				local int, frac = math.modf(result[i])&lt;br /&gt;
				isInteger = frac == 0.0&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result, isInteger&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function stringArray(text)&lt;br /&gt;
	if not text then return end&lt;br /&gt;
&lt;br /&gt;
	local list = mw.text.split(mw.ustring.gsub(tostring(text), &amp;quot;\\,&amp;quot;, &amp;quot;&amp;lt;COMMA&amp;gt;&amp;quot;), &amp;quot;,&amp;quot;, true)&lt;br /&gt;
	for i = 1, #list do&lt;br /&gt;
		list[i] = mw.ustring.gsub(mw.text.trim(list[i]), &amp;quot;&amp;lt;COMMA&amp;gt;&amp;quot;, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	return list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function isTable(t) return type(t) == &amp;quot;table&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
local function copy(x)&lt;br /&gt;
	if type(x) == &amp;quot;table&amp;quot; then&lt;br /&gt;
		local result = {}&lt;br /&gt;
		for key, value in pairs(x) do result[key] = copy(value) end&lt;br /&gt;
		return result&lt;br /&gt;
	else&lt;br /&gt;
		return x&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.map(frame)&lt;br /&gt;
	-- map path data for geographic objects&lt;br /&gt;
	local basemap = frame.args.basemap or &amp;quot;WorldMap-iso2.json&amp;quot;&lt;br /&gt;
	-- scaling factor&lt;br /&gt;
	local scale = tonumber(frame.args.scale) or 100&lt;br /&gt;
	-- map projection, see https://github.com/mbostock/d3/wiki/Geo-Projections&lt;br /&gt;
	local projection = frame.args.projection or &amp;quot;equirectangular&amp;quot;&lt;br /&gt;
	-- defaultValue for geographic objects without data&lt;br /&gt;
	local defaultValue = frame.args.defaultValue&lt;br /&gt;
	local scaleType = frame.args.scaleType or &amp;quot;linear&amp;quot;&lt;br /&gt;
	-- minimaler Wertebereich (nur für numerische Daten)&lt;br /&gt;
	local domainMin = tonumber(frame.args.domainMin)&lt;br /&gt;
	-- maximaler Wertebereich (nur für numerische Daten)&lt;br /&gt;
	local domainMax = tonumber(frame.args.domainMax)&lt;br /&gt;
	-- Farbwerte der Farbskala (nur für numerische Daten)&lt;br /&gt;
	local colorScale = frame.args.colorScale or &amp;quot;category10&amp;quot;&lt;br /&gt;
	-- show legend&lt;br /&gt;
	local legend = frame.args.legend&lt;br /&gt;
	-- format JSON output&lt;br /&gt;
	local formatJson = frame.args.formatjson&lt;br /&gt;
&lt;br /&gt;
	-- map data are key-value pairs: keys are non-lowercase strings (ideally ISO codes) which need to match the &amp;quot;id&amp;quot; values of the map path data&lt;br /&gt;
	local values = {}&lt;br /&gt;
	local isNumbers = nil&lt;br /&gt;
	for name, value in pairs(frame.args) do&lt;br /&gt;
		if mw.ustring.find(name, &amp;quot;^[^%l]+$&amp;quot;) and value and value ~= &amp;quot;&amp;quot; then&lt;br /&gt;
			if isNumbers == nil then isNumbers = tonumber(value) end&lt;br /&gt;
			local data = { id = name, v = value }&lt;br /&gt;
			if isNumbers then data.v = tonumber(data.v) end&lt;br /&gt;
			table.insert(values, data)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not defaultValue then&lt;br /&gt;
		if isNumbers then defaultValue = 0 else defaultValue = &amp;quot;silver&amp;quot; end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- create highlight scale&lt;br /&gt;
	local scales&lt;br /&gt;
	if isNumbers then&lt;br /&gt;
		if colorScale then colorScale = string.lower(colorScale) end&lt;br /&gt;
		if colorScale == &amp;quot;category10&amp;quot; or colorScale == &amp;quot;category20&amp;quot; then else colorScale = stringArray(colorScale) end&lt;br /&gt;
		scales =&lt;br /&gt;
		{&lt;br /&gt;
			{&lt;br /&gt;
				name = &amp;quot;color&amp;quot;,&lt;br /&gt;
				type = scaleType,&lt;br /&gt;
				domain = { data = &amp;quot;highlights&amp;quot;, field = &amp;quot;v&amp;quot; },&lt;br /&gt;
				range = colorScale,&lt;br /&gt;
				nice = true,&lt;br /&gt;
				zero = false&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if domainMin then scales[1].domainMin = domainMin end&lt;br /&gt;
		if domainMax then scales[1].domainMax = domainMax end&lt;br /&gt;
&lt;br /&gt;
		local exponent = string.match(scaleType, &amp;quot;pow%s+(%d+%.?%d+)&amp;quot;) -- check for exponent&lt;br /&gt;
		if exponent then&lt;br /&gt;
			scales[1].type = &amp;quot;pow&amp;quot;&lt;br /&gt;
			scales[1].exponent = exponent&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- create legend&lt;br /&gt;
	if legend then&lt;br /&gt;
		legend =&lt;br /&gt;
		{&lt;br /&gt;
			{&lt;br /&gt;
				fill = &amp;quot;color&amp;quot;,&lt;br /&gt;
				offset = 120,&lt;br /&gt;
				properties =&lt;br /&gt;
				{&lt;br /&gt;
					title = { fontSize = { value = 14 } },&lt;br /&gt;
					labels = { fontSize = { value = 12 } },&lt;br /&gt;
					legend =&lt;br /&gt;
					{&lt;br /&gt;
						stroke = { value = &amp;quot;silver&amp;quot; },&lt;br /&gt;
						strokeWidth = { value = 1.5 }&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- get map url&lt;br /&gt;
	local basemapUrl&lt;br /&gt;
	if (string.sub(basemap, 1, 10) == &amp;quot;wikiraw://&amp;quot;) then&lt;br /&gt;
		basemapUrl = basemap&lt;br /&gt;
	else&lt;br /&gt;
		-- if not a (supported) url look for a colon as namespace separator. If none prepend default map directory name.&lt;br /&gt;
		if not string.find(basemap, &amp;quot;:&amp;quot;) then basemap = baseMapDirectory .. basemap end&lt;br /&gt;
		basemapUrl = &amp;quot;wikiraw:///&amp;quot; .. mw.uri.encode(mw.title.new(basemap).prefixedText, &amp;quot;PATH&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local output =&lt;br /&gt;
	{&lt;br /&gt;
		version = 2,&lt;br /&gt;
		width = 1,  -- generic value as output size depends solely on map size and scaling factor&lt;br /&gt;
		height = 1, -- ditto&lt;br /&gt;
		data =&lt;br /&gt;
		{&lt;br /&gt;
			{&lt;br /&gt;
				-- data source for the highlights&lt;br /&gt;
				name = &amp;quot;highlights&amp;quot;,&lt;br /&gt;
				values = values&lt;br /&gt;
			},&lt;br /&gt;
			{&lt;br /&gt;
				-- data source for map paths data&lt;br /&gt;
				name = &amp;quot;countries&amp;quot;,&lt;br /&gt;
				url = basemapUrl,&lt;br /&gt;
				format = { type = &amp;quot;topojson&amp;quot;, feature = &amp;quot;countries&amp;quot; },&lt;br /&gt;
				transform =&lt;br /&gt;
				{&lt;br /&gt;
					{&lt;br /&gt;
						-- geographic transformation (&amp;quot;geopath&amp;quot;) of map paths data&lt;br /&gt;
						type = &amp;quot;geopath&amp;quot;,&lt;br /&gt;
						value = &amp;quot;data&amp;quot;,			-- data source&lt;br /&gt;
						scale = scale,&lt;br /&gt;
						translate = { 0, 0 },&lt;br /&gt;
						projection = projection&lt;br /&gt;
					},&lt;br /&gt;
					{&lt;br /&gt;
						-- join (&amp;quot;zip&amp;quot;) of mutiple data source: here map paths data and highlights&lt;br /&gt;
						type = &amp;quot;lookup&amp;quot;,&lt;br /&gt;
						keys = { &amp;quot;id&amp;quot; },      -- key for map paths data&lt;br /&gt;
						on = &amp;quot;highlights&amp;quot;,    -- name of highlight data source&lt;br /&gt;
						onKey = &amp;quot;id&amp;quot;,         -- key for highlight data source&lt;br /&gt;
						as = { &amp;quot;zipped&amp;quot; },    -- name of resulting table&lt;br /&gt;
						default = { v = defaultValue } -- default value for geographic objects that could not be joined&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		marks =&lt;br /&gt;
		{&lt;br /&gt;
			-- output markings (map paths and highlights)&lt;br /&gt;
			{&lt;br /&gt;
				type = &amp;quot;path&amp;quot;,&lt;br /&gt;
				from = { data = &amp;quot;countries&amp;quot; },&lt;br /&gt;
				properties =&lt;br /&gt;
				{&lt;br /&gt;
					enter = { path = { field = &amp;quot;layout_path&amp;quot; } },&lt;br /&gt;
					update = { fill = { field = &amp;quot;zipped.v&amp;quot; } },&lt;br /&gt;
					hover = { fill = { value = &amp;quot;darkgrey&amp;quot; } }&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		legends = legend&lt;br /&gt;
	}&lt;br /&gt;
	if (scales) then&lt;br /&gt;
		output.scales = scales&lt;br /&gt;
		output.marks[1].properties.update.fill.scale = &amp;quot;color&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local flags&lt;br /&gt;
	if formatJson then flags = mw.text.JSON_PRETTY end&lt;br /&gt;
	return mw.text.jsonEncode(output, flags)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function deserializeXData(serializedX, xType, xMin, xMax)&lt;br /&gt;
	local x&lt;br /&gt;
&lt;br /&gt;
	if not xType or xType == &amp;quot;integer&amp;quot; or xType == &amp;quot;number&amp;quot; then&lt;br /&gt;
		local isInteger&lt;br /&gt;
		x, isInteger = numericArray(serializedX)&lt;br /&gt;
		if x then&lt;br /&gt;
			xMin = tonumber(xMin)&lt;br /&gt;
			xMax = tonumber(xMax)&lt;br /&gt;
			if not xType then&lt;br /&gt;
				if isInteger then xType = &amp;quot;integer&amp;quot; else xType = &amp;quot;number&amp;quot; end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if xType then error(&amp;quot;Numbers expected for parameter &#039;x&#039;&amp;quot;) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if not x then&lt;br /&gt;
		x = stringArray(serializedX)&lt;br /&gt;
		if not xType then xType = &amp;quot;string&amp;quot; end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return x, xType, xMin, xMax&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function deserializeYData(serializedYs, yType, yMin, yMax)&lt;br /&gt;
	local y = {}&lt;br /&gt;
	local areAllInteger = true&lt;br /&gt;
&lt;br /&gt;
	for yNum, value in pairs(serializedYs) do&lt;br /&gt;
		local yValues&lt;br /&gt;
		if not yType or yType == &amp;quot;integer&amp;quot; or yType == &amp;quot;number&amp;quot; then&lt;br /&gt;
			local isInteger&lt;br /&gt;
			yValues, isInteger = numericArray(value)&lt;br /&gt;
			if yValues then&lt;br /&gt;
				areAllInteger = areAllInteger and isInteger&lt;br /&gt;
			else&lt;br /&gt;
				if yType then&lt;br /&gt;
					error(&amp;quot;Numbers expected for parameter &#039;&amp;quot; .. name .. &amp;quot;&#039;&amp;quot;)&lt;br /&gt;
				else&lt;br /&gt;
					return deserializeYData(serializedYs, &amp;quot;string&amp;quot;, yMin, yMax)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if not yValues then yValues = stringArray(value) end&lt;br /&gt;
&lt;br /&gt;
		y[yNum] = yValues&lt;br /&gt;
	end&lt;br /&gt;
	if not yType then&lt;br /&gt;
		if areAllInteger then yType = &amp;quot;integer&amp;quot; else yType = &amp;quot;number&amp;quot; end&lt;br /&gt;
	end&lt;br /&gt;
	if yType == &amp;quot;integer&amp;quot; or yType == &amp;quot;number&amp;quot; then&lt;br /&gt;
		yMin = tonumber(yMin)&lt;br /&gt;
		yMax = tonumber(yMax)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return y, yType, yMin, yMax&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function convertXYToManySeries(x, y, xType, yType, seriesTitles)&lt;br /&gt;
	local data =&lt;br /&gt;
	{&lt;br /&gt;
		name = &amp;quot;chart&amp;quot;,&lt;br /&gt;
		format =&lt;br /&gt;
		{&lt;br /&gt;
			type = &amp;quot;json&amp;quot;,&lt;br /&gt;
			parse = { x = xType, y = yType }&lt;br /&gt;
		},&lt;br /&gt;
		values = {}&lt;br /&gt;
	}&lt;br /&gt;
	for i = 1, #y do&lt;br /&gt;
		local yLen = table.maxn(y[i])&lt;br /&gt;
		for j = 1, #x do&lt;br /&gt;
			if j &amp;lt;= yLen and y[i][j] then table.insert(data.values, { series = seriesTitles[i], x = x[j], y = y[i][j] }) end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function convertXYToSingleSeries(x, y, xType, yType, yNames)&lt;br /&gt;
	local data = { name = &amp;quot;chart&amp;quot;, format = { type = &amp;quot;json&amp;quot;, parse = { x = xType } }, values = {} }&lt;br /&gt;
&lt;br /&gt;
	for j = 1, #y do data.format.parse[yNames[j]] = yType end&lt;br /&gt;
&lt;br /&gt;
	for i = 1, #x do&lt;br /&gt;
		local item = { x = x[i] }&lt;br /&gt;
		for j = 1, #y do item[yNames[j]] = y[j][i] end&lt;br /&gt;
&lt;br /&gt;
		table.insert(data.values, item)&lt;br /&gt;
	end&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getXScale(chartType, stacked, xMin, xMax, xType)&lt;br /&gt;
	if chartType == &amp;quot;pie&amp;quot; then return end&lt;br /&gt;
&lt;br /&gt;
	local xscale =&lt;br /&gt;
	{&lt;br /&gt;
		name = &amp;quot;x&amp;quot;,&lt;br /&gt;
		type = &amp;quot;linear&amp;quot;,&lt;br /&gt;
		range = &amp;quot;width&amp;quot;,&lt;br /&gt;
		zero = false, -- do not include zero value&lt;br /&gt;
		nice = true,  -- force round numbers for y scale&lt;br /&gt;
		domain = { data = &amp;quot;chart&amp;quot;, field = &amp;quot;x&amp;quot; }&lt;br /&gt;
	}&lt;br /&gt;
	if xMin then xscale.domainMin = xMin end&lt;br /&gt;
	if xMax then xscale.domainMax = xMax end&lt;br /&gt;
	if xMin or xMax then&lt;br /&gt;
		xscale.clamp = true&lt;br /&gt;
		xscale.nice = false&lt;br /&gt;
	end&lt;br /&gt;
	if chartType == &amp;quot;rect&amp;quot; then&lt;br /&gt;
		xscale.type = &amp;quot;ordinal&amp;quot;&lt;br /&gt;
		if not stacked then xscale.padding = 0.2 end -- pad each bar group&lt;br /&gt;
	else&lt;br /&gt;
		if xType == &amp;quot;date&amp;quot; then xscale.type = &amp;quot;time&amp;quot;&lt;br /&gt;
		elseif xType == &amp;quot;string&amp;quot; then&lt;br /&gt;
			xscale.type = &amp;quot;ordinal&amp;quot;&lt;br /&gt;
			xscale.points = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return xscale&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getYScale(chartType, stacked, yMin, yMax, yType)&lt;br /&gt;
	if chartType == &amp;quot;pie&amp;quot; then return end&lt;br /&gt;
&lt;br /&gt;
	local yscale =&lt;br /&gt;
	{&lt;br /&gt;
		name = &amp;quot;y&amp;quot;,&lt;br /&gt;
		type = &amp;quot;linear&amp;quot;,&lt;br /&gt;
		range = &amp;quot;height&amp;quot;,&lt;br /&gt;
		-- area charts have the lower boundary of their filling at y=0 (see marks.properties.enter.y2), therefore these need to start at zero&lt;br /&gt;
		zero = chartType ~= &amp;quot;line&amp;quot;,&lt;br /&gt;
		nice = true&lt;br /&gt;
	}&lt;br /&gt;
	if yMin then yscale.domainMin = yMin end&lt;br /&gt;
	if yMax then yscale.domainMax = yMax end&lt;br /&gt;
	if yMin or yMax then yscale.clamp = true end&lt;br /&gt;
	if yType == &amp;quot;date&amp;quot; then yscale.type = &amp;quot;time&amp;quot;&lt;br /&gt;
	elseif yType == &amp;quot;string&amp;quot; then yscale.type = &amp;quot;ordinal&amp;quot; end&lt;br /&gt;
	if stacked then&lt;br /&gt;
		yscale.domain = { data = &amp;quot;stats&amp;quot;, field = &amp;quot;sum_y&amp;quot; }&lt;br /&gt;
	else&lt;br /&gt;
		yscale.domain = { data = &amp;quot;chart&amp;quot;, field = &amp;quot;y&amp;quot; }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return yscale&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getColorScale(colors, chartType, xCount, yCount)&lt;br /&gt;
	if not colors then&lt;br /&gt;
		if (chartType == &amp;quot;pie&amp;quot; and xCount &amp;gt; 10) or yCount &amp;gt; 10 then colors = &amp;quot;category20&amp;quot; else colors = &amp;quot;category10&amp;quot; end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local colorScale =&lt;br /&gt;
	{&lt;br /&gt;
		name = &amp;quot;color&amp;quot;,&lt;br /&gt;
		type = &amp;quot;ordinal&amp;quot;,&lt;br /&gt;
		range = colors,&lt;br /&gt;
		domain = { data = &amp;quot;chart&amp;quot;, field = &amp;quot;series&amp;quot; }&lt;br /&gt;
	}&lt;br /&gt;
	if chartType == &amp;quot;pie&amp;quot; then colorScale.domain.field = &amp;quot;x&amp;quot; end&lt;br /&gt;
	return colorScale&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getAlphaColorScale(colors, y)&lt;br /&gt;
	local alphaScale&lt;br /&gt;
	-- if there is at least one color in the format &amp;quot;#aarrggbb&amp;quot;, create a transparency (alpha) scale&lt;br /&gt;
	if isTable(colors) then&lt;br /&gt;
		local alphas = {}&lt;br /&gt;
		local hasAlpha = false&lt;br /&gt;
		for i = 1, #colors do&lt;br /&gt;
			local a, rgb = string.match(colors[i], &amp;quot;#(%x%x)(%x%x%x%x%x%x)&amp;quot;)&lt;br /&gt;
			if a then&lt;br /&gt;
				hasAlpha = true&lt;br /&gt;
				alphas[i] = tostring(tonumber(a, 16) / 255.0)&lt;br /&gt;
				colors[i] = &amp;quot;#&amp;quot; .. rgb&lt;br /&gt;
			else&lt;br /&gt;
				alphas[i] = &amp;quot;1&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for i = #colors + 1, #y do alphas[i] = &amp;quot;1&amp;quot; end&lt;br /&gt;
		if hasAlpha then alphaScale = { name = &amp;quot;transparency&amp;quot;, type = &amp;quot;ordinal&amp;quot;, range = alphas } end&lt;br /&gt;
	end&lt;br /&gt;
	return alphaScale&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getValueScale(fieldName, min, max, type)&lt;br /&gt;
	local valueScale =&lt;br /&gt;
	{&lt;br /&gt;
		name = fieldName,&lt;br /&gt;
		type = type or &amp;quot;linear&amp;quot;,&lt;br /&gt;
		domain = { data = &amp;quot;chart&amp;quot;, field = fieldName },&lt;br /&gt;
		range = { min, max }&lt;br /&gt;
	}&lt;br /&gt;
	return valueScale&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function addInteractionToChartVisualisation(plotMarks, colorField, dataField)&lt;br /&gt;
	-- initial setup&lt;br /&gt;
	if not plotMarks.properties.enter then plotMarks.properties.enter = {} end&lt;br /&gt;
	plotMarks.properties.enter[colorField] = { scale = &amp;quot;color&amp;quot;, field = dataField }&lt;br /&gt;
&lt;br /&gt;
	-- action when cursor is over plot mark: highlight&lt;br /&gt;
	if not plotMarks.properties.hover then plotMarks.properties.hover = {} end&lt;br /&gt;
	plotMarks.properties.hover[colorField] = { value = &amp;quot;red&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
	-- action when cursor leaves plot mark: reset to initial setup&lt;br /&gt;
	if not plotMarks.properties.update then plotMarks.properties.update = {} end&lt;br /&gt;
	plotMarks.properties.update[colorField] = { scale = &amp;quot;color&amp;quot;, field = dataField }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getPieChartVisualisation(yCount, innerRadius, outerRadius, linewidth, radiusScale)&lt;br /&gt;
	local chartvis =&lt;br /&gt;
	{&lt;br /&gt;
		type = &amp;quot;arc&amp;quot;,&lt;br /&gt;
		from = { data = &amp;quot;chart&amp;quot;, transform = { { field = &amp;quot;y&amp;quot;, type = &amp;quot;pie&amp;quot; } } },&lt;br /&gt;
&lt;br /&gt;
		properties =&lt;br /&gt;
		{&lt;br /&gt;
			enter = {&lt;br /&gt;
				innerRadius = { value = innerRadius },&lt;br /&gt;
				outerRadius = { },&lt;br /&gt;
				startAngle = { field = &amp;quot;layout_start&amp;quot; },&lt;br /&gt;
				endAngle = { field = &amp;quot;layout_end&amp;quot; },&lt;br /&gt;
				stroke = { value = &amp;quot;white&amp;quot; },&lt;br /&gt;
				strokeWidth = { value = linewidth or 1 }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if radiusScale then&lt;br /&gt;
		chartvis.properties.enter.outerRadius.scale = radiusScale.name&lt;br /&gt;
		chartvis.properties.enter.outerRadius.field = radiusScale.domain.field&lt;br /&gt;
	else&lt;br /&gt;
		chartvis.properties.enter.outerRadius.value = outerRadius&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	addInteractionToChartVisualisation(chartvis, &amp;quot;fill&amp;quot;, &amp;quot;x&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
	return chartvis&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getChartVisualisation(chartType, stacked, colorField, yCount, innerRadius, outerRadius, linewidth, alphaScale, radiusScale, interpolate)&lt;br /&gt;
	if chartType == &amp;quot;pie&amp;quot; then return getPieChartVisualisation(yCount, innerRadius, outerRadius, linewidth, radiusScale) end&lt;br /&gt;
&lt;br /&gt;
	local chartvis =&lt;br /&gt;
	{&lt;br /&gt;
		type = chartType,&lt;br /&gt;
		properties =&lt;br /&gt;
		{&lt;br /&gt;
			-- chart creation event handler&lt;br /&gt;
			enter =&lt;br /&gt;
			{&lt;br /&gt;
				x = { scale = &amp;quot;x&amp;quot;, field = &amp;quot;x&amp;quot; },&lt;br /&gt;
				y = { scale = &amp;quot;y&amp;quot;, field = &amp;quot;y&amp;quot; }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	addInteractionToChartVisualisation(chartvis, colorField, &amp;quot;series&amp;quot;)&lt;br /&gt;
	if colorField == &amp;quot;stroke&amp;quot; then&lt;br /&gt;
		chartvis.properties.enter.strokeWidth = { value = linewidth or 2.5 }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if interpolate then chartvis.properties.enter.interpolate = { value = interpolate } end&lt;br /&gt;
&lt;br /&gt;
	if alphaScale then chartvis.properties.update[colorField .. &amp;quot;Opacity&amp;quot;] = { scale = &amp;quot;transparency&amp;quot; } end&lt;br /&gt;
	-- for bars and area charts set the lower bound of their areas&lt;br /&gt;
	if chartType == &amp;quot;rect&amp;quot; or chartType == &amp;quot;area&amp;quot; then&lt;br /&gt;
		if stacked then&lt;br /&gt;
			-- for stacked charts this lower bound is the end of the last stacking element&lt;br /&gt;
			chartvis.properties.enter.y2 = { scale = &amp;quot;y&amp;quot;, field = &amp;quot;layout_end&amp;quot; }&lt;br /&gt;
		else&lt;br /&gt;
			--[[&lt;br /&gt;
			for non-stacking charts the lower bound is y=0&lt;br /&gt;
			TODO: &amp;quot;yscale.zero&amp;quot; is currently set to &amp;quot;true&amp;quot; for this case, but &amp;quot;false&amp;quot; for all other cases.&lt;br /&gt;
			For the similar behavior &amp;quot;y2&amp;quot; should actually be set to where y axis crosses the x axis,&lt;br /&gt;
			if there are only positive or negative values in the data ]]&lt;br /&gt;
			chartvis.properties.enter.y2 = { scale = &amp;quot;y&amp;quot;, value = 0 }&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- for bar charts ...&lt;br /&gt;
	if chartType == &amp;quot;rect&amp;quot; then&lt;br /&gt;
		-- set 1 pixel width between the bars&lt;br /&gt;
		chartvis.properties.enter.width = { scale = &amp;quot;x&amp;quot;, band = true, offset = -1 }&lt;br /&gt;
		-- for multiple series the bar marking needs to use the &amp;quot;inner&amp;quot; series scale, whereas the &amp;quot;outer&amp;quot; x scale is used by the grouping&lt;br /&gt;
		if not stacked and yCount &amp;gt; 1 then&lt;br /&gt;
			chartvis.properties.enter.x.scale = &amp;quot;series&amp;quot;&lt;br /&gt;
			chartvis.properties.enter.x.field = &amp;quot;series&amp;quot;&lt;br /&gt;
			chartvis.properties.enter.width.scale = &amp;quot;series&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- stacked charts have their own (stacked) y values&lt;br /&gt;
	if stacked then chartvis.properties.enter.y.field = &amp;quot;layout_start&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	-- if there are multiple series group these together&lt;br /&gt;
	if yCount == 1 then&lt;br /&gt;
		chartvis.from = { data = &amp;quot;chart&amp;quot; }&lt;br /&gt;
	else&lt;br /&gt;
		-- if there are multiple series, connect colors to series&lt;br /&gt;
		chartvis.properties.update[colorField].field = &amp;quot;series&amp;quot;&lt;br /&gt;
		if alphaScale then chartvis.properties.update[colorField .. &amp;quot;Opacity&amp;quot;].field = &amp;quot;series&amp;quot; end&lt;br /&gt;
		-- apply a grouping (facetting) transformation&lt;br /&gt;
		chartvis =&lt;br /&gt;
		{&lt;br /&gt;
			type = &amp;quot;group&amp;quot;,&lt;br /&gt;
			marks = { chartvis },&lt;br /&gt;
			from =&lt;br /&gt;
			{&lt;br /&gt;
				data = &amp;quot;chart&amp;quot;,&lt;br /&gt;
				transform =&lt;br /&gt;
				{&lt;br /&gt;
					{&lt;br /&gt;
						type = &amp;quot;facet&amp;quot;,&lt;br /&gt;
						groupby = { &amp;quot;series&amp;quot; }&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		-- for stacked charts apply a stacking transformation&lt;br /&gt;
		if stacked then&lt;br /&gt;
			table.insert(chartvis.from.transform, 1, { type = &amp;quot;stack&amp;quot;, groupby = { &amp;quot;x&amp;quot; }, sortby = { &amp;quot;-_id&amp;quot; }, field = &amp;quot;y&amp;quot; } )&lt;br /&gt;
		else&lt;br /&gt;
			-- for bar charts the series are side-by-side grouped by x&lt;br /&gt;
			if chartType == &amp;quot;rect&amp;quot; then&lt;br /&gt;
				-- for bar charts with multiple series: each serie is grouped by the x value, therefore the series need their own scale within each x group&lt;br /&gt;
				local groupScale =&lt;br /&gt;
				{&lt;br /&gt;
					name = &amp;quot;series&amp;quot;,&lt;br /&gt;
					type = &amp;quot;ordinal&amp;quot;,&lt;br /&gt;
					range = &amp;quot;width&amp;quot;,&lt;br /&gt;
					domain = { field = &amp;quot;series&amp;quot; }&lt;br /&gt;
				}&lt;br /&gt;
&lt;br /&gt;
				chartvis.from.transform[1].groupby = &amp;quot;x&amp;quot;&lt;br /&gt;
				chartvis.scales = { groupScale }&lt;br /&gt;
				chartvis.properties = { enter = { x = { field = &amp;quot;key&amp;quot;, scale = &amp;quot;x&amp;quot; }, width = { scale = &amp;quot;x&amp;quot;, band = true } } }&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return chartvis&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getTextMarks(chartvis, chartType, outerRadius, scales, radiusScale, yType, showValues)&lt;br /&gt;
	local properties&lt;br /&gt;
	if chartType == &amp;quot;rect&amp;quot; then&lt;br /&gt;
		properties =&lt;br /&gt;
		{&lt;br /&gt;
			x = { scale = chartvis.properties.enter.x.scale, field = chartvis.properties.enter.x.field },&lt;br /&gt;
			y = { scale = chartvis.properties.enter.y.scale, field = chartvis.properties.enter.y.field, offset = -(tonumber(showValues.offset) or -4) },&lt;br /&gt;
			--dx = { scale = chartvis.properties.enter.x.scale, band = true, mult = 0.5 }, -- for horizontal text&lt;br /&gt;
			dy = { scale = chartvis.properties.enter.x.scale, band = true, mult = 0.5 }, -- for vertical text&lt;br /&gt;
			align = { },&lt;br /&gt;
			baseline = { value = &amp;quot;middle&amp;quot; },&lt;br /&gt;
			fill = { },&lt;br /&gt;
			angle = { value = -90 },&lt;br /&gt;
			fontSize = { value = tonumber(showValues.fontsize) or 11 }&lt;br /&gt;
		}&lt;br /&gt;
		if properties.y.offset &amp;gt;= 0 then&lt;br /&gt;
			properties.align.value = &amp;quot;right&amp;quot;&lt;br /&gt;
			properties.fill.value = showValues.fontcolor or &amp;quot;white&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			properties.align.value = &amp;quot;left&amp;quot;&lt;br /&gt;
			properties.fill.value = showValues.fontcolor or &amp;quot;black&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
	elseif chartType == &amp;quot;pie&amp;quot; then&lt;br /&gt;
		properties =&lt;br /&gt;
		{&lt;br /&gt;
			x = { group = &amp;quot;width&amp;quot;, mult = 0.5 },&lt;br /&gt;
			y = { group = &amp;quot;height&amp;quot;, mult = 0.5 },&lt;br /&gt;
			radius = { offset = tonumber(showValues.offset) or -4 },&lt;br /&gt;
			theta = { field = &amp;quot;layout_mid&amp;quot; },&lt;br /&gt;
			fill = { value = showValues.fontcolor or &amp;quot;black&amp;quot; },&lt;br /&gt;
			baseline = { },&lt;br /&gt;
			angle = { },&lt;br /&gt;
			fontSize = { value = tonumber(showValues.fontsize) or math.ceil(outerRadius / 10) }&lt;br /&gt;
		}&lt;br /&gt;
		if (showValues.angle or &amp;quot;midangle&amp;quot;) == &amp;quot;midangle&amp;quot; then&lt;br /&gt;
			properties.align = { value = &amp;quot;center&amp;quot; }&lt;br /&gt;
			properties.angle = { field = &amp;quot;layout_mid&amp;quot;, mult = 180.0 / math.pi }&lt;br /&gt;
&lt;br /&gt;
			if properties.radius.offset &amp;gt;= 0 then&lt;br /&gt;
				properties.baseline.value = &amp;quot;bottom&amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				if not showValues.fontcolor then properties.fill.value = &amp;quot;white&amp;quot; end&lt;br /&gt;
				properties.baseline.value = &amp;quot;top&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		elseif tonumber(showValues.angle) then&lt;br /&gt;
			-- qunatize scale for aligning text left on right half-circle and right on left half-circle&lt;br /&gt;
			local alignScale = { name = &amp;quot;align&amp;quot;, type = &amp;quot;quantize&amp;quot;, domainMin = 0.0, domainMax = math.pi * 2, range = { &amp;quot;left&amp;quot;, &amp;quot;right&amp;quot; } }&lt;br /&gt;
			table.insert(scales, alignScale)&lt;br /&gt;
&lt;br /&gt;
			properties.align = { scale = alignScale.name, field = &amp;quot;layout_mid&amp;quot; }&lt;br /&gt;
			properties.angle = { value = tonumber(showValues.angle) }&lt;br /&gt;
			properties.baseline.value = &amp;quot;middle&amp;quot;&lt;br /&gt;
			if not tonumber(showValues.offset) then properties.radius.offset = 4 end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if radiusScale then&lt;br /&gt;
			properties.radius.scale = radiusScale.name&lt;br /&gt;
			properties.radius.field = radiusScale.domain.field&lt;br /&gt;
		else&lt;br /&gt;
			properties.radius.value = outerRadius&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if properties then&lt;br /&gt;
		if showValues.format then&lt;br /&gt;
			local template = &amp;quot;datum.y&amp;quot;&lt;br /&gt;
			if yType == &amp;quot;integer&amp;quot; or yType == &amp;quot;number&amp;quot; then template = template .. &amp;quot;|number:&#039;&amp;quot; .. showValues.format .. &amp;quot;&#039;&amp;quot;&lt;br /&gt;
			elseif yType == &amp;quot;date&amp;quot; then template = template .. &amp;quot;|time:&amp;quot; .. showValues.format .. &amp;quot;&#039;&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			properties.text = { template = &amp;quot;{{&amp;quot; .. template .. &amp;quot;}}&amp;quot; }&lt;br /&gt;
		else&lt;br /&gt;
			properties.text = { field = &amp;quot;y&amp;quot; }&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local textmarks =&lt;br /&gt;
		{&lt;br /&gt;
			type = &amp;quot;text&amp;quot;,&lt;br /&gt;
			properties =&lt;br /&gt;
			{&lt;br /&gt;
				enter = properties&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		if chartvis.from then textmarks.from = copy(chartvis.from) end&lt;br /&gt;
&lt;br /&gt;
		return textmarks&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getSymbolMarks(chartvis)&lt;br /&gt;
	local symbolmarks =&lt;br /&gt;
	{&lt;br /&gt;
		type = &amp;quot;symbol&amp;quot;,&lt;br /&gt;
		properties =&lt;br /&gt;
		{&lt;br /&gt;
			enter = &lt;br /&gt;
			{&lt;br /&gt;
				x = { scale = &amp;quot;x&amp;quot;, field = &amp;quot;x&amp;quot; },&lt;br /&gt;
				y = { scale = &amp;quot;y&amp;quot;, field = &amp;quot;y&amp;quot; },&lt;br /&gt;
				fill = { scale = &amp;quot;color&amp;quot;, field = &amp;quot;series&amp;quot; },&lt;br /&gt;
				shape = &amp;quot;circle&amp;quot;,&lt;br /&gt;
				size = { value = 49 }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	if chartvis.from then symbolmarks.from = copy(chartvis.from) end&lt;br /&gt;
&lt;br /&gt;
	return symbolmarks&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getAxes(xTitle, xAxisFormat, xAxisAngle, xType, xGrid, yTitle, yAxisFormat, yType, yGrid, chartType)&lt;br /&gt;
	local xAxis, yAxis&lt;br /&gt;
	if chartType ~= &amp;quot;pie&amp;quot; then&lt;br /&gt;
		if xType == &amp;quot;integer&amp;quot; and not xAxisFormat then xAxisFormat = &amp;quot;d&amp;quot; end&lt;br /&gt;
		xAxis =&lt;br /&gt;
		{&lt;br /&gt;
			type = &amp;quot;x&amp;quot;,&lt;br /&gt;
			scale = &amp;quot;x&amp;quot;,&lt;br /&gt;
			title = xTitle,&lt;br /&gt;
			format = xAxisFormat,&lt;br /&gt;
			grid = xGrid ~= &amp;quot;0&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
		if xAxisAngle then&lt;br /&gt;
			local xAxisAlign&lt;br /&gt;
			if xAxisAngle &amp;lt; 0 then xAxisAlign = &amp;quot;right&amp;quot; else xAxisAlign = &amp;quot;left&amp;quot; end&lt;br /&gt;
			xAxis.properties =&lt;br /&gt;
			{&lt;br /&gt;
				title =&lt;br /&gt;
				{&lt;br /&gt;
					fill = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
				},&lt;br /&gt;
				labels =&lt;br /&gt;
				{&lt;br /&gt;
					angle = { value = xAxisAngle },&lt;br /&gt;
					align = { value = xAxisAlign },&lt;br /&gt;
					fill = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
				},&lt;br /&gt;
				ticks =&lt;br /&gt;
				{&lt;br /&gt;
					stroke = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
				},&lt;br /&gt;
				axis =&lt;br /&gt;
				{&lt;br /&gt;
					stroke = { value = &amp;quot;#54595d&amp;quot; },&lt;br /&gt;
					strokeWidth = { value = 2 }&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		else&lt;br /&gt;
			xAxis.properties =&lt;br /&gt;
			{&lt;br /&gt;
				title =&lt;br /&gt;
				{&lt;br /&gt;
					fill = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
				},&lt;br /&gt;
				labels =&lt;br /&gt;
				{&lt;br /&gt;
					fill = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
				},&lt;br /&gt;
				ticks =&lt;br /&gt;
				{&lt;br /&gt;
					stroke = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
				},&lt;br /&gt;
				axis =&lt;br /&gt;
				{&lt;br /&gt;
					stroke = { value = &amp;quot;#54595d&amp;quot; },&lt;br /&gt;
					strokeWidth = { value = 2 }&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if yType == &amp;quot;integer&amp;quot; and not yAxisFormat then yAxisFormat = &amp;quot;d&amp;quot; end&lt;br /&gt;
		yAxis =&lt;br /&gt;
		{&lt;br /&gt;
			type = &amp;quot;y&amp;quot;,&lt;br /&gt;
			scale = &amp;quot;y&amp;quot;,&lt;br /&gt;
			title = yTitle,&lt;br /&gt;
			format = yAxisFormat,&lt;br /&gt;
			grid = yGrid ~= &amp;quot;0&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
		yAxis.properties =&lt;br /&gt;
		{&lt;br /&gt;
			title =&lt;br /&gt;
			{&lt;br /&gt;
				fill = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
			},&lt;br /&gt;
			labels =&lt;br /&gt;
			{&lt;br /&gt;
				fill = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
			},&lt;br /&gt;
			ticks =&lt;br /&gt;
			{&lt;br /&gt;
				stroke = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
			},&lt;br /&gt;
			axis =&lt;br /&gt;
			{&lt;br /&gt;
				stroke = { value = &amp;quot;#54595d&amp;quot; },&lt;br /&gt;
				strokeWidth = { value = 2 }&lt;br /&gt;
			},&lt;br /&gt;
			grid =&lt;br /&gt;
			{&lt;br /&gt;
				stroke = { value = &amp;quot;#54595d&amp;quot; }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return xAxis, yAxis&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLegend(legendTitle, chartType, outerRadius)&lt;br /&gt;
	local legend =&lt;br /&gt;
	{&lt;br /&gt;
		fill = &amp;quot;color&amp;quot;,&lt;br /&gt;
		stroke = &amp;quot;color&amp;quot;,&lt;br /&gt;
		title = legendTitle,&lt;br /&gt;
	}&lt;br /&gt;
	if chartType == &amp;quot;pie&amp;quot; then&lt;br /&gt;
		-- move legend from center position to top&lt;br /&gt;
		legend.properties = { legend = { y = { value = -outerRadius } } }&lt;br /&gt;
	end&lt;br /&gt;
	return legend&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.chart(frame)&lt;br /&gt;
	-- chart width and height&lt;br /&gt;
	local graphwidth = tonumber(frame.args.width) or 200&lt;br /&gt;
	local graphheight = tonumber(frame.args.height) or 200&lt;br /&gt;
	-- chart type&lt;br /&gt;
	local chartType = frame.args.type or &amp;quot;line&amp;quot;&lt;br /&gt;
	-- interpolation mode for line and area charts: linear, step-before, step-after, basis, basis-open, basis-closed (type=line only), bundle (type=line only), cardinal, cardinal-open, cardinal-closed (type=line only), monotone&lt;br /&gt;
	local interpolate = frame.args.interpolate&lt;br /&gt;
	-- mark colors (if no colors are given, the default 10 color palette is used)&lt;br /&gt;
	local colorString = frame.args.colors&lt;br /&gt;
	if colorString then colorString = string.lower(colorString) end&lt;br /&gt;
	local colors = stringArray(colorString)&lt;br /&gt;
	-- for line charts, the thickness of the line; for pie charts the gap between each slice&lt;br /&gt;
	local linewidth = tonumber(frame.args.linewidth)&lt;br /&gt;
	-- x and y axis caption&lt;br /&gt;
	local xTitle = frame.args.xAxisTitle&lt;br /&gt;
	local yTitle = frame.args.yAxisTitle&lt;br /&gt;
	-- x and y value types&lt;br /&gt;
	local xType = frame.args.xType&lt;br /&gt;
	local yType = frame.args.yType&lt;br /&gt;
	-- override x and y axis minimum and maximum&lt;br /&gt;
	local xMin = frame.args.xAxisMin&lt;br /&gt;
	local xMax = frame.args.xAxisMax&lt;br /&gt;
	local yMin = frame.args.yAxisMin&lt;br /&gt;
	local yMax = frame.args.yAxisMax&lt;br /&gt;
	-- override x and y axis label formatting&lt;br /&gt;
	local xAxisFormat = frame.args.xAxisFormat&lt;br /&gt;
	local yAxisFormat = frame.args.yAxisFormat&lt;br /&gt;
	local xAxisAngle = tonumber(frame.args.xAxisAngle)&lt;br /&gt;
	-- show grid&lt;br /&gt;
	local xGrid = frame.args.xGrid or &amp;quot;0&amp;quot;&lt;br /&gt;
	local yGrid = frame.args.yGrid or &amp;quot;0&amp;quot;&lt;br /&gt;
	-- for line chart, show a symbol at each data point&lt;br /&gt;
	local showSymbols = frame.args.showSymbols&lt;br /&gt;
	-- show legend with given title&lt;br /&gt;
	local legendTitle = frame.args.legend&lt;br /&gt;
	-- show values as text&lt;br /&gt;
	local showValues = frame.args.showValues&lt;br /&gt;
	-- pie chart radiuses&lt;br /&gt;
	local innerRadius = tonumber(frame.args.innerRadius) or 0&lt;br /&gt;
	local outerRadius = math.min(graphwidth, graphheight)&lt;br /&gt;
	-- format JSON output&lt;br /&gt;
	local formatJson = frame.args.formatjson&lt;br /&gt;
&lt;br /&gt;
	-- get x values&lt;br /&gt;
	local x&lt;br /&gt;
	x, xType, xMin, xMax = deserializeXData(frame.args.x, xType, xMin, xMax)&lt;br /&gt;
&lt;br /&gt;
	-- get y values (series)&lt;br /&gt;
	local yValues = {}&lt;br /&gt;
	local seriesTitles = {}&lt;br /&gt;
	for name, value in pairs(frame.args) do&lt;br /&gt;
		local yNum&lt;br /&gt;
		if name == &amp;quot;y&amp;quot; then yNum = 1 else yNum = tonumber(string.match(name, &amp;quot;^y(%d+)$&amp;quot;)) end&lt;br /&gt;
		if yNum then&lt;br /&gt;
			yValues[yNum] = value&lt;br /&gt;
			-- name the series: default is &amp;quot;y&amp;lt;number&amp;gt;&amp;quot;. Can be overwritten using the &amp;quot;y&amp;lt;number&amp;gt;Title&amp;quot; parameters.&lt;br /&gt;
			seriesTitles[yNum] = frame.args[&amp;quot;y&amp;quot; .. yNum .. &amp;quot;Title&amp;quot;] or name&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local y&lt;br /&gt;
	y, yType, yMin, yMax = deserializeYData(yValues, yType, yMin, yMax)&lt;br /&gt;
&lt;br /&gt;
	-- create data tuples, consisting of series index, x value, y value&lt;br /&gt;
	local data&lt;br /&gt;
	if chartType == &amp;quot;pie&amp;quot; then&lt;br /&gt;
		-- for pie charts the second second series is merged into the first series as radius values&lt;br /&gt;
		data = convertXYToSingleSeries(x, y, xType, yType, { &amp;quot;y&amp;quot;, &amp;quot;r&amp;quot; })&lt;br /&gt;
	else&lt;br /&gt;
		data = convertXYToManySeries(x, y, xType, yType, seriesTitles)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- configure stacked charts&lt;br /&gt;
	local stacked = false&lt;br /&gt;
	local stats&lt;br /&gt;
	if string.sub(chartType, 1, 7) == &amp;quot;stacked&amp;quot; then&lt;br /&gt;
		chartType = string.sub(chartType, 8)&lt;br /&gt;
		if #y &amp;gt; 1 then -- ignore stacked charts if there is only one series&lt;br /&gt;
		stacked = true&lt;br /&gt;
		-- aggregate data by cumulative y values&lt;br /&gt;
		stats =&lt;br /&gt;
		{&lt;br /&gt;
			name = &amp;quot;stats&amp;quot;, source = &amp;quot;chart&amp;quot;, transform =&lt;br /&gt;
		{&lt;br /&gt;
			{&lt;br /&gt;
				type = &amp;quot;aggregate&amp;quot;,&lt;br /&gt;
				groupby = { &amp;quot;x&amp;quot; },&lt;br /&gt;
				summarize = { y = &amp;quot;sum&amp;quot; }&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
		}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- create scales&lt;br /&gt;
	local scales = {}&lt;br /&gt;
&lt;br /&gt;
	local xscale = getXScale(chartType, stacked, xMin, xMax, xType)&lt;br /&gt;
	table.insert(scales, xscale)&lt;br /&gt;
	local yscale = getYScale(chartType, stacked, yMin, yMax, yType)&lt;br /&gt;
	table.insert(scales, yscale)&lt;br /&gt;
&lt;br /&gt;
	local colorScale = getColorScale(colors, chartType, #x, #y)&lt;br /&gt;
	table.insert(scales, colorScale)&lt;br /&gt;
&lt;br /&gt;
	local alphaScale = getAlphaColorScale(colors, y)&lt;br /&gt;
	table.insert(scales, alphaScale)&lt;br /&gt;
&lt;br /&gt;
	local radiusScale&lt;br /&gt;
	if chartType == &amp;quot;pie&amp;quot; and #y &amp;gt; 1 then&lt;br /&gt;
		radiusScale = getValueScale(&amp;quot;r&amp;quot;, 0, outerRadius)&lt;br /&gt;
		table.insert(scales, radiusScale)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- decide if lines (strokes) or areas (fills) should be drawn&lt;br /&gt;
	local colorField&lt;br /&gt;
	if chartType == &amp;quot;line&amp;quot; then colorField = &amp;quot;stroke&amp;quot; else colorField = &amp;quot;fill&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
	-- create chart markings&lt;br /&gt;
	local chartvis = getChartVisualisation(chartType, stacked, colorField, #y, innerRadius, outerRadius, linewidth, alphaScale, radiusScale, interpolate)&lt;br /&gt;
	local marks = { chartvis }&lt;br /&gt;
	&lt;br /&gt;
	-- text marks&lt;br /&gt;
	if showValues then&lt;br /&gt;
		if type(showValues) == &amp;quot;string&amp;quot; then -- deserialize as table&lt;br /&gt;
			local keyValues = mw.text.split(showValues, &amp;quot;%s*,%s*&amp;quot;)&lt;br /&gt;
			showValues = {}&lt;br /&gt;
			for _, kv in ipairs(keyValues) do&lt;br /&gt;
				local key, value = mw.ustring.match(kv, &amp;quot;^%s*(.-)%s*:%s*(.-)%s*$&amp;quot;)&lt;br /&gt;
				if key then showValues[key] = value end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local chartmarks = chartvis&lt;br /&gt;
		if chartmarks.marks then chartmarks = chartmarks.marks[1] end&lt;br /&gt;
		local textmarks = getTextMarks(chartmarks, chartType, outerRadius, scales, radiusScale, yType, showValues)&lt;br /&gt;
		if chartmarks ~= chartvis then&lt;br /&gt;
			table.insert(chartvis.marks, textmarks)&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(marks, textmarks)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- symbol marks&lt;br /&gt;
	if chartType == &amp;quot;line&amp;quot; and showSymbols then&lt;br /&gt;
		local chartmarks = chartvis&lt;br /&gt;
		if chartmarks.marks then chartmarks = chartmarks.marks[1] end&lt;br /&gt;
		local symbolmarks = getSymbolMarks(chartmarks)&lt;br /&gt;
		if chartmarks ~= chartvis then&lt;br /&gt;
			table.insert(chartvis.marks, symbolmarks)&lt;br /&gt;
		else&lt;br /&gt;
			table.insert(marks, symbolmarks)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- axes&lt;br /&gt;
	local xAxis, yAxis = getAxes(xTitle, xAxisFormat, xAxisAngle, xType, xGrid, yTitle, yAxisFormat, yType, yGrid, chartType)&lt;br /&gt;
&lt;br /&gt;
	-- legend&lt;br /&gt;
	local legend&lt;br /&gt;
	if legendTitle and tonumber(legendTitle) ~= 0 then legend = getLegend(legendTitle, chartType, outerRadius) end&lt;br /&gt;
&lt;br /&gt;
	-- construct final output object&lt;br /&gt;
	local output =&lt;br /&gt;
	{&lt;br /&gt;
		version = 2,&lt;br /&gt;
		width = graphwidth,&lt;br /&gt;
		height = graphheight,&lt;br /&gt;
		data = { data, stats },&lt;br /&gt;
		scales = scales,&lt;br /&gt;
		axes = { xAxis, yAxis },&lt;br /&gt;
		marks = marks,&lt;br /&gt;
		legends = { legend }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local flags&lt;br /&gt;
	if formatJson then flags = mw.text.JSON_PRETTY end&lt;br /&gt;
	return mw.text.jsonEncode(output, flags)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.mapWrapper(frame)&lt;br /&gt;
	return p.map(frame:getParent())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.chartWrapper(frame)&lt;br /&gt;
	return p.chart(frame:getParent())&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Given an HTML-encoded title as first argument, e.g. one produced with {{ARTICLEPAGENAME}},&lt;br /&gt;
-- convert it into a properly URL path-encoded string&lt;br /&gt;
-- This function is critical for any graph that uses path-based APIs, e.g. PageViews graph&lt;br /&gt;
function p.encodeTitleForPath(frame)&lt;br /&gt;
	return mw.uri.encode(mw.text.decode(mw.text.trim(frame.args[1])), &#039;PATH&#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Documentation/styles.css&amp;diff=2756</id>
		<title>Module:Documentation/styles.css</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Documentation/styles.css&amp;diff=2756"/>
		<updated>2020-07-01T10:17:02Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Documentation/styles.css&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;.ts-doc-sandbox .mbox-image	{&lt;br /&gt;
	padding:.75em 0 .75em .75em;&lt;br /&gt;
}&lt;br /&gt;
	&lt;br /&gt;
.ts-doc-doc {&lt;br /&gt;
	clear: both;&lt;br /&gt;
	background-color: #eaf3ff;&lt;br /&gt;
	border: 1px solid #a3caff;&lt;br /&gt;
	margin-top: 1em;&lt;br /&gt;
	border-top-left-radius: 2px;&lt;br /&gt;
	border-top-right-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-header {&lt;br /&gt;
	background-color: #c2dcff;&lt;br /&gt;
	padding: .642857em 1em .5em;&lt;br /&gt;
	border-top-left-radius: 2px;&lt;br /&gt;
	border-top-right-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-header .ts-tlinks-tlinks {&lt;br /&gt;
	line-height: 24px;&lt;br /&gt;
	margin-left: 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-header .ts-tlinks-tlinks a.external {&lt;br /&gt;
	color: #0645ad;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-header .ts-tlinks-tlinks a.external:visited {&lt;br /&gt;
	color: #0b0080;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-header .ts-tlinks-tlinks a.external:active {&lt;br /&gt;
	color: #faa700;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-content {&lt;br /&gt;
	padding: .214286em 1em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-content:after {&lt;br /&gt;
	content: &#039;&#039;;&lt;br /&gt;
	clear: both;&lt;br /&gt;
	display: block;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-heading {&lt;br /&gt;
	display: inline-block;&lt;br /&gt;
	padding-left: 30px;&lt;br /&gt;
	background: center left/24px 24px no-repeat;&lt;br /&gt;
	/* @noflip */&lt;br /&gt;
	background-image: url(//upload.wikimedia.org/wikipedia/commons/f/fb/OOjs_UI_icon_puzzle-ltr.svg);&lt;br /&gt;
	height: 24px;&lt;br /&gt;
	line-height: 24px;&lt;br /&gt;
	font-size: 13px;&lt;br /&gt;
	font-weight: 600;&lt;br /&gt;
	letter-spacing: 1px;&lt;br /&gt;
	text-transform: uppercase;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-content &amp;gt; *:first-child,&lt;br /&gt;
.ts-doc-footer &amp;gt; *:first-child {&lt;br /&gt;
	margin-top: .5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-content &amp;gt; *:last-child,&lt;br /&gt;
.ts-doc-footer &amp;gt; *:last-child {&lt;br /&gt;
	margin-bottom: .5em;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
.ts-doc-footer {&lt;br /&gt;
	background-color: #eaf3ff;&lt;br /&gt;
	border: 1px solid #a3caff;&lt;br /&gt;
	padding: .214286em 1em;&lt;br /&gt;
	margin-top: .214286em;&lt;br /&gt;
	font-style: italic;&lt;br /&gt;
	border-bottom-left-radius: 2px;&lt;br /&gt;
	border-bottom-right-radius: 2px;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
@media all and (min-width: 720px) { &lt;br /&gt;
	.ts-doc-header .ts-tlinks-tlinks {&lt;br /&gt;
		float: right;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Documentation/i18n&amp;diff=2755</id>
		<title>Module:Documentation/i18n</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Documentation/i18n&amp;diff=2755"/>
		<updated>2020-07-01T10:17:01Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Documentation/i18n&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local format = require(&#039;Module:TNT&#039;).format&lt;br /&gt;
local i18n = {}&lt;br /&gt;
&lt;br /&gt;
i18n[&#039;cfg-error-msg-type&#039;] = format(&#039;I18n/Documentation&#039;, &#039;cfg-error-msg-type&#039;)&lt;br /&gt;
i18n[&#039;cfg-error-msg-empty&#039;] = format(&#039;I18n/Documentation&#039;, &#039;cfg-error-msg-empty&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;template-namespace-heading&#039;]&lt;br /&gt;
-- The heading shown in the template namespace.&lt;br /&gt;
i18n[&#039;template-namespace-heading&#039;] = format(&#039;I18n/Documentation&#039;, &#039;template-namespace-heading&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-namespace-heading&#039;]&lt;br /&gt;
-- The heading shown in the module namespace.&lt;br /&gt;
i18n[&#039;module-namespace-heading&#039;] = format(&#039;I18n/Documentation&#039;, &#039;module-namespace-heading&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;file-namespace-heading&#039;]&lt;br /&gt;
-- The heading shown in the file namespace.&lt;br /&gt;
i18n[&#039;file-namespace-heading&#039;] = format(&#039;I18n/Documentation&#039;, &#039;file-namespace-heading&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;other-namespaces-heading&#039;]&lt;br /&gt;
-- The heading shown in other namespaces.&lt;br /&gt;
i18n[&#039;other-namespaces-heading&#039;] = format(&#039;I18n/Documentation&#039;, &#039;other-namespaces-heading&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;view-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;view&amp;quot; links.&lt;br /&gt;
i18n[&#039;view-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;view-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;edit-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;edit&amp;quot; links.&lt;br /&gt;
i18n[&#039;edit-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;edit-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;history-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;history&amp;quot; links.&lt;br /&gt;
i18n[&#039;history-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;history-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;purge-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;purge&amp;quot; links.&lt;br /&gt;
i18n[&#039;purge-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;purge-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;create-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;create&amp;quot; links.&lt;br /&gt;
i18n[&#039;create-link-display&#039;] = format(&#039;I18n/Documentation&#039;, &#039;create-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
return i18n&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Documentation/doc&amp;diff=2754</id>
		<title>Module:Documentation/doc</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Documentation/doc&amp;diff=2754"/>
		<updated>2020-07-01T10:17:01Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Documentation/doc&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{module rating|release}}&lt;br /&gt;
This module displays a blue box containing documentation for [[Special:MyLanguage/Help:templates|templates]], [[Special:MyLanguage/Lua scripting|Lua modules]], or other pages. The {{tl|documentation}} template invokes it.&lt;br /&gt;
&lt;br /&gt;
== Normal usage ==&lt;br /&gt;
&lt;br /&gt;
For most uses, you should use the {{tl|documentation}} template; please see that template&#039;s page for its usage instructions and parameters.&lt;br /&gt;
&lt;br /&gt;
== Use in other modules ==&lt;br /&gt;
&lt;br /&gt;
To use this module from another Lua module, first load it with &amp;lt;code&amp;gt;require&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
local documentation = require(&#039;Module:Documentation&#039;).main&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then you can simply call it using a table of arguments.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lua&amp;quot;&amp;gt;&lt;br /&gt;
documentation{content = &#039;Some documentation&#039;, [&#039;link box&#039;] = &#039;My custom link box&#039;}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Please refer to the [[Template:Documentation/doc|template documentation]] for usage instructions and a list of parameters.&lt;br /&gt;
&lt;br /&gt;
== Porting to other wikis ==&lt;br /&gt;
&lt;br /&gt;
The module has a configuration file at [[Module:Documentation/config]] which is intended to allow easy translation and porting to other wikis. Please see the code comments in the config page for instructions. If you have any questions, or you need a feature which is not currently implemented, please leave a message at [[Template talk:Documentation]] to get the attention of a developer.&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Documentation/config&amp;diff=2753</id>
		<title>Module:Documentation/config</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Documentation/config&amp;diff=2753"/>
		<updated>2020-07-01T10:17:01Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Documentation/config&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;----------------------------------------------------------------------------------------------------&lt;br /&gt;
--&lt;br /&gt;
--                               Configuration for Module:Documentation&lt;br /&gt;
--&lt;br /&gt;
-- Here you can set the values of the parameters and messages used in Module:Documentation to&lt;br /&gt;
-- localise it to your wiki and your language. Unless specified otherwise, values given here&lt;br /&gt;
-- should be string values.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local _format = require(&#039;Module:TNT&#039;).format&lt;br /&gt;
local function format(id)&lt;br /&gt;
	return _format(&#039;I18n/Documentation&#039;, id)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local cfg = {} -- Do not edit this line.&lt;br /&gt;
&lt;br /&gt;
cfg[&#039;templatestyles-scr&#039;] = &#039;Module:Documentation/styles.css&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Protection template configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;protection-template&#039;]&lt;br /&gt;
-- The name of the template that displays the protection icon (a padlock on enwiki).&lt;br /&gt;
cfg[&#039;protection-template&#039;] = &#039;pp-template&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;protection-reason-edit&#039;]&lt;br /&gt;
-- The protection reason for edit-protected templates to pass to&lt;br /&gt;
-- [[Module:Protection banner]].&lt;br /&gt;
cfg[&#039;protection-reason-edit&#039;] = &#039;template&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;protection-template-args&#039;]&lt;br /&gt;
-- Any arguments to send to the protection template. This should be a Lua table.&lt;br /&gt;
-- For example, if the protection template is &amp;quot;pp-template&amp;quot;, and the wikitext template invocation&lt;br /&gt;
-- looks like &amp;quot;{{pp-template|docusage=yes}}&amp;quot;, then this table should look like &amp;quot;{docusage = &#039;yes&#039;}&amp;quot;.&lt;br /&gt;
 --]]&lt;br /&gt;
 cfg[&#039;protection-template-args&#039;] = {docusage = &#039;yes&#039;}&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Sandbox notice configuration&lt;br /&gt;
--&lt;br /&gt;
-- On sandbox pages the module can display a template notifying users that the current page is a&lt;br /&gt;
-- sandbox, and the location of test cases pages, etc. The module decides whether the page is a&lt;br /&gt;
-- sandbox or not based on the value of cfg[&#039;sandbox-subpage&#039;]. The following settings configure the&lt;br /&gt;
-- messages that the notices contains.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-notice-image&#039;]&lt;br /&gt;
-- The image displayed in the sandbox notice.&lt;br /&gt;
cfg[&#039;sandbox-notice-image&#039;] = &#039;[[Image:Edit In Sandbox Icon - Color.svg|40px|alt=|link=]]&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;sandbox-notice-pagetype-template&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-pagetype-module&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-pagetype-other&#039;]&lt;br /&gt;
-- The page type of the sandbox page. The message that is displayed depends on the current subject&lt;br /&gt;
-- namespace. This message is used in either cfg[&#039;sandbox-notice-blurb&#039;] or&lt;br /&gt;
-- cfg[&#039;sandbox-notice-diff-blurb&#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;sandbox-notice-pagetype-template&#039;] = format(&#039;sandbox-notice-pagetype-template&#039;)&lt;br /&gt;
cfg[&#039;sandbox-notice-pagetype-module&#039;] = format(&#039;sandbox-notice-pagetype-module&#039;)&lt;br /&gt;
cfg[&#039;sandbox-notice-pagetype-other&#039;] = format(&#039;sandbox-notice-pagetype-other&#039;)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;sandbox-notice-blurb&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-diff-blurb&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-diff-display&#039;]&lt;br /&gt;
-- Either cfg[&#039;sandbox-notice-blurb&#039;] or cfg[&#039;sandbox-notice-diff-blurb&#039;] is the opening sentence&lt;br /&gt;
-- of the sandbox notice. The latter has a diff link, but the former does not. $1 is the page&lt;br /&gt;
-- type, which is either cfg[&#039;sandbox-notice-pagetype-template&#039;],&lt;br /&gt;
-- cfg[&#039;sandbox-notice-pagetype-module&#039;] or cfg[&#039;sandbox-notice-pagetype-other&#039;] depending what&lt;br /&gt;
-- namespace we are in. $2 is a link to the main template page, and $3 is a diff link between&lt;br /&gt;
-- the sandbox and the main template. The display value of the diff link is set by &lt;br /&gt;
-- cfg[&#039;sandbox-notice-compare-link-display&#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;sandbox-notice-blurb&#039;] = format(&#039;sandbox-notice-blurb&#039;)&lt;br /&gt;
cfg[&#039;sandbox-notice-diff-blurb&#039;] = format(&#039;sandbox-notice-diff-blurb&#039;)&lt;br /&gt;
cfg[&#039;sandbox-notice-compare-link-display&#039;] = format(&#039;sandbox-notice-compare-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-blurb&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-link-display&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-run-blurb&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-run-link-display&#039;]&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-blurb&#039;] is a sentence notifying the user that there is a test cases page&lt;br /&gt;
-- corresponding to this sandbox that they can edit. $1 is a link to the test cases page.&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-link-display&#039;] is the display value for that link.&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-run-blurb&#039;] is a sentence notifying the user that there is a test cases page&lt;br /&gt;
-- corresponding to this sandbox that they can edit, along with a link to run it. $1 is a link to the test&lt;br /&gt;
-- cases page, and $2 is a link to the page to run it.&lt;br /&gt;
-- cfg[&#039;sandbox-notice-testcases-run-link-display&#039;] is the display value for the link to run the test&lt;br /&gt;
-- cases.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;sandbox-notice-testcases-blurb&#039;] = format(&#039;sandbox-notice-testcases-blurb&#039;)&lt;br /&gt;
cfg[&#039;sandbox-notice-testcases-link-display&#039;] = format(&#039;sandbox-notice-testcases-link-display&#039;)&lt;br /&gt;
cfg[&#039;sandbox-notice-testcases-run-blurb&#039;] = format(&#039;sandbox-notice-testcases-run-blurb&#039;)&lt;br /&gt;
cfg[&#039;sandbox-notice-testcases-run-link-display&#039;] = format(&#039;sandbox-notice-testcases-run-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-category&#039;]&lt;br /&gt;
-- A category to add to all template sandboxes.&lt;br /&gt;
cfg[&#039;sandbox-category&#039;] = &#039;Template sandboxes&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Start box configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;documentation-icon-wikitext&#039;]&lt;br /&gt;
-- The wikitext for the icon shown at the top of the template.&lt;br /&gt;
cfg[&#039;documentation-icon-wikitext&#039;] = &#039;[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=Documentation icon]]&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Link box (end box) configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;transcluded-from-blurb&#039;]&lt;br /&gt;
-- Notice displayed when the docs are transcluded from another page. $1 is a wikilink to that page.&lt;br /&gt;
cfg[&#039;transcluded-from-blurb&#039;] = format(&#039;transcluded-from-blurb&#039;)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;create-module-doc-blurb&#039;]&lt;br /&gt;
-- Notice displayed in the module namespace when the documentation subpage does not exist.&lt;br /&gt;
-- $1 is a link to create the documentation page with the preload cfg[&#039;module-preload&#039;] and the&lt;br /&gt;
-- display cfg[&#039;create-link-display&#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;create-module-doc-blurb&#039;] = format(&#039;create-module-doc-blurb&#039;)&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Experiment blurb configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;experiment-blurb-template&#039;]&lt;br /&gt;
-- cfg[&#039;experiment-blurb-module&#039;]&lt;br /&gt;
-- The experiment blurb is the text inviting editors to experiment in sandbox and test cases pages.&lt;br /&gt;
-- It is only shown in the template and module namespaces. With the default English settings, it&lt;br /&gt;
-- might look like this:&lt;br /&gt;
--&lt;br /&gt;
-- Editors can experiment in this template&#039;s sandbox (edit | diff) and testcases (edit) pages.&lt;br /&gt;
--&lt;br /&gt;
-- In this example, &amp;quot;sandbox&amp;quot;, &amp;quot;edit&amp;quot;, &amp;quot;diff&amp;quot;, &amp;quot;testcases&amp;quot;, and &amp;quot;edit&amp;quot; would all be links.&lt;br /&gt;
--&lt;br /&gt;
-- There are two versions, cfg[&#039;experiment-blurb-template&#039;] and cfg[&#039;experiment-blurb-module&#039;], depending&lt;br /&gt;
-- on what namespace we are in.&lt;br /&gt;
-- &lt;br /&gt;
-- Parameters:&lt;br /&gt;
--&lt;br /&gt;
-- $1 is a link to the sandbox page. If the sandbox exists, it is in the following format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg[&#039;sandbox-link-display&#039;] (cfg[&#039;sandbox-edit-link-display&#039;] | cfg[&#039;compare-link-display&#039;])&lt;br /&gt;
-- &lt;br /&gt;
-- If the sandbox doesn&#039;t exist, it is in the format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg[&#039;sandbox-link-display&#039;] (cfg[&#039;sandbox-create-link-display&#039;] | cfg[&#039;mirror-link-display&#039;])&lt;br /&gt;
-- &lt;br /&gt;
-- The link for cfg[&#039;sandbox-create-link-display&#039;] link preloads the page with cfg[&#039;template-sandbox-preload&#039;]&lt;br /&gt;
-- or cfg[&#039;module-sandbox-preload&#039;], depending on the current namespace. The link for cfg[&#039;mirror-link-display&#039;]&lt;br /&gt;
-- loads a default edit summary of cfg[&#039;mirror-edit-summary&#039;].&lt;br /&gt;
--&lt;br /&gt;
-- $2 is a link to the test cases page. If the test cases page exists, it is in the following format:&lt;br /&gt;
--&lt;br /&gt;
--     cfg[&#039;testcases-link-display&#039;] (cfg[&#039;testcases-edit-link-display&#039;])&lt;br /&gt;
--&lt;br /&gt;
-- If the test cases page doesn&#039;t exist, it is in the format:&lt;br /&gt;
-- &lt;br /&gt;
--     cfg[&#039;testcases-link-display&#039;] (cfg[&#039;testcases-create-link-display&#039;])&lt;br /&gt;
--&lt;br /&gt;
-- If the test cases page doesn&#039;t exist, the link for cfg[&#039;testcases-create-link-display&#039;] preloads the&lt;br /&gt;
-- page with cfg[&#039;template-testcases-preload&#039;] or cfg[&#039;module-testcases-preload&#039;], depending on the current&lt;br /&gt;
-- namespace.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;experiment-blurb-template&#039;] = format(&#039;experiment-blurb-template&#039;)&lt;br /&gt;
cfg[&#039;experiment-blurb-module&#039;] = format(&#039;experiment-blurb-module&#039;)&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Sandbox link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-subpage&#039;]&lt;br /&gt;
-- The name of the template subpage typically used for sandboxes.&lt;br /&gt;
cfg[&#039;sandbox-subpage&#039;] = &#039;sandbox&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;template-sandbox-preload&#039;]&lt;br /&gt;
-- Preload file for template sandbox pages.&lt;br /&gt;
cfg[&#039;template-sandbox-preload&#039;] = &#039;Template:Documentation/preload-sandbox&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-sandbox-preload&#039;]&lt;br /&gt;
-- Preload file for Lua module sandbox pages.&lt;br /&gt;
cfg[&#039;module-sandbox-preload&#039;] = &#039;Template:Documentation/preload-module-sandbox&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;sandbox&amp;quot; links.&lt;br /&gt;
cfg[&#039;sandbox-link-display&#039;] = format(&#039;sandbox-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-edit-link-display&#039;]&lt;br /&gt;
-- The text to display for sandbox &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg[&#039;sandbox-edit-link-display&#039;] = format(&#039;sandbox-edit-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;sandbox-create-link-display&#039;]&lt;br /&gt;
-- The text to display for sandbox &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg[&#039;sandbox-create-link-display&#039;] = format(&#039;sandbox-create-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;compare-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;compare&amp;quot; links.&lt;br /&gt;
cfg[&#039;compare-link-display&#039;] = format(&#039;compare-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;mirror-edit-summary&#039;]&lt;br /&gt;
-- The default edit summary to use when a user clicks the &amp;quot;mirror&amp;quot; link. $1 is a wikilink to the&lt;br /&gt;
-- template page.&lt;br /&gt;
cfg[&#039;mirror-edit-summary&#039;] = &#039;Create sandbox version of $1&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;mirror-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;mirror&amp;quot; links.&lt;br /&gt;
cfg[&#039;mirror-link-display&#039;] = format(&#039;mirror-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;mirror-link-preload&#039;]&lt;br /&gt;
-- The page to preload when a user clicks the &amp;quot;mirror&amp;quot; link.&lt;br /&gt;
cfg[&#039;mirror-link-preload&#039;] = &#039;Template:Documentation/mirror&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Test cases link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;testcases-subpage&#039;]&lt;br /&gt;
-- The name of the template subpage typically used for test cases.&lt;br /&gt;
cfg[&#039;testcases-subpage&#039;] = &#039;testcases&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;template-testcases-preload&#039;]&lt;br /&gt;
-- Preload file for template test cases pages.&lt;br /&gt;
cfg[&#039;template-testcases-preload&#039;] = &#039;Template:Documentation/preload-testcases&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-testcases-preload&#039;]&lt;br /&gt;
-- Preload file for Lua module test cases pages.&lt;br /&gt;
cfg[&#039;module-testcases-preload&#039;] = &#039;Template:Documentation/preload-module-testcases&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;testcases-link-display&#039;]&lt;br /&gt;
-- The text to display for &amp;quot;testcases&amp;quot; links.&lt;br /&gt;
cfg[&#039;testcases-link-display&#039;] = format(&#039;testcases-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;testcases-edit-link-display&#039;]&lt;br /&gt;
-- The text to display for test cases &amp;quot;edit&amp;quot; links.&lt;br /&gt;
cfg[&#039;testcases-edit-link-display&#039;] = format(&#039;testcases-edit-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;testcases-create-link-display&#039;]&lt;br /&gt;
-- The text to display for test cases &amp;quot;create&amp;quot; links.&lt;br /&gt;
cfg[&#039;testcases-create-link-display&#039;] = format(&#039;testcases-create-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Add categories blurb configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;add-categories-blurb&#039;]&lt;br /&gt;
-- Text to direct users to add categories to the /doc subpage. Not used if the &amp;quot;content&amp;quot; or&lt;br /&gt;
-- &amp;quot;docname fed&amp;quot; arguments are set, as then it is not clear where to add the categories. $1 is a&lt;br /&gt;
-- link to the /doc subpage with a display value of cfg[&#039;doc-link-display&#039;].&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;add-categories-blurb&#039;] = format(&#039;add-categories-blurb&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;doc-link-display&#039;]&lt;br /&gt;
-- The text to display when linking to the /doc subpage.&lt;br /&gt;
cfg[&#039;doc-link-display&#039;] = &#039;/doc&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Subpages link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;subpages-blurb&#039;]&lt;br /&gt;
-- The &amp;quot;Subpages of this template&amp;quot; blurb. $1 is a link to the main template&#039;s subpages with a&lt;br /&gt;
-- display value of cfg[&#039;subpages-link-display&#039;]. In the English version this blurb is simply&lt;br /&gt;
-- the link followed by a period, and the link display provides the actual text.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;subpages-blurb&#039;] = format(&#039;subpages-blurb&#039;)&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
-- cfg[&#039;subpages-link-display&#039;]&lt;br /&gt;
-- The text to display for the &amp;quot;subpages of this page&amp;quot; link. $1 is cfg[&#039;template-pagetype&#039;],&lt;br /&gt;
-- cfg[&#039;module-pagetype&#039;] or cfg[&#039;default-pagetype&#039;], depending on whether the current page is in&lt;br /&gt;
-- the template namespace, the module namespace, or another namespace.&lt;br /&gt;
--]]&lt;br /&gt;
cfg[&#039;subpages-link-display&#039;] = format(&#039;subpages-link-display&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;template-pagetype&#039;]&lt;br /&gt;
-- The pagetype to display for template pages.&lt;br /&gt;
cfg[&#039;template-pagetype&#039;] = format(&#039;template-pagetype&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-pagetype&#039;]&lt;br /&gt;
-- The pagetype to display for Lua module pages.&lt;br /&gt;
cfg[&#039;module-pagetype&#039;] = format(&#039;module-pagetype&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;default-pagetype&#039;]&lt;br /&gt;
-- The pagetype to display for pages other than templates or Lua modules.&lt;br /&gt;
cfg[&#039;default-pagetype&#039;] = format(&#039;default-pagetype&#039;)&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Doc link configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;doc-subpage&#039;]&lt;br /&gt;
-- The name of the subpage typically used for documentation pages.&lt;br /&gt;
cfg[&#039;doc-subpage&#039;] = &#039;doc&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;file-docpage-preload&#039;]&lt;br /&gt;
-- Preload file for documentation page in the file namespace.&lt;br /&gt;
cfg[&#039;file-docpage-preload&#039;] = &#039;Template:Documentation/preload-filespace&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;docpage-preload&#039;]&lt;br /&gt;
-- Preload file for template documentation pages in all namespaces.&lt;br /&gt;
cfg[&#039;docpage-preload&#039;] = &#039;Template:Documentation/preload&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;module-preload&#039;]&lt;br /&gt;
-- Preload file for Lua module documentation pages.&lt;br /&gt;
cfg[&#039;module-preload&#039;] = &#039;Template:Documentation/preload-module-doc&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Print version configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;print-subpage&#039;]&lt;br /&gt;
-- The name of the template subpage used for print versions.&lt;br /&gt;
cfg[&#039;print-subpage&#039;] = &#039;Print&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;print-link-display&#039;]&lt;br /&gt;
-- The text to display when linking to the /Print subpage.&lt;br /&gt;
cfg[&#039;print-link-display&#039;] = &#039;/Print&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;print-blurb&#039;]&lt;br /&gt;
-- Text to display if a /Print subpage exists. $1 is a link to the subpage with a display value of cfg[&#039;print-link-display&#039;].&lt;br /&gt;
cfg[&#039;print-blurb&#039;] = format(&#039;print-blurb&#039;)&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;display-print-category&#039;]&lt;br /&gt;
-- Set to true to enable output of cfg[&#039;print-category&#039;] if a /Print subpage exists.&lt;br /&gt;
-- This should be a boolean value (either true or false).&lt;br /&gt;
cfg[&#039;display-print-category&#039;] = true&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;print-category&#039;]&lt;br /&gt;
-- Category to output if cfg[&#039;display-print-category&#039;] is set to true, and a /Print subpage exists.&lt;br /&gt;
cfg[&#039;print-category&#039;] = &#039;Templates with print versions&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- HTML and CSS configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;main-div-id&#039;]&lt;br /&gt;
-- The &amp;quot;id&amp;quot; attribute of the main HTML &amp;quot;div&amp;quot; tag.&lt;br /&gt;
cfg[&#039;main-div-id&#039;] = &#039;template-documentation&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;main-div-classes&#039;]&lt;br /&gt;
-- The CSS classes added to the main HTML &amp;quot;div&amp;quot; tag.&lt;br /&gt;
cfg[&#039;main-div-class&#039;] = &#039;ts-doc-doc&#039;&lt;br /&gt;
cfg[&#039;header-div-class&#039;] = &#039;ts-doc-header&#039;&lt;br /&gt;
cfg[&#039;heading-div-class&#039;] = &#039;ts-doc-heading&#039;&lt;br /&gt;
cfg[&#039;content-div-class&#039;] = &#039;ts-doc-content&#039;&lt;br /&gt;
cfg[&#039;footer-div-class&#039;] = &#039;ts-doc-footer plainlinks&#039;&lt;br /&gt;
&lt;br /&gt;
cfg[&#039;sandbox-class&#039;] = &#039;ts-doc-sandbox&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;start-box-linkclasses&#039;]&lt;br /&gt;
-- The CSS classes used for the [view][edit][history] or [create] links in the start box.&lt;br /&gt;
cfg[&#039;start-box-linkclasses&#039;] = &#039;ts-tlinks-tlinks mw-editsection-like plainlinks&#039;&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;start-box-link-id&#039;]&lt;br /&gt;
-- The HTML &amp;quot;id&amp;quot; attribute for the links in the start box.&lt;br /&gt;
cfg[&#039;start-box-link-id&#039;] = &#039;doc_editlinks&#039;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- Tracking category configuration&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;display-strange-usage-category&#039;]&lt;br /&gt;
-- Set to true to enable output of cfg[&#039;strange-usage-category&#039;] if the module is used on a /doc subpage&lt;br /&gt;
-- or a /testcases subpage. This should be a boolean value (either true or false).&lt;br /&gt;
cfg[&#039;display-strange-usage-category&#039;] = true&lt;br /&gt;
&lt;br /&gt;
-- cfg[&#039;strange-usage-category&#039;]&lt;br /&gt;
-- Category to output if cfg[&#039;display-strange-usage-category&#039;] is set to true and the module is used on a&lt;br /&gt;
-- /doc subpage or a /testcases subpage.&lt;br /&gt;
cfg[&#039;strange-usage-category&#039;] = &#039;Wikipedia pages with strange ((documentation)) usage&#039;&lt;br /&gt;
&lt;br /&gt;
--[[&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
-- End configuration&lt;br /&gt;
--&lt;br /&gt;
-- Don&#039;t edit anything below this line.&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
return cfg&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Documentation&amp;diff=2752</id>
		<title>Module:Documentation</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Documentation&amp;diff=2752"/>
		<updated>2020-07-01T10:17:00Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Documentation&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module implements {{documentation}}.&lt;br /&gt;
&lt;br /&gt;
-- Get required modules.&lt;br /&gt;
local getArgs = require(&#039;Module:Arguments&#039;).getArgs&lt;br /&gt;
local messageBox = require(&#039;Module:Message box&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Get the config table.&lt;br /&gt;
local cfg = mw.loadData(&#039;Module:Documentation/config&#039;)&lt;br /&gt;
local i18n = mw.loadData(&#039;Module:Documentation/i18n&#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Often-used functions.&lt;br /&gt;
local ugsub = mw.ustring.gsub&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--&lt;br /&gt;
-- These are defined as local functions, but are made available in the p&lt;br /&gt;
-- table for testing purposes.&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function message(cfgKey, valArray, expectType)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Gets a message from the cfg table and formats it if appropriate.&lt;br /&gt;
	-- The function raises an error if the value from the cfg table is not&lt;br /&gt;
	-- of the type expectType. The default type for expectType is &#039;string&#039;.&lt;br /&gt;
	-- If the table valArray is present, strings such as $1, $2 etc. in the&lt;br /&gt;
	-- message are substituted with values from the table keys [1], [2] etc.&lt;br /&gt;
	-- For example, if the message &amp;quot;foo-message&amp;quot; had the value &#039;Foo $2 bar $1.&#039;,&lt;br /&gt;
	-- message(&#039;foo-message&#039;, {&#039;baz&#039;, &#039;qux&#039;}) would return &amp;quot;Foo qux bar baz.&amp;quot;&lt;br /&gt;
	--]]&lt;br /&gt;
	local msg = cfg[cfgKey]&lt;br /&gt;
	expectType = expectType or &#039;string&#039;&lt;br /&gt;
	if type(msg) ~= expectType then&lt;br /&gt;
		error(require(&#039;Module:TNT&#039;).format(&#039;I18n/Documentation&#039;, &#039;cfg-error-msg-type&#039;, cfgKey, expectType, type(msg)), 2)&lt;br /&gt;
	end&lt;br /&gt;
	if not valArray then&lt;br /&gt;
		return msg&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function getMessageVal(match)&lt;br /&gt;
		match = tonumber(match)&lt;br /&gt;
		return valArray[match] or error(require(&#039;Module:TNT&#039;).format(&#039;I18n/Documentation&#039;, &#039;cfg-error-msg-empty&#039;, &#039;$&#039; .. match, cfgKey), 4)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret = ugsub(msg, &#039;$([1-9][0-9]*)&#039;, getMessageVal)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.message = message&lt;br /&gt;
&lt;br /&gt;
local function makeWikilink(page, display)&lt;br /&gt;
	if display then&lt;br /&gt;
		return mw.ustring.format(&#039;[[%s|%s]]&#039;, page, display)&lt;br /&gt;
	else&lt;br /&gt;
		return mw.ustring.format(&#039;[[%s]]&#039;, page)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeWikilink = makeWikilink&lt;br /&gt;
&lt;br /&gt;
local function makeCategoryLink(cat, sort)&lt;br /&gt;
	local catns = mw.site.namespaces[14].name&lt;br /&gt;
	return makeWikilink(catns .. &#039;:&#039; .. cat, sort)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeCategoryLink = makeCategoryLink&lt;br /&gt;
&lt;br /&gt;
local function makeUrlLink(url, display)&lt;br /&gt;
	return mw.ustring.format(&#039;[%s %s]&#039;, url, display)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.makeUrlLink = makeUrlLink&lt;br /&gt;
&lt;br /&gt;
local function makeToolbar(...)&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	local lim = select(&#039;#&#039;, ...)&lt;br /&gt;
	if lim &amp;lt; 1 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	for i = 1, lim do&lt;br /&gt;
		ret[#ret + 1] = select(i, ...)&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&amp;lt;small style=&amp;quot;font-style: normal;&amp;quot;&amp;gt;(&#039; .. table.concat(ret, &#039; &amp;amp;#124; &#039;) .. &#039;)&amp;lt;/small&amp;gt;&#039;&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
p.makeToolbar = makeToolbar&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Argument processing&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function makeInvokeFunc(funcName)&lt;br /&gt;
	return function (frame)&lt;br /&gt;
		local args = getArgs(frame, {&lt;br /&gt;
			valueFunc = function (key, value)&lt;br /&gt;
				if type(value) == &#039;string&#039; then&lt;br /&gt;
					value = value:match(&#039;^%s*(.-)%s*$&#039;) -- Remove whitespace.&lt;br /&gt;
					if key == &#039;heading&#039; or value ~= &#039;&#039; then&lt;br /&gt;
						return value&lt;br /&gt;
					else&lt;br /&gt;
						return nil&lt;br /&gt;
					end&lt;br /&gt;
				else&lt;br /&gt;
					return value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
		return p[funcName](args)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Load TemplateStyles&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.main = function(frame)&lt;br /&gt;
	local parent = frame.getParent(frame)&lt;br /&gt;
	local output = p._main(parent.args)&lt;br /&gt;
	return frame:extensionTag{ name=&#039;templatestyles&#039;, args = { src= message(&#039;templatestyles-scr&#039;) } } .. frame:preprocess(output)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Main function&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- This function defines logic flow for the module.&lt;br /&gt;
	-- @args - table of arguments passed by the user&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;main-div-id&#039; --&amp;gt; &#039;template-documentation&#039;&lt;br /&gt;
	-- &#039;main-div-classes&#039; --&amp;gt; &#039;template-documentation iezoomfix&#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local env = p.getEnvironment(args)&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
	root&lt;br /&gt;
		:wikitext(p.protectionTemplate(env))&lt;br /&gt;
		:wikitext(p.sandboxNotice(args, env))&lt;br /&gt;
		 -- This div tag is from {{documentation/start box}}, but moving it here&lt;br /&gt;
		 -- so that we don&#039;t have to worry about unclosed tags.&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			:attr(&#039;id&#039;, message(&#039;main-div-id&#039;))&lt;br /&gt;
			:addClass(message(&#039;main-div-class&#039;))&lt;br /&gt;
			:wikitext(p._startBox(args, env))&lt;br /&gt;
			:wikitext(p._content(args, env))&lt;br /&gt;
			:done()&lt;br /&gt;
		:wikitext(p._endBox(args, env))&lt;br /&gt;
		:wikitext(p.addTrackingCategories(env))&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Environment settings&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.getEnvironment(args)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Returns a table with information about the environment, including title objects and other namespace- or&lt;br /&gt;
	-- path-related data.&lt;br /&gt;
	-- @args - table of arguments passed by the user&lt;br /&gt;
	--&lt;br /&gt;
	-- Title objects include:&lt;br /&gt;
	-- env.title - the page we are making documentation for (usually the current title)&lt;br /&gt;
	-- env.templateTitle - the template (or module, file, etc.)&lt;br /&gt;
	-- env.docTitle - the /doc subpage.&lt;br /&gt;
	-- env.sandboxTitle - the /sandbox subpage.&lt;br /&gt;
	-- env.testcasesTitle - the /testcases subpage.&lt;br /&gt;
	-- env.printTitle - the print version of the template, located at the /Print subpage.&lt;br /&gt;
	--&lt;br /&gt;
	-- Data includes:&lt;br /&gt;
	-- env.protectionLevels - the protection levels table of the title object.&lt;br /&gt;
	-- env.subjectSpace - the number of the title&#039;s subject namespace.&lt;br /&gt;
	-- env.docSpace - the number of the namespace the title puts its documentation in.&lt;br /&gt;
	-- env.docpageBase - the text of the base page of the /doc, /sandbox and /testcases pages, with namespace.&lt;br /&gt;
	-- env.compareUrl - URL of the Special:ComparePages page comparing the sandbox with the template.&lt;br /&gt;
	-- &lt;br /&gt;
	-- All table lookups are passed through pcall so that errors are caught. If an error occurs, the value&lt;br /&gt;
	-- returned will be nil.&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	local env, envFuncs = {}, {}&lt;br /&gt;
&lt;br /&gt;
	-- Set up the metatable. If triggered we call the corresponding function in the envFuncs table. The value&lt;br /&gt;
	-- returned by that function is memoized in the env table so that we don&#039;t call any of the functions&lt;br /&gt;
	-- more than once. (Nils won&#039;t be memoized.)&lt;br /&gt;
	setmetatable(env, {&lt;br /&gt;
		__index = function (t, key)&lt;br /&gt;
			local envFunc = envFuncs[key]&lt;br /&gt;
			if envFunc then&lt;br /&gt;
				local success, val = pcall(envFunc)&lt;br /&gt;
				if success then&lt;br /&gt;
					env[key] = val -- Memoise the value.&lt;br /&gt;
					return val&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	})	&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.title()&lt;br /&gt;
		-- The title object for the current page, or a test page passed with args.page.&lt;br /&gt;
		local title&lt;br /&gt;
		local titleArg = args.page&lt;br /&gt;
		if titleArg then&lt;br /&gt;
			title = mw.title.new(titleArg)&lt;br /&gt;
		else&lt;br /&gt;
			title = mw.title.getCurrentTitle()&lt;br /&gt;
		end&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.templateTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- The template (or module, etc.) title object.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;sandbox-subpage&#039; --&amp;gt; &#039;sandbox&#039;&lt;br /&gt;
		-- &#039;testcases-subpage&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		local subjectSpace = env.subjectSpace&lt;br /&gt;
		local title = env.title&lt;br /&gt;
		local subpage = title.subpageText&lt;br /&gt;
		if subpage == message(&#039;sandbox-subpage&#039;) or subpage == message(&#039;testcases-subpage&#039;) then&lt;br /&gt;
			return mw.title.makeTitle(subjectSpace, title.baseText)&lt;br /&gt;
		else&lt;br /&gt;
			return mw.title.makeTitle(subjectSpace, title.text)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object of the /doc subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;doc-subpage&#039; --&amp;gt; &#039;doc&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		local title = env.title&lt;br /&gt;
		local docname = args[1] -- User-specified doc page.&lt;br /&gt;
		local docpage&lt;br /&gt;
		if docname then&lt;br /&gt;
			docpage = docname&lt;br /&gt;
		else&lt;br /&gt;
			docpage = env.docpageBase .. &#039;/&#039; .. message(&#039;doc-subpage&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		return mw.title.new(docpage)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.sandboxTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /sandbox subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;sandbox-subpage&#039; --&amp;gt; &#039;sandbox&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		return mw.title.new(env.docpageBase .. &#039;/&#039; .. message(&#039;sandbox-subpage&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.testcasesTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /testcases subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;testcases-subpage&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		return mw.title.new(env.docpageBase .. &#039;/&#039; .. message(&#039;testcases-subpage&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.printTitle()&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Title object for the /Print subpage.&lt;br /&gt;
		-- Messages:&lt;br /&gt;
		-- &#039;print-subpage&#039; --&amp;gt; &#039;Print&#039;&lt;br /&gt;
		--]]&lt;br /&gt;
		return env.templateTitle:subPageTitle(message(&#039;print-subpage&#039;))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.protectionLevels()&lt;br /&gt;
		-- The protection levels table of the title object.&lt;br /&gt;
		return env.title.protectionLevels&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.subjectSpace()&lt;br /&gt;
		-- The subject namespace number.&lt;br /&gt;
		return mw.site.namespaces[env.title.namespace].subject.id&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docSpace()&lt;br /&gt;
		-- The documentation namespace number. For most namespaces this is the same as the&lt;br /&gt;
		-- subject namespace. However, pages in the Article, File, MediaWiki or Category&lt;br /&gt;
		-- namespaces must have their /doc, /sandbox and /testcases pages in talk space.&lt;br /&gt;
		local subjectSpace = env.subjectSpace&lt;br /&gt;
		if subjectSpace == 0 or subjectSpace == 6 or subjectSpace == 8 or subjectSpace == 14 then&lt;br /&gt;
			return subjectSpace + 1&lt;br /&gt;
		else&lt;br /&gt;
			return subjectSpace&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	function envFuncs.docpageBase()&lt;br /&gt;
		-- The base page of the /doc, /sandbox, and /testcases subpages.&lt;br /&gt;
		-- For some namespaces this is the talk page, rather than the template page.&lt;br /&gt;
		local templateTitle = env.templateTitle&lt;br /&gt;
		local docSpace = env.docSpace&lt;br /&gt;
		local docSpaceText = mw.site.namespaces[docSpace].name&lt;br /&gt;
		-- Assemble the link. docSpace is never the main namespace, so we can hardcode the colon.&lt;br /&gt;
		return docSpaceText .. &#039;:&#039; .. templateTitle.text&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	function envFuncs.compareUrl()&lt;br /&gt;
		-- Diff link between the sandbox and the main template using [[Special:ComparePages]].&lt;br /&gt;
		local templateTitle = env.templateTitle&lt;br /&gt;
		local sandboxTitle = env.sandboxTitle&lt;br /&gt;
		if templateTitle.exists and sandboxTitle.exists then&lt;br /&gt;
			local compareUrl = mw.uri.fullUrl(&lt;br /&gt;
				&#039;Special:ComparePages&#039;,&lt;br /&gt;
				{page1 = templateTitle.prefixedText, page2 = sandboxTitle.prefixedText}&lt;br /&gt;
			)&lt;br /&gt;
			return tostring(compareUrl)&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	end		&lt;br /&gt;
&lt;br /&gt;
	return env&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Auxiliary templates&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.sandboxNotice(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Generates a sandbox notice for display above sandbox pages.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;sandbox-notice-image&#039; --&amp;gt; &#039;[[Image:Sandbox.svg|50px|alt=|link=]]&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-blurb&#039; --&amp;gt; &#039;This is the $1 for $2.&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-diff-blurb&#039; --&amp;gt; &#039;This is the $1 for $2 ($3).&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-pagetype-template&#039; --&amp;gt; &#039;[[w:Wikipedia:Template test cases|template sandbox]] page&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-pagetype-module&#039; --&amp;gt; &#039;[[w:Wikipedia:Template test cases|module sandbox]] page&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-pagetype-other&#039; --&amp;gt; &#039;sandbox page&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-compare-link-display&#039; --&amp;gt; &#039;diff&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-testcases-blurb&#039; --&amp;gt; &#039;See also the companion subpage for $1.&#039;&lt;br /&gt;
	-- &#039;sandbox-notice-testcases-link-display&#039; --&amp;gt; &#039;test cases&#039;&lt;br /&gt;
	-- &#039;sandbox-category&#039; --&amp;gt; &#039;Template sandboxes&#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local sandboxTitle = env.sandboxTitle&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not (subjectSpace and title and sandboxTitle and templateTitle and mw.title.equals(title, sandboxTitle)) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Build the table of arguments to pass to {{ombox}}. We need just two fields, &amp;quot;image&amp;quot; and &amp;quot;text&amp;quot;.&lt;br /&gt;
	local omargs = {}&lt;br /&gt;
	omargs.image = message(&#039;sandbox-notice-image&#039;)&lt;br /&gt;
	-- Get the text. We start with the opening blurb, which is something like&lt;br /&gt;
	-- &amp;quot;This is the template sandbox for [[Template:Foo]] (diff).&amp;quot;&lt;br /&gt;
	local text = &#039;&#039;&lt;br /&gt;
	local frame = mw.getCurrentFrame()&lt;br /&gt;
	local isPreviewing = frame:preprocess(&#039;{{REVISIONID}}&#039;) == &#039;&#039; -- True if the page is being previewed.&lt;br /&gt;
	local pagetype&lt;br /&gt;
	if subjectSpace == 10 then&lt;br /&gt;
		pagetype = message(&#039;sandbox-notice-pagetype-template&#039;)&lt;br /&gt;
	elseif subjectSpace == 828 then&lt;br /&gt;
		pagetype = message(&#039;sandbox-notice-pagetype-module&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		pagetype = message(&#039;sandbox-notice-pagetype-other&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local templateLink = makeWikilink(templateTitle.prefixedText)&lt;br /&gt;
	local compareUrl = env.compareUrl&lt;br /&gt;
	if isPreviewing or not compareUrl then&lt;br /&gt;
		text = text .. message(&#039;sandbox-notice-blurb&#039;, {pagetype, templateLink})&lt;br /&gt;
	else&lt;br /&gt;
		local compareDisplay = message(&#039;sandbox-notice-compare-link-display&#039;)&lt;br /&gt;
		local compareLink = makeUrlLink(compareUrl, compareDisplay)&lt;br /&gt;
		text = text .. message(&#039;sandbox-notice-diff-blurb&#039;, {pagetype, templateLink, compareLink})&lt;br /&gt;
	end&lt;br /&gt;
	-- Get the test cases page blurb if the page exists. This is something like&lt;br /&gt;
	-- &amp;quot;See also the companion subpage for [[Template:Foo/testcases|test cases]].&amp;quot;&lt;br /&gt;
	local testcasesTitle = env.testcasesTitle&lt;br /&gt;
	if testcasesTitle and testcasesTitle.exists then&lt;br /&gt;
		if testcasesTitle.contentModel == &amp;quot;Scribunto&amp;quot; then&lt;br /&gt;
			local testcasesLinkDisplay = message(&#039;sandbox-notice-testcases-link-display&#039;)&lt;br /&gt;
			local testcasesRunLinkDisplay = message(&#039;sandbox-notice-testcases-run-link-display&#039;)&lt;br /&gt;
			local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)&lt;br /&gt;
			local testcasesRunLink = makeWikilink(testcasesTitle.talkPageTitle.prefixedText, testcasesRunLinkDisplay)&lt;br /&gt;
			text = text .. &#039;&amp;lt;br /&amp;gt;&#039; .. message(&#039;sandbox-notice-testcases-run-blurb&#039;, {testcasesLink, testcasesRunLink})&lt;br /&gt;
		else&lt;br /&gt;
			local testcasesLinkDisplay = message(&#039;sandbox-notice-testcases-link-display&#039;)&lt;br /&gt;
			local testcasesLink = makeWikilink(testcasesTitle.prefixedText, testcasesLinkDisplay)&lt;br /&gt;
			text = text .. &#039;&amp;lt;br /&amp;gt;&#039; .. message(&#039;sandbox-notice-testcases-blurb&#039;, {testcasesLink})&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Add the sandbox to the sandbox category.&lt;br /&gt;
	text = text .. makeCategoryLink(message(&#039;sandbox-category&#039;))&lt;br /&gt;
	omargs.text = text&lt;br /&gt;
	omargs.class = message(&#039;sandbox-class&#039;)&lt;br /&gt;
	local ret = &#039;&amp;lt;div style=&amp;quot;clear: both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&#039;&lt;br /&gt;
	ret = ret .. messageBox.main(&#039;ombox&#039;, omargs)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.protectionTemplate(env)&lt;br /&gt;
	-- Generates the padlock icon in the top right.&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;protection-template&#039; --&amp;gt; &#039;pp-template&#039;&lt;br /&gt;
	-- &#039;protection-template-args&#039; --&amp;gt; {docusage = &#039;yes&#039;}&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local protectionLevels&lt;br /&gt;
	local protectionTemplate = message(&#039;protection-template&#039;)&lt;br /&gt;
	local namespace = title.namespace&lt;br /&gt;
	if not (protectionTemplate and (namespace == 10 or namespace == 828)) then&lt;br /&gt;
		-- Don&#039;t display the protection template if we are not in the template or module namespaces.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	protectionLevels = env.protectionLevels&lt;br /&gt;
	if not protectionLevels then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local editLevels = protectionLevels.edit&lt;br /&gt;
	local moveLevels = protectionLevels.move&lt;br /&gt;
	if moveLevels and moveLevels[1] == &#039;sysop&#039; or editLevels and editLevels[1] then&lt;br /&gt;
		-- The page is full-move protected, or full, template, or semi-protected.&lt;br /&gt;
		local frame = mw.getCurrentFrame()&lt;br /&gt;
		return frame:expandTemplate{title = protectionTemplate, args = message(&#039;protection-template-args&#039;, nil, &#039;table&#039;)}&lt;br /&gt;
	else&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Start box&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.startBox = makeInvokeFunc(&#039;_startBox&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._startBox(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- This function generates the start box.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- The actual work is done by p.makeStartBoxLinksData and p.renderStartBoxLinks which make&lt;br /&gt;
	-- the [view] [edit] [history] [purge] links, and by p.makeStartBoxData and p.renderStartBox&lt;br /&gt;
	-- which generate the box HTML.&lt;br /&gt;
	--]]&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local links&lt;br /&gt;
	local content = args.content&lt;br /&gt;
	if not content then&lt;br /&gt;
		-- No need to include the links if the documentation is on the template page itself.&lt;br /&gt;
		local linksData = p.makeStartBoxLinksData(args, env)&lt;br /&gt;
		if linksData then&lt;br /&gt;
			links = p.renderStartBoxLinks(linksData)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- Generate the start box html.&lt;br /&gt;
	local data = p.makeStartBoxData(args, env, links)&lt;br /&gt;
	if data then&lt;br /&gt;
		return p.renderStartBox(data)&lt;br /&gt;
	else&lt;br /&gt;
		-- User specified no heading.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeStartBoxLinksData(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Does initial processing of data to make the [view] [edit] [history] [purge] links.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;view-link-display&#039; --&amp;gt; &#039;view&#039;&lt;br /&gt;
	-- &#039;edit-link-display&#039; --&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;history-link-display&#039; --&amp;gt; &#039;history&#039;&lt;br /&gt;
	-- &#039;purge-link-display&#039; --&amp;gt; &#039;purge&#039;&lt;br /&gt;
	-- &#039;file-docpage-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-filespace&#039;&lt;br /&gt;
	-- &#039;module-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-module-doc&#039;&lt;br /&gt;
	-- &#039;docpage-preload&#039; --&amp;gt; &#039;Template:Documentation/preload&#039;&lt;br /&gt;
	-- &#039;create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not title or not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if docTitle.isRedirect then &lt;br /&gt;
		docTitle = docTitle.redirectTarget&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local data = {}&lt;br /&gt;
	data.title = title&lt;br /&gt;
	data.docTitle = docTitle&lt;br /&gt;
	-- View, display, edit, and purge links if /doc exists.&lt;br /&gt;
	data.viewLinkDisplay = i18n[&#039;view-link-display&#039;]&lt;br /&gt;
	data.editLinkDisplay = i18n[&#039;edit-link-display&#039;]&lt;br /&gt;
	data.historyLinkDisplay = i18n[&#039;history-link-display&#039;]&lt;br /&gt;
	data.purgeLinkDisplay = i18n[&#039;purge-link-display&#039;]&lt;br /&gt;
	-- Create link if /doc doesn&#039;t exist.&lt;br /&gt;
	local preload = args.preload&lt;br /&gt;
	if not preload then&lt;br /&gt;
		if subjectSpace == 6 then -- File namespace&lt;br /&gt;
			preload = message(&#039;file-docpage-preload&#039;)&lt;br /&gt;
		elseif subjectSpace == 828 then -- Module namespace&lt;br /&gt;
			preload = message(&#039;module-preload&#039;)&lt;br /&gt;
		else&lt;br /&gt;
			preload = message(&#039;docpage-preload&#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	data.preload = preload&lt;br /&gt;
	data.createLinkDisplay = i18n[&#039;create-link-display&#039;]&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderStartBoxLinks(data)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the [view][edit][history][purge] or [create] links from the data table.&lt;br /&gt;
	-- @data - a table of data generated by p.makeStartBoxLinksData&lt;br /&gt;
	--]]&lt;br /&gt;
	&lt;br /&gt;
	local function escapeBrackets(s)&lt;br /&gt;
		-- Escapes square brackets with HTML entities.&lt;br /&gt;
		s = s:gsub(&#039;%[&#039;, &#039;&amp;amp;#91;&#039;) -- Replace square brackets with HTML entities.&lt;br /&gt;
		s = s:gsub(&#039;%]&#039;, &#039;&amp;amp;#93;&#039;)&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret&lt;br /&gt;
	local docTitle = data.docTitle&lt;br /&gt;
	local title = data.title&lt;br /&gt;
	if docTitle.exists then&lt;br /&gt;
		local viewLink = makeWikilink(docTitle.prefixedText, data.viewLinkDisplay)&lt;br /&gt;
		local editLink = makeUrlLink(docTitle:fullUrl{action = &#039;edit&#039;}, data.editLinkDisplay)&lt;br /&gt;
		local historyLink = makeUrlLink(docTitle:fullUrl{action = &#039;history&#039;}, data.historyLinkDisplay)&lt;br /&gt;
		local purgeLink = makeUrlLink(title:fullUrl{action = &#039;purge&#039;}, data.purgeLinkDisplay)&lt;br /&gt;
		ret = &#039;[%s] [%s] [%s] [%s]&#039;&lt;br /&gt;
		ret = escapeBrackets(ret)&lt;br /&gt;
		ret = mw.ustring.format(ret, viewLink, editLink, historyLink, purgeLink)&lt;br /&gt;
	else&lt;br /&gt;
		local createLink = makeUrlLink(docTitle:fullUrl{action = &#039;edit&#039;, preload = data.preload}, data.createLinkDisplay)&lt;br /&gt;
		ret = &#039;[%s]&#039;&lt;br /&gt;
		ret = escapeBrackets(ret)&lt;br /&gt;
		ret = mw.ustring.format(ret, createLink)&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeStartBoxData(args, env, links)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Does initial processing of data to pass to the start-box render function, p.renderStartBox.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- @links - a string containing the [view][edit][history][purge] links - could be nil if there&#039;s an error.&lt;br /&gt;
	--&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;documentation-icon-wikitext&#039; --&amp;gt; &#039;[[File:Test Template Info-Icon - Version (2).svg|50px|link=|alt=Documentation icon]]&#039;&lt;br /&gt;
	-- &#039;template-namespace-heading&#039; --&amp;gt; &#039;Template documentation&#039;&lt;br /&gt;
	-- &#039;module-namespace-heading&#039; --&amp;gt; &#039;Module documentation&#039;&lt;br /&gt;
	-- &#039;file-namespace-heading&#039; --&amp;gt; &#039;Summary&#039;&lt;br /&gt;
	-- &#039;other-namespaces-heading&#039; --&amp;gt; &#039;Documentation&#039;&lt;br /&gt;
	-- &#039;start-box-linkclasses&#039; --&amp;gt; &#039;mw-editsection-like plainlinks&#039;&lt;br /&gt;
	-- &#039;start-box-link-id&#039; --&amp;gt; &#039;doc_editlinks&#039;&lt;br /&gt;
	-- &#039;testcases-create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not subjectSpace then&lt;br /&gt;
		-- Default to an &amp;quot;other namespaces&amp;quot; namespace, so that we get at least some output&lt;br /&gt;
		-- if an error occurs.&lt;br /&gt;
		subjectSpace = 2&lt;br /&gt;
	end&lt;br /&gt;
	local data = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Heading&lt;br /&gt;
	local heading = args.heading -- Blank values are not removed.&lt;br /&gt;
	if heading == &#039;&#039; then&lt;br /&gt;
		-- Don&#039;t display the start box if the heading arg is defined but blank.&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if heading then&lt;br /&gt;
		data.heading = heading&lt;br /&gt;
	elseif subjectSpace == 10 then -- Template namespace&lt;br /&gt;
		data.heading = i18n[&#039;template-namespace-heading&#039;]&lt;br /&gt;
	elseif subjectSpace == 828 then -- Module namespace&lt;br /&gt;
		data.heading = i18n[&#039;module-namespace-heading&#039;]&lt;br /&gt;
	elseif subjectSpace == 6 then -- File namespace&lt;br /&gt;
		data.heading = i18n[&#039;file-namespace-heading&#039;]&lt;br /&gt;
	else&lt;br /&gt;
		data.heading = i18n[&#039;other-namespaces-heading&#039;]&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Data for the [view][edit][history][purge] or [create] links.&lt;br /&gt;
	if links then&lt;br /&gt;
		data.linksClass = message(&#039;start-box-linkclasses&#039;)&lt;br /&gt;
		data.linksId = message(&#039;start-box-link-id&#039;)&lt;br /&gt;
		data.links = links&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return data&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.renderStartBox(data)&lt;br /&gt;
	-- Renders the start box html.&lt;br /&gt;
	-- @data - a table of data generated by p.makeStartBoxData.&lt;br /&gt;
	local sbox = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	sbox&lt;br /&gt;
		:addClass(message(&#039;header-div-class&#039;))&lt;br /&gt;
		:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(message(&#039;heading-div-class&#039;))&lt;br /&gt;
			:wikitext(data.heading)&lt;br /&gt;
	local links = data.links&lt;br /&gt;
	if links then&lt;br /&gt;
		sbox&lt;br /&gt;
			:tag(&#039;div&#039;)&lt;br /&gt;
				:addClass(data.linksClass)&lt;br /&gt;
				:attr(&#039;id&#039;, data.linksId)&lt;br /&gt;
				:wikitext(links)&lt;br /&gt;
	end&lt;br /&gt;
	return tostring(sbox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Documentation content&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.content = makeInvokeFunc(&#039;_content&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._content(args, env)&lt;br /&gt;
	-- Displays the documentation contents&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	local content = args.content&lt;br /&gt;
	if not content and docTitle and docTitle.exists then&lt;br /&gt;
		content = args._content or mw.getCurrentFrame():expandTemplate{title = docTitle.prefixedText}&lt;br /&gt;
	end&lt;br /&gt;
	-- The line breaks below are necessary so that &amp;quot;=== Headings ===&amp;quot; at the start and end&lt;br /&gt;
	-- of docs are interpreted correctly.&lt;br /&gt;
	local cbox = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	cbox&lt;br /&gt;
		:addClass(message(&#039;content-div-class&#039;))&lt;br /&gt;
		:wikitext(&#039;\n&#039; .. (content or &#039;&#039;) .. &#039;\n&#039;)&lt;br /&gt;
	return tostring(cbox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.contentTitle = makeInvokeFunc(&#039;_contentTitle&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._contentTitle(args, env)&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not args.content and docTitle and docTitle.exists then&lt;br /&gt;
		return docTitle.prefixedText&lt;br /&gt;
	else&lt;br /&gt;
		return &#039;&#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- End box&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
p.endBox = makeInvokeFunc(&#039;_endBox&#039;)&lt;br /&gt;
&lt;br /&gt;
function p._endBox(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- This function generates the end box (also known as the link box).&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	--]=]&lt;br /&gt;
	&lt;br /&gt;
	-- Get environment data.&lt;br /&gt;
	env = env or p.getEnvironment(args)&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not subjectSpace or not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	-- Check whether we should output the end box at all. Add the end&lt;br /&gt;
	-- box by default if the documentation exists or if we are in the&lt;br /&gt;
	-- user, module or template namespaces.&lt;br /&gt;
	local linkBox = args[&#039;link box&#039;]&lt;br /&gt;
	if linkBox == &#039;off&#039;&lt;br /&gt;
		or not (&lt;br /&gt;
			docTitle.exists&lt;br /&gt;
			or subjectSpace == 2&lt;br /&gt;
			or subjectSpace == 828&lt;br /&gt;
			or subjectSpace == 10&lt;br /&gt;
		)&lt;br /&gt;
	then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Assemble the footer text field.&lt;br /&gt;
	local text = &#039;&#039;&lt;br /&gt;
	if linkBox then&lt;br /&gt;
		text = text .. linkBox&lt;br /&gt;
	else&lt;br /&gt;
		text = text .. (p.makeDocPageBlurb(args, env) or &#039;&#039;) -- &amp;quot;This documentation is transcluded from [[Foo]].&amp;quot; &lt;br /&gt;
		if subjectSpace == 2 or subjectSpace == 10 or subjectSpace == 828 then&lt;br /&gt;
			-- We are in the user, template or module namespaces.&lt;br /&gt;
			-- Add sandbox and testcases links.&lt;br /&gt;
			-- &amp;quot;Editors can experiment in this template&#039;s sandbox and testcases pages.&amp;quot;&lt;br /&gt;
			text = text .. (p.makeExperimentBlurb(args, env) or &#039;&#039;)&lt;br /&gt;
			text = text .. &#039;&amp;lt;br /&amp;gt;&#039;&lt;br /&gt;
			if not args.content and not args[1] then&lt;br /&gt;
				-- &amp;quot;Please add categories to the /doc subpage.&amp;quot;&lt;br /&gt;
				-- Don&#039;t show this message with inline docs or with an explicitly specified doc page,&lt;br /&gt;
				-- as then it is unclear where to add the categories.&lt;br /&gt;
				text = text .. (p.makeCategoriesBlurb(args, env) or &#039;&#039;)&lt;br /&gt;
			end&lt;br /&gt;
			text = text .. &#039; &#039; .. (p.makeSubpagesBlurb(args, env) or &#039;&#039;) --&amp;quot;Subpages of this template&amp;quot;&lt;br /&gt;
			local printBlurb = p.makePrintBlurb(args, env) -- Two-line blurb about print versions of templates.&lt;br /&gt;
			if printBlurb then&lt;br /&gt;
				text = text .. &#039;&amp;lt;br /&amp;gt;&#039; .. printBlurb&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ebox = mw.html.create(&#039;div&#039;)&lt;br /&gt;
	ebox&lt;br /&gt;
		:addClass(message(&#039;footer-div-class&#039;))&lt;br /&gt;
		:wikitext(text)&lt;br /&gt;
	return tostring(ebox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeDocPageBlurb(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Makes the blurb &amp;quot;This documentation is transcluded from [[Template:Foo]] (edit, history)&amp;quot;.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;edit-link-display&#039; --&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;history-link-display&#039; --&amp;gt; &#039;history&#039;&lt;br /&gt;
	-- &#039;transcluded-from-blurb&#039; --&amp;gt; &lt;br /&gt;
	-- &#039;The above [[w:Wikipedia:Template documentation|documentation]] &lt;br /&gt;
	-- is [[w:Wikipedia:Transclusion|transcluded]] from $1.&#039;&lt;br /&gt;
	-- &#039;module-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-module-doc&#039;&lt;br /&gt;
	-- &#039;create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	-- &#039;create-module-doc-blurb&#039; --&amp;gt;&lt;br /&gt;
	-- &#039;You might want to $1 a documentation page for this [[w:Wikipedia:Lua|Scribunto module]].&#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not docTitle or args.content then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local ret&lt;br /&gt;
	if docTitle.exists then&lt;br /&gt;
		-- /doc exists; link to it.&lt;br /&gt;
		local docLink = makeWikilink(docTitle.prefixedText)&lt;br /&gt;
		local editUrl = docTitle:fullUrl{action = &#039;edit&#039;}&lt;br /&gt;
		local editDisplay = i18n[&#039;edit-link-display&#039;]&lt;br /&gt;
		local editLink = makeUrlLink(editUrl, editDisplay)&lt;br /&gt;
		local historyUrl = docTitle:fullUrl{action = &#039;history&#039;}&lt;br /&gt;
		local historyDisplay = i18n[&#039;history-link-display&#039;]&lt;br /&gt;
		local historyLink = makeUrlLink(historyUrl, historyDisplay)&lt;br /&gt;
		ret = message(&#039;transcluded-from-blurb&#039;, {docLink})&lt;br /&gt;
			.. &#039; &#039;&lt;br /&gt;
			.. makeToolbar(editLink, historyLink)&lt;br /&gt;
			.. &#039;&amp;lt;br /&amp;gt;&#039;&lt;br /&gt;
	elseif env.subjectSpace == 828 then&lt;br /&gt;
		-- /doc does not exist; ask to create it.&lt;br /&gt;
		local createUrl = docTitle:fullUrl{action = &#039;edit&#039;, preload = message(&#039;module-preload&#039;)}&lt;br /&gt;
		local createDisplay = i18n[&#039;create-link-display&#039;]&lt;br /&gt;
		local createLink = makeUrlLink(createUrl, createDisplay)&lt;br /&gt;
		ret = message(&#039;create-module-doc-blurb&#039;, {createLink})&lt;br /&gt;
			.. &#039;&amp;lt;br /&amp;gt;&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeExperimentBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Renders the text &amp;quot;Editors can experiment in this template&#039;s sandbox (edit | diff) and testcases (edit) pages.&amp;quot;&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- &lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;sandbox-link-display&#039; --&amp;gt; &#039;sandbox&#039;&lt;br /&gt;
	-- &#039;sandbox-edit-link-display&#039; --&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;compare-link-display&#039; --&amp;gt; &#039;diff&#039;&lt;br /&gt;
	-- &#039;module-sandbox-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-module-sandbox&#039;&lt;br /&gt;
	-- &#039;template-sandbox-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-sandbox&#039;&lt;br /&gt;
	-- &#039;sandbox-create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	-- &#039;mirror-edit-summary&#039; --&amp;gt; &#039;Create sandbox version of $1&#039;&lt;br /&gt;
	-- &#039;mirror-link-display&#039; --&amp;gt; &#039;mirror&#039;&lt;br /&gt;
	-- &#039;mirror-link-preload&#039; --&amp;gt; &#039;Template:Documentation/mirror&#039;&lt;br /&gt;
	-- &#039;sandbox-link-display&#039; --&amp;gt; &#039;sandbox&#039;&lt;br /&gt;
	-- &#039;testcases-link-display&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
	-- &#039;testcases-edit-link-display&#039;--&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;template-sandbox-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-sandbox&#039;&lt;br /&gt;
	-- &#039;testcases-create-link-display&#039; --&amp;gt; &#039;create&#039;&lt;br /&gt;
	-- &#039;testcases-link-display&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
	-- &#039;testcases-edit-link-display&#039; --&amp;gt; &#039;edit&#039;&lt;br /&gt;
	-- &#039;module-testcases-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-module-testcases&#039;&lt;br /&gt;
	-- &#039;template-testcases-preload&#039; --&amp;gt; &#039;Template:Documentation/preload-testcases&#039;&lt;br /&gt;
	-- &#039;experiment-blurb-module&#039; --&amp;gt; &#039;Editors can experiment in this module&#039;s $1 and $2 pages.&#039;&lt;br /&gt;
	-- &#039;experiment-blurb-template&#039; --&amp;gt; &#039;Editors can experiment in this template&#039;s $1 and $2 pages.&#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	local sandboxTitle = env.sandboxTitle&lt;br /&gt;
	local testcasesTitle = env.testcasesTitle&lt;br /&gt;
	local templatePage = templateTitle.prefixedText&lt;br /&gt;
	if not subjectSpace or not templateTitle or not sandboxTitle or not testcasesTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	-- Make links.&lt;br /&gt;
	local sandboxLinks, testcasesLinks&lt;br /&gt;
	if sandboxTitle.exists then&lt;br /&gt;
		local sandboxPage = sandboxTitle.prefixedText&lt;br /&gt;
		local sandboxDisplay = message(&#039;sandbox-link-display&#039;)&lt;br /&gt;
		local sandboxLink = makeWikilink(sandboxPage, sandboxDisplay)&lt;br /&gt;
		local sandboxEditUrl = sandboxTitle:fullUrl{action = &#039;edit&#039;}&lt;br /&gt;
		local sandboxEditDisplay = message(&#039;sandbox-edit-link-display&#039;)&lt;br /&gt;
		local sandboxEditLink = makeUrlLink(sandboxEditUrl, sandboxEditDisplay)&lt;br /&gt;
		local compareUrl = env.compareUrl&lt;br /&gt;
		local compareLink&lt;br /&gt;
		if compareUrl then&lt;br /&gt;
			local compareDisplay = message(&#039;compare-link-display&#039;)&lt;br /&gt;
			compareLink = makeUrlLink(compareUrl, compareDisplay)&lt;br /&gt;
		end&lt;br /&gt;
		sandboxLinks = sandboxLink .. &#039; &#039; .. makeToolbar(sandboxEditLink, compareLink)&lt;br /&gt;
	else&lt;br /&gt;
		local sandboxPreload&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			sandboxPreload = message(&#039;module-sandbox-preload&#039;)&lt;br /&gt;
		else&lt;br /&gt;
			sandboxPreload = message(&#039;template-sandbox-preload&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local sandboxCreateUrl = sandboxTitle:fullUrl{action = &#039;edit&#039;, preload = sandboxPreload}&lt;br /&gt;
		local sandboxCreateDisplay = message(&#039;sandbox-create-link-display&#039;)&lt;br /&gt;
		local sandboxCreateLink = makeUrlLink(sandboxCreateUrl, sandboxCreateDisplay)&lt;br /&gt;
		local mirrorSummary = message(&#039;mirror-edit-summary&#039;, {makeWikilink(templatePage)})&lt;br /&gt;
		local mirrorPreload = message(&#039;mirror-link-preload&#039;)&lt;br /&gt;
		local mirrorUrl = sandboxTitle:fullUrl{action = &#039;edit&#039;, preload = mirrorPreload, summary = mirrorSummary}&lt;br /&gt;
		local mirrorDisplay = message(&#039;mirror-link-display&#039;)&lt;br /&gt;
		local mirrorLink = makeUrlLink(mirrorUrl, mirrorDisplay)&lt;br /&gt;
		sandboxLinks = message(&#039;sandbox-link-display&#039;) .. &#039; &#039; .. makeToolbar(sandboxCreateLink, mirrorLink)&lt;br /&gt;
	end&lt;br /&gt;
	if testcasesTitle.exists then&lt;br /&gt;
		local testcasesPage = testcasesTitle.prefixedText&lt;br /&gt;
		local testcasesDisplay = message(&#039;testcases-link-display&#039;)&lt;br /&gt;
		local testcasesLink = makeWikilink(testcasesPage, testcasesDisplay)&lt;br /&gt;
		local testcasesEditUrl = testcasesTitle:fullUrl{action = &#039;edit&#039;}&lt;br /&gt;
		local testcasesEditDisplay = message(&#039;testcases-edit-link-display&#039;)&lt;br /&gt;
		local testcasesEditLink = makeUrlLink(testcasesEditUrl, testcasesEditDisplay)&lt;br /&gt;
		testcasesLinks = testcasesLink .. &#039; &#039; .. makeToolbar(testcasesEditLink)&lt;br /&gt;
	else&lt;br /&gt;
		local testcasesPreload&lt;br /&gt;
		if subjectSpace == 828 then&lt;br /&gt;
			testcasesPreload = message(&#039;module-testcases-preload&#039;)&lt;br /&gt;
		else&lt;br /&gt;
			testcasesPreload = message(&#039;template-testcases-preload&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local testcasesCreateUrl = testcasesTitle:fullUrl{action = &#039;edit&#039;, preload = testcasesPreload}&lt;br /&gt;
		local testcasesCreateDisplay = message(&#039;testcases-create-link-display&#039;)&lt;br /&gt;
		local testcasesCreateLink = makeUrlLink(testcasesCreateUrl, testcasesCreateDisplay)&lt;br /&gt;
		testcasesLinks = message(&#039;testcases-link-display&#039;) .. &#039; &#039; .. makeToolbar(testcasesCreateLink)&lt;br /&gt;
	end&lt;br /&gt;
	local messageName&lt;br /&gt;
	if subjectSpace == 828 then&lt;br /&gt;
		messageName = &#039;experiment-blurb-module&#039;&lt;br /&gt;
	else&lt;br /&gt;
		messageName = &#039;experiment-blurb-template&#039;&lt;br /&gt;
	end&lt;br /&gt;
	return message(messageName, {sandboxLinks, testcasesLinks})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeCategoriesBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the text &amp;quot;Please add categories to the /doc subpage.&amp;quot;&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;doc-link-display&#039; --&amp;gt; &#039;/doc&#039;&lt;br /&gt;
	-- &#039;add-categories-blurb&#039; --&amp;gt; &#039;Please add categories to the $1 subpage.&#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local docTitle = env.docTitle&lt;br /&gt;
	if not docTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local docPathLink = makeWikilink(docTitle.prefixedText, message(&#039;doc-link-display&#039;))&lt;br /&gt;
	return message(&#039;add-categories-blurb&#039;, {docPathLink})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makeSubpagesBlurb(args, env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generates the &amp;quot;Subpages of this template&amp;quot; link.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;template-pagetype&#039; --&amp;gt; &#039;template&#039;&lt;br /&gt;
	-- &#039;module-pagetype&#039; --&amp;gt; &#039;module&#039;&lt;br /&gt;
	-- &#039;default-pagetype&#039; --&amp;gt; &#039;page&#039;&lt;br /&gt;
	-- &#039;subpages-link-display&#039; --&amp;gt; &#039;Subpages of this $1&#039;&lt;br /&gt;
	--]]&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	local templateTitle = env.templateTitle&lt;br /&gt;
	if not subjectSpace or not templateTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local pagetype&lt;br /&gt;
	if subjectSpace == 10 then&lt;br /&gt;
		pagetype = message(&#039;template-pagetype&#039;)&lt;br /&gt;
	elseif subjectSpace == 828 then&lt;br /&gt;
		pagetype = message(&#039;module-pagetype&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		pagetype = message(&#039;default-pagetype&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	local subpagesLink = makeWikilink(&lt;br /&gt;
		&#039;Special:PrefixIndex/&#039; .. templateTitle.prefixedText .. &#039;/&#039;,&lt;br /&gt;
		message(&#039;subpages-link-display&#039;, {pagetype})&lt;br /&gt;
	)&lt;br /&gt;
	return message(&#039;subpages-blurb&#039;, {subpagesLink})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.makePrintBlurb(args, env)&lt;br /&gt;
	--[=[&lt;br /&gt;
	-- Generates the blurb displayed when there is a print version of the template available.&lt;br /&gt;
	-- @args - a table of arguments passed by the user&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	--&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;print-link-display&#039; --&amp;gt; &#039;/Print&#039;&lt;br /&gt;
	-- &#039;print-blurb&#039; --&amp;gt; &#039;A [[Help:Books/for experts#Improving the book layout|print version]]&#039;&lt;br /&gt;
	--		.. &#039; of this template exists at $1.&#039;&lt;br /&gt;
	--		.. &#039; If you make a change to this template, please update the print version as well.&#039;&lt;br /&gt;
	-- &#039;display-print-category&#039; --&amp;gt; true&lt;br /&gt;
	-- &#039;print-category&#039; --&amp;gt; &#039;Templates with print versions&#039;&lt;br /&gt;
	--]=]&lt;br /&gt;
	local printTitle = env.printTitle&lt;br /&gt;
	if not printTitle then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local ret&lt;br /&gt;
	if printTitle.exists then&lt;br /&gt;
		local printLink = makeWikilink(printTitle.prefixedText, message(&#039;print-link-display&#039;))&lt;br /&gt;
		ret = message(&#039;print-blurb&#039;, {printLink})&lt;br /&gt;
		local displayPrintCategory = message(&#039;display-print-category&#039;, nil, &#039;boolean&#039;)&lt;br /&gt;
		if displayPrintCategory then&lt;br /&gt;
			ret = ret .. makeCategoryLink(message(&#039;print-category&#039;))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
-- Tracking categories&lt;br /&gt;
----------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.addTrackingCategories(env)&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Check if {{documentation}} is transcluded on a /doc or /testcases page.&lt;br /&gt;
	-- @env - environment table containing title objects, etc., generated with p.getEnvironment&lt;br /&gt;
	&lt;br /&gt;
	-- Messages:&lt;br /&gt;
	-- &#039;display-strange-usage-category&#039; --&amp;gt; true&lt;br /&gt;
	-- &#039;doc-subpage&#039; --&amp;gt; &#039;doc&#039;&lt;br /&gt;
	-- &#039;testcases-subpage&#039; --&amp;gt; &#039;testcases&#039;&lt;br /&gt;
	-- &#039;strange-usage-category&#039; --&amp;gt; &#039;Wikipedia pages with strange ((documentation)) usage&#039;&lt;br /&gt;
	-- &lt;br /&gt;
	-- /testcases pages in the module namespace are not categorised, as they may have&lt;br /&gt;
	-- {{documentation}} transcluded automatically.&lt;br /&gt;
	--]]&lt;br /&gt;
	local title = env.title&lt;br /&gt;
	local subjectSpace = env.subjectSpace&lt;br /&gt;
	if not title or not subjectSpace then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	local subpage = title.subpageText&lt;br /&gt;
	local ret = &#039;&#039;&lt;br /&gt;
	if message(&#039;display-strange-usage-category&#039;, nil, &#039;boolean&#039;)&lt;br /&gt;
		and (&lt;br /&gt;
			subpage == message(&#039;doc-subpage&#039;)&lt;br /&gt;
			or subjectSpace ~= 828 and subpage == message(&#039;testcases-subpage&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	then&lt;br /&gt;
		ret = ret .. makeCategoryLink(message(&#039;strange-usage-category&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Distinguish&amp;diff=2751</id>
		<title>Module:Distinguish</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Distinguish&amp;diff=2751"/>
		<updated>2020-07-01T10:17:00Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Distinguish&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local mHatnote = require(&#039;Module:Hatnote&#039;)&lt;br /&gt;
local mHatlist = require(&#039;Module:Hatnote list&#039;)&lt;br /&gt;
local mArguments --initialize lazily&lt;br /&gt;
local mTableTools --initialize lazily&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.distinguish(frame)&lt;br /&gt;
	mArguments = require(&#039;Module:Arguments&#039;)&lt;br /&gt;
	mTableTools = require(&#039;Module:TableTools&#039;)&lt;br /&gt;
	local args = mArguments.getArgs(frame)&lt;br /&gt;
	local selfref = args.selfref&lt;br /&gt;
	local text = args.text&lt;br /&gt;
	args = mTableTools.compressSparseArray(args)&lt;br /&gt;
	return p._distinguish(args, text, selfref)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._distinguish(args, text, selfref)&lt;br /&gt;
	checkType(&amp;quot;_distinguish&amp;quot;, 1, args, &#039;table&#039;)&lt;br /&gt;
	if #args == 0 and not text then return &#039;&#039; end&lt;br /&gt;
	local text = string.format(&lt;br /&gt;
		&#039;Not to be confused with %s.&#039;,&lt;br /&gt;
		text or mHatlist.orList(args, true)&lt;br /&gt;
	)&lt;br /&gt;
	hnOptions = {selfref = selfref}&lt;br /&gt;
	return mHatnote._hatnote(text, hnOptions)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Module:Arguments&amp;diff=2750</id>
		<title>Module:Arguments</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Module:Arguments&amp;diff=2750"/>
		<updated>2020-07-01T10:16:57Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Module:Arguments&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides easy processing of arguments passed to Scribunto from&lt;br /&gt;
-- #invoke. It is intended for use by other Lua modules, and should not be&lt;br /&gt;
-- called from #invoke directly.&lt;br /&gt;
&lt;br /&gt;
local libraryUtil = require(&#039;libraryUtil&#039;)&lt;br /&gt;
local checkType = libraryUtil.checkType&lt;br /&gt;
&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Generate four different tidyVal functions, so that we don&#039;t have to check the&lt;br /&gt;
-- options every time we call it.&lt;br /&gt;
&lt;br /&gt;
local function tidyValDefault(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		val = val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
		if val == &#039;&#039; then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return val&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValTrimOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		return val:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValRemoveBlanksOnly(key, val)&lt;br /&gt;
	if type(val) == &#039;string&#039; then&lt;br /&gt;
		if val:find(&#039;%S&#039;) then&lt;br /&gt;
			return val&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return val&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function tidyValNoChange(key, val)&lt;br /&gt;
	return val&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function matchesTitle(given, title)&lt;br /&gt;
	local tp = type( given )&lt;br /&gt;
	return (tp == &#039;string&#039; or tp == &#039;number&#039;) and mw.title.new( given ).prefixedText == title&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local translate_mt = { __index = function(t, k) return k end }&lt;br /&gt;
&lt;br /&gt;
function arguments.getArgs(frame, options)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 1, frame, &#039;table&#039;, true)&lt;br /&gt;
	checkType(&#039;getArgs&#039;, 2, options, &#039;table&#039;, true)&lt;br /&gt;
	frame = frame or {}&lt;br /&gt;
	options = options or {}&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up argument translation.&lt;br /&gt;
	--]]&lt;br /&gt;
	options.translate = options.translate or {}&lt;br /&gt;
	if getmetatable(options.translate) == nil then&lt;br /&gt;
		setmetatable(options.translate, translate_mt)&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate == nil then&lt;br /&gt;
		options.backtranslate = {}&lt;br /&gt;
		for k,v in pairs(options.translate) do&lt;br /&gt;
			options.backtranslate[v] = k&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if options.backtranslate and getmetatable(options.backtranslate) == nil then&lt;br /&gt;
		setmetatable(options.backtranslate, {&lt;br /&gt;
			__index = function(t, k)&lt;br /&gt;
				if options.translate[k] ~= k then&lt;br /&gt;
					return nil&lt;br /&gt;
				else&lt;br /&gt;
					return k&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		})&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Get the argument tables. If we were passed a valid frame object, get the&lt;br /&gt;
	-- frame arguments (fargs) and the parent frame arguments (pargs), depending&lt;br /&gt;
	-- on the options set and on the parent frame&#039;s availability. If we weren&#039;t&lt;br /&gt;
	-- passed a valid frame object, we are being called from another Lua module&lt;br /&gt;
	-- or from the debug console, so assume that we were passed a table of args&lt;br /&gt;
	-- directly, and assign it to a new variable (luaArgs).&lt;br /&gt;
	--]]&lt;br /&gt;
	local fargs, pargs, luaArgs&lt;br /&gt;
	if type(frame.args) == &#039;table&#039; and type(frame.getParent) == &#039;function&#039; then&lt;br /&gt;
		if options.wrappers then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- The wrappers option makes Module:Arguments look up arguments in&lt;br /&gt;
			-- either the frame argument table or the parent argument table, but&lt;br /&gt;
			-- not both. This means that users can use either the #invoke syntax&lt;br /&gt;
			-- or a wrapper template without the loss of performance associated&lt;br /&gt;
			-- with looking arguments up in both the frame and the parent frame.&lt;br /&gt;
			-- Module:Arguments will look up arguments in the parent frame&lt;br /&gt;
			-- if it finds the parent frame&#039;s title in options.wrapper;&lt;br /&gt;
			-- otherwise it will look up arguments in the frame object passed&lt;br /&gt;
			-- to getArgs.&lt;br /&gt;
			--]]&lt;br /&gt;
			local parent = frame:getParent()&lt;br /&gt;
			if not parent then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			else&lt;br /&gt;
				local title = parent:getTitle():gsub(&#039;/sandbox$&#039;, &#039;&#039;)&lt;br /&gt;
				local found = false&lt;br /&gt;
				if matchesTitle(options.wrappers, title) then&lt;br /&gt;
					found = true&lt;br /&gt;
				elseif type(options.wrappers) == &#039;table&#039; then&lt;br /&gt;
					for _,v in pairs(options.wrappers) do&lt;br /&gt;
						if matchesTitle(v, title) then&lt;br /&gt;
							found = true&lt;br /&gt;
							break&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				-- We test for false specifically here so that nil (the default) acts like true.&lt;br /&gt;
				if found or options.frameOnly == false then&lt;br /&gt;
					pargs = parent.args&lt;br /&gt;
				end&lt;br /&gt;
				if not found or options.parentOnly == false then&lt;br /&gt;
					fargs = frame.args&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			-- options.wrapper isn&#039;t set, so check the other options.&lt;br /&gt;
			if not options.parentOnly then&lt;br /&gt;
				fargs = frame.args&lt;br /&gt;
			end&lt;br /&gt;
			if not options.frameOnly then&lt;br /&gt;
				local parent = frame:getParent()&lt;br /&gt;
				pargs = parent and parent.args or nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if options.parentFirst then&lt;br /&gt;
			fargs, pargs = pargs, fargs&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		luaArgs = frame&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the order of precedence of the argument tables. If the variables are&lt;br /&gt;
	-- nil, nothing will be added to the table, which is how we avoid clashes&lt;br /&gt;
	-- between the frame/parent args and the Lua args.&lt;br /&gt;
	local argTables = {fargs}&lt;br /&gt;
	argTables[#argTables + 1] = pargs&lt;br /&gt;
	argTables[#argTables + 1] = luaArgs&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Generate the tidyVal function. If it has been specified by the user, we&lt;br /&gt;
	-- use that; if not, we choose one of four functions depending on the&lt;br /&gt;
	-- options chosen. This is so that we don&#039;t have to call the options table&lt;br /&gt;
	-- every time the function is called.&lt;br /&gt;
	--]]&lt;br /&gt;
	local tidyVal = options.valueFunc&lt;br /&gt;
	if tidyVal then&lt;br /&gt;
		if type(tidyVal) ~= &#039;function&#039; then&lt;br /&gt;
			error(&lt;br /&gt;
				&amp;quot;bad value assigned to option &#039;valueFunc&#039;&amp;quot;&lt;br /&gt;
					.. &#039;(function expected, got &#039;&lt;br /&gt;
					.. type(tidyVal)&lt;br /&gt;
					.. &#039;)&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		end&lt;br /&gt;
	elseif options.trim ~= false then&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValDefault&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValTrimOnly&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if options.removeBlanks ~= false then&lt;br /&gt;
			tidyVal = tidyValRemoveBlanksOnly&lt;br /&gt;
		else&lt;br /&gt;
			tidyVal = tidyValNoChange&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Set up the args, metaArgs and nilArgs tables. args will be the one&lt;br /&gt;
	-- accessed from functions, and metaArgs will hold the actual arguments. Nil&lt;br /&gt;
	-- arguments are memoized in nilArgs, and the metatable connects all of them&lt;br /&gt;
	-- together.&lt;br /&gt;
	--]]&lt;br /&gt;
	local args, metaArgs, nilArgs, metatable = {}, {}, {}, {}&lt;br /&gt;
	setmetatable(args, metatable)&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs(tables)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Accepts multiple tables as input and merges their keys and values&lt;br /&gt;
		-- into one table. If a value is already present it is not overwritten;&lt;br /&gt;
		-- tables listed earlier have precedence. We are also memoizing nil&lt;br /&gt;
		-- values, which can be overwritten if they are &#039;s&#039; (soft).&lt;br /&gt;
		--]]&lt;br /&gt;
		for _, t in ipairs(tables) do&lt;br /&gt;
			for key, val in pairs(t) do&lt;br /&gt;
				if metaArgs[key] == nil and nilArgs[key] ~= &#039;h&#039; then&lt;br /&gt;
					local tidiedVal = tidyVal(key, val)&lt;br /&gt;
					if tidiedVal == nil then&lt;br /&gt;
						nilArgs[key] = &#039;s&#039;&lt;br /&gt;
					else&lt;br /&gt;
						metaArgs[key] = tidiedVal&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--[[&lt;br /&gt;
	-- Define metatable behaviour. Arguments are memoized in the metaArgs table,&lt;br /&gt;
	-- and are only fetched from the argument tables once. Fetching arguments&lt;br /&gt;
	-- from the argument tables is the most resource-intensive step in this&lt;br /&gt;
	-- module, so we try and avoid it where possible. For this reason, nil&lt;br /&gt;
	-- arguments are also memoized, in the nilArgs table. Also, we keep a record&lt;br /&gt;
	-- in the metatable of when pairs and ipairs have been called, so we do not&lt;br /&gt;
	-- run pairs and ipairs on the argument tables more than once. We also do&lt;br /&gt;
	-- not run ipairs on fargs and pargs if pairs has already been run, as all&lt;br /&gt;
	-- the arguments will already have been copied over.&lt;br /&gt;
	--]]&lt;br /&gt;
&lt;br /&gt;
	metatable.__index = function (t, key)&lt;br /&gt;
		--[[&lt;br /&gt;
		-- Fetches an argument when the args table is indexed. First we check&lt;br /&gt;
		-- to see if the value is memoized, and if not we try and fetch it from&lt;br /&gt;
		-- the argument tables. When we check memoization, we need to check&lt;br /&gt;
		-- metaArgs before nilArgs, as both can be non-nil at the same time.&lt;br /&gt;
		-- If the argument is not present in metaArgs, we also check whether&lt;br /&gt;
		-- pairs has been run yet. If pairs has already been run, we return nil.&lt;br /&gt;
		-- This is because all the arguments will have already been copied into&lt;br /&gt;
		-- metaArgs by the mergeArgs function, meaning that any other arguments&lt;br /&gt;
		-- must be nil.&lt;br /&gt;
		--]]&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		local val = metaArgs[key]&lt;br /&gt;
		if val ~= nil then&lt;br /&gt;
			return val&lt;br /&gt;
		elseif metatable.donePairs or nilArgs[key] then&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
		for _, argTable in ipairs(argTables) do&lt;br /&gt;
			local argTableVal = tidyVal(key, argTable[key])&lt;br /&gt;
			if argTableVal ~= nil then&lt;br /&gt;
				metaArgs[key] = argTableVal&lt;br /&gt;
				return argTableVal&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__newindex = function (t, key, val)&lt;br /&gt;
		-- This function is called when a module tries to add a new value to the&lt;br /&gt;
		-- args table, or tries to change an existing value.&lt;br /&gt;
		if type(key) == &#039;string&#039; then&lt;br /&gt;
			key = options.translate[key]&lt;br /&gt;
		end&lt;br /&gt;
		if options.readOnly then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; the table is read-only&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif options.noOverwrite and args[key] ~= nil then&lt;br /&gt;
			error(&lt;br /&gt;
				&#039;could not write to argument table key &amp;quot;&#039;&lt;br /&gt;
					.. tostring(key)&lt;br /&gt;
					.. &#039;&amp;quot;; overwriting existing arguments is not permitted&#039;,&lt;br /&gt;
				2&lt;br /&gt;
			)&lt;br /&gt;
		elseif val == nil then&lt;br /&gt;
			--[[&lt;br /&gt;
			-- If the argument is to be overwritten with nil, we need to erase&lt;br /&gt;
			-- the value in metaArgs, so that __index, __pairs and __ipairs do&lt;br /&gt;
			-- not use a previous existing value, if present; and we also need&lt;br /&gt;
			-- to memoize the nil in nilArgs, so that the value isn&#039;t looked&lt;br /&gt;
			-- up in the argument tables if it is accessed again.&lt;br /&gt;
			--]]&lt;br /&gt;
			metaArgs[key] = nil&lt;br /&gt;
			nilArgs[key] = &#039;h&#039;&lt;br /&gt;
		else&lt;br /&gt;
			metaArgs[key] = val&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function translatenext(invariant)&lt;br /&gt;
		local k, v = next(invariant.t, invariant.k)&lt;br /&gt;
		invariant.k = k&lt;br /&gt;
		if k == nil then&lt;br /&gt;
			return nil&lt;br /&gt;
		elseif type(k) ~= &#039;string&#039; or not options.backtranslate then&lt;br /&gt;
			return k, v&lt;br /&gt;
		else&lt;br /&gt;
			local backtranslate = options.backtranslate[k]&lt;br /&gt;
			if backtranslate == nil then&lt;br /&gt;
				-- Skip this one. This is a tail call, so this won&#039;t cause stack overflow&lt;br /&gt;
				return translatenext(invariant)&lt;br /&gt;
			else&lt;br /&gt;
				return backtranslate, v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__pairs = function ()&lt;br /&gt;
		-- Called when pairs is run on the args table.&lt;br /&gt;
		if not metatable.donePairs then&lt;br /&gt;
			mergeArgs(argTables)&lt;br /&gt;
			metatable.donePairs = true&lt;br /&gt;
		end&lt;br /&gt;
		return translatenext, { t = metaArgs }&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function inext(t, i)&lt;br /&gt;
		-- This uses our __index metamethod&lt;br /&gt;
		local v = t[i + 1]&lt;br /&gt;
		if v ~= nil then&lt;br /&gt;
			return i + 1, v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	metatable.__ipairs = function (t)&lt;br /&gt;
		-- Called when ipairs is run on the args table.&lt;br /&gt;
		return inext, t, 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return arguments&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Yesno-no&amp;diff=2749</id>
		<title>Template:Yesno-no</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Yesno-no&amp;diff=2749"/>
		<updated>2020-07-01T10:16:57Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Yesno-no&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{safesubst:&amp;lt;noinclude /&amp;gt;yesno|{{{1}}}|yes={{{yes|yes}}}|no={{{no|no}}}|blank={{{blank|no}}}|¬={{{¬|no}}}|def={{{def|no}}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation|Template:Yesno/doc}}&lt;br /&gt;
&amp;lt;!--Categories go in the doc page referenced above; interwikis go in Wikidata.--&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Yesno&amp;diff=2748</id>
		<title>Template:Yesno</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Yesno&amp;diff=2748"/>
		<updated>2020-07-01T10:16:56Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Yesno&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#switch: {{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;lc: {{{1|¬}}} }}&lt;br /&gt;
 |no&lt;br /&gt;
 |n&lt;br /&gt;
 |false&lt;br /&gt;
 |off&lt;br /&gt;
 |0        = {{{no|&amp;lt;!-- null --&amp;gt;}}}&lt;br /&gt;
 |         = {{{blank|{{{no|&amp;lt;!-- null --&amp;gt;}}}}}}&lt;br /&gt;
 |¬        = {{{¬|}}}&lt;br /&gt;
 |yes&lt;br /&gt;
 |y&lt;br /&gt;
 |true&lt;br /&gt;
 |on&lt;br /&gt;
 |1        = {{{yes|yes}}}&lt;br /&gt;
 |#default = {{{def|{{{yes|yes}}}}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:WithEn&amp;diff=2747</id>
		<title>Template:WithEn</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:WithEn&amp;diff=2747"/>
		<updated>2020-07-01T10:16:56Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:WithEn&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:{{{1|}}}|{{{2|}}}&lt;br /&gt;
|{{{2}}}&lt;br /&gt;
|{{{1}}}&amp;lt;hr /&amp;gt;{{{2}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{ {{TNTN|Documentation}} |content=&lt;br /&gt;
&lt;br /&gt;
This template prepends English source text to its translation text.&lt;br /&gt;
&lt;br /&gt;
== Examples==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{Note| {{WithEn|Administrators: Do not delete this category!|Administrators: Do not delete this category!}} }}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Note| {{WithEn|Administrators: Do not delete this category!|Administrators: Do not delete this category!}} }}&lt;br /&gt;
* &amp;lt;nowiki&amp;gt;{{Note| {{WithEn|Administrators: Do not delete this category!|管理者へ: このカテゴリを削除しないでください!}} }}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
{{Note| {{WithEn|Administrators: Do not delete this category!|管理者へ: このカテゴリを削除しないでください!}} }}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Who&amp;diff=2746</id>
		<title>Template:Who</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Who&amp;diff=2746"/>
		<updated>2020-07-01T10:16:55Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Who&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--{{Who}} begin--&amp;gt;{{Fix&lt;br /&gt;
| subst = &amp;lt;includeonly&amp;gt;{{subst:&amp;lt;/includeonly&amp;gt;&amp;lt;includeonly&amp;gt;substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
| link  = Wikipedia:Avoid weasel words&lt;br /&gt;
| text  = who?&lt;br /&gt;
| title = The material in the vicinity of this tag may use weasel words or too-vague attribution.&lt;br /&gt;
| date  = {{{date|}}}&lt;br /&gt;
| cat   = [[Category:All articles with specifically marked weasel-worded phrases]]&lt;br /&gt;
| cat-date = Category:Articles with specifically marked weasel-worded phrases}}&amp;lt;!--{{Who}} end--&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- PLEASE ADD THIS TEMPLATE&#039;S CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:When&amp;diff=2745</id>
		<title>Template:When</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:When&amp;diff=2745"/>
		<updated>2020-07-01T10:16:55Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:When&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--{{When}} begin--&amp;gt;{{Fix&lt;br /&gt;
| subst = &amp;lt;includeonly&amp;gt;{{subst:&amp;lt;/includeonly&amp;gt;&amp;lt;includeonly&amp;gt;substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
| link  = Wikipedia:Manual_of_Style_(dates_and_numbers)#Chronological_items&lt;br /&gt;
| text  = when?&lt;br /&gt;
| title = The time period in the vicinity of this tag is ambiguous&lt;br /&gt;
| date  = {{{date|}}}&lt;br /&gt;
| cat-date = Category:Vague or ambiguous time&lt;br /&gt;
}}&amp;lt;!--{{When}} end--&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Vague&amp;diff=2744</id>
		<title>Template:Vague</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Vague&amp;diff=2744"/>
		<updated>2020-07-01T10:16:54Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Vague&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!--{{Vague}} begin--&amp;gt;{{Fix&lt;br /&gt;
| subst = &amp;lt;includeonly&amp;gt;{{subst:&amp;lt;/includeonly&amp;gt;&amp;lt;includeonly&amp;gt;substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
| link  = Wikipedia:Vagueness&lt;br /&gt;
| text  = vague&lt;br /&gt;
| title = You can help — {{{1|}}}&lt;br /&gt;
| date  = {{{date|}}}&lt;br /&gt;
| cat   = [[Category:All Wikipedia articles needing clarification]]&lt;br /&gt;
| cat-date = Category:Wikipedia articles needing clarification}}&amp;lt;!--{{Vague}} end--&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Uselang&amp;diff=2743</id>
		<title>Template:Uselang</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Uselang&amp;diff=2743"/>
		<updated>2020-07-01T10:16:54Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Uselang&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if: {{{lang|}}} | {{{lang|}}} | {{#ifeq: {{int:Lang}} | &amp;lt;Lang&amp;gt; | default | {{int:Lang}} }} }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{ {{TNTN|Documentation}} |content=&lt;br /&gt;
&lt;br /&gt;
Returns the code of the user language, as specified in the corresponding page mediawiki:lang/xx, otherwise &amp;quot;en&amp;quot; (default).&lt;br /&gt;
&lt;br /&gt;
MediaWiki:Lang:&lt;br /&gt;
{{languages|MediaWiki:Lang}}&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Internationalization templates{{#translation:}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Update/en&amp;diff=2742</id>
		<title>Template:Update/en</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Update/en&amp;diff=2742"/>
		<updated>2020-07-01T10:16:53Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Update/en&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;languages/&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#switch:&lt;br /&gt;
| =&lt;br /&gt;
{{ambox&lt;br /&gt;
  | name  = Update&lt;br /&gt;
  | subst = &amp;lt;includeonly&amp;gt;{{subst:substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
  | type  = content&lt;br /&gt;
  | class = ambox-Update&lt;br /&gt;
  | image = [[File:OOjs UI icon clock-warning.svg|40px|link=]]&lt;br /&gt;
  | text  = {{#if:{{{part|{{{1|}}}}}}&lt;br /&gt;
   |{{#if:{{{inaccurate|}}}&lt;br /&gt;
    |The &#039;&#039;&#039;factual accuracy&#039;&#039;&#039; of parts of this {{{type|{{SUBJECTSPACE formatted}}}}} (those related to {{{part|{{{1|}}}}}}) &#039;&#039;&#039;may be compromised due to out-of-date information&#039;&#039;&#039;.&lt;br /&gt;
    |Parts of this {{{type|{{SUBJECTSPACE formatted}}}}} (those related to {{{part|{{{1|}}}}}}) are &#039;&#039;&#039;outdated&#039;&#039;&#039;.}}&lt;br /&gt;
   |{{#if:{{{inaccurate|}}}&lt;br /&gt;
    |The &#039;&#039;&#039;factual accuracy&#039;&#039;&#039; of this {{{type|{{SUBJECTSPACE formatted}}}}} &#039;&#039;&#039;may be compromised due to out-of-date information&#039;&#039;&#039;.&lt;br /&gt;
    |This {{{type|{{SUBJECTSPACE formatted}}}}} is &#039;&#039;&#039;outdated&#039;&#039;&#039;.}}&lt;br /&gt;
  }} {{#if:{{{reason|}}}|{{{reason}}}|It was written for an older version of MediaWiki and may not apply to the most recent version.}} If you have checked or updated this page and found the content to be suitable, please remove this notice. {{#ifexist: {{TALKPAGENAME}}&lt;br /&gt;
   |&amp;amp;#32;See the [[{{TALKPAGENAME}}|talk page]] for a possible discussion on this&lt;br /&gt;
  }}. {{#if:{{{date|}}}|&amp;lt;small&amp;gt;&#039;&#039;({{{date}}})&#039;&#039;&amp;lt;/small&amp;gt;}} {{#if:{{{2|}}}&lt;br /&gt;
   |&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;Last update: {{{2}}}&amp;lt;/small&amp;gt;&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Category:Outdated pages{{#translation:}}]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
| #default=&lt;br /&gt;
  {{#invoke:Template translation|renderTranslatedTemplate|template=Template:Update|noshift=1}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|content=&lt;br /&gt;
== Usage ==&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Update}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Aliases of this template:&lt;br /&gt;
* {{tl|outdated}}&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
* {{tl|historical}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Alert templates{{#translation:}}|{{PAGENAME}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Update&amp;diff=2741</id>
		<title>Template:Update</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Update&amp;diff=2741"/>
		<updated>2020-07-01T10:16:52Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Update&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;languages/&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#switch:&amp;lt;translate&amp;gt;&amp;lt;/translate&amp;gt;&lt;br /&gt;
| =&lt;br /&gt;
{{ambox&lt;br /&gt;
  | name  = Update&lt;br /&gt;
  | subst = &amp;lt;includeonly&amp;gt;{{subst:substcheck}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
  | type  = content&lt;br /&gt;
  | class = ambox-Update&lt;br /&gt;
  | image = [[File:OOjs UI icon clock-warning.svg|40px|link=]]&lt;br /&gt;
  | text  = {{#if:{{{part|{{{1|}}}}}}&lt;br /&gt;
   |{{#if:{{{inaccurate|}}}&lt;br /&gt;
    |&amp;lt;translate&amp;gt;&amp;lt;!--T:9--&amp;gt; The &#039;&#039;&#039;factual accuracy&#039;&#039;&#039; of parts of this &amp;lt;tvar|1&amp;gt;{{{type|{{SUBJECTSPACE formatted}}}}}&amp;lt;/&amp;gt; (those related to &amp;lt;tvar|2&amp;gt;{{{part|{{{1|}}}}}}&amp;lt;/&amp;gt;) &#039;&#039;&#039;may be compromised due to out-of-date information&#039;&#039;&#039;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
    |&amp;lt;translate&amp;gt;&amp;lt;!--T:10--&amp;gt; Parts of this &amp;lt;tvar|1&amp;gt;{{{type|{{SUBJECTSPACE formatted}}}}}&amp;lt;/&amp;gt; (those related to &amp;lt;tvar|2&amp;gt;{{{part|{{{1|}}}}}}&amp;lt;/&amp;gt;) are &#039;&#039;&#039;outdated&#039;&#039;&#039;.&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
   |{{#if:{{{inaccurate|}}}&lt;br /&gt;
    |&amp;lt;translate&amp;gt;&amp;lt;!--T:11--&amp;gt; The &#039;&#039;&#039;factual accuracy&#039;&#039;&#039; of this &amp;lt;tvar|1&amp;gt;{{{type|{{SUBJECTSPACE formatted}}}}}&amp;lt;/&amp;gt; &#039;&#039;&#039;may be compromised due to out-of-date information&#039;&#039;&#039;.&amp;lt;/translate&amp;gt;&lt;br /&gt;
    |&amp;lt;translate&amp;gt;&amp;lt;!--T:12--&amp;gt; This &amp;lt;tvar|1&amp;gt;{{{type|{{SUBJECTSPACE formatted}}}}}&amp;lt;/&amp;gt; is &#039;&#039;&#039;outdated&#039;&#039;&#039;.&amp;lt;/translate&amp;gt;}}&lt;br /&gt;
  }} {{#if:{{{reason|}}}|{{{reason}}}|&amp;lt;translate&amp;gt;&amp;lt;!--T:13--&amp;gt; It was written for an older version of MediaWiki and may not apply to the most recent version.&amp;lt;/translate&amp;gt;}} &amp;lt;translate&amp;gt;&amp;lt;!--T:20--&amp;gt; If you have checked or updated this page and found the content to be suitable, please remove this notice.&amp;lt;/translate&amp;gt; {{#ifexist: {{TALKPAGENAME}}&lt;br /&gt;
   |&amp;amp;#32;&amp;lt;translate&amp;gt;&amp;lt;!--T:14--&amp;gt; See the [[&amp;lt;tvar|talk&amp;gt;{{TALKPAGENAME}}&amp;lt;/&amp;gt;|talk page]] for a possible discussion on this&amp;lt;/translate&amp;gt;&lt;br /&gt;
  }}. {{#if:{{{date|}}}|&amp;lt;small&amp;gt;&#039;&#039;({{{date}}})&#039;&#039;&amp;lt;/small&amp;gt;}} {{#if:{{{2|}}}&lt;br /&gt;
   |&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;&amp;lt;translate&amp;gt;&amp;lt;!--T:15--&amp;gt; Last update:&amp;lt;/translate&amp;gt; {{{2}}}&amp;lt;/small&amp;gt;&lt;br /&gt;
  }}&lt;br /&gt;
}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;[[Category:Outdated pages{{#translation:}}]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
| #default=&lt;br /&gt;
  {{#invoke:Template translation|renderTranslatedTemplate|template=Template:Update|noshift=1}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation|content=&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== Usage == &amp;lt;!--T:17--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Update}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
&amp;lt;!--T:18--&amp;gt;&lt;br /&gt;
Aliases of this template:&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* {{tl|outdated}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;translate&amp;gt;&lt;br /&gt;
== See also == &amp;lt;!--T:19--&amp;gt;&lt;br /&gt;
&amp;lt;/translate&amp;gt;&lt;br /&gt;
* {{tl|historical}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Alert templates{{#translation:}}|{{PAGENAME}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Translatable&amp;diff=2740</id>
		<title>Template:Translatable</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Translatable&amp;diff=2740"/>
		<updated>2020-07-01T10:16:51Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Translatable&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:{{pagelang|{{{1|{{FULLPAGENAME}}}}}}}|&lt;br /&gt;
|{{{1|{{FULLPAGENAME}}}}}&lt;br /&gt;
|{{#invoke:String|sub|{{{1|{{FULLPAGENAME}}}}}&lt;br /&gt;
  |1&lt;br /&gt;
  |{{#expr:{{#invoke:String|len|{{{1|{{FULLPAGENAME}}}}}}}-{{#invoke:String|len|{{pagelang|{{{1|{{FULLPAGENAME}}}}}}}}}-1}}&lt;br /&gt;
  }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{ {{TNTN|Documentation}} |content=&lt;br /&gt;
&lt;br /&gt;
== Examples ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{translatable}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{translatable}}&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{translatable|Page name}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{translatable|Page name}}&lt;br /&gt;
* &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{translatable|Page name/ja}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{translatable|Page name/ja}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Internationalization templates{{#translation:}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Tnull&amp;diff=2739</id>
		<title>Template:Tnull</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Tnull&amp;diff=2739"/>
		<updated>2020-07-01T10:16:51Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Tnull&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;lt;code&amp;gt;&amp;amp;#123;&amp;amp;#123;{{#ifeq:{{lcfirst:{{{1|}}}}}|{{lc:{{{1|}}}}}|{{lcfirst:{{{1|}}}}}|{{{1|}}}}}{{#if:{{{2|}}}|&amp;amp;#124;{{{2}}}|}}{{#if:{{{3|}}}|&amp;amp;#124;{{{3}}}|}}{{#if:{{{4|}}}|&amp;amp;#124;{{{4}}}|}}{{#if:{{{5|}}}|&amp;amp;#124;{{{5}}}|}}{{#if:{{{6|}}}|&amp;amp;#124;{{{6}}}|}}{{#if:{{{7|}}}|&amp;amp;#124;{{{7}}}|}}{{#if:{{{8|}}}|&amp;amp;#124;{{{8}}}|}}&amp;amp;#125;&amp;amp;#125;&amp;lt;/code&amp;gt;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Tntn&amp;diff=2738</id>
		<title>Template:Tntn</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Tntn&amp;diff=2738"/>
		<updated>2020-07-01T10:16:51Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Tntn&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Translatable template name]]&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Tlx&amp;diff=2737</id>
		<title>Template:Tlx</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Tlx&amp;diff=2737"/>
		<updated>2020-07-01T10:16:50Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Tlx&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span style=&amp;quot;font-family:&amp;amp;quot;Consolas&amp;amp;quot;, monospace;&amp;quot;&amp;gt;{{[[{{#if:{{{SISTER|}}}|{{{SISTER}}}Template|{{ns:Template}}}}:{{{1|Tlx}}}|{{{1|Tlx}}}]]{{#if:{{{2|}}}|&amp;amp;#124;{{{2}}}}}{{#if:{{{3|}}}|&amp;amp;#124;{{{3}}}}}{{#if:{{{4|}}}|&amp;amp;#124;{{{4}}}}}{{#if:{{{5|}}}|&amp;amp;#124;{{{5}}}}}{{#if:{{{6|}}}|&amp;amp;#124;{{{6}}}}}{{#if:{{{7|}}}|&amp;amp;#124;{{{7}}}}}{{#if:{{{8|}}}|&amp;amp;#124;&#039;&#039;...&#039;&#039;}}}}&amp;lt;/span&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Tl&amp;diff=2736</id>
		<title>Template:Tl</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Tl&amp;diff=2736"/>
		<updated>2020-07-01T10:16:50Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Tl&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;amp;#123;&amp;amp;#123;[[Template:{{{1}}}|{{{1}}}]]&amp;amp;#125;&amp;amp;#125;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Categories go on the /doc subpage and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Tiw&amp;diff=2735</id>
		<title>Template:Tiw</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Tiw&amp;diff=2735"/>
		<updated>2020-07-01T10:16:50Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Tiw&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[w:Template:{{{1|{{PAGENAME}}}}}]]&amp;lt;noinclude&amp;gt;&lt;br /&gt;
----&lt;br /&gt;
Displays a link to a template on the English Wikipedia.&lt;br /&gt;
* {{xpd|tiw|foo}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Shortcut templates|{{PAGENAME}}]]&lt;br /&gt;
[[Category:External link templates]]&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Tim&amp;diff=2734</id>
		<title>Template:Tim</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Tim&amp;diff=2734"/>
		<updated>2020-07-01T10:16:49Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Tim&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[m:Template:{{{1|{{PAGENAME}}}}}]]&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation|content=&lt;br /&gt;
Displays a link to a template on Meta.&lt;br /&gt;
* {{xpds|tim|foo}}&lt;br /&gt;
&lt;br /&gt;
[[Category:Shortcut templates|{{PAGENAME}}]]&lt;br /&gt;
[[Category:External link templates]]}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:TemplateDataHeader&amp;diff=2733</id>
		<title>Template:TemplateDataHeader</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:TemplateDataHeader&amp;diff=2733"/>
		<updated>2020-07-01T10:16:48Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:TemplateDataHeader&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:TemplateData header]]&lt;br /&gt;
{{R from move}}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Tag&amp;diff=2732</id>
		<title>Template:Tag</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Tag&amp;diff=2732"/>
		<updated>2020-07-01T10:16:48Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Tag&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:{{{plain|}}}|&lt;br /&gt;
 |&amp;lt;code style=&amp;quot;white-space:nowrap&amp;quot;&amp;gt;&lt;br /&gt;
}}{{#switch:{{{2|pair}}}&lt;br /&gt;
 |c|close  = &amp;lt;!--nothing--&amp;gt;&lt;br /&gt;
 |s|single&lt;br /&gt;
 |o|open&lt;br /&gt;
 |p|pair   = &amp;amp;lt;{{{1|tag}}}{{#if:{{{params|}}}|&amp;amp;#32;{{{params}}}}}&lt;br /&gt;
}}{{#switch:{{{2|pair}}}&lt;br /&gt;
 |c|close  = {{{content|}}}&lt;br /&gt;
 |s|single = &amp;amp;#32;&amp;amp;#47;&amp;amp;gt;&lt;br /&gt;
 |o|open   = &amp;amp;gt;{{{content|}}}&lt;br /&gt;
 |p|pair   = &amp;amp;gt;{{{content|...}}}&lt;br /&gt;
}}{{#switch:{{{2|pair}}}&lt;br /&gt;
 |s|single&lt;br /&gt;
 |o|open   = &amp;lt;!--nothing--&amp;gt;&lt;br /&gt;
 |c|close&lt;br /&gt;
 |p|pair   = &amp;amp;lt;&amp;amp;#47;{{{1|tag}}}&amp;amp;gt;&lt;br /&gt;
}}{{#if:{{{plain|}}}|&lt;br /&gt;
 |&amp;lt;/code&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:TNTN&amp;diff=2731</id>
		<title>Template:TNTN</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:TNTN&amp;diff=2731"/>
		<updated>2020-07-01T10:16:47Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:TNTN&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Translatable template name]]&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:TNT&amp;diff=2730</id>
		<title>Template:TNT</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:TNT&amp;diff=2730"/>
		<updated>2020-07-01T10:16:47Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:TNT&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Translatable template]]&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:TFAFULL/doc&amp;diff=2729</id>
		<title>Template:TFAFULL/doc</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:TFAFULL/doc&amp;diff=2729"/>
		<updated>2020-07-01T10:16:46Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:TFAFULL/doc&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{documentation subpage}}&lt;br /&gt;
{{Wikipedia:Article alerts/Bot use warning}}&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{TFAFULL|Bird}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; will generate: {{TFAFULL|Bird}}, which is the current preferred linking method to the featured article in TFA blurbs. If it is decided to change this, after appropriate discussion, then a change in the template here will suffice. The template is fully protected from editing because it is continuously used on the Main Page.&lt;br /&gt;
&lt;br /&gt;
As of October 2019, as per discussion at [[Wikipedia talk:Today&#039;s featured article#Featured topics]], this template can now take an optional second parameter. For instance, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{TFAFULL|Guy Fawkes|Gunpowder Plot}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; now produces: {{TFAFULL|Guy Fawkes|Gunpowder Plot}}&lt;br /&gt;
&amp;lt;includeonly&amp;gt;{{Sandbox other||&lt;br /&gt;
[[Category:Wikipedia Today&#039;s featured article]]&lt;br /&gt;
}}&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:TFAFULL&amp;diff=2728</id>
		<title>Template:TFAFULL</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:TFAFULL&amp;diff=2728"/>
		<updated>2020-07-01T10:16:46Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:TFAFULL&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:{{{2|}}}|&#039;&#039;(&#039;&#039;&#039;[[{{{1}}}|This&amp;amp;nbsp;article]]&#039;&#039;&#039; is part of a [[Wikipedia:Featured topics|featured topic]]: &#039;&#039;&#039;[[Wikipedia:Featured topics/{{{2}}}|{{{2}}}]]&#039;&#039;&#039;.)&#039;&#039;|(&#039;&#039;&#039;[[{{{1&amp;lt;noinclude&amp;gt;|Wikipedia:Today&#039;s featured article&amp;lt;/noinclude&amp;gt;}}}|Full&amp;amp;nbsp;article...]]&#039;&#039;&#039;)}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- PLEASE ADD THIS TEMPLATE&#039;S CATEGORIES AND INTERWIKIS TO THE /doc SUBPAGE, THANKS --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:TFA&amp;diff=2727</id>
		<title>Template:TFA</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:TFA&amp;diff=2727"/>
		<updated>2020-07-01T10:16:45Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:TFA&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Infrastructure Guidance for COVID-19/Alternate Care Sites ==&lt;br /&gt;
{{:Infrastructure Guidance for COVID-19/Alternate Care Sites}}{{TFAFULL|:Infrastructure Guidance for COVID-19/Alternate Care Sites}}&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Stub/doc&amp;diff=2726</id>
		<title>Template:Stub/doc</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Stub/doc&amp;diff=2726"/>
		<updated>2020-07-01T10:16:45Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Stub/doc&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{documentation subpage}}&lt;br /&gt;
The word &#039;&#039;&#039;stub&#039;&#039;&#039; means something that is very short. On wikis, a &#039;&#039;&#039;stub&#039;&#039;&#039; is a short [[Wikipedia:article|article]]. When writers begin a new article, they can mark it as a &#039;&#039;&#039;short article&#039;&#039;&#039; or stub to mean that it is still very short and that people can add a lot more useful information to it. Generally, articles with less than 1500 characters of text are called stubs here. If a stub has little [[Wikipedia:simple:Wikipedia:Verifiability|verifiable information]], or if its subject has no apparent [[Wikipedia:simple:Wikipedia:Notability|notability]], it may be [[Wikipedia:simple:Wikipedia:Deletion policy|deleted]] or be [[Wikipedia:simple:Wikipedia:Merging and moving pages|merged]] into another relevant article.&lt;br /&gt;
&lt;br /&gt;
== Stub alert! ==&lt;br /&gt;
If you make or find a stub, here is what you should do. You can make the article better, or if you think that someone else would do a better job, add the {{tl|stub}} template to ask other users to make the article longer. The template will show this message on the page:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;boilerplate metadata plainlinks&amp;quot; id=&amp;quot;stub&amp;quot;&amp;gt;[[File:HillsideIcon.png|30px]] &#039;&#039;This [[Template:Stub|short article]] can be made longer. You can help the HILLSIDE by [{{fullurl:{{FULLPAGENAME}}|action=edit}} adding to it]&#039;&#039;.&amp;lt;/div &amp;gt;&lt;br /&gt;
&lt;br /&gt;
However, stubs should not have {{tl|stub}} on them for a long time.&lt;br /&gt;
&lt;br /&gt;
==Finding stubs== &lt;br /&gt;
The [[Wikipedia:simple:MediaWiki|MediaWiki]] [[Wikipedia:simple:software|software]] can help you to easily identify links to short articles that need fixing. To do this set the &#039;&#039;&#039;Threshold for stub link formatting&#039;&#039;&#039; on the [[Special:Preferences#mw-prefsection-rendering|Special:Preferences]] page to a value other than &amp;quot;Disabled&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Alternatively you can go to the following pages:&lt;br /&gt;
* [[:Category:Stubs]]&lt;br /&gt;
* [[Special:WhatLinksHere/Template:Stub]] (for older stubs)&lt;br /&gt;
* [[Special:ShortPages]] (sometimes, the article has not been marked a stub)&lt;br /&gt;
&lt;br /&gt;
==Fixing stubs==&lt;br /&gt;
Stubs are usually only a [[Wikipedia:paragraph|paragraph]] and sometimes only a few lines. Stubs do not fully describe the [[wikt:subject|subject]] of the article. To fix a stub:&lt;br /&gt;
&lt;br /&gt;
# Write in Simple English. Use complete sentences.&lt;br /&gt;
# Give a good [[definition]] or description of the topic. For biographies and articles about non-concepts (e.g., about countries and cities), definitions are impossible, so begin with a clear, helpful, informative description of the subject. For articles or stubs about a person, tell what he or she is famous for. For a place, tell where it is and what it is known for. For an event, tell what it was and when it happened. A good definition or description may encourage contributors by suggesting the limits of the article, indirectly summarizing what needs to be done. For example, &#039;&#039;&#039;&#039;&#039;Salvador Allende&#039;&#039;&#039; was the President of Chile from 1970 until 1973&#039;&#039; would be a good description.&lt;br /&gt;
# Try to give more than just a definition - at least a little more. It does not hurt to be provocative, as long as you attempt to have a [[Wikipedia:simple:Wikipedia:Neutral point of view|neutral point of view]] and be reasonably accurate. What is interesting and important about the subject? If your introduction would make someone want to read more, then it will probably encourage someone to write more. As little as one extra sentence can turn a good description into a great stub, e.g. &#039;&#039;&#039;&#039;&#039;Salvador Allende&#039;&#039;&#039; was the President of Chile from 1970 until 1973. The CIA might have been involved in the military revolt that put him out of government.&#039;&#039; You do not have to know any more yourself; many people will be very eager to fill in the details.&lt;br /&gt;
# Make sure any relevant linkable words have been linked, but be careful about which words you link; see [[Wikipedia:simple:Wikipedia:Naming conventions|Naming conventions]]. e.g. &#039;&#039;&#039;&#039;&#039;Salvador Allende&#039;&#039;&#039; was the President of [[Wikipedia:Chile|Chile]] from 1970 until 1973.  The [[Wikipedia:Central Intelligence Agency|CIA]] might have been involved in the  military revolt that put him out of government.&#039;&#039;&lt;br /&gt;
# Save the article with a [[Wikipedia:simple:Wikipedia:Change summary|change summary]] that will attract the attention of others to your stub.&lt;br /&gt;
# Be responsible for your stub article. If nobody contributes to your stub for a few weeks, try to make it better yourself. Take the fact that nobody has contributed as a hint that your stub might not have been that great, and if nothing else, try to make it a better stub.&lt;br /&gt;
&lt;br /&gt;
==Marking pages as stubs==&lt;br /&gt;
Put a &amp;quot;This short article can be made longer&amp;quot; message on an article by adding &#039;&#039;&#039;{{tl|stub}}&#039;&#039;&#039; at the bottom of the article below text, other templates and categories. This will tell people who read the article that more work needs to be done. Some people watch the [[Special:RecentChanges|New Changes]] page, but adding the message will tell more people.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
[[Category:Maintenance]]&lt;br /&gt;
[[Category:Stub templates|*]]&lt;br /&gt;
[[Category:Templates with categories]]&lt;br /&gt;
[[Category:Exclude in print]]&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Stub&amp;diff=2725</id>
		<title>Template:Stub</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Stub&amp;diff=2725"/>
		<updated>2020-07-01T10:16:45Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Stub&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div class=&amp;quot;boilerplate metadata plainlinks&amp;quot; id=&amp;quot;stub&amp;quot;&amp;gt;[[File:HillsideIcon.png|30px]] &#039;&#039;This [[Template:Stub|short article]] can be made longer. You can help the HILLSIDE by [{{fullurl:{{FULLPAGENAME}}|action=edit}} adding to it]&#039;&#039;.&amp;lt;/div &amp;gt;&amp;lt;includeonly&amp;gt;[[Category:Stubs&amp;lt;noinclude&amp;gt;|&amp;lt;/noinclude&amp;gt;]]&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://thehillside.info/index.php?title=Template:Speedy/en&amp;diff=2724</id>
		<title>Template:Speedy/en</title>
		<link rel="alternate" type="text/html" href="https://thehillside.info/index.php?title=Template:Speedy/en&amp;diff=2724"/>
		<updated>2020-07-01T10:16:44Z</updated>

		<summary type="html">&lt;p&gt;Maintenance script: Protected &amp;quot;Template:Speedy/en&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;languages/&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#switch:&lt;br /&gt;
| =&lt;br /&gt;
{{mbox&lt;br /&gt;
| type = speedy&lt;br /&gt;
| text = &#039;&#039;&#039;{{#switch:{{lc:{{NAMESPACE}}}}|template=This template|file=This file|category=This category|#default=This page}} is a candidate for speedy deletion.&#039;&#039;&#039; The given reason is: &#039;&#039;&#039;&#039;&#039;{{{reason|{{{1|No reason supplied!}}}}}}&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
If you disagree with its &#039;&#039;&#039;speedy&#039;&#039;&#039; deletion, please edit the page and change {{tlx|speedy|reason}} to {{tlx|delete|reason}} and discuss your reasons on this page (or its associated talk page, as applicable).&lt;br /&gt;
&lt;br /&gt;
If this page obviously does not meet the common criteria for speedy deletion (vandalism, spam, etc) or you intend to fix it, please remove this notice, but do not remove this notice from pages that you have created yourself.&lt;br /&gt;
&lt;br /&gt;
Remember to check [[Special:Whatlinkshere/{{NAMESPACE}}:{{PAGENAME}}|if anything links here]] and [{{SERVER}}{{localurl:{{NAMESPACE}}:{{PAGENAME}}|action=history}} the page history] before deleting.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- copied from enwiki --&amp;gt;&lt;br /&gt;
&amp;lt;small&amp;gt;&amp;lt;span class=&amp;quot;sysop-show&amp;quot;&amp;gt;&#039;&#039;Administrators: [{{fullurl:{{FULLPAGENAME}}|wpReason={{urlencode:{{{reason|{{{1|}}}}}}}}&amp;amp;action=delete}} delete this page]&#039;&#039;&amp;lt;/span&amp;gt;&amp;lt;/small&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
| #default=&lt;br /&gt;
  {{#invoke:Template translation|renderTranslatedTemplate|template=Template:Speedy|noshift=1|uselang={{int:lang}}}}&lt;br /&gt;
}}&amp;lt;includeonly&amp;gt;{{#if: {{{nocat|}}}||[[Category:Candidates for speedy deletion]]}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation|content=&lt;br /&gt;
&lt;br /&gt;
== Speedy deletion template ==&lt;br /&gt;
 &#039;&#039;&#039;Usage:&#039;&#039;&#039; &amp;lt;nowiki&amp;gt;{{speedy|&amp;lt;/nowiki&amp;gt;reason&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--transclude TemplateData here--&amp;gt;&lt;br /&gt;
{{Template:Speedy/doc}}&lt;br /&gt;
&lt;br /&gt;
This template puts a warning at the top of the page and adds the page to the [[:Category:Candidates for speedy deletion]].&lt;br /&gt;
&lt;br /&gt;
It should be added as the very first line on pages that are obvious candidates for deletion (e.g. vandalism, test pages, etc.) and whose deletion would be uncontentious.&lt;br /&gt;
For all other cases use {{tlx|delete|reason}}.&lt;br /&gt;
&lt;br /&gt;
{{Note|1=In user talk page/structured discussion/flow it should be placed into topic summary. Not into discussion itself.}}&lt;br /&gt;
&lt;br /&gt;
== Example ==&lt;br /&gt;
{{speedy|1=Sample reason here|nocat=true}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Admin templates{{#translation:}}|{{PAGENAME}}]]&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
</feed>