<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mesh.host/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ampdot</id>
	<title>Mesh Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://mesh.host/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Ampdot"/>
	<link rel="alternate" type="text/html" href="https://mesh.host/wiki/Special:Contributions/Ampdot"/>
	<updated>2026-04-25T23:15:14Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=904</id>
		<title>Polymarket</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=904"/>
		<updated>2026-02-20T08:45:29Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* Fractional Kelly betting */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polymarket can be used to make money and to hedge against possible risks. &lt;br /&gt;
&lt;br /&gt;
== Trading / betting ==&lt;br /&gt;
&lt;br /&gt;
=== Depositing ===&lt;br /&gt;
The default deposit method costs ~13 basis points or 0.13%. You can avoid this fee by:&lt;br /&gt;
&lt;br /&gt;
* Deposit with card: For beginners, this offers the smoothest experience. You don&#039;t even need a crypto wallet to do it.&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and using the &amp;quot;deposit crypto&amp;quot; option. ~10 basis points plus possible bridge fee&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and swapping for USDC.E yourself. ~5 basis points plus possible swap and/or bridge fee&lt;br /&gt;
* For advanced users: The default deposit dialog is an accouintless centralized exchange that enforces OFAC sanctions. Any method to send USDC.E to a Polygon PoS wallet will work. Note that different L2s have different &amp;quot;USDC.E&amp;quot; tokens, and it needs to be USDC.E wrapped by the official Polygon bridge- not USDC issued natively by Circle.&lt;br /&gt;
&lt;br /&gt;
Always test with small amounts when trying a new method first.&lt;br /&gt;
&lt;br /&gt;
== Hedging / insuring ==&lt;br /&gt;
Polymarket tends to have a bias towards things happening, so it tends to offer poor (but still sometimes useful) prices for insurance.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;https://news.polymarket.com/p/286-to-1m-from-reversing-stupidity&amp;lt;/ref&amp;gt; However, it can offer a potentially useful venue to create [https://www.simplify.us/simplify101/what-is-convexity convex portfolios].&lt;br /&gt;
&lt;br /&gt;
== Trading strategies ==&lt;br /&gt;
&lt;br /&gt;
* For large orders in markets with decent volume, place limit orders at or near the current price and wait for fills to trickle in if you don&#039;t expect the price to move quickly on its own&lt;br /&gt;
* have ways of knowing orthogonal to the market and bet when multiple of those point in the same direction&lt;br /&gt;
* nothing ever happens&lt;br /&gt;
* thoroughly research things, don&#039;t bet on impulse, multiple rounds of analysis are good&lt;br /&gt;
* place limit orders to get good prices&lt;br /&gt;
* oracle risk (misresolution risk)&lt;br /&gt;
* avoid sports, crypto, mentions, earnings, and stocks. these markets are either random or too efficient due to people poring over spreadsheets already&lt;br /&gt;
* read and understand the market rules in detail&lt;br /&gt;
* if you think a probability is approximately correct, place yes and no orders on both sides and then merge them together into USDC later&lt;br /&gt;
* For beginners, making money is more about avoiding dumb bets and bet sizing than betting smart.&lt;br /&gt;
* If you&#039;re worried an opportunity will disappear before you have a chance to bet on it, increase your bet size as you gain confidence by researching the opportunity, instead of betting all at once&lt;br /&gt;
* If you have a smaller amount of money to bet (a smaller &#039;&#039;&#039;bankroll&#039;&#039;&#039;), bet on lower liquidity markets that aren&#039;t worthwhile for larger traders&lt;br /&gt;
&lt;br /&gt;
=== Fractional Kelly betting ===&lt;br /&gt;
The &#039;&#039;&#039;Kelly criterion&#039;&#039;&#039; or &#039;&#039;&#039;formula&#039;&#039;&#039; describes the theoretical optimal maximum size to bet as a portion of the participant&#039;s bankroll, assuming the bettor has perfect knowledge and zero risk aversion. &#039;&#039;&#039;Fractional Kelly&#039;&#039;&#039; (often referred to as just &amp;quot;&#039;&#039;&#039;Kelly betting&#039;&#039;&#039;&amp;quot;) is a strategy that some real-world market participants use for bet sizing, which multiplies the Kelly criterion by a percent. For example, &amp;quot;25% Kelly&amp;quot; means to bet a quarter of what the Kelly criterion would suggest. Colloquially, this fraction is known as the &#039;&#039;&#039;Kelly factor&#039;&#039;&#039;, and is used to describe the maximum or present bet amount relative to the bankroll.&lt;br /&gt;
&lt;br /&gt;
On its own, the Kelly criterion only takes into account the market probability and your probability. Fractional Kelly takes into account your confidence level. Neither take into account market spreads nor other possible competing uses of your time and money.&lt;br /&gt;
&lt;br /&gt;
* Beginner traders should cap their bets at 25% Kelly&lt;br /&gt;
** This smooths out losses and cushions their emotional impact&lt;br /&gt;
* Skilled traders should cap their bets at 50% Kelly&lt;br /&gt;
** Traders should be prepared by having the emotional fortitude to handle losing money. Otherwise, the first time you get burned, you&#039;ll reduce your Kelly factor&lt;br /&gt;
** Roughly, for each $1 of upside risk you get beyond 50% Kelly, you get $3 of downside risk&lt;br /&gt;
*The specific Kelly factor you use for a given market should be based on how confident you are in your prediction, and how many risks you&#039;ve accounted for (such as model error, oracle risks, black swans)&lt;br /&gt;
&lt;br /&gt;
The [https://claude.ai/public/artifacts/cc354d9e-0510-4334-a777-644449667439 Kelly Bet Calculator v1.2] ampdot made combines most of this information into an interactive tool.&lt;br /&gt;
&lt;br /&gt;
You can (and should!) read more about Kelly betting and the Kelly formula:&lt;br /&gt;
&lt;br /&gt;
* [https://www.lesswrong.com/posts/TNWnK9g2EeRnQA8Dg/never-go-full-kelly Never Go Full Kelly - LessWrong]&lt;br /&gt;
&lt;br /&gt;
=== Pitfalls ===&lt;br /&gt;
&lt;br /&gt;
* Kalshi has a track record of misresolving markets or silently changing rules&lt;br /&gt;
* Many prediction markets (e.g. Coinbase Predict) are actually frontends to Kalshi&lt;br /&gt;
* Some markets are largely noise unless you have a detailed model of what&#039;s going on, including, in descending order of randomness: Earnings, sports, crypto, app store rankings, and mentions. Avoid betting on them unless you know what you&#039;re doing!&lt;br /&gt;
* Avoid markets with ambiguity or misresolution risk. Markets linked to an organization taking action in response to the event may resolve based on when the organization announces it, not when the event happens.&lt;br /&gt;
* Ask yourself if there is potential for semantic ambiguity before trading on an event contract and avoid betting if so&lt;br /&gt;
* The user aenews is known to win markets by manipulating the oracle into misresolving markets. Check if they&#039;re betting on a market and be aware of elevated risk if they are&lt;br /&gt;
&lt;br /&gt;
== Trading tools ==&lt;br /&gt;
*&lt;br /&gt;
* [https://betmoar.fun Market analytics that allows seeing which side has more smart vs dumb money]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=903</id>
		<title>Polymarket</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=903"/>
		<updated>2026-02-20T08:42:27Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polymarket can be used to make money and to hedge against possible risks. &lt;br /&gt;
&lt;br /&gt;
== Trading / betting ==&lt;br /&gt;
&lt;br /&gt;
=== Depositing ===&lt;br /&gt;
The default deposit method costs ~13 basis points or 0.13%. You can avoid this fee by:&lt;br /&gt;
&lt;br /&gt;
* Deposit with card: For beginners, this offers the smoothest experience. You don&#039;t even need a crypto wallet to do it.&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and using the &amp;quot;deposit crypto&amp;quot; option. ~10 basis points plus possible bridge fee&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and swapping for USDC.E yourself. ~5 basis points plus possible swap and/or bridge fee&lt;br /&gt;
* For advanced users: The default deposit dialog is an accouintless centralized exchange that enforces OFAC sanctions. Any method to send USDC.E to a Polygon PoS wallet will work. Note that different L2s have different &amp;quot;USDC.E&amp;quot; tokens, and it needs to be USDC.E wrapped by the official Polygon bridge- not USDC issued natively by Circle.&lt;br /&gt;
&lt;br /&gt;
Always test with small amounts when trying a new method first.&lt;br /&gt;
&lt;br /&gt;
== Hedging / insuring ==&lt;br /&gt;
Polymarket tends to have a bias towards things happening, so it tends to offer poor (but still sometimes useful) prices for insurance.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;https://news.polymarket.com/p/286-to-1m-from-reversing-stupidity&amp;lt;/ref&amp;gt; However, it can offer a potentially useful venue to create [https://www.simplify.us/simplify101/what-is-convexity convex portfolios].&lt;br /&gt;
&lt;br /&gt;
== Trading strategies ==&lt;br /&gt;
&lt;br /&gt;
* For large orders in markets with decent volume, place limit orders at or near the current price and wait for fills to trickle in if you don&#039;t expect the price to move quickly on its own&lt;br /&gt;
* have ways of knowing orthogonal to the market and bet when multiple of those point in the same direction&lt;br /&gt;
* nothing ever happens&lt;br /&gt;
* thoroughly research things, don&#039;t bet on impulse, multiple rounds of analysis are good&lt;br /&gt;
* place limit orders to get good prices&lt;br /&gt;
* oracle risk (misresolution risk)&lt;br /&gt;
* avoid sports, crypto, mentions, earnings, and stocks. these markets are either random or too efficient due to people poring over spreadsheets already&lt;br /&gt;
* read and understand the market rules in detail&lt;br /&gt;
* if you think a probability is approximately correct, place yes and no orders on both sides and then merge them together into USDC later&lt;br /&gt;
* For beginners, making money is more about avoiding dumb bets and bet sizing than betting smart.&lt;br /&gt;
* If you&#039;re worried an opportunity will disappear before you have a chance to bet on it, increase your bet size as you gain confidence by researching the opportunity, instead of betting all at once&lt;br /&gt;
* If you have a smaller amount of money to bet (a smaller &#039;&#039;&#039;bankroll&#039;&#039;&#039;), bet on lower liquidity markets that aren&#039;t worthwhile for larger traders&lt;br /&gt;
&lt;br /&gt;
=== Fractional Kelly betting ===&lt;br /&gt;
The &#039;&#039;&#039;Kelly criterion&#039;&#039;&#039; or &#039;&#039;&#039;formula&#039;&#039;&#039; describes the theoretical optimal maximum size to bet as a portion of the participant&#039;s bankroll, assuming the bettor has perfect knowledge and zero risk aversion. &#039;&#039;&#039;Fractional Kelly&#039;&#039;&#039; (often referred to as just &amp;quot;&#039;&#039;&#039;Kelly betting&#039;&#039;&#039;&amp;quot;) is a strategy that some real-world market participants use for bet sizing, which multiplies the Kelly criterion by a percent. For example, &amp;quot;25% Kelly&amp;quot; means to bet a quarter of what the Kelly criterion would suggest. Colloquially, this fraction is known as the &#039;&#039;&#039;Kelly factor&#039;&#039;&#039;, and is used to describe the maximum or present bet amount relative to the bankroll.&lt;br /&gt;
&lt;br /&gt;
On its own, the Kelly criterion only takes into account the market probability and your probability. Fractional Kelly takes into account your confidence level. Neither take into account market spreads nor other possible competing uses of your time and money.&lt;br /&gt;
&lt;br /&gt;
* Beginner traders should cap their bets at 25% Kelly&lt;br /&gt;
** This smooths out losses and cushions their emotional impact&lt;br /&gt;
* Skilled traders should cap their bets at 50% Kelly&lt;br /&gt;
** Traders should be prepared by having the emotional fortitude to handle losing money. Otherwise, the first time you get burned, you&#039;ll reduce your Kelly factor&lt;br /&gt;
** Roughly, for each $1 of upside risk you get beyond 50% Kelly, you get $3 of downside risk&lt;br /&gt;
&lt;br /&gt;
The [https://claude.ai/public/artifacts/cc354d9e-0510-4334-a777-644449667439 Kelly Bet Calculator v1.2] ampdot made combines most of this information into an interactive tool.&lt;br /&gt;
&lt;br /&gt;
You can (and should!) read more about Kelly betting and the Kelly formula:&lt;br /&gt;
&lt;br /&gt;
* [https://www.lesswrong.com/posts/TNWnK9g2EeRnQA8Dg/never-go-full-kelly Never Go Full Kelly - LessWrong]&lt;br /&gt;
&lt;br /&gt;
=== Pitfalls ===&lt;br /&gt;
&lt;br /&gt;
* Kalshi has a track record of misresolving markets or silently changing rules&lt;br /&gt;
* Many prediction markets (e.g. Coinbase Predict) are actually frontends to Kalshi&lt;br /&gt;
* Some markets are largely noise unless you have a detailed model of what&#039;s going on, including, in descending order of randomness: Earnings, sports, crypto, app store rankings, and mentions. Avoid betting on them unless you know what you&#039;re doing!&lt;br /&gt;
* Avoid markets with ambiguity or misresolution risk. Markets linked to an organization taking action in response to the event may resolve based on when the organization announces it, not when the event happens.&lt;br /&gt;
* Ask yourself if there is potential for semantic ambiguity before trading on an event contract and avoid betting if so&lt;br /&gt;
* The user aenews is known to win markets by manipulating the oracle into misresolving markets. Check if they&#039;re betting on a market and be aware of elevated risk if they are&lt;br /&gt;
&lt;br /&gt;
== Trading tools ==&lt;br /&gt;
*&lt;br /&gt;
* [https://betmoar.fun Market analytics that allows seeing which side has more smart vs dumb money]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=902</id>
		<title>Polymarket</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=902"/>
		<updated>2026-02-20T08:10:14Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polymarket can be used to make money and to hedge against possible risks. &lt;br /&gt;
&lt;br /&gt;
== Trading / betting ==&lt;br /&gt;
&lt;br /&gt;
=== Depositing ===&lt;br /&gt;
The default deposit method costs ~13 basis points or 0.13%. You can avoid this fee by:&lt;br /&gt;
&lt;br /&gt;
* Deposit with card: For beginners, this offers the smoothest experience. You don&#039;t even need a crypto wallet to do it.&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and using the &amp;quot;deposit crypto&amp;quot; option. ~10 basis points plus possible bridge fee&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and swapping for USDC.E yourself. ~5 basis points plus possible swap and/or bridge fee&lt;br /&gt;
* For advanced users: The default deposit dialog is an accouintless centralized exchange that enforces OFAC sanctions. Any method to send USDC.E to a Polygon PoS wallet will work. Note that different L2s have different &amp;quot;USDC.E&amp;quot; tokens, and it needs to be USDC.E wrapped by the official Polygon bridge- not USDC issued natively by Circle.&lt;br /&gt;
&lt;br /&gt;
Always test with small amounts when trying a new method first.&lt;br /&gt;
&lt;br /&gt;
== Hedging / insuring ==&lt;br /&gt;
Polymarket tends to have a bias towards things happening, so it tends to offer poor (but still sometimes useful) prices for insurance.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;https://news.polymarket.com/p/286-to-1m-from-reversing-stupidity&amp;lt;/ref&amp;gt; However, it can offer a potentially useful venue to create [https://www.simplify.us/simplify101/what-is-convexity convex portfolios].&lt;br /&gt;
&lt;br /&gt;
== Trading strategies ==&lt;br /&gt;
&lt;br /&gt;
* Avoid markets with ambiguity or misresolution risk. Markets linked to an organization taking action in response to the event may resolve based on when the organization announces it, not when the event happens.&amp;lt;ref&amp;gt;https://polymarket.com/event/when-will-the-government-shutdown-end-545?tid=1762799039950&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://polymarket.com/event/another-commercial-airline-evacuation-before-march&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ask yourself if there is potential for &#039;&#039;&#039;semantic ambiguity&#039;&#039;&#039; before trading on an event contract and avoid betting if so&amp;lt;ref&amp;gt;https://www.wired.com/story/volodymyr-zelensky-suit-polymarket-rebellion/&amp;lt;/ref&amp;gt;&lt;br /&gt;
** The user aenews is known to win markets by manipulating the oracle into misresolving markets. Check if they&#039;re betting on a market and be aware of elevated risk if they are&lt;br /&gt;
* For large orders in markets with decent volume, place limit orders at or near the current price and wait for fills to trickle in if you don&#039;t expect the price to move quickly on its own&lt;br /&gt;
* have ways of knowing orthogonal to the market and bet when multiple of those point in the same direction&lt;br /&gt;
* nothing ever happens&lt;br /&gt;
* thoroughly research things, don&#039;t bet on impulse, multiple rounds of analysis are good&lt;br /&gt;
* place limit orders to get good prices&lt;br /&gt;
* oracle risk (misresolution risk)&lt;br /&gt;
* avoid sports, crypto, mentions, earnings, and stocks. these markets are either random or too efficient due to people poring over spreadsheets already&lt;br /&gt;
* read and understand the market rules in detail&lt;br /&gt;
* if you think a probability is approximately correct, place yes and no orders on both sides and then merge them together into USDC later&lt;br /&gt;
* For beginners, making money is more about avoiding dumb bets and bet sizing than betting smart.&lt;br /&gt;
* [https://www.lesswrong.com/posts/TNWnK9g2EeRnQA8Dg/never-go-full-kelly Learn to make Kelly bets]&lt;br /&gt;
&lt;br /&gt;
== Trading tools ==&lt;br /&gt;
* [https://claude.ai/public/artifacts/cc354d9e-0510-4334-a777-644449667439 Kelly Bet Calculator v1.2]&lt;br /&gt;
* [https://betmoar.fun Market analytics that allows seeing which side has more smart vs dumb money]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=715</id>
		<title>Polymarket</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=715"/>
		<updated>2026-01-30T22:51:40Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polymarket can be used to make money and to hedge against possible risks. &lt;br /&gt;
&lt;br /&gt;
== Trading / betting ==&lt;br /&gt;
&lt;br /&gt;
=== Depositing ===&lt;br /&gt;
The default deposit method costs ~13 basis points or 0.13%. You can avoid this fee by:&lt;br /&gt;
&lt;br /&gt;
* Deposit with card: For beginners, this offers the smoothest experience. You don&#039;t even need a crypto wallet to do it.&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and using the &amp;quot;deposit crypto&amp;quot; option. ~10 basis points plus possible bridge fee&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and swapping for USDC.E yourself. ~5 basis points plus possible swap and/or bridge fee&lt;br /&gt;
* For advanced users: The default deposit dialog is an accouintless centralized exchange that enforces OFAC sanctions. Any method to send USDC.E to a Polygon PoS wallet will work. Note that different L2s have different &amp;quot;USDC.E&amp;quot; tokens, and it needs to be USDC.E wrapped by the official Polygon bridge- not USDC issued natively by Circle.&lt;br /&gt;
&lt;br /&gt;
Always test with small amounts when trying a new method first.&lt;br /&gt;
&lt;br /&gt;
== Hedging / insuring ==&lt;br /&gt;
Polymarket tends to have a bias towards things happening, so it tends to offer poor (but still sometimes useful) prices for insurance.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;https://news.polymarket.com/p/286-to-1m-from-reversing-stupidity&amp;lt;/ref&amp;gt; However, it can offer a potentially useful venue to create [https://www.simplify.us/simplify101/what-is-convexity convex portfolios].&lt;br /&gt;
&lt;br /&gt;
== Trading strategies ==&lt;br /&gt;
&lt;br /&gt;
* Avoid markets with ambiguity or misresolution risk. Markets linked to an organization taking action in response to the event may resolve based on when the organization announces it, not when the event happens.&amp;lt;ref&amp;gt;https://polymarket.com/event/when-will-the-government-shutdown-end-545?tid=1762799039950&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://polymarket.com/event/another-commercial-airline-evacuation-before-march&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ask yourself if there is potential for &#039;&#039;&#039;semantic ambiguity&#039;&#039;&#039; before trading on an event contract and avoid betting if so&amp;lt;ref&amp;gt;https://www.wired.com/story/volodymyr-zelensky-suit-polymarket-rebellion/&amp;lt;/ref&amp;gt;&lt;br /&gt;
* For large orders in markets with decent volume, place limit orders at or near the current price and wait for fills to trickle in if you don&#039;t expect the price to move quickly on its own&lt;br /&gt;
* have ways of knowing orthogonal to the market and bet when multiple of those point in the same direction&lt;br /&gt;
* nothing ever happens&lt;br /&gt;
* thoroughly research things, don&#039;t bet on impulse, multiple rounds of analysis are good&lt;br /&gt;
* place limit orders to get good prices&lt;br /&gt;
* oracle risk (misresolution risk)&lt;br /&gt;
* avoid sports, crypto, mentions, earnings, and stocks. these markets are either random or too efficient due to people poring over spreadsheets already&lt;br /&gt;
* read and understand the market rules in detail&lt;br /&gt;
* if you think a probability is approximately correct, place yes and no orders on both sides and then merge them together into USDC later&lt;br /&gt;
* For beginners, making money is more about avoiding dumb bets and bet sizing than betting smart.&lt;br /&gt;
* [https://www.lesswrong.com/posts/TNWnK9g2EeRnQA8Dg/never-go-full-kelly Learn to make Kelly bets]&lt;br /&gt;
&lt;br /&gt;
== Trading tools ==&lt;br /&gt;
* [https://claude.ai/public/artifacts/cc354d9e-0510-4334-a777-644449667439 Kelly Bet Calculator v1.2]&lt;br /&gt;
* [https://betmoar.fun Market analytics that allows seeing which side has more smart vs dumb money]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Ampdot:Industrial_values&amp;diff=692</id>
		<title>Ampdot:Industrial values</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Ampdot:Industrial_values&amp;diff=692"/>
		<updated>2026-01-20T10:05:21Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;Production Excellence  Weirdness Budget  [https://how.complexsystems.fail/ Respect for complexity]  Systems thinking  Skin in the game  Point and call&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Production Excellence&lt;br /&gt;
&lt;br /&gt;
Weirdness Budget&lt;br /&gt;
&lt;br /&gt;
[https://how.complexsystems.fail/ Respect for complexity]&lt;br /&gt;
&lt;br /&gt;
Systems thinking&lt;br /&gt;
&lt;br /&gt;
Skin in the game&lt;br /&gt;
&lt;br /&gt;
Point and call&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Travel&amp;diff=651</id>
		<title>Travel</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Travel&amp;diff=651"/>
		<updated>2026-01-10T21:38:16Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* After Booking */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Travel =&lt;br /&gt;
&lt;br /&gt;
== General Flight Planning ==&lt;br /&gt;
&lt;br /&gt;
=== Before You Book ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Transit to Airport&#039;&#039;&#039;: Check if public transit is available at your departure and arrival times. Factor in cost and time for non-transit options.&lt;br /&gt;
* &#039;&#039;&#039;Airport Selection&#039;&#039;&#039;: Some cities have multiple airports - compare total travel costs including ground transportation.&lt;br /&gt;
* &#039;&#039;&#039;Flight Flexibility&#039;&#039;&#039;: United Basic Economy (no carry-on) and Spirit don&#039;t offer flight flexibility. You can purchase flexibility from Spirit separately.&lt;br /&gt;
* &#039;&#039;&#039;Route Changes&#039;&#039;&#039;: On most airlines (except Spirit and Frontier), you can often modify flights to extend stays - usually cheaper than booking return trips later.&lt;br /&gt;
&lt;br /&gt;
=== Search Tools ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[https://matrix.itasoftware.com/search ITA Matrix]&#039;&#039;&#039;: Advanced flight search engine with more sophisticated querying than Google Flights and often more current results since it doesn&#039;t rely on caching.&lt;br /&gt;
&lt;br /&gt;
== Discounts and Special Programs ==&lt;br /&gt;
&lt;br /&gt;
=== Youth Discounts ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[https://www.united.com/en/us/fly/mileageplus/young-adult-discount.html United Airlines]&#039;&#039;&#039;: 5% off flights for ages 18-23 (valid through December 31st, 2025)&lt;br /&gt;
* &#039;&#039;&#039;[https://www.amtrak.com/student-discounts Amtrak]&#039;&#039;&#039;: 15% off train tickets for students ages 17-24&lt;br /&gt;
* &#039;&#039;&#039;[https://www.studentuniverse.com/flights Student Universe]&#039;&#039;&#039;: Discounted flights for college students&lt;br /&gt;
&lt;br /&gt;
=== Credit Card Points / Airline Miles ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Search Engines&#039;&#039;&#039;: [https://www.pointhound.com/ Pointhound] and [https://roame.travel/ Roame] specialize in point redemption searches&lt;br /&gt;
* &#039;&#039;&#039;Best Value&#039;&#039;&#039;: High-end flights (like direct transcontinental/transoceanic routes) typically offer the most value per point&lt;br /&gt;
* You can buy frequent flyer points at a rate of 1.6-1.9c and then purchase business and first class flights with them using 50-60K points&lt;br /&gt;
&lt;br /&gt;
== After Booking ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Flight Preparation ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timing&#039;&#039;&#039;: Set alarm for airport departure time + 30 minutes for last-minute packing&lt;br /&gt;
* &#039;&#039;&#039;Hydration&#039;&#039;&#039;: Bring a large water bottle (24oz+) to fill after security - cabin humidity is very low (10-20%)&lt;br /&gt;
* &#039;&#039;&#039;Electrolytes&#039;&#039;&#039;: Consume sodium and potassium-rich foods before and during flight&lt;br /&gt;
* &#039;&#039;&#039;Medication&#039;&#039;&#039;: Pack extra doses in multiple compartments, keep in carry-on for easy access&lt;br /&gt;
&lt;br /&gt;
=== Long-Haul Flight Tips ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timezone Adjustment&#039;&#039;&#039;: Set devices to destination timezone when boarding and sync eating/drinking accordingly&lt;br /&gt;
* &#039;&#039;&#039;Comfort&#039;&#039;&#039;: Wear clothes you&#039;re comfortable being in for extended periods&lt;br /&gt;
&lt;br /&gt;
=== Destination-Specific Tips ===&lt;br /&gt;
&lt;br /&gt;
==== Japan ====&lt;br /&gt;
&lt;br /&gt;
* Bring multiple debit cards for cash access and transportation card payments&lt;br /&gt;
&lt;br /&gt;
== Airline-specific tips ==&lt;br /&gt;
&lt;br /&gt;
=== Alaska Airlines ===&lt;br /&gt;
The &amp;quot;same-day change&amp;quot; feature often charges you a large fee when using the regular change flight interface would be free, if your ticket isn&#039;t Basic Economy.&lt;br /&gt;
&lt;br /&gt;
== Alternative Travel Options ==&lt;br /&gt;
&lt;br /&gt;
=== Frontier GoWild! All-You-Can-Fly Pass ===&lt;br /&gt;
&#039;&#039;For travelers with flexible schedules who prioritize cost savings over convenience&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The GoWild! Pass offers unlimited flights for a fixed subscription price, with flights available for $0.01 plus taxes/fees (typically ~$14.60 domestic).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key Features:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Access to all Frontier domestic and international destinations&lt;br /&gt;
* Domestic flights: book 1 day before departure&lt;br /&gt;
* International flights: book 10 days before departure&lt;br /&gt;
* Various subscription options: annual, seasonal, monthly&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Limitations:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Last-minute booking requirements&lt;br /&gt;
* Additional costs for baggage and seat selection&lt;br /&gt;
* Blackout dates during peak periods&lt;br /&gt;
* Subject to availability&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Route Planning Strategy:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Use the [https://www.flightconnections.com/route-map-frontier-airlines-f9 interactive Frontier route map] for planning&lt;br /&gt;
* Prioritize direct flights when possible&lt;br /&gt;
* Transform long layovers into stopovers to visit additional cities&lt;br /&gt;
* Check multiple airports in metro areas (e.g., Chicago: ORD/MDW, DC area: BWI/DCA)&lt;br /&gt;
* Compare different days - schedules vary significantly by day of week&lt;br /&gt;
* Check historical delay data using FlightStats or FlightAware&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Booking Tips:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Check prices frequently - discounted rates often available 24-48 hours before departure&lt;br /&gt;
* Treat like public transit: focus on functionality over luxury&lt;br /&gt;
* Build buffer time for delays&lt;br /&gt;
* Pack light to avoid baggage fees&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Main_Page&amp;diff=650</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Main_Page&amp;diff=650"/>
		<updated>2026-01-08T06:13:13Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* Featured articles */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Featured articles ==&lt;br /&gt;
[[Mindsets]]&lt;br /&gt;
&lt;br /&gt;
[[Travel]]&lt;br /&gt;
&lt;br /&gt;
[[Useful links]]&lt;br /&gt;
&lt;br /&gt;
== Read an article ==&lt;br /&gt;
{{Querylink|Special:AllPages|qs=namespace=620|Draft articles}}&lt;br /&gt;
&lt;br /&gt;
[[Special:AllPages|All published pages]]&lt;br /&gt;
== Create an article ==&lt;br /&gt;
&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=create&lt;br /&gt;
width=100&lt;br /&gt;
break=no&lt;br /&gt;
buttonlabel=Create new article&lt;br /&gt;
default=&lt;br /&gt;
useve=true&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The draft namespace offers a shared space for works in progress. Prefix article titles with &amp;quot;Draft:&amp;quot; to store notes, outlines, or developing content. It&#039;s available for early ideas and collaboration, but optional. Direct publishing is equally welcome. This resource exists for those who find it useful, without obligation.&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Main_Page&amp;diff=649</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Main_Page&amp;diff=649"/>
		<updated>2026-01-08T06:12:48Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Featured articles ==&lt;br /&gt;
[[Mindsets]]&lt;br /&gt;
&lt;br /&gt;
== Read an article ==&lt;br /&gt;
{{Querylink|Special:AllPages|qs=namespace=620|Draft articles}}&lt;br /&gt;
&lt;br /&gt;
[[Special:AllPages|All published pages]]&lt;br /&gt;
== Create an article ==&lt;br /&gt;
&amp;lt;inputbox&amp;gt;&lt;br /&gt;
type=create&lt;br /&gt;
width=100&lt;br /&gt;
break=no&lt;br /&gt;
buttonlabel=Create new article&lt;br /&gt;
default=&lt;br /&gt;
useve=true&lt;br /&gt;
&amp;lt;/inputbox&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The draft namespace offers a shared space for works in progress. Prefix article titles with &amp;quot;Draft:&amp;quot; to store notes, outlines, or developing content. It&#039;s available for early ideas and collaboration, but optional. Direct publishing is equally welcome. This resource exists for those who find it useful, without obligation.&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=646</id>
		<title>Polymarket</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=646"/>
		<updated>2025-12-17T06:13:02Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polymarket can be used to make money and to hedge against possible risks. &lt;br /&gt;
&lt;br /&gt;
== Trading / betting ==&lt;br /&gt;
&lt;br /&gt;
=== Depositing ===&lt;br /&gt;
The default deposit method costs ~13 basis points or 0.13%. You can avoid this fee by:&lt;br /&gt;
&lt;br /&gt;
* Deposit with card: For beginners, this offers the smoothest experience. You don&#039;t even need a crypto wallet to do it.&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and using the &amp;quot;deposit crypto&amp;quot; option. ~10 basis points plus possible bridge fee&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and swapping for USDC.E yourself. ~5 basis points plus possible swap and/or bridge fee&lt;br /&gt;
* For advanced users: The default deposit dialog is an accouintless centralized exchange that enforces OFAC sanctions. Any method to send USDC.E to a Polygon PoS wallet will work. Note that different L2s have different &amp;quot;USDC.E&amp;quot; tokens, and it needs to be USDC.E wrapped by the official Polygon bridge- not USDC issued natively by Circle.&lt;br /&gt;
&lt;br /&gt;
Always test with small amounts when trying a new method first.&lt;br /&gt;
&lt;br /&gt;
== Hedging / insuring ==&lt;br /&gt;
Polymarket tends to have a bias towards things happening, so it tends to offer poor (but still sometimes useful) prices for insurance.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;https://news.polymarket.com/p/286-to-1m-from-reversing-stupidity&amp;lt;/ref&amp;gt; However, it can offer a potentially useful venue to create [https://www.simplify.us/simplify101/what-is-convexity convex portfolios].&lt;br /&gt;
&lt;br /&gt;
== Trading strategies ==&lt;br /&gt;
&lt;br /&gt;
* Avoid markets with ambiguity or misresolution risk. Markets linked to an organization taking action in response to the event may resolve based on when the organization announces it, not when the event happens.&amp;lt;ref&amp;gt;https://polymarket.com/event/when-will-the-government-shutdown-end-545?tid=1762799039950&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://polymarket.com/event/another-commercial-airline-evacuation-before-march&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ask yourself if there is potential for &#039;&#039;&#039;semantic ambiguity&#039;&#039;&#039; before trading on an event contract and avoid betting if so&amp;lt;ref&amp;gt;https://www.wired.com/story/volodymyr-zelensky-suit-polymarket-rebellion/&amp;lt;/ref&amp;gt;&lt;br /&gt;
* For large orders in markets with decent volume, place limit orders at or near the current price and wait for fills to trickle in if you don&#039;t expect the price to move quickly on its own&lt;br /&gt;
* have ways of knowing orthogonal to the market and bet when multiple of those point in the same direction&lt;br /&gt;
* nothing ever happens&lt;br /&gt;
* thoroughly research things, don&#039;t bet on impulse, multiple rounds of analysis are good&lt;br /&gt;
* place limit orders to get good prices&lt;br /&gt;
* oracle risk (misresolution risk)&lt;br /&gt;
* avoid sports, crypto, mentions, earnings, and stocks. these markets are either random or too efficient due to people poring over spreadsheets already&lt;br /&gt;
* read and understand the market rules in detail&lt;br /&gt;
* if you think a probability is approximately correct, place yes and no orders on both sides and then merge them together into USDC later&lt;br /&gt;
* For beginners, making money is more about avoiding dumb bets and bet sizing than betting smart.&lt;br /&gt;
* [https://www.lesswrong.com/posts/TNWnK9g2EeRnQA8Dg/never-go-full-kelly Learn to make Kelly bets]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=645</id>
		<title>Polymarket</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=645"/>
		<updated>2025-12-17T05:53:22Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polymarket can be used to make money and to hedge against possible risks. &lt;br /&gt;
&lt;br /&gt;
== Trading / betting ==&lt;br /&gt;
&lt;br /&gt;
=== Depositing ===&lt;br /&gt;
The default deposit method costs ~13 basis points or 0.13%. You can avoid this fee by:&lt;br /&gt;
&lt;br /&gt;
* Deposit with card: For beginners, this offers the smoothest experience. You don&#039;t even need a crypto wallet to do it.&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and using the &amp;quot;deposit crypto&amp;quot; option. ~10 basis points plus possible bridge fee&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and swapping for USDC.E yourself. ~5 basis points plus possible swap and/or bridge fee&lt;br /&gt;
* For advanced users: The default deposit dialog is an accouintless centralized exchange that enforces OFAC sanctions. Any method to send USDC.E to a Polygon PoS wallet will work. Note that different L2s have different &amp;quot;USDC.E&amp;quot; tokens, and it needs to be USDC.E wrapped by the official Polygon bridge- not USDC issued natively by Circle.&lt;br /&gt;
&lt;br /&gt;
Always test with small amounts when trying a new method first.&lt;br /&gt;
&lt;br /&gt;
=== Trading strategies ===&lt;br /&gt;
&lt;br /&gt;
* have ways of knowing orthogonal to the market and bet when multiple of those point in the same direction&lt;br /&gt;
* nothing ever happens&lt;br /&gt;
* thoroughly research things, don&#039;t bet on impulse, multiple rounds of analysis are good&lt;br /&gt;
* place limit orders to get good prices &lt;br /&gt;
* oracle risk (misresolution risk)&lt;br /&gt;
* avoid sports, crypto, mentions, earnings, and stocks. these markets are either random or too efficient due to people poring over spreadsheets already&lt;br /&gt;
* read and understand the market rules in detail&lt;br /&gt;
* if you think a probability is approximately correct, place yes and no orders on both sides and then merge them together into USDC later&lt;br /&gt;
&lt;br /&gt;
For beginners, making money is more about avoiding dumb bets and bet sizing than betting smart. &lt;br /&gt;
&lt;br /&gt;
== Hedging / insuring ==&lt;br /&gt;
Polymarket tends to have a bias towards things happening, so it tends to offer poor (but still sometimes useful) prices for insurance.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;https://news.polymarket.com/p/286-to-1m-from-reversing-stupidity&amp;lt;/ref&amp;gt; However, it can offer a potentially useful venue to create [https://www.simplify.us/simplify101/what-is-convexity convex portfolios].&lt;br /&gt;
&lt;br /&gt;
== Trading strategies ==&lt;br /&gt;
&lt;br /&gt;
* Avoid markets with ambiguity or misresolution risk. Markets linked to an organization taking action in response to the event may resolve based on when the organization announces it, not when the event happens.&amp;lt;ref&amp;gt;https://polymarket.com/event/when-will-the-government-shutdown-end-545?tid=1762799039950&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://polymarket.com/event/another-commercial-airline-evacuation-before-march&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ask yourself if there is potential for &#039;&#039;&#039;semantic ambiguity&#039;&#039;&#039; before trading on an event contract and avoid betting if so&amp;lt;ref&amp;gt;https://www.wired.com/story/volodymyr-zelensky-suit-polymarket-rebellion/&amp;lt;/ref&amp;gt;&lt;br /&gt;
* For large orders in markets with decent volume, place limit orders at or near the current price and wait for fills to trickle in if you don&#039;t expect the price to move quickly on its own&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=636</id>
		<title>Biosecurity</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=636"/>
		<updated>2025-12-01T03:17:46Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* Guidelines */ hedge&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Motivation =&lt;br /&gt;
You can reduce your suffering by following these guidelines. ampdot used to get sniffles a third of the time after flying and feel mildly tired for a few hours as amp&#039;s immune system fought off a small amount of viral load. You can also make mild and short infections happen much more infrequently.&lt;br /&gt;
&lt;br /&gt;
= Guidelines =&lt;br /&gt;
* Get your flu shot by scheduling an appointment at CVS or Walgreens (there are often same-hour slots available) or by getting [https://www.flumist.com/ways-to-find-flumist FluMist nasal spray] at a pharmacy or via the mail&lt;br /&gt;
* Wear a N95 disposable respirator while in dense transportation, such as on a plane, airport, or train.&lt;br /&gt;
** 3M Aura masks tend to fit East Asian faces well&lt;br /&gt;
** Bring enough masks for the journey to your destination and also for the journey back&lt;br /&gt;
** Perform [https://www.cdc.gov/niosh/ppe/php/n95-use/index.html a fit check] for optimal performance&lt;br /&gt;
** Disposable and reusable P100 masks also exist. [https://www.amazon.com/GVS-SPR457-Elipse-Respirator-Medium/dp/B013SIIBFQ/ GVS Eclipse has good audio properties]&lt;br /&gt;
** N95 and P100 masks only filter particulates and not gases&lt;br /&gt;
* Get an updated Pfizer-BioNTech COVID-19 vaccine booster. They&#039;re substantially more effective than other brands.&lt;br /&gt;
* When running indoor events, it is ideal to &#039;&#039;&#039;purchase a HEPA filter&#039;&#039;&#039;. Target has same-day delivery for a small $5 fee, and you can return it afterwards. They reduce transmission by a five-fold factor. Alternatively, open some windows. &#039;&#039;&#039;The number of and width of windows matters&#039;&#039;&#039;, and you can gauge the airflow effectiveness using an Aranet Home CO2 monitor.&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=635</id>
		<title>Biosecurity</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=635"/>
		<updated>2025-12-01T03:17:22Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* Guidelines */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Motivation =&lt;br /&gt;
You can reduce your suffering by following these guidelines. ampdot used to get sniffles a third of the time after flying and feel mildly tired for a few hours as amp&#039;s immune system fought off a small amount of viral load. You can also make mild and short infections happen much more infrequently.&lt;br /&gt;
&lt;br /&gt;
= Guidelines =&lt;br /&gt;
* Get your flu shot by scheduling an appointment at CVS or Walgreens (there are often same-hour slots available) or by getting [https://www.flumist.com/ways-to-find-flumist FluMist nasal spray] at a pharmacy or via the mail&lt;br /&gt;
* Wear a N95 disposable respirator while in dense transportation, such as on a plane, airport, or train.&lt;br /&gt;
** 3M Aura masks tend to fit East Asian faces well&lt;br /&gt;
** Bring enough masks for the journey to your destination and also for the journey back&lt;br /&gt;
** Perform [https://www.cdc.gov/niosh/ppe/php/n95-use/index.html a fit check] for optimal performance&lt;br /&gt;
** Disposable and reusable P100 masks also exist. [https://www.amazon.com/GVS-SPR457-Elipse-Respirator-Medium/dp/B013SIIBFQ/ GVS Eclipse has good audio properties]&lt;br /&gt;
** N95 and P100 masks only filter particulates and not gases&lt;br /&gt;
* Get an updated Pfizer-BioNTech COVID-19 vaccine booster. They&#039;re substantially more effective than other brands.&lt;br /&gt;
* When running indoor events, &#039;&#039;&#039;purchase a HEPA filter&#039;&#039;&#039;. Target has same-day delivery for a small $5 fee, and you can return it afterwards. They reduce transmission by a five-fold factor. Alternatively, open some windows. &#039;&#039;&#039;The number of and width of windows matters&#039;&#039;&#039;, and you can gauge the airflow effectiveness using an Aranet Home CO2 monitor.&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=634</id>
		<title>Biosecurity</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=634"/>
		<updated>2025-12-01T03:16:26Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* Guidelines */ fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Motivation =&lt;br /&gt;
You can reduce your suffering by following these guidelines. ampdot used to get sniffles a third of the time after flying and feel mildly tired for a few hours as amp&#039;s immune system fought off a small amount of viral load. You can also make mild and short infections happen much more infrequently.&lt;br /&gt;
&lt;br /&gt;
= Guidelines =&lt;br /&gt;
* Get your flu shot by scheduling an appointment at CVS or Walgreens (there are often same-hour slots available) or by getting [https://www.flumist.com/ways-to-find-flumist FluMist nasal spray] at a pharmacy or via the mail&lt;br /&gt;
* Wear a N95 disposable respirator while in dense transportation, such as on a plane, airport, or train.&lt;br /&gt;
** 3M Aura masks tend to fit East Asian faces well&lt;br /&gt;
** Bring enough masks for the journey to your destination and also for the journey back&lt;br /&gt;
** Perform [https://www.cdc.gov/niosh/ppe/php/n95-use/index.html a fit check] for optimal performance&lt;br /&gt;
** Disposable and reusable P100 masks also exist. [https://www.amazon.com/GVS-SPR457-Elipse-Respirator-Medium/dp/B013SIIBFQ/ GVS Eclipse has good audio properties]&lt;br /&gt;
** N95 and P100 masks only filter particulates and not gases&lt;br /&gt;
* Get an updated Pfizer-BioNTech COVID-19 vaccine booster. They&#039;re substantially more effective than other brands.&lt;br /&gt;
* When running indoor events, &#039;&#039;&#039;purchase a HEPA filter&#039;&#039;&#039;. Target has same-day delivery for a small $5 fee, and you can return it afterwards. They reduce transmission by a five-fold factor. Alternatively, open some windows.&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=633</id>
		<title>Biosecurity</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=633"/>
		<updated>2025-12-01T03:15:31Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Updated biosecurity guidelines&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Motivation =&lt;br /&gt;
You can reduce your suffering by following these guidelines. ampdot used to get sniffles a third of the time after flying and feel mildly tired for a few hours as amp&#039;s immune system fought off a small amount of viral load. You can also make mild and short infections happen much more infrequently.&lt;br /&gt;
&lt;br /&gt;
= Guidelines =&lt;br /&gt;
* Get your flu shot by scheduling an appointment at CVS or Walgreens (there are often same-hour slots available) or by getting [https://www.flumist.com/ways-to-find-flumist FluMist nasal spray] at a pharmacy or via the nail&lt;br /&gt;
* Wear a N95 disposable respirator while in dense transportation, such as on a plane, airport, or train.&lt;br /&gt;
** 3M Aura masks tend to fit East Asian faces well&lt;br /&gt;
** Bring enough masks for the journey to your destination and also for the journey back&lt;br /&gt;
** Perform [https://www.cdc.gov/niosh/ppe/php/n95-use/index.html a fit check] for optimal performance&lt;br /&gt;
** Disposable and reusable P100 masks also exist. [https://www.amazon.com/GVS-SPR457-Elipse-Respirator-Medium/dp/B013SIIBFQ/ GVS Eclipse has good audio properties]&lt;br /&gt;
** N95 and P100 masks only filter particulates and not gases&lt;br /&gt;
* Get an updated Pfizer-BioNTech COVID-19 vaccine booster. They&#039;re substantially more effective than other brands.&lt;br /&gt;
* When running indoor events, &#039;&#039;&#039;purchase a HEPA filter&#039;&#039;&#039;. Target has same-day delivery for a small $5 fee, and you can return it afterwards. They reduce transmission by a five-fold factor. Alternatively, open some windows.&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=629</id>
		<title>Polymarket</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=629"/>
		<updated>2025-11-12T18:08:25Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* Trading strategies */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polymarket can be used to make money and to hedge against possible risks. &lt;br /&gt;
&lt;br /&gt;
== Trading / betting ==&lt;br /&gt;
The default deposit method costs ~13 basis points or 0.13%. You can avoid this fee by:&lt;br /&gt;
&lt;br /&gt;
* Deposit with card: For beginners, this offers the smoothest experience. You don&#039;t even need a crypto wallet to do it.&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and using the &amp;quot;deposit crypto&amp;quot; option. ~10 basis points plus possible bridge fee&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and swapping for USDC.E yourself. ~5 basis points plus possible swap and/or bridge fee&lt;br /&gt;
* For advanced users: The default deposit dialog is an accouintless centralized exchange that enforces OFAC sanctions. Any method to send USDC.E to a Polygon PoS wallet will work. Note that different L2s have different &amp;quot;USDC.E&amp;quot; tokens, and it needs to be USDC.E wrapped by the official Polygon bridge- not USDC issued natively by Circle.&lt;br /&gt;
&lt;br /&gt;
Always test with small amounts when trying a new method first.&lt;br /&gt;
&lt;br /&gt;
== Hedging / insuring ==&lt;br /&gt;
Polymarket tends to have a bias towards things happening, so it tends to offer poor (but still sometimes useful) prices for insurance.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;https://news.polymarket.com/p/286-to-1m-from-reversing-stupidity&amp;lt;/ref&amp;gt; However, it can offer a potentially useful venue to create [https://www.simplify.us/simplify101/what-is-convexity convex portfolios].&lt;br /&gt;
&lt;br /&gt;
== Trading strategies ==&lt;br /&gt;
&lt;br /&gt;
* Avoid markets with ambiguity or misresolution risk. Markets linked to an organization taking action in response to the event may resolve based on when the organization announces it, not when the event happens.&amp;lt;ref&amp;gt;https://polymarket.com/event/when-will-the-government-shutdown-end-545?tid=1762799039950&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://polymarket.com/event/another-commercial-airline-evacuation-before-march&amp;lt;/ref&amp;gt;&lt;br /&gt;
** Ask yourself if there is potential for &#039;&#039;&#039;semantic ambiguity&#039;&#039;&#039; before trading on an event contract and avoid betting if so&amp;lt;ref&amp;gt;https://www.wired.com/story/volodymyr-zelensky-suit-polymarket-rebellion/&amp;lt;/ref&amp;gt;&lt;br /&gt;
* For large orders in markets with decent volume, place limit orders at or near the current price and wait for fills to trickle in if you don&#039;t expect the price to move quickly on its own&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=628</id>
		<title>Polymarket</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=628"/>
		<updated>2025-11-10T18:26:58Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polymarket can be used to make money and to hedge against possible risks. &lt;br /&gt;
&lt;br /&gt;
== Trading / betting ==&lt;br /&gt;
The default deposit method costs ~13 basis points or 0.13%. You can avoid this fee by:&lt;br /&gt;
&lt;br /&gt;
* Deposit with card: For beginners, this offers the smoothest experience. You don&#039;t even need a crypto wallet to do it.&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and using the &amp;quot;deposit crypto&amp;quot; option. ~10 basis points plus possible bridge fee&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and swapping for USDC.E yourself. ~5 basis points plus possible swap and/or bridge fee&lt;br /&gt;
* For advanced users: The default deposit dialog is an accouintless centralized exchange that enforces OFAC sanctions. Any method to send USDC.E to a Polygon PoS wallet will work. Note that different L2s have different &amp;quot;USDC.E&amp;quot; tokens, and it needs to be USDC.E wrapped by the official Polygon bridge- not USDC issued natively by Circle.&lt;br /&gt;
&lt;br /&gt;
Always test with small amounts when trying a new method first.&lt;br /&gt;
&lt;br /&gt;
== Hedging / insuring ==&lt;br /&gt;
Polymarket tends to have a bias towards things happening, so it tends to offer poor (but still sometimes useful) prices for insurance.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;https://news.polymarket.com/p/286-to-1m-from-reversing-stupidity&amp;lt;/ref&amp;gt; However, it can offer a potentially useful venue to create [https://www.simplify.us/simplify101/what-is-convexity convex portfolios].&lt;br /&gt;
&lt;br /&gt;
== Trading strategies ==&lt;br /&gt;
&lt;br /&gt;
* Avoid markets with ambiguity or misresolution risk. Markets linked to an organization taking action in response to the event may resolve based on when the organization announces it, not when the event happens.&amp;lt;ref&amp;gt;https://polymarket.com/event/when-will-the-government-shutdown-end-545?tid=1762799039950&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;https://polymarket.com/event/another-commercial-airline-evacuation-before-march&amp;lt;/ref&amp;gt;&lt;br /&gt;
* For large orders in markets with decent volume, place limit orders at or near the current price and wait for fills to trickle in if you don&#039;t expect the price to move quickly on its own&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=627</id>
		<title>Polymarket</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Polymarket&amp;diff=627"/>
		<updated>2025-11-10T18:24:07Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Polymarket can be used to make money and to hedge against possible risks. &lt;br /&gt;
&lt;br /&gt;
== Trading / betting ==&lt;br /&gt;
The default deposit method costs ~13 basis points or 0.13%. You can avoid this fee by:&lt;br /&gt;
&lt;br /&gt;
* Deposit with card: For beginners, this offers the smoothest experience. You don&#039;t even need a crypto wallet to do it.&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and using the &amp;quot;deposit crypto&amp;quot; option. ~10 basis points plus possible bridge fee&lt;br /&gt;
* Getting USDC on the Polygon PoS chain yourself and swapping for USDC.E yourself. ~5 basis points plus possible swap and/or bridge fee&lt;br /&gt;
* For advanced users: The default deposit dialog is an accouintless centralized exchange that enforces OFAC sanctions. Any method to send USDC.E to a Polygon PoS wallet will work. Note that different L2s have different &amp;quot;USDC.E&amp;quot; tokens, and it needs to be USDC.E wrapped by the official Polygon bridge- not USDC issued natively by Circle.&lt;br /&gt;
&lt;br /&gt;
Always test with small amounts when trying a new method first.&lt;br /&gt;
&lt;br /&gt;
== Hedging / insuring ==&lt;br /&gt;
Polymarket tends to have a bias towards things happening, so it tends to offer poor (but still sometimes useful) prices for insurance.&amp;lt;ref name=&amp;quot;:0&amp;quot;&amp;gt;https://news.polymarket.com/p/286-to-1m-from-reversing-stupidity&amp;lt;/ref&amp;gt; However, it can offer a potentially useful venue to create [https://www.simplify.us/simplify101/what-is-convexity convex portfolios].&lt;br /&gt;
&lt;br /&gt;
== Trading strategies ==&lt;br /&gt;
&lt;br /&gt;
* Avoid markets with ambiguity or misresolution risk. Markets linked to an organization taking action in response to the event may resolve based on when the organization announces it, not when the event happens.&amp;lt;ref name=&amp;quot;:0&amp;quot; /&amp;gt;&amp;lt;ref&amp;gt;https://polymarket.com/event/when-will-the-government-shutdown-end-545?tid=1762799039950&amp;lt;/ref&amp;gt;&lt;br /&gt;
* For large orders in markets with decent volume, place limit orders at or near the current price and wait for fills to trickle in if you don&#039;t expect the price to move quickly on its own&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Useful_links&amp;diff=626</id>
		<title>Useful links</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Useful_links&amp;diff=626"/>
		<updated>2025-11-01T08:40:08Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;* [https://github.com/LanikSJ/webannoyances Web Annoyances Ultralist] blocks annoying distractions on webpages&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* [https://github.com/LanikSJ/webannoyances Web Annoyances Ultralist] blocks annoying distractions on webpages&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Japan&amp;diff=624</id>
		<title>Japan</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Japan&amp;diff=624"/>
		<updated>2025-10-28T18:03:01Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* Hotels */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== I&#039;m worried about... ==&lt;br /&gt;
&lt;br /&gt;
=== the language barrier ===&lt;br /&gt;
&lt;br /&gt;
* Train stations have English signage and announcements&lt;br /&gt;
* Google Translate&#039;s camera feature works well for reading menus and signs&lt;br /&gt;
* Japanese staff who don&#039;t speak English generally try their best to accommodate language barriers, and are often the first to pull out a translation app if you don&#039;t have one out&lt;br /&gt;
* If you need healthcare, you can seek it at clinics and hospitals with dedicated English-speaking medical professionals&lt;br /&gt;
&lt;br /&gt;
== How to... ==&lt;br /&gt;
&lt;br /&gt;
=== Prepare to leave ===&lt;br /&gt;
&lt;br /&gt;
* Set up an [https://www.amazon.co.jp/ Amazon.co.jp] account to be able to order things in Japan. Phone number verification is required to do so, non-Japanese phone numbers work, but you may or may not be able to receive texts in Japan, and if it does, it may be inconsistent&lt;br /&gt;
* Modify 2FA settings for any critical services (such as finance or airbnb) to avoid relying on phone numbers&lt;br /&gt;
** If you&#039;re eligible, register a Google Voice number to replace your domestic phone number&lt;br /&gt;
*Bring as many &#039;&#039;&#039;debit cards&#039;&#039;&#039; as possible. You need it to withdraw cash from an ATM to recharge transport cards, and if you lose one, it is critical you can continue to withdraw cash.&lt;br /&gt;
&lt;br /&gt;
==== Prepare to fly on Zipair ====&lt;br /&gt;
&lt;br /&gt;
* Check the weight of your bag. If your bags are higher than the weight limit, purchase extra weight at least 24 hours beforehand or reduce the weight.&lt;br /&gt;
** You will be forced to check overweight carry-ons, which may lead to important items you wanted to use during the flight being inaccessible.&lt;br /&gt;
&lt;br /&gt;
=== Find a place to stay ===&lt;br /&gt;
&lt;br /&gt;
==== Hotels ====&lt;br /&gt;
* Recommended for small groups between one and three people&lt;br /&gt;
* Avoid rooms where smoking is permitted&lt;br /&gt;
* Book a &#039;&#039;&#039;minimum&#039;&#039;&#039; of 14 days ahead&lt;br /&gt;
* APA Hotel is a bad experience and more expensive. but when booking late, it is sometimes the only option close to the city center.&lt;br /&gt;
* The year a hotel was constructed is a potential indicator of what features it will have. For example, older hotels may not have per-room AC&lt;br /&gt;
&lt;br /&gt;
===== Hotel check out =====&lt;br /&gt;
* Return room keys to check out&lt;br /&gt;
** There will usually be a hefty penalty if the keys are not returned&lt;br /&gt;
* You can usually pay 1000-2000¥/hour to get late checkout as late as 1pm-2pm&lt;br /&gt;
&lt;br /&gt;
==== Manga cafe ====&lt;br /&gt;
&lt;br /&gt;
* You can rent a private room in a manga cafe for many hours continuously&lt;br /&gt;
* Cheap, ~$15/night, ~$30/24hrs&lt;br /&gt;
* Inside city center&lt;br /&gt;
* Excellent option for spontaneous daytrips and for saving money&lt;br /&gt;
&lt;br /&gt;
=== Connect to the internet ===&lt;br /&gt;
&lt;br /&gt;
==== Mobile data ====&lt;br /&gt;
&lt;br /&gt;
* If your phone supports eSIM, purchase and install an eSIM profile from these providers:&lt;br /&gt;
** [https://www.airalo.com/ Airalo], on the KDDI/SoftBank network - more popular with tourists, cheaper and more convenient&lt;br /&gt;
** [https://www.sakuramobile.jp/ Sakura Mobile] - on the NTT Docomoco/IIJ network - more popular with locals, more expensive but generally faster overall, tends to struggle in areas with lots of locals&lt;br /&gt;
* If your phone does not support eSIM,&lt;br /&gt;
** you can purchase a physical SIM card from a local convenience store. Roughly 1 in 4 konbinis have them, ask for a &amp;quot;sim kado.&amp;quot; It takes roughly 15 minutes to find a convenience store with one in Tokyo. Airport SIM cards are very expensive and the Keisei Express from Narita has free wifi.&lt;br /&gt;
** or you can [https://esim.me/ purchase a physical eSIM to SIM card adapter]. It ships from Germany, so it&#039;s best to do this ahead of time or while using a different solution&lt;br /&gt;
* &#039;&#039;&#039;Free&#039;&#039;&#039; wi-fi is common in Japan. All Lawson convenience stores have free wifi. Many of them require verifying an email. Some commercial streets, especially around youth-oriented areas like Akihabara and Shinsaibashi, offer high-speed free wifi. The [https://www.ntt-bp.net/jw-auto/en/index.html Japan Wi-Fi Auto-Connect] app automatically connects you to nearby wifi networks without needing to verify an email and connects you to new ones as you move, but it consumes lots of battery life. Caveat: Shinkansen wi-fi tends to be fairly slow and only good for basic browsing and low bitrate calls.&lt;br /&gt;
&lt;br /&gt;
==== High-speed internet (&amp;gt;100 Mbps) ====&lt;br /&gt;
&lt;br /&gt;
* Some hotels have 200-800Mbps connections, though the speed varies throughout the day&lt;br /&gt;
* Most hotels have an Ethernet port, you can obtain an Ethernet to USB-C adapter by asking the front desk or purchasing one online or at an electronics retailer. The Ethernet speed is usually somewhat (up to 2x) faster than the Wi-Fi speed.&lt;br /&gt;
* Manga cafes are the best way to temporarily access low-latency and fast internet, up to 800Mbps&lt;br /&gt;
&lt;br /&gt;
=== Set up personal infrastructure ===&lt;br /&gt;
&lt;br /&gt;
* Withdraw 5,000-10,000¥ from an ATM to pay at transit, arcades, gachapon, and some restaurants&lt;br /&gt;
* Download the Google Translate app. The camera function lets you translate Japanese signs and menus  &lt;br /&gt;
&lt;br /&gt;
=== Maintain a good schedule ===&lt;br /&gt;
&lt;br /&gt;
* To be online at the same time as your friends in North America and Europe, you get up early or stay up late. While nightclubs stay open as late as 3am, most stores close at 8pm, so an early-to-rise schedule is generally recommended. 6am Japan time is 2pm PT and 5pm ET, so 8am is 4pm PT and 7pm ET.&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Search_engines&amp;diff=614</id>
		<title>Search engines</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Search_engines&amp;diff=614"/>
		<updated>2025-09-25T04:18:59Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* https://kagi.com &amp;quot;small web&amp;quot; filter has a custom index that ranks websites that don&#039;t have analytics and ads higher (by running uBlock Origin on the website to detect them)&lt;br /&gt;
* https://search.marginalia.nu is a curated index of personal websites, much thinner&lt;br /&gt;
* https://exa.ai/search works well as long as you write a good prompt and skim the top 10&lt;br /&gt;
* https://websets.exa.ai/websets/ good for compiling lists and finding rare results- embeddings-based search combined with AI filtering (partial matches are useful to mine) &lt;br /&gt;
&lt;br /&gt;
= Specialist =&lt;br /&gt;
* https://www.searchagora.com/ ecommerce&lt;br /&gt;
* https://findthatmeme.com/ memes&lt;br /&gt;
* https://www.phind.com/ code&lt;br /&gt;
* https://same.energy/ images by vibes&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Finance&amp;diff=613</id>
		<title>Finance</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Finance&amp;diff=613"/>
		<updated>2025-09-19T08:27:04Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* On and off ramps */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Revenue ==&lt;br /&gt;
&lt;br /&gt;
=== Grants ===&lt;br /&gt;
Message [https://matrix.to/#/@moonfern:mesh.host moonfern] about Project Stratosphere (a rough prototype of a grant aggregator/search engine) to find publicly known grants that might be relevant to you. Project Stratosphere is still in development and may be unreliable.&lt;br /&gt;
&lt;br /&gt;
=== Crowdfunding ===&lt;br /&gt;
[https://manifund.org/ Manifund] can be used as a 501(c)3 eligible fiscal sponsor for projects with charitable or altruistic aims.&lt;br /&gt;
&lt;br /&gt;
=== P2P funding ===&lt;br /&gt;
Gifts within the [https://www.irs.gov/businesses/small-businesses-self-employed/frequently-asked-questions-on-gift-taxes annual or lifetime exclusion limit] are not taxable. If you would be put in a higher tax bracket than your recipient would be put in, less taxes would need be paid total if you gift the recipient the asset (such as stocks or crypto) and they sell it immediately, than if you sell it and gift them the returns. Make sure to compensate for the taxes they will need to pay when converting to stock, since they will inherit your [https://ttlc.intuit.com/turbotax-support/en-us/help-article/investment-income/determine-cost-basis-stock-received-gift/L4bZeNvpc_US_en_US cost basis].&lt;br /&gt;
&lt;br /&gt;
== Expenses ==&lt;br /&gt;
&lt;br /&gt;
=== Cryptocurrency ===&lt;br /&gt;
&lt;br /&gt;
==== On and off ramps ====&lt;br /&gt;
Kraken is the best centralized exchange (CEX) for buying cryptocurrencies. You can get the best rates by using [https://pro.kraken.com Kraken Pro] (it&#039;s free, just a different user interface with lower fees) and checking &amp;quot;Post only.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Coinbase is the best way to liquidate USDC for USD– it does so at a 1:1 ratio with high limits.&lt;br /&gt;
&lt;br /&gt;
You can purchase Monero using other crypto using [https://www.wizardswap.io/ WizardSwap]&lt;br /&gt;
&lt;br /&gt;
==== Wallets ====&lt;br /&gt;
For Ethereum usage on desktop, Rabby is recommended. It supports hardware wallets, bridging between L2s, has an integrated browser for interacting with web3 applications (&amp;quot;dapps&amp;quot;), and you can pay gas using USDC. For Ethereum usage in a browser, Rainbow wallet is recommended.&lt;br /&gt;
&lt;br /&gt;
[https://support.ledger.com/article/115005165269-zd Fix for Ledger wallets failing to connect on Linux]&lt;br /&gt;
&lt;br /&gt;
=== Medical debt ===&lt;br /&gt;
* Medical debt below $500 will not show on a credit report&lt;br /&gt;
* Once debt gets sent to collections, you can usually negotiate for a lump sum payment 20-40% off&lt;br /&gt;
* If the debt was sent to collections recently, you can often still pay with the hospital directly&lt;br /&gt;
* Ask the hospital or collections agency to itemize the bill, which will often reduce the amount&lt;br /&gt;
* (Charisma roll required) You can &amp;quot;call bait&amp;quot; a debt collector into committing an FDCPA violation, which can reduce the amount of debt by up to $1000&lt;br /&gt;
&lt;br /&gt;
==== See also ====&lt;br /&gt;
[https://www.reddit.com/r/UnethicalLifeProTips/comments/hr6ccy/ulpt_how_to_dispute_medical_debt_the_right/ How to dispute medical debt the right way]&lt;br /&gt;
&lt;br /&gt;
=== Reimbursements ===&lt;br /&gt;
When reimbursing friends, include &amp;quot;reimbursement&amp;quot; in the memo field. This ensures the IRS is aware the and the money is less likely to be scrutinized as possible income. The IRS has required Venmo, Cash App, PayPal, and other p2p money transfer apps to report transactions to them if the total received exceeded $5000 for the 2024 tax year, and intends to lower it to $600.&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Travel&amp;diff=610</id>
		<title>Travel</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Travel&amp;diff=610"/>
		<updated>2025-09-08T22:00:57Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* Alternative Travel Options */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Travel =&lt;br /&gt;
&lt;br /&gt;
== General Flight Planning ==&lt;br /&gt;
&lt;br /&gt;
=== Before You Book ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Transit to Airport&#039;&#039;&#039;: Check if public transit is available at your departure and arrival times. Factor in cost and time for non-transit options.&lt;br /&gt;
* &#039;&#039;&#039;Airport Selection&#039;&#039;&#039;: Some cities have multiple airports - compare total travel costs including ground transportation.&lt;br /&gt;
* &#039;&#039;&#039;Flight Flexibility&#039;&#039;&#039;: United Basic Economy (no carry-on) and Spirit don&#039;t offer flight flexibility. You can purchase flexibility from Spirit separately.&lt;br /&gt;
* &#039;&#039;&#039;Route Changes&#039;&#039;&#039;: On most airlines (except Spirit and Frontier), you can often modify flights to extend stays - usually cheaper than booking return trips later.&lt;br /&gt;
&lt;br /&gt;
=== Search Tools ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[https://matrix.itasoftware.com/search ITA Matrix]&#039;&#039;&#039;: Advanced flight search engine with more sophisticated querying than Google Flights and often more current results since it doesn&#039;t rely on caching.&lt;br /&gt;
&lt;br /&gt;
== Discounts and Special Programs ==&lt;br /&gt;
&lt;br /&gt;
=== Youth Discounts ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[https://www.united.com/en/us/fly/mileageplus/young-adult-discount.html United Airlines]&#039;&#039;&#039;: 5% off flights for ages 18-23 (valid through December 31st, 2025)&lt;br /&gt;
* &#039;&#039;&#039;[https://www.amtrak.com/student-discounts Amtrak]&#039;&#039;&#039;: 15% off train tickets for students ages 17-24&lt;br /&gt;
* &#039;&#039;&#039;[https://www.studentuniverse.com/flights Student Universe]&#039;&#039;&#039;: Discounted flights for college students&lt;br /&gt;
&lt;br /&gt;
=== Credit Card Points / Airline Miles ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Search Engines&#039;&#039;&#039;: [https://www.pointhound.com/ Pointhound] and [https://roame.travel/ Roame] specialize in point redemption searches&lt;br /&gt;
* &#039;&#039;&#039;Best Value&#039;&#039;&#039;: High-end flights (like direct transcontinental/transoceanic routes) typically offer the most value per point&lt;br /&gt;
* You can buy frequent flyer points at a rate of 1.6-1.9c and then purchase business and first class flights with them using 50-60K points&lt;br /&gt;
&lt;br /&gt;
== After Booking ==&lt;br /&gt;
&lt;br /&gt;
=== Pre-Flight Preparation ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timing&#039;&#039;&#039;: Set alarm for airport departure time + 30 minutes for last-minute packing&lt;br /&gt;
* &#039;&#039;&#039;Hydration&#039;&#039;&#039;: Bring a large water bottle (24oz+) to fill after security - cabin humidity is very low (10-20%)&lt;br /&gt;
* &#039;&#039;&#039;Electrolytes&#039;&#039;&#039;: Consume sodium and potassium-rich foods before and during flight&lt;br /&gt;
* &#039;&#039;&#039;Medication&#039;&#039;&#039;: Pack extra doses in multiple compartments, keep in carry-on for easy access&lt;br /&gt;
&lt;br /&gt;
=== Long-Haul Flight Tips ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Timezone Adjustment&#039;&#039;&#039;: Set devices to destination timezone when boarding and sync eating/drinking accordingly&lt;br /&gt;
* &#039;&#039;&#039;Comfort&#039;&#039;&#039;: Wear clothes you&#039;re comfortable being in for extended periods&lt;br /&gt;
&lt;br /&gt;
=== Destination-Specific Tips ===&lt;br /&gt;
&lt;br /&gt;
==== Japan ====&lt;br /&gt;
&lt;br /&gt;
* Bring multiple debit cards for cash access and transportation card payments&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
== Alternative Travel Options ==&lt;br /&gt;
&lt;br /&gt;
=== Frontier GoWild! All-You-Can-Fly Pass ===&lt;br /&gt;
&#039;&#039;For travelers with flexible schedules who prioritize cost savings over convenience&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The GoWild! Pass offers unlimited flights for a fixed subscription price, with flights available for $0.01 plus taxes/fees (typically ~$14.60 domestic).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Key Features:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Access to all Frontier domestic and international destinations&lt;br /&gt;
* Domestic flights: book 1 day before departure&lt;br /&gt;
* International flights: book 10 days before departure&lt;br /&gt;
* Various subscription options: annual, seasonal, monthly&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Limitations:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Last-minute booking requirements&lt;br /&gt;
* Additional costs for baggage and seat selection&lt;br /&gt;
* Blackout dates during peak periods&lt;br /&gt;
* Subject to availability&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Route Planning Strategy:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Use the [https://www.flightconnections.com/route-map-frontier-airlines-f9 interactive Frontier route map] for planning&lt;br /&gt;
* Prioritize direct flights when possible&lt;br /&gt;
* Transform long layovers into stopovers to visit additional cities&lt;br /&gt;
* Check multiple airports in metro areas (e.g., Chicago: ORD/MDW, DC area: BWI/DCA)&lt;br /&gt;
* Compare different days - schedules vary significantly by day of week&lt;br /&gt;
* Check historical delay data using FlightStats or FlightAware&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Booking Tips:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* Check prices frequently - discounted rates often available 24-48 hours before departure&lt;br /&gt;
* Treat like public transit: focus on functionality over luxury&lt;br /&gt;
* Build buffer time for delays&lt;br /&gt;
* Pack light to avoid baggage fees&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Japanese_learning_resources&amp;diff=598</id>
		<title>Japanese learning resources</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Japanese_learning_resources&amp;diff=598"/>
		<updated>2025-09-05T14:25:11Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Gamb&#039;s Guide ==&lt;br /&gt;
This is the main resource that I was using to give an order to learn things in. It&#039;s focused on being able to read untranslated visual novels in Japanese. It proposes:&lt;br /&gt;
&lt;br /&gt;
* Learning hiragana and katakana first&lt;br /&gt;
* Learning grammar from reading a textbook as fast as possible&lt;br /&gt;
* Then learning vocabulary from flashcards until you know 2000 - 6000 words&lt;br /&gt;
* Then reading native material (namely, VNs)&lt;br /&gt;
&lt;br /&gt;
== djtguide Learn Kana ==&lt;br /&gt;
A [https://djtguide.github.io/learn/kana.html kana recognition training game]. Shows you a kana and scores you on whether you recognize it, with the ability to choose which kana are shown (so you can fully learn five, and then the next five, and so on).   &lt;br /&gt;
&lt;br /&gt;
== Duolingo ==&lt;br /&gt;
Duolingo&#039;s focus on teaching is listening practice for individual Japanese sentences, and handwriting practise for kana and kanji.&lt;br /&gt;
&lt;br /&gt;
== WaniKani ==&lt;br /&gt;
WaniKani teaches reading individual words, focusing on reading kanji, hence the name.&lt;br /&gt;
&lt;br /&gt;
The advice for learning Japanese kanji given in Gamb&#039;s guide is that kanji don&#039;t appear on their own and don&#039;t have pronunciations independent of being in words; in Japanese, kanji are just sememes. There&#039;s hence no meaningful notion of &amp;quot;learning kanji&amp;quot; seperately from learning vocabulary.&lt;br /&gt;
&lt;br /&gt;
WaniKani disbelieves this, and instead&lt;br /&gt;
&lt;br /&gt;
* teaches a set of WaniKani platform-specific kanji-parts, called radicals, that each appear in many kanji. Because these are formed from the same generator of breaking down kanij, WaniKani&#039;s radical list has overlap with other lists of radicals&lt;br /&gt;
* once a radical has been learned, teaches the kanji that contain that radical, with their primary meaning and the list of possible pronunciations that it can take when it appears in a word&lt;br /&gt;
* once the kanji and its pronunciations have been learned, teaches words that contain that kanji.&lt;br /&gt;
&lt;br /&gt;
Each radical, kanji and word come with associated mneumonics for the shape and where relevant pronunciation.&lt;br /&gt;
&lt;br /&gt;
This means that rather than learning kanji as being drawn from the infinite space of possible squiggles, they&#039;re learned as draws from a more finite space of easier-to-learn WaniKani radicals; and rather than learning words as being drawn from a large space of valid strings of Japanese phonemes, from a more finite space of possible readings for their component kanji; at the cost of adding a lot of additional scaffolding to learn that isn&#039;t used at higher levels or outside of WaniKani. &lt;br /&gt;
&lt;br /&gt;
== Iago ==&lt;br /&gt;
&lt;br /&gt;
== Anki ==&lt;br /&gt;
&lt;br /&gt;
== Dictionaries ==&lt;br /&gt;
Wiktionary contains basically every Japanese word. The benefit I find from Wiktionary is that, for each word, it includes the Japanese word, and the Chinese etymology of the kanji, which can make the meaning clearer or more memorable. For example, the page for 食 has &lt;br /&gt;
&lt;br /&gt;
* every definition and reading of 食 used in Japanese&lt;br /&gt;
* the Kangxi radical and composition; in this case, it&#039;s 食 with no extra strokes&lt;br /&gt;
* the etymology; it explains that 食 in the Oracle Bone script was a picture of a mouth over a bowl of rice.&lt;br /&gt;
&lt;br /&gt;
The Oxford Beginner&#039;s Japanese Dictionary has a subset of Japanese words, because dictionaries are finite in size. It&#039;s a paper dictionary, which I like. It&#039;s bilingual between Japanese and British English &lt;br /&gt;
&lt;br /&gt;
Jisho&lt;br /&gt;
&lt;br /&gt;
== NHK News Easy ==&lt;br /&gt;
&lt;br /&gt;
== sottaku ==&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Finance&amp;diff=595</id>
		<title>Finance</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Finance&amp;diff=595"/>
		<updated>2025-09-02T10:31:00Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: /* Wallets */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Revenue ==&lt;br /&gt;
&lt;br /&gt;
=== Grants ===&lt;br /&gt;
Message [https://matrix.to/#/@moonfern:mesh.host moonfern] about Project Stratosphere (a rough prototype of a grant aggregator/search engine) to find publicly known grants that might be relevant to you. Project Stratosphere is still in development and may be unreliable.&lt;br /&gt;
&lt;br /&gt;
=== Crowdfunding ===&lt;br /&gt;
[https://manifund.org/ Manifund] can be used as a 501(c)3 eligible fiscal sponsor for projects with charitable or altruistic aims.&lt;br /&gt;
&lt;br /&gt;
=== P2P funding ===&lt;br /&gt;
Gifts within the [https://www.irs.gov/businesses/small-businesses-self-employed/frequently-asked-questions-on-gift-taxes annual or lifetime exclusion limit] are not taxable. If you would be put in a higher tax bracket than your recipient would be put in, less taxes would need be paid total if you gift the recipient the asset (such as stocks or crypto) and they sell it immediately, than if you sell it and gift them the returns. Make sure to compensate for the taxes they will need to pay when converting to stock, since they will inherit your [https://ttlc.intuit.com/turbotax-support/en-us/help-article/investment-income/determine-cost-basis-stock-received-gift/L4bZeNvpc_US_en_US cost basis].&lt;br /&gt;
&lt;br /&gt;
== Expenses ==&lt;br /&gt;
&lt;br /&gt;
=== Cryptocurrency ===&lt;br /&gt;
&lt;br /&gt;
==== On and off ramps ====&lt;br /&gt;
Kraken is the best centralized exchange (CEX) for buying cryptocurrencies. You can get the best rates by using [https://pro.kraken.com Kraken Pro] (it&#039;s free, just a different user interface with lower fees) and checking &amp;quot;Post only.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Coinbase is the best way to liquidate USDC for USD– it does so at a 1:1 ratio with high limits.&lt;br /&gt;
&lt;br /&gt;
==== Wallets ====&lt;br /&gt;
For Ethereum usage on desktop, Rabby is recommended. It supports hardware wallets, bridging between L2s, has an integrated browser for interacting with web3 applications (&amp;quot;dapps&amp;quot;), and you can pay gas using USDC. For Ethereum usage in a browser, Rainbow wallet is recommended.&lt;br /&gt;
&lt;br /&gt;
[https://support.ledger.com/article/115005165269-zd Fix for Ledger wallets failing to connect on Linux]&lt;br /&gt;
&lt;br /&gt;
=== Medical debt ===&lt;br /&gt;
* Medical debt below $500 will not show on a credit report&lt;br /&gt;
* Once debt gets sent to collections, you can usually negotiate for a lump sum payment 20-40% off&lt;br /&gt;
* If the debt was sent to collections recently, you can often still pay with the hospital directly&lt;br /&gt;
* Ask the hospital or collections agency to itemize the bill, which will often reduce the amount&lt;br /&gt;
* (Charisma roll required) You can &amp;quot;call bait&amp;quot; a debt collector into committing an FDCPA violation, which can reduce the amount of debt by up to $1000&lt;br /&gt;
&lt;br /&gt;
==== See also ====&lt;br /&gt;
[https://www.reddit.com/r/UnethicalLifeProTips/comments/hr6ccy/ulpt_how_to_dispute_medical_debt_the_right/ How to dispute medical debt the right way]&lt;br /&gt;
&lt;br /&gt;
=== Reimbursements ===&lt;br /&gt;
When reimbursing friends, include &amp;quot;reimbursement&amp;quot; in the memo field. This ensures the IRS is aware the and the money is less likely to be scrutinized as possible income. The IRS has required Venmo, Cash App, PayPal, and other p2p money transfer apps to report transactions to them if the total received exceeded $5000 for the 2024 tax year, and intends to lower it to $600.&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=594</id>
		<title>Biosecurity</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=594"/>
		<updated>2025-08-29T03:23:34Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This page needs to be updated. Please help update this page to reflect recent events or newly available information.&lt;br /&gt;
&lt;br /&gt;
= Motivation =&lt;br /&gt;
You can reduce your suffering by following these guidelines. ampdot used to get sniffles a third of the time after flying and feel mildly tired for a few hours as amp&#039;s immune system fought off a small amount of viral load. You can also make mild and short infections happen much more infrequently.&lt;br /&gt;
&lt;br /&gt;
= Guidelines =&lt;br /&gt;
* Wear a P100 respirator or N100 disposable mask in crowded areas, such as a plane or airport. They cost about $35 and deliver quickly. [https://www.amazon.com/GVS-SPR457-Elipse-Respirator-Medium/dp/B013SIIBFQ/ Here is one ampdot recommends.]&lt;br /&gt;
** Disposable P100 masks also exist.&lt;br /&gt;
* Get vaccinated, and get boosted. You should have your second booster, for a total of four shots. An updated vaccine is available as of October 1st.&lt;br /&gt;
* When running indoor events, &#039;&#039;&#039;purchase a HEPA filter&#039;&#039;&#039;. Target has same-day delivery for a small $5 fee, and you can return it afterwards. They reduce transmission by a five-fold factor. Alternatively, open some windows.&lt;br /&gt;
* Be mindful of going into crowded indoor spaces and consider wearing a mask if you visit them frequently. According to [https://microcovid.org microcovid.org], a N95 mask reduces transmission rates by 3x, a surgical mask by 2x, and a thick and snug cloth mask by 1.5x.&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=593</id>
		<title>Biosecurity</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Biosecurity&amp;diff=593"/>
		<updated>2025-08-29T03:23:20Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Note:&#039;&#039;&#039; This page needs to be updated. Please help update this page to reflect recent events or newly available information.&lt;br /&gt;
&lt;br /&gt;
= Motivation =&lt;br /&gt;
You can reduce your suffering by following these guidelines. ampdot used to get sniffles a third of the time after flying and feel mildly tired for a few hours as amp&#039;s immune system fought off a small amount of viral load. You can also make mild and short infections happen much more infrequently.&lt;br /&gt;
&lt;br /&gt;
= Guidelines =&lt;br /&gt;
* Wear a P100 respirator or N100 disposable mask in crowded areas, such as a plane or airport. They cost about $35 and deliver quickly. [https://www.amazon.com/GVS-SPR457-Elipse-Respirator-Medium/dp/B013SIIBFQ/ Here is one ampdot recommends.]&lt;br /&gt;
** Disposable P100 masks also exist.&lt;br /&gt;
* Get vaccinated, and get boosted. You should have your second booster, for a total of four shots. An updated vaccine is available as of October 1st.&lt;br /&gt;
* When running indoor events, &#039;&#039;&#039;purchase a HEPA filter&#039;&#039;&#039;. Target has same-day delivery for a small $5 fee, and you can return it afterwards. They reduce transmission by a five-fold factor. Alternatively, open some windows.&lt;br /&gt;
* Be mindful of going into crowded indoor spaces and consider wearing a mask if you visit them frequently. According to [https://microcovid.org microcovid.org], a N95 mask reduces transmission rates by 3x, a surgical mask by 2x, and a thick and snug cloth mask by 1.5x.&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Module:Template_invocation&amp;diff=592</id>
		<title>Module:Template invocation</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Module:Template_invocation&amp;diff=592"/>
		<updated>2025-08-29T03:20:21Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;-- This module provides functions for making MediaWiki template invocations.  local checkType = require(&amp;#039;libraryUtil&amp;#039;).checkType  local p = {}  ------------------------------------------------------------------------ --         Name:  p.name --      Purpose:  Find a template invocation name from a page name or a --                mw.title object. --  Description:  This function detects whether a string or a mw.title --                object has been passed in, and uses t...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This module provides functions for making MediaWiki template invocations.&lt;br /&gt;
&lt;br /&gt;
local checkType = require(&#039;libraryUtil&#039;).checkType&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
--         Name:  p.name&lt;br /&gt;
--      Purpose:  Find a template invocation name from a page name or a&lt;br /&gt;
--                mw.title object.&lt;br /&gt;
--  Description:  This function detects whether a string or a mw.title&lt;br /&gt;
--                object has been passed in, and uses that to find a&lt;br /&gt;
--                template name as it is used in template invocations.&lt;br /&gt;
--   Parameters:  title - full page name or mw.title object for the&lt;br /&gt;
--                template (string or mw.title object)&lt;br /&gt;
--      Returns:  String&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.name(title)&lt;br /&gt;
	if type(title) == &#039;string&#039; then&lt;br /&gt;
		title = mw.title.new(title)&lt;br /&gt;
		if not title or #title.prefixedText == 0 or #title.interwiki &amp;gt; 0 then&lt;br /&gt;
			error(&amp;quot;invalid title in parameter #1 of function &#039;name&#039;&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
	elseif type(title) ~= &#039;table&#039; or type(title.getContent) ~= &#039;function&#039; then&lt;br /&gt;
		error(&amp;quot;parameter #1 of function &#039;name&#039; must be a string or a mw.title object&amp;quot;, 2)&lt;br /&gt;
	end&lt;br /&gt;
	if title.namespace == 10 then&lt;br /&gt;
		local text = title.text&lt;br /&gt;
		local check = mw.title.new(text, 10)&lt;br /&gt;
		-- Exclude the prefix, unless we have something like &amp;quot;Template:Category:Foo&amp;quot;, which can&#039;t be abbreviated to &amp;quot;Category:Foo&amp;quot;.&lt;br /&gt;
		return check and mw.title.equals(title, check) and text or title.prefixedText&lt;br /&gt;
	elseif title.namespace == 0 then&lt;br /&gt;
		return &#039;:&#039; .. title.prefixedText&lt;br /&gt;
	else&lt;br /&gt;
		return title.prefixedText&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
--         Name:  p.invocation&lt;br /&gt;
--      Purpose:  Construct a MediaWiki template invocation.&lt;br /&gt;
--  Description:  This function makes a template invocation from the&lt;br /&gt;
--                name and the arguments given. Note that it isn&#039;t&lt;br /&gt;
--                perfect: we have no way of knowing what whitespace was&lt;br /&gt;
--                in the original invocation, the named parameters will be&lt;br /&gt;
--                alphabetically sorted, and any parameters with duplicate keys&lt;br /&gt;
--                will be removed.&lt;br /&gt;
--   Parameters:  name - the template name, formatted as it will appear&lt;br /&gt;
--                    in the invocation. (string)&lt;br /&gt;
--                args - a table of template arguments. (table)&lt;br /&gt;
--                format - formatting options. (string, optional)&lt;br /&gt;
--                    Set to &amp;quot;nowiki&amp;quot; to escape, curly braces, pipes and&lt;br /&gt;
--                    equals signs with their HTML entities. The default&lt;br /&gt;
--                    is unescaped.&lt;br /&gt;
--      Returns:  String&lt;br /&gt;
------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
function p.invocation(name, args, format)&lt;br /&gt;
	checkType(&#039;invocation&#039;, 1, name, &#039;string&#039;)&lt;br /&gt;
	checkType(&#039;invocation&#039;, 2, args, &#039;table&#039;)&lt;br /&gt;
	checkType(&#039;invocation&#039;, 3, format, &#039;string&#039;, true)&lt;br /&gt;
&lt;br /&gt;
	-- Validate the args table and make a copy to work from. We need to&lt;br /&gt;
	-- make a copy of the table rather than just using the original, as&lt;br /&gt;
	-- some of the values may be erased when building the invocation.&lt;br /&gt;
	local invArgs = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local typek = type(k)&lt;br /&gt;
		local typev = type(v)&lt;br /&gt;
		if typek ~= &#039;string&#039; and typek ~= &#039;number&#039;&lt;br /&gt;
			or typev ~= &#039;string&#039; and typev ~= &#039;number&#039;&lt;br /&gt;
		then&lt;br /&gt;
			error(&amp;quot;invalid arguments table in parameter #2 of &amp;quot; ..&lt;br /&gt;
			&amp;quot;&#039;invocation&#039; (keys and values must be strings or numbers)&amp;quot;, 2)&lt;br /&gt;
		end&lt;br /&gt;
		invArgs[k] = v&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Get the separators to use.&lt;br /&gt;
	local seps = {&lt;br /&gt;
		openb = &#039;{{&#039;,&lt;br /&gt;
		closeb = &#039;}}&#039;,&lt;br /&gt;
		pipe = &#039;|&#039;,&lt;br /&gt;
		equals = &#039;=&#039;&lt;br /&gt;
	}&lt;br /&gt;
	if format == &#039;nowiki&#039; then&lt;br /&gt;
		for k, v in pairs(seps) do&lt;br /&gt;
			seps[k] = mw.text.nowiki(v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Build the invocation body with numbered args first, then named.&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	ret[#ret + 1] = seps.openb&lt;br /&gt;
	ret[#ret + 1] = name&lt;br /&gt;
	for k, v in ipairs(invArgs) do&lt;br /&gt;
		if type(v) == &#039;string&#039; and v:find(&#039;=&#039;, 1, true) then&lt;br /&gt;
			-- Likely something like 1=foo=bar which needs to be displayed as a named arg.&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = seps.pipe&lt;br /&gt;
			ret[#ret + 1] = v&lt;br /&gt;
			invArgs[k] = nil -- Erase the key so that we don&#039;t add the value twice&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	local keys = {} -- sort parameter list; better than arbitrary order&lt;br /&gt;
	for k, _ in pairs(invArgs) do&lt;br /&gt;
		keys[#keys + 1] = k&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(keys,&lt;br /&gt;
		function (a, b)&lt;br /&gt;
			-- Sort with keys of type number first, then string.&lt;br /&gt;
			if type(a) == type(b) then&lt;br /&gt;
				return a &amp;lt; b&lt;br /&gt;
			elseif type(a) == &#039;number&#039; then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	)&lt;br /&gt;
	&lt;br /&gt;
	local maybeSpace = &#039;&#039; -- First named parameter should not be separated by a space&lt;br /&gt;
	for _, v in ipairs(keys) do -- Add named args based on sorted parameter list&lt;br /&gt;
		ret[#ret + 1] = maybeSpace .. seps.pipe&lt;br /&gt;
		ret[#ret + 1] = tostring(v)&lt;br /&gt;
		ret[#ret + 1] = seps.equals&lt;br /&gt;
		ret[#ret + 1] = invArgs[v]&lt;br /&gt;
		maybeSpace = &#039; &#039;&lt;br /&gt;
	end&lt;br /&gt;
	ret[#ret + 1] = seps.closeb&lt;br /&gt;
&lt;br /&gt;
	return table.concat(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Module:Unsubst&amp;diff=591</id>
		<title>Module:Unsubst</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Module:Unsubst&amp;diff=591"/>
		<updated>2025-08-29T03:19:29Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;local checkType = require(&amp;#039;libraryUtil&amp;#039;).checkType  local p = {}  local BODY_PARAM = &amp;#039;$B&amp;#039;  local specialParams = { 	[&amp;#039;$params&amp;#039;] = &amp;#039;parameter list&amp;#039;, 	[&amp;#039;$aliases&amp;#039;] = &amp;#039;parameter aliases&amp;#039;, 	[&amp;#039;$flags&amp;#039;] = &amp;#039;flags&amp;#039;, 	[&amp;#039;$B&amp;#039;] = &amp;#039;template content&amp;#039;, 	[&amp;#039;$template-name&amp;#039;] = &amp;#039;template invocation name override&amp;#039;, }  function p.main(frame, body) 	-- If we are substing, this function returns a template invocation, and if 	-- not, it returns the template body. The template body can be specif...&amp;quot;&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;
	[&#039;$template-name&#039;] = &#039;template invocation name override&#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&lt;br /&gt;
&lt;br /&gt;
	if frame.args[&#039;$template-name&#039;] and &#039;&#039; ~= frame.args[&#039;$template-name&#039;] then&lt;br /&gt;
		name = frame.args[&#039;$template-name&#039;]										-- override whatever the template name is with this name&lt;br /&gt;
	else&lt;br /&gt;
		name = mTemplateInvocation.name(frame:getParent():getTitle())&lt;br /&gt;
	end&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>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Template:Update&amp;diff=590</id>
		<title>Template:Update</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Template:Update&amp;diff=590"/>
		<updated>2025-08-29T03:19:02Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;{{safesubst:&amp;lt;noinclude /&amp;gt;#invoke:Unsubst||date=__DATE__ |$B= {{main other  | demospace = {{{demospace|}}}   |{{ambox   | name  = Update   | subst = &amp;lt;includeonly&amp;gt;{{subst:substcheck}}&amp;lt;/includeonly&amp;gt;   | type  = content   | class = ambox-Update   | image = alt=   | issue = {{#if:{{{part|{{{1|}}}}}}    |{{#ifeq:{{{part|{{{1|}}}}}}|section      |{{#if:{{{inaccurate|}}}       |This section&amp;#039;s &amp;#039;&amp;#039;&amp;#039;Wikipedia:Accuracy dispute|factual...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{safesubst:&amp;lt;noinclude /&amp;gt;#invoke:Unsubst||date=__DATE__ |$B=&lt;br /&gt;
{{main other&lt;br /&gt;
 | demospace = {{{demospace|}}} &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:{{Ambox globe current red}}|42px|link=|alt=]]&lt;br /&gt;
  | issue = {{#if:{{{part|{{{1|}}}}}}&lt;br /&gt;
   |{{#ifeq:{{{part|{{{1|}}}}}}|section&lt;br /&gt;
     |{{#if:{{{inaccurate|}}}&lt;br /&gt;
      |This section&#039;s &#039;&#039;&#039;[[Wikipedia:Accuracy dispute|factual accuracy]] may be compromised due to out-of-date information&#039;&#039;&#039;&lt;br /&gt;
      |This section needs to be &#039;&#039;&#039;updated&#039;&#039;&#039;}}&lt;br /&gt;
     |{{#if:{{{inaccurate|}}}&lt;br /&gt;
      |The &#039;&#039;&#039;[[Wikipedia:Accuracy dispute|factual accuracy]]&#039;&#039;&#039; of parts of this article (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 article (those related to {{{part|{{{1|}}}}}}) need to be &#039;&#039;&#039;updated&#039;&#039;&#039;}}&lt;br /&gt;
     }}&lt;br /&gt;
   |{{#if:{{{inaccurate|}}}&lt;br /&gt;
    |This article&#039;s &#039;&#039;&#039;[[Wikipedia:Accuracy dispute|factual accuracy]] may be compromised due to out-of-date information&#039;&#039;&#039;&lt;br /&gt;
    |This article needs to be &#039;&#039;&#039;updated&#039;&#039;&#039;}}&lt;br /&gt;
  }}. {{#if:{{{reason|}}}|The reason given is: {{{reason}}}.}} &lt;br /&gt;
  | fix   =  Please help update this {{{type|{{SUBJECTSPACE formatted}}}}} to reflect recent events or newly available information. {{#if:{{{2|{{{updated|}}}}}}&lt;br /&gt;
   |&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;Last update: {{{2|{{{updated}}}}}}&amp;lt;/small&amp;gt;&lt;br /&gt;
  }}&lt;br /&gt;
  | talk  = {{{talk|{{{talksection|{{{discuss|}}}}}}}}}&lt;br /&gt;
  | date  = {{{date|}}}&lt;br /&gt;
  | cat   = {{#if:{{{inaccurate|}}}|Articles with obsolete information|Wikipedia articles in need of updating}}&lt;br /&gt;
  | all   = All Wikipedia articles in need of updating&lt;br /&gt;
  | all2  = {{{cat|}}}&lt;br /&gt;
 }}&lt;br /&gt;
 |{{mbox&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:{{Ambox globe current red}}|42px|link=|alt=]]&lt;br /&gt;
  | text  = {{#if:{{{part|{{{1|}}}}}}&lt;br /&gt;
   |{{#if:{{{inaccurate|}}}&lt;br /&gt;
    |The &#039;&#039;&#039;[[Wikipedia:Accuracy dispute|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|}}}}}}) need to be &#039;&#039;&#039;updated&#039;&#039;&#039;}}&lt;br /&gt;
   |{{#if:{{{inaccurate|}}}&lt;br /&gt;
    |The &#039;&#039;&#039;[[Wikipedia:Accuracy dispute|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}}}}} needs to be &#039;&#039;&#039;updated&#039;&#039;&#039;}}&lt;br /&gt;
  }}. {{#if:{{{reason|}}}|The reason given is: {{{reason}}}.}} Please help update this {{{type|{{SUBJECTSPACE formatted}}}}} to reflect recent events or newly available information. {{#ifexist: {{TALKPAGENAME}}&lt;br /&gt;
   |Relevant discussion may be found on {{#if: {{{talk|{{{talksection|{{{discuss|}}}}}}}}} | [[{{TALKPAGENAME}}#{{{talk|{{{talksection|{{{discuss}}}}}}}}}|the talk page]] | [[{{TALKPAGENAME}}| the talk page]] }}.}} {{#if:{{{date|}}}|&amp;lt;small&amp;gt;&#039;&#039;({{{date}}})&#039;&#039;&amp;lt;/small&amp;gt;}} {{#if:{{{2|{{{updated|}}}}}}&lt;br /&gt;
   |&amp;lt;br /&amp;gt;&amp;lt;small&amp;gt;Last update: {{{2|{{{updated}}}}}}&amp;lt;/small&amp;gt;&lt;br /&gt;
  }}&lt;br /&gt;
 }}&lt;br /&gt;
}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- Place categories on /doc subpage; interwikis go to Wikidata. --&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Template:Outdated_as_of&amp;diff=589</id>
		<title>Template:Outdated as of</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Template:Outdated_as_of&amp;diff=589"/>
		<updated>2025-08-29T03:18:37Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;{{#ifexpr: {{#time: U | now }} - {{#time: U | {{{year|{{{1|{{CURRENTYEAR}}}}}}}}-{{{month|{{{2|1}}}}}}-{{{day|{{{3|1}}}}}}}} &amp;gt; 0 |{{Update|{{{topic|}}}|{{{last updated|{{{4|}}}}}}|demospace={{{demospace|}}}|type={{{type|{{SUBJECTSPACE formatted}}}}}|date={{{date|{{#time:F Y|{{{year|{{{1|{{CURRENTYEAR}}}}}}}}-{{{month|{{{2|1}}}}}}-{{{day|{{{3|1}}}}}}}}}}}}} }}&amp;lt;noinclude&amp;gt;  {{Documentation}}  &amp;lt;!-- Add categories to the /doc subpage, not here! --&amp;gt;  &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifexpr: {{#time: U | now }} - {{#time: U | {{{year|{{{1|{{CURRENTYEAR}}}}}}}}-{{{month|{{{2|1}}}}}}-{{{day|{{{3|1}}}}}}}} &amp;gt; 0 |{{Update|{{{topic|}}}|{{{last updated|{{{4|}}}}}}|demospace={{{demospace|}}}|type={{{type|{{SUBJECTSPACE formatted}}}}}|date={{{date|{{#time:F Y|{{{year|{{{1|{{CURRENTYEAR}}}}}}}}-{{{month|{{{2|1}}}}}}-{{{day|{{{3|1}}}}}}}}}}}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Module:Category_handler&amp;diff=588</id>
		<title>Module:Category handler</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Module:Category_handler&amp;diff=588"/>
		<updated>2025-08-29T03:17:09Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;-------------------------------------------------------------------------------- --                                                                            -- --                              CATEGORY HANDLER                              -- --                                                                            -- --      This module implements the {{category handler}} template in Lua,      -- --      with a few improvements: all namespaces and all namespace alia...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--                              CATEGORY HANDLER                              --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--      This module implements the {{category handler}} template in Lua,      --&lt;br /&gt;
--      with a few improvements: all namespaces and all namespace aliases     --&lt;br /&gt;
--      are supported, and namespace names are detected automatically for     --&lt;br /&gt;
--      the local wiki. This module requires [[Module:Namespace detect]]      --&lt;br /&gt;
--      and [[Module:Yesno]] to be available on the local wiki. It can be     --&lt;br /&gt;
--      configured for different wikis by altering the values in              --&lt;br /&gt;
--      [[Module:Category handler/config]], and pages can be blacklisted      --&lt;br /&gt;
--      from categorisation by using [[Module:Category handler/blacklist]].   --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
-- Load required modules&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Lazily load things we don&#039;t always need&lt;br /&gt;
local mShared, mappings&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 trimWhitespace(s, removeBlanks)&lt;br /&gt;
	if type(s) ~= &#039;string&#039; then&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
	s = s:match(&#039;^%s*(.-)%s*$&#039;)&lt;br /&gt;
	if removeBlanks then&lt;br /&gt;
		if s ~= &#039;&#039; then&lt;br /&gt;
			return s&lt;br /&gt;
		else&lt;br /&gt;
			return nil&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return s&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- CategoryHandler class&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local CategoryHandler = {}&lt;br /&gt;
CategoryHandler.__index = CategoryHandler&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler.new(data, args)&lt;br /&gt;
	local obj = setmetatable({ _data = data, _args = args }, CategoryHandler)&lt;br /&gt;
	&lt;br /&gt;
	-- Set the title object&lt;br /&gt;
	do&lt;br /&gt;
		local pagename = obj:parameter(&#039;demopage&#039;)&lt;br /&gt;
		local success, titleObj&lt;br /&gt;
		if pagename then&lt;br /&gt;
			success, titleObj = pcall(mw.title.new, pagename)&lt;br /&gt;
		end&lt;br /&gt;
		if success and titleObj then&lt;br /&gt;
			obj.title = titleObj&lt;br /&gt;
			if titleObj == mw.title.getCurrentTitle() then&lt;br /&gt;
				obj._usesCurrentTitle = true&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			obj.title = mw.title.getCurrentTitle()&lt;br /&gt;
			obj._usesCurrentTitle = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set suppression parameter values&lt;br /&gt;
	for _, key in ipairs{&#039;nocat&#039;, &#039;categories&#039;} do&lt;br /&gt;
		local value = obj:parameter(key)&lt;br /&gt;
		value = trimWhitespace(value, true)&lt;br /&gt;
		obj[&#039;_&#039; .. key] = yesno(value)&lt;br /&gt;
	end&lt;br /&gt;
	do&lt;br /&gt;
		local subpage = obj:parameter(&#039;subpage&#039;)&lt;br /&gt;
		local category2 = obj:parameter(&#039;category2&#039;)&lt;br /&gt;
		if type(subpage) == &#039;string&#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(subpage)&lt;br /&gt;
		end&lt;br /&gt;
		if type(category2) == &#039;string&#039; then&lt;br /&gt;
			subpage = mw.ustring.lower(category2)&lt;br /&gt;
		end&lt;br /&gt;
		obj._subpage = trimWhitespace(subpage, true)&lt;br /&gt;
		obj._category2 = trimWhitespace(category2) -- don&#039;t remove blank values&lt;br /&gt;
	end&lt;br /&gt;
	return obj&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:parameter(key)&lt;br /&gt;
	local parameterNames = self._data.parameters[key]&lt;br /&gt;
	local pntype = type(parameterNames)&lt;br /&gt;
	if pntype == &#039;string&#039; or pntype == &#039;number&#039; then&lt;br /&gt;
		return self._args[parameterNames]&lt;br /&gt;
	elseif pntype == &#039;table&#039; then&lt;br /&gt;
		for _, name in ipairs(parameterNames) do&lt;br /&gt;
			local value = self._args[name]&lt;br /&gt;
			if value ~= nil then&lt;br /&gt;
				return value&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return nil&lt;br /&gt;
	else&lt;br /&gt;
		error(string.format(&lt;br /&gt;
			&#039;invalid config key &amp;quot;%s&amp;quot;&#039;,&lt;br /&gt;
			tostring(key)&lt;br /&gt;
		), 2)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressedByArguments()&lt;br /&gt;
	return&lt;br /&gt;
		-- See if a category suppression argument has been set.&lt;br /&gt;
		self._nocat == true&lt;br /&gt;
		or self._categories == false&lt;br /&gt;
		or (&lt;br /&gt;
			self._category2&lt;br /&gt;
			and self._category2 ~= self._data.category2Yes&lt;br /&gt;
			and self._category2 ~= self._data.category2Negative&lt;br /&gt;
		)&lt;br /&gt;
&lt;br /&gt;
		-- Check whether we are on a subpage, and see if categories are&lt;br /&gt;
		-- suppressed based on our subpage status.&lt;br /&gt;
		or self._subpage == self._data.subpageNo and self.title.isSubpage&lt;br /&gt;
		or self._subpage == self._data.subpageOnly and not self.title.isSubpage&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:shouldSkipBlacklistCheck()&lt;br /&gt;
	-- Check whether the category suppression arguments indicate we&lt;br /&gt;
	-- should skip the blacklist check.&lt;br /&gt;
	return self._nocat == false&lt;br /&gt;
		or self._categories == true&lt;br /&gt;
		or self._category2 == self._data.category2Yes&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:matchesBlacklist()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleMatchesBlacklist&lt;br /&gt;
	else&lt;br /&gt;
		mShared = mShared or require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
		return mShared.matchesBlacklist(&lt;br /&gt;
			self.title.prefixedText,&lt;br /&gt;
			mw.loadData(&#039;Module:Category handler/blacklist&#039;)&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:isSuppressed()&lt;br /&gt;
	-- Find if categories are suppressed by either the arguments or by&lt;br /&gt;
	-- matching the blacklist.&lt;br /&gt;
	return self:isSuppressedByArguments()&lt;br /&gt;
		or not self:shouldSkipBlacklistCheck() and self:matchesBlacklist()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getNamespaceParameters()&lt;br /&gt;
	if self._usesCurrentTitle then&lt;br /&gt;
		return self._data.currentTitleNamespaceParameters&lt;br /&gt;
	else&lt;br /&gt;
		if not mappings then&lt;br /&gt;
			mShared = mShared or require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
			mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
		end&lt;br /&gt;
		return mShared.getNamespaceParameters(&lt;br /&gt;
			self.title,&lt;br /&gt;
			mappings&lt;br /&gt;
		)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:namespaceParametersExist()&lt;br /&gt;
	-- Find whether any namespace parameters have been specified.&lt;br /&gt;
	-- We use the order &amp;quot;all&amp;quot; --&amp;gt; namespace params --&amp;gt; &amp;quot;other&amp;quot; as this is what&lt;br /&gt;
	-- the old template did.&lt;br /&gt;
	if self:parameter(&#039;all&#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	if not mappings then&lt;br /&gt;
		mShared = mShared or require(&#039;Module:Category handler/shared&#039;)&lt;br /&gt;
		mappings = mShared.getParamMappings(true) -- gets mappings with mw.loadData&lt;br /&gt;
	end&lt;br /&gt;
	for ns, params in pairs(mappings) do&lt;br /&gt;
		for i, param in ipairs(params) do&lt;br /&gt;
			if self._args[param] then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if self:parameter(&#039;other&#039;) then&lt;br /&gt;
		return true&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function CategoryHandler:getCategories()&lt;br /&gt;
	local params = self:getNamespaceParameters()&lt;br /&gt;
	local nsCategory&lt;br /&gt;
	for i, param in ipairs(params) do&lt;br /&gt;
		local value = self._args[param]&lt;br /&gt;
		if value ~= nil then&lt;br /&gt;
			nsCategory = value&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if nsCategory ~= nil or self:namespaceParametersExist() then&lt;br /&gt;
		-- Namespace parameters exist - advanced usage.&lt;br /&gt;
		if nsCategory == nil then&lt;br /&gt;
			nsCategory = self:parameter(&#039;other&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		local ret = {self:parameter(&#039;all&#039;)}&lt;br /&gt;
		local numParam = tonumber(nsCategory)&lt;br /&gt;
		if numParam and numParam &amp;gt;= 1 and math.floor(numParam) == numParam then&lt;br /&gt;
			-- nsCategory is an integer&lt;br /&gt;
			ret[#ret + 1] = self._args[numParam]&lt;br /&gt;
		else&lt;br /&gt;
			ret[#ret + 1] = nsCategory&lt;br /&gt;
		end&lt;br /&gt;
		if #ret &amp;lt; 1 then&lt;br /&gt;
			return nil&lt;br /&gt;
		else&lt;br /&gt;
			return table.concat(ret)&lt;br /&gt;
		end&lt;br /&gt;
	elseif self._data.defaultNamespaces[self.title.namespace] then&lt;br /&gt;
		-- Namespace parameters don&#039;t exist, simple usage.&lt;br /&gt;
		return self._args[1]&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- Used for testing purposes.&lt;br /&gt;
	return {&lt;br /&gt;
		CategoryHandler = CategoryHandler&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args, data)&lt;br /&gt;
	data = data or mw.loadData(&#039;Module:Category handler/data&#039;)&lt;br /&gt;
	local handler = CategoryHandler.new(data, args)&lt;br /&gt;
	if handler:isSuppressed() then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return handler:getCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame, data)&lt;br /&gt;
	data = data or mw.loadData(&#039;Module:Category handler/data&#039;)&lt;br /&gt;
	local args = require(&#039;Module:Arguments&#039;).getArgs(frame, {&lt;br /&gt;
		wrappers = data.wrappers,&lt;br /&gt;
		valueFunc = function (k, v)&lt;br /&gt;
			v = trimWhitespace(v)&lt;br /&gt;
			if type(k) == &#039;number&#039; then&lt;br /&gt;
				if v ~= &#039;&#039; then&lt;br /&gt;
					return v&lt;br /&gt;
				else&lt;br /&gt;
					return nil&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				return v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	})&lt;br /&gt;
	return p._main(args, data)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Module:Arguments&amp;diff=587</id>
		<title>Module:Arguments</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Module:Arguments&amp;diff=587"/>
		<updated>2025-08-29T03:16:37Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;-- This module provides easy processing of arguments passed to Scribunto from -- #invoke. It is intended for use by other Lua modules, and should not be -- called from #invoke directly.  local libraryUtil = require(&amp;#039;libraryUtil&amp;#039;) local checkType = libraryUtil.checkType  local arguments = {}  -- Generate four different tidyVal functions, so that we don&amp;#039;t have to check the -- options every time we call it.  local function tidyValDefault(key, val) 	if type(val) == &amp;#039;string&amp;#039;...&amp;quot;&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>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Module:Message_box/configuration&amp;diff=586</id>
		<title>Module:Message box/configuration</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Module:Message_box/configuration&amp;diff=586"/>
		<updated>2025-08-29T03:16:15Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;-------------------------------------------------------------------------------- --                          Message box configuration                         -- --                                                                            -- -- This module contains configuration data for Module:Message box.        -- --------------------------------------------------------------------------------  return { 	ambox = { 		types = { 			speedy = { 				class = &amp;#039;ambox-spee...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--------------------------------------------------------------------------------&lt;br /&gt;
--                          Message box configuration                         --&lt;br /&gt;
--                                                                            --&lt;br /&gt;
-- This module contains configuration data for [[Module:Message box]].        --&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	ambox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &#039;ambox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;ambox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			warning = { -- alias for content&lt;br /&gt;
				class = &#039;ambox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;ambox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;ambox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;ambox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;ambox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;ambox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default                     = &#039;notice&#039;,&lt;br /&gt;
		allowBlankParams            = {&#039;talk&#039;, &#039;sect&#039;, &#039;date&#039;, &#039;issue&#039;, &#039;fix&#039;, &#039;subst&#039;, &#039;hidden&#039;},&lt;br /&gt;
		allowSmall                  = true,&lt;br /&gt;
		smallParam                  = &#039;left&#039;,&lt;br /&gt;
		smallClass                  = &#039;mbox-small-left&#039;,&lt;br /&gt;
		substCheck                  = true,&lt;br /&gt;
		classes                     = {&#039;metadata&#039;, &#039;plainlinks&#039;, &#039;ambox&#039;},&lt;br /&gt;
		imageEmptyCell              = true,&lt;br /&gt;
		imageCheckBlank             = true,&lt;br /&gt;
		imageSmallSize              = &#039;20x20px&#039;,&lt;br /&gt;
		imageCellDiv                = true,&lt;br /&gt;
		useCollapsibleTextFields    = true,&lt;br /&gt;
		imageRightNone              = true,&lt;br /&gt;
		sectionDefault              = &#039;article&#039;,&lt;br /&gt;
		allowMainspaceCategories    = true,&lt;br /&gt;
		templateCategory            = &#039;Article message templates&#039;,&lt;br /&gt;
	        templateCategoryRequireName = true,&lt;br /&gt;
		templateErrorCategory       = nil,&lt;br /&gt;
		templateErrorParamsToCheck  = {&#039;issue&#039;, &#039;fix&#039;, &#039;subst&#039;}&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	cmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &#039;cmbox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;cmbox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;cmbox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;cmbox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;cmbox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;cmbox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;cmbox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			caution = {&lt;br /&gt;
				class = &#039;cmbox-style&#039;,&lt;br /&gt;
				image = &#039;Ambox warning yellow.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;notice&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;plainlinks&#039;, &#039;cmbox&#039;},&lt;br /&gt;
		imageEmptyCell       = true&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	fmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			warning = {&lt;br /&gt;
				class = &#039;fmbox-warning&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			editnotice = {&lt;br /&gt;
				class = &#039;fmbox-editnotice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			system = {&lt;br /&gt;
				class = &#039;fmbox-system&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;system&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;plainlinks&#039;, &#039;fmbox&#039;},&lt;br /&gt;
		imageEmptyCell       = false,&lt;br /&gt;
		imageRightNone       = false&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	imbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &#039;imbox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;imbox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;imbox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;imbox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;imbox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;imbox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			license = {&lt;br /&gt;
				class = &#039;imbox-license licensetpl&#039;,&lt;br /&gt;
				image = &#039;Imbox-license.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			featured = {&lt;br /&gt;
				class = &#039;imbox-featured&#039;,&lt;br /&gt;
				image = &#039;Cscr-featured.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;imbox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;notice&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;imbox&#039;},&lt;br /&gt;
		usePlainlinksParam   = true,&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		below                = true,&lt;br /&gt;
		templateCategory     = &#039;File message boxes&#039;&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	ombox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &#039;ombox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;ombox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			warning = { -- alias for content&lt;br /&gt;
				class = &#039;ombox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;ombox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;ombox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;ombox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;ombox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;ombox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			critical = {&lt;br /&gt;
				class = &#039;mbox-critical&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;notice&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;plainlinks&#039;, &#039;ombox&#039;},&lt;br /&gt;
		allowSmall           = true,&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		imageRightNone       = true&lt;br /&gt;
	},&lt;br /&gt;
	&lt;br /&gt;
	tmbox = {&lt;br /&gt;
		types = {&lt;br /&gt;
			speedy = {&lt;br /&gt;
				class = &#039;tmbox-speedy&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon clock-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			delete = {&lt;br /&gt;
				class = &#039;tmbox-delete&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon alert-destructive.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			content = {&lt;br /&gt;
				class = &#039;tmbox-content&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon notice-warning.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			style = {&lt;br /&gt;
				class = &#039;tmbox-style&#039;,&lt;br /&gt;
				image = &#039;Edit-clear.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			move = {&lt;br /&gt;
				class = &#039;tmbox-move&#039;,&lt;br /&gt;
				image = &#039;Merge-split-transwiki default.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			protection = {&lt;br /&gt;
				class = &#039;tmbox-protection&#039;,&lt;br /&gt;
				image = &#039;Semi-protection-shackle-keyhole.svg&#039;&lt;br /&gt;
			},&lt;br /&gt;
			notice = {&lt;br /&gt;
				class = &#039;tmbox-notice&#039;,&lt;br /&gt;
				image = &#039;OOjs UI icon information-progressive.svg&#039;&lt;br /&gt;
			}&lt;br /&gt;
		},&lt;br /&gt;
		default              = &#039;notice&#039;,&lt;br /&gt;
		showInvalidTypeError = true,&lt;br /&gt;
		classes              = {&#039;plainlinks&#039;, &#039;tmbox&#039;},&lt;br /&gt;
		allowSmall           = true,&lt;br /&gt;
		imageRightNone       = true,&lt;br /&gt;
		imageEmptyCell       = true,&lt;br /&gt;
		imageEmptyCellStyle  = true,&lt;br /&gt;
		templateCategory     = &#039;Talk message boxes&#039;&lt;br /&gt;
	}&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Module:Yesno&amp;diff=585</id>
		<title>Module:Yesno</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Module:Yesno&amp;diff=585"/>
		<updated>2025-08-29T03:15:44Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;-- Function allowing for consistent treatment of boolean-like wikitext input. -- It works similarly to the template {{yesno}}.  return function (val, default) 	-- If your wiki uses non-ascii characters for any of &amp;quot;yes&amp;quot;, &amp;quot;no&amp;quot;, etc., you 	-- should replace &amp;quot;val:lower()&amp;quot; with &amp;quot;mw.ustring.lower(val)&amp;quot; in the 	-- following line. 	val = type(val) == &amp;#039;string&amp;#039; and val:lower() or val 	if val == nil then 		return nil 	elseif val == true  		or val == &amp;#039;yes&amp;#039; 		or val == &amp;#039;y&amp;#039; 		or val =...&amp;quot;&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>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Template:Mbox&amp;diff=584</id>
		<title>Template:Mbox</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Template:Mbox&amp;diff=584"/>
		<updated>2025-08-29T03:13:41Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;{{#invoke:Message box|mbox}}&amp;lt;noinclude&amp;gt; {{documentation}} &amp;lt;!-- Categories go on the /doc subpage, and interwikis go on Wikidata. --&amp;gt; &amp;lt;/noinclude&amp;gt;&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:Message box|mbox}}&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>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Module:Message_box&amp;diff=583</id>
		<title>Module:Message box</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Module:Message_box&amp;diff=583"/>
		<updated>2025-08-29T03:13:17Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Created page with &amp;quot;-- This is a meta-module for producing message box templates, including -- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.  -- Load necessary modules. require(&amp;#039;strict&amp;#039;) local getArgs local yesno = require(&amp;#039;Module:Yesno&amp;#039;)  -- Get a language object for formatDate and ucfirst. local lang = mw.language.getContentLanguage()  -- Define constants local CONFIG_MODULE = &amp;#039;Module:Message box/configuration&amp;#039; local DEMOSPACES = {talk = &amp;#039;tmbox&amp;#039;, image = &amp;#039;...&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- This is a meta-module for producing message box templates, including&lt;br /&gt;
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.&lt;br /&gt;
&lt;br /&gt;
-- Load necessary modules.&lt;br /&gt;
require(&#039;strict&#039;)&lt;br /&gt;
local getArgs&lt;br /&gt;
local yesno = require(&#039;Module:Yesno&#039;)&lt;br /&gt;
&lt;br /&gt;
-- Get a language object for formatDate and ucfirst.&lt;br /&gt;
local lang = mw.language.getContentLanguage()&lt;br /&gt;
&lt;br /&gt;
-- Define constants&lt;br /&gt;
local CONFIG_MODULE = &#039;Module:Message box/configuration&#039;&lt;br /&gt;
local DEMOSPACES = {talk = &#039;tmbox&#039;, image = &#039;imbox&#039;, file = &#039;imbox&#039;, category = &#039;cmbox&#039;, article = &#039;ambox&#039;, main = &#039;ambox&#039;}&lt;br /&gt;
local TEMPLATE_STYLES = &#039;Module:Message box/%s.css&#039;&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Helper functions&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local function getTitleObject(...)&lt;br /&gt;
	-- Get the title object, passing the function through pcall&lt;br /&gt;
	-- in case we are over the expensive function count limit.&lt;br /&gt;
	local success, title = pcall(mw.title.new, ...)&lt;br /&gt;
	if success then&lt;br /&gt;
		return title&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function union(t1, t2)&lt;br /&gt;
	-- Returns the union of two arrays.&lt;br /&gt;
	local vals = {}&lt;br /&gt;
	for i, v in ipairs(t1) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	for i, v in ipairs(t2) do&lt;br /&gt;
		vals[v] = true&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for k in pairs(vals) do&lt;br /&gt;
		table.insert(ret, k)&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(ret)&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getArgNums(args, prefix)&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for k, v in pairs(args) do&lt;br /&gt;
		local num = mw.ustring.match(tostring(k), &#039;^&#039; .. prefix .. &#039;([1-9]%d*)$&#039;)&lt;br /&gt;
		if num then&lt;br /&gt;
			table.insert(nums, tonumber(num))&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;
-- Box class definition&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local MessageBox = {}&lt;br /&gt;
MessageBox.__index = MessageBox&lt;br /&gt;
&lt;br /&gt;
function MessageBox.new(boxType, args, cfg)&lt;br /&gt;
	args = args or {}&lt;br /&gt;
	local obj = {}&lt;br /&gt;
&lt;br /&gt;
	obj.boxType = boxType&lt;br /&gt;
&lt;br /&gt;
	-- Set the title object and the namespace.&lt;br /&gt;
	obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	-- Set the config for our box type.&lt;br /&gt;
	obj.cfg = cfg[boxType]&lt;br /&gt;
	if not obj.cfg then&lt;br /&gt;
		local ns = obj.title.namespace&lt;br /&gt;
		-- boxType is &amp;quot;mbox&amp;quot; or invalid input&lt;br /&gt;
		if args.demospace and args.demospace ~= &#039;&#039; then&lt;br /&gt;
			-- implement demospace parameter of mbox&lt;br /&gt;
			local demospace = string.lower(args.demospace)&lt;br /&gt;
			if DEMOSPACES[demospace] then&lt;br /&gt;
				-- use template from DEMOSPACES&lt;br /&gt;
				obj.cfg = cfg[DEMOSPACES[demospace]]&lt;br /&gt;
				obj.boxType = DEMOSPACES[demospace]&lt;br /&gt;
			elseif string.find( demospace, &#039;talk&#039; ) then&lt;br /&gt;
				-- demo as a talk page&lt;br /&gt;
				obj.cfg = cfg.tmbox&lt;br /&gt;
				obj.boxType = &#039;tmbox&#039;&lt;br /&gt;
			else&lt;br /&gt;
				-- default to ombox&lt;br /&gt;
				obj.cfg = cfg.ombox&lt;br /&gt;
				obj.boxType = &#039;ombox&#039;&lt;br /&gt;
			end&lt;br /&gt;
		elseif ns == 0 then&lt;br /&gt;
			obj.cfg = cfg.ambox -- main namespace&lt;br /&gt;
			obj.boxType = &#039;ambox&#039;&lt;br /&gt;
		elseif ns == 6 then&lt;br /&gt;
			obj.cfg = cfg.imbox -- file namespace&lt;br /&gt;
			obj.boxType = &#039;imbox&#039;&lt;br /&gt;
		elseif ns == 14 then&lt;br /&gt;
			obj.cfg = cfg.cmbox -- category namespace&lt;br /&gt;
			obj.boxType = &#039;cmbox&#039;&lt;br /&gt;
		else&lt;br /&gt;
			local nsTable = mw.site.namespaces[ns]&lt;br /&gt;
			if nsTable and nsTable.isTalk then&lt;br /&gt;
				obj.cfg = cfg.tmbox -- any talk namespace&lt;br /&gt;
				obj.boxType = &#039;tmbox&#039;&lt;br /&gt;
			else&lt;br /&gt;
				obj.cfg = cfg.ombox -- other namespaces or invalid input&lt;br /&gt;
				obj.boxType = &#039;ombox&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the arguments, and remove all blank arguments except for the ones&lt;br /&gt;
	-- listed in cfg.allowBlankParams.&lt;br /&gt;
	do&lt;br /&gt;
		local newArgs = {}&lt;br /&gt;
		for k, v in pairs(args) do&lt;br /&gt;
			if v ~= &#039;&#039; then&lt;br /&gt;
				newArgs[k] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		for i, param in ipairs(obj.cfg.allowBlankParams or {}) do&lt;br /&gt;
			newArgs[param] = args[param]&lt;br /&gt;
		end&lt;br /&gt;
		obj.args = newArgs&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Define internal data structure.&lt;br /&gt;
	obj.categories = {}&lt;br /&gt;
	obj.classes = {}&lt;br /&gt;
	-- For lazy loading of [[Module:Category handler]].&lt;br /&gt;
	obj.hasCategories = false&lt;br /&gt;
&lt;br /&gt;
	return setmetatable(obj, MessageBox)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addCat(ns, cat, sort)&lt;br /&gt;
	if not cat then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	if sort then&lt;br /&gt;
		cat = string.format(&#039;[[Category:%s|%s]]&#039;, cat, sort)&lt;br /&gt;
	else&lt;br /&gt;
		cat = string.format(&#039;[[Category:%s]]&#039;, cat)&lt;br /&gt;
	end&lt;br /&gt;
	self.hasCategories = true&lt;br /&gt;
	self.categories[ns] = self.categories[ns] or {}&lt;br /&gt;
	table.insert(self.categories[ns], cat)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:addClass(class)&lt;br /&gt;
	if not class then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	self.classes[class] = 1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:removeClass(class)&lt;br /&gt;
	if not class then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	self.classes[class] = nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setParameters()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Get type data.&lt;br /&gt;
	self.type = args.type&lt;br /&gt;
	local typeData = cfg.types[self.type]&lt;br /&gt;
	self.invalidTypeError = cfg.showInvalidTypeError&lt;br /&gt;
		and self.type&lt;br /&gt;
		and not typeData&lt;br /&gt;
	typeData = typeData or cfg.types[cfg.default]&lt;br /&gt;
	self.typeClass = typeData.class&lt;br /&gt;
	self.typeImage = typeData.image&lt;br /&gt;
&lt;br /&gt;
	-- Find if the box has been wrongly substituted.&lt;br /&gt;
	self.isSubstituted = cfg.substCheck and args.subst == &#039;SUBST&#039;&lt;br /&gt;
&lt;br /&gt;
	-- Find whether we are using a small message box.&lt;br /&gt;
	self.isSmall = cfg.allowSmall and (&lt;br /&gt;
		cfg.smallParam and args.small == cfg.smallParam&lt;br /&gt;
		or not cfg.smallParam and yesno(args.small)&lt;br /&gt;
	)&lt;br /&gt;
&lt;br /&gt;
	-- Add attributes, classes and styles.&lt;br /&gt;
	self.id = args.id&lt;br /&gt;
	self.name = args.name&lt;br /&gt;
	for _, class in ipairs(cfg.classes or {}) do&lt;br /&gt;
		self:addClass(class)&lt;br /&gt;
	end&lt;br /&gt;
	if self.name then&lt;br /&gt;
		self:addClass(&#039;box-&#039; .. string.gsub(self.name,&#039; &#039;,&#039;_&#039;))&lt;br /&gt;
	end&lt;br /&gt;
	local plainlinks = yesno(args.plainlinks)&lt;br /&gt;
	if plainlinks == true then&lt;br /&gt;
		self:addClass(&#039;plainlinks&#039;)&lt;br /&gt;
	elseif plainlinks == false then&lt;br /&gt;
		self:removeClass(&#039;plainlinks&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self:addClass(cfg.smallClass or &#039;mbox-small&#039;)&lt;br /&gt;
	end&lt;br /&gt;
	self:addClass(self.typeClass)&lt;br /&gt;
	self:addClass(args.class)&lt;br /&gt;
	self.style = args.style&lt;br /&gt;
	self.attrs = args.attrs&lt;br /&gt;
&lt;br /&gt;
	-- Set text style.&lt;br /&gt;
	self.textstyle = args.textstyle&lt;br /&gt;
&lt;br /&gt;
	-- Find if we are on the template page or not. This functionality is only&lt;br /&gt;
	-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory&lt;br /&gt;
	-- and cfg.templateCategoryRequireName are set.&lt;br /&gt;
	self.useCollapsibleTextFields = cfg.useCollapsibleTextFields&lt;br /&gt;
	if self.useCollapsibleTextFields&lt;br /&gt;
		or cfg.templateCategory&lt;br /&gt;
		and cfg.templateCategoryRequireName&lt;br /&gt;
	then&lt;br /&gt;
		if self.name then&lt;br /&gt;
			local templateName = mw.ustring.match(&lt;br /&gt;
				self.name,&lt;br /&gt;
				&#039;^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$&#039;&lt;br /&gt;
			) or self.name&lt;br /&gt;
			templateName = &#039;Template:&#039; .. templateName&lt;br /&gt;
			self.templateTitle = getTitleObject(templateName)&lt;br /&gt;
		end&lt;br /&gt;
		self.isTemplatePage = self.templateTitle&lt;br /&gt;
			and mw.title.equals(self.title, self.templateTitle)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- Process data for collapsible text fields. At the moment these are only&lt;br /&gt;
	-- used in {{ambox}}.&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- Get the self.issue value.&lt;br /&gt;
		if self.isSmall and args.smalltext then&lt;br /&gt;
			self.issue = args.smalltext&lt;br /&gt;
		else&lt;br /&gt;
			local sect&lt;br /&gt;
			if args.sect == &#039;&#039; then&lt;br /&gt;
				sect = &#039;This &#039; .. (cfg.sectionDefault or &#039;page&#039;)&lt;br /&gt;
			elseif type(args.sect) == &#039;string&#039; then&lt;br /&gt;
				sect = &#039;This &#039; .. args.sect&lt;br /&gt;
			end&lt;br /&gt;
			local issue = args.issue&lt;br /&gt;
			issue = type(issue) == &#039;string&#039; and issue ~= &#039;&#039; and issue or nil&lt;br /&gt;
			local text = args.text&lt;br /&gt;
			text = type(text) == &#039;string&#039; and text or nil&lt;br /&gt;
			local issues = {}&lt;br /&gt;
			table.insert(issues, sect)&lt;br /&gt;
			table.insert(issues, issue)&lt;br /&gt;
			table.insert(issues, text)&lt;br /&gt;
			self.issue = table.concat(issues, &#039; &#039;)&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get the self.talk value.&lt;br /&gt;
		local talk = args.talk&lt;br /&gt;
		-- Show talk links on the template page or template subpages if the talk&lt;br /&gt;
		-- parameter is blank.&lt;br /&gt;
		if talk == &#039;&#039;&lt;br /&gt;
			and self.templateTitle&lt;br /&gt;
			and (&lt;br /&gt;
				mw.title.equals(self.templateTitle, self.title)&lt;br /&gt;
				or self.title:isSubpageOf(self.templateTitle)&lt;br /&gt;
			)&lt;br /&gt;
		then&lt;br /&gt;
			talk = &#039;#&#039;&lt;br /&gt;
		elseif talk == &#039;&#039; then&lt;br /&gt;
			talk = nil&lt;br /&gt;
		end&lt;br /&gt;
		if talk then&lt;br /&gt;
			-- If the talk value is a talk page, make a link to that page. Else&lt;br /&gt;
			-- assume that it&#039;s a section heading, and make a link to the talk&lt;br /&gt;
			-- page of the current page with that section heading.&lt;br /&gt;
			local talkTitle = getTitleObject(talk)&lt;br /&gt;
			local talkArgIsTalkPage = true&lt;br /&gt;
			if not talkTitle or not talkTitle.isTalkPage then&lt;br /&gt;
				talkArgIsTalkPage = false&lt;br /&gt;
				talkTitle = getTitleObject(&lt;br /&gt;
					self.title.text,&lt;br /&gt;
					mw.site.namespaces[self.title.namespace].talk.id&lt;br /&gt;
				)&lt;br /&gt;
			end&lt;br /&gt;
			if talkTitle and talkTitle.exists then&lt;br /&gt;
				local talkText = &#039;Relevant discussion may be found on&#039;&lt;br /&gt;
				if talkArgIsTalkPage then&lt;br /&gt;
					talkText = string.format(&lt;br /&gt;
						&#039;%s [[%s|%s]].&#039;,&lt;br /&gt;
						talkText,&lt;br /&gt;
						talk,&lt;br /&gt;
						talkTitle.prefixedText&lt;br /&gt;
					)&lt;br /&gt;
				else&lt;br /&gt;
					talkText = string.format(&lt;br /&gt;
						&#039;%s the [[%s#%s|talk page]].&#039;,&lt;br /&gt;
						talkText,&lt;br /&gt;
						talkTitle.prefixedText,&lt;br /&gt;
						talk&lt;br /&gt;
					)&lt;br /&gt;
				end&lt;br /&gt;
				self.talk = talkText&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- Get other values.&lt;br /&gt;
		self.fix = args.fix ~= &#039;&#039; and args.fix or nil&lt;br /&gt;
		local date&lt;br /&gt;
		if args.date and args.date ~= &#039;&#039; then&lt;br /&gt;
			date = args.date&lt;br /&gt;
		elseif args.date == &#039;&#039; and self.isTemplatePage then&lt;br /&gt;
			date = lang:formatDate(&#039;F Y&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if date then&lt;br /&gt;
			self.date = string.format(&amp;quot; &amp;lt;small class=&#039;date-container&#039;&amp;gt;&#039;&#039;(&amp;lt;span class=&#039;date&#039;&amp;gt;%s&amp;lt;/span&amp;gt;)&#039;&#039;&amp;lt;/small&amp;gt;&amp;quot;, date)&lt;br /&gt;
		end&lt;br /&gt;
		self.info = args.info&lt;br /&gt;
		if yesno(args.removalnotice) then&lt;br /&gt;
			self.removalNotice = cfg.removalNotice&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the non-collapsible text field. At the moment this is used by all box&lt;br /&gt;
	-- types other than ambox, and also by ambox when small=yes.&lt;br /&gt;
	if self.isSmall then&lt;br /&gt;
		self.text = args.smalltext or args.text&lt;br /&gt;
	else&lt;br /&gt;
		self.text = args.text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Set the below row.&lt;br /&gt;
	self.below = cfg.below and args.below&lt;br /&gt;
&lt;br /&gt;
	-- General image settings.&lt;br /&gt;
	self.imageCellDiv = not self.isSmall and cfg.imageCellDiv&lt;br /&gt;
	self.imageEmptyCell = cfg.imageEmptyCell&lt;br /&gt;
	if cfg.imageEmptyCellStyle then&lt;br /&gt;
		self.imageEmptyCellStyle = &#039;border:none;padding:0px;width:1px&#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Left image settings.&lt;br /&gt;
	local imageLeft = self.isSmall and args.smallimage or args.image&lt;br /&gt;
	if cfg.imageCheckBlank and imageLeft ~= &#039;blank&#039; and imageLeft ~= &#039;none&#039;&lt;br /&gt;
		or not cfg.imageCheckBlank and imageLeft ~= &#039;none&#039;&lt;br /&gt;
	then&lt;br /&gt;
		self.imageLeft = imageLeft&lt;br /&gt;
		if not imageLeft then&lt;br /&gt;
			local imageSize = self.isSmall&lt;br /&gt;
				and (cfg.imageSmallSize or &#039;30x30px&#039;)&lt;br /&gt;
				or &#039;40x40px&#039;&lt;br /&gt;
			self.imageLeft = string.format(&#039;[[File:%s|%s|link=|alt=]]&#039;, self.typeImage&lt;br /&gt;
				or &#039;Information icon4.svg&#039;, imageSize)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Right image settings.&lt;br /&gt;
	local imageRight = self.isSmall and args.smallimageright or args.imageright&lt;br /&gt;
	if not (cfg.imageRightNone and imageRight == &#039;none&#039;) then&lt;br /&gt;
		self.imageRight = imageRight&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setMainspaceCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	if not cfg.allowMainspaceCategories then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local nums = {}&lt;br /&gt;
	for _, prefix in ipairs{&#039;cat&#039;, &#039;category&#039;, &#039;all&#039;} do&lt;br /&gt;
		args[prefix .. &#039;1&#039;] = args[prefix]&lt;br /&gt;
		nums = union(nums, getArgNums(args, prefix))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- The following is roughly equivalent to the old {{Ambox/category}}.&lt;br /&gt;
	local date = args.date&lt;br /&gt;
	date = type(date) == &#039;string&#039; and date&lt;br /&gt;
	local preposition = &#039;from&#039;&lt;br /&gt;
	for _, num in ipairs(nums) do&lt;br /&gt;
		local mainCat = args[&#039;cat&#039; .. tostring(num)]&lt;br /&gt;
			or args[&#039;category&#039; .. tostring(num)]&lt;br /&gt;
		local allCat = args[&#039;all&#039; .. tostring(num)]&lt;br /&gt;
		mainCat = type(mainCat) == &#039;string&#039; and mainCat&lt;br /&gt;
		allCat = type(allCat) == &#039;string&#039; and allCat&lt;br /&gt;
		if mainCat and date and date ~= &#039;&#039; then&lt;br /&gt;
			local catTitle = string.format(&#039;%s %s %s&#039;, mainCat, preposition, date)&lt;br /&gt;
			self:addCat(0, catTitle)&lt;br /&gt;
			catTitle = getTitleObject(&#039;Category:&#039; .. catTitle)&lt;br /&gt;
			if not catTitle or not catTitle.exists then&lt;br /&gt;
				self:addCat(0, &#039;Articles with invalid date parameter in template&#039;)&lt;br /&gt;
			end&lt;br /&gt;
		elseif mainCat and (not date or date == &#039;&#039;) then&lt;br /&gt;
			self:addCat(0, mainCat)&lt;br /&gt;
		end&lt;br /&gt;
		if allCat then&lt;br /&gt;
			self:addCat(0, allCat)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setTemplateCategories()&lt;br /&gt;
	local args = self.args&lt;br /&gt;
	local cfg = self.cfg&lt;br /&gt;
&lt;br /&gt;
	-- Add template categories.&lt;br /&gt;
	if cfg.templateCategory then&lt;br /&gt;
		if cfg.templateCategoryRequireName then&lt;br /&gt;
			if self.isTemplatePage then&lt;br /&gt;
				self:addCat(10, cfg.templateCategory)&lt;br /&gt;
			end&lt;br /&gt;
		elseif not self.title.isSubpage then&lt;br /&gt;
			self:addCat(10, cfg.templateCategory)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add template error categories.&lt;br /&gt;
	if cfg.templateErrorCategory then&lt;br /&gt;
		local templateErrorCategory = cfg.templateErrorCategory&lt;br /&gt;
		local templateCat, templateSort&lt;br /&gt;
		if not self.name and not self.title.isSubpage then&lt;br /&gt;
			templateCat = templateErrorCategory&lt;br /&gt;
		elseif self.isTemplatePage then&lt;br /&gt;
			local paramsToCheck = cfg.templateErrorParamsToCheck or {}&lt;br /&gt;
			local count = 0&lt;br /&gt;
			for i, param in ipairs(paramsToCheck) do&lt;br /&gt;
				if not args[param] then&lt;br /&gt;
					count = count + 1&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if count &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = tostring(count)&lt;br /&gt;
			end&lt;br /&gt;
			if self.categoryNums and #self.categoryNums &amp;gt; 0 then&lt;br /&gt;
				templateCat = templateErrorCategory&lt;br /&gt;
				templateSort = &#039;C&#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		self:addCat(10, templateCat, templateSort)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setAllNamespaceCategories()&lt;br /&gt;
	-- Set categories for all namespaces.&lt;br /&gt;
	if self.isSubstituted then&lt;br /&gt;
		self:addCat(&#039;all&#039;, &#039;Pages with incorrectly substituted templates&#039;)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:setCategories()&lt;br /&gt;
	if self.title.namespace == 0 then&lt;br /&gt;
		self:setMainspaceCategories()&lt;br /&gt;
	elseif self.title.namespace == 10 then&lt;br /&gt;
		self:setTemplateCategories()&lt;br /&gt;
	end&lt;br /&gt;
	self:setAllNamespaceCategories()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:renderCategories()&lt;br /&gt;
	if not self.hasCategories then&lt;br /&gt;
		-- No categories added, no need to pass them to Category handler so,&lt;br /&gt;
		-- if it was invoked, it would return the empty string.&lt;br /&gt;
		-- So we shortcut and return the empty string.&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	-- Convert category tables to strings and pass them through&lt;br /&gt;
	-- [[Module:Category handler]].&lt;br /&gt;
	return require(&#039;Module:Category handler&#039;)._main{&lt;br /&gt;
		main = table.concat(self.categories[0] or {}),&lt;br /&gt;
		template = table.concat(self.categories[10] or {}),&lt;br /&gt;
		all = table.concat(self.categories.all or {}),&lt;br /&gt;
		nocat = self.args.nocat,&lt;br /&gt;
		page = self.args.page&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function MessageBox:export()&lt;br /&gt;
	local root = mw.html.create()&lt;br /&gt;
&lt;br /&gt;
	-- Add the subst check error.&lt;br /&gt;
	if self.isSubstituted and self.name then&lt;br /&gt;
		root:tag(&#039;b&#039;)&lt;br /&gt;
			:addClass(&#039;error&#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&#039;Template &amp;lt;code&amp;gt;%s[[Template:%s|%s]]%s&amp;lt;/code&amp;gt; has been incorrectly substituted.&#039;,&lt;br /&gt;
				mw.text.nowiki(&#039;{{&#039;), self.name, self.name, mw.text.nowiki(&#039;}}&#039;)&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add TemplateStyles&lt;br /&gt;
	root:wikitext(mw.getCurrentFrame():extensionTag{&lt;br /&gt;
		name = &#039;templatestyles&#039;,&lt;br /&gt;
		args = { src = TEMPLATE_STYLES:format(self.boxType) },&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	-- Create the box table.&lt;br /&gt;
	local boxTable&lt;br /&gt;
	-- Check for fmbox because not all interface messages have mw-parser-output&lt;br /&gt;
	-- which is necessary for TemplateStyles. Add the wrapper class if it is and&lt;br /&gt;
	-- then start the actual mbox, else start the mbox.&lt;br /&gt;
	if self.boxType == &#039;fmbox&#039; then&lt;br /&gt;
		boxTable = root:tag(&#039;div&#039;)&lt;br /&gt;
			:addClass(&#039;mw-parser-output&#039;)&lt;br /&gt;
			:tag(&#039;table&#039;)&lt;br /&gt;
	else&lt;br /&gt;
		boxTable = root:tag(&#039;table&#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	boxTable:attr(&#039;id&#039;, self.id or nil)&lt;br /&gt;
	for class, _ in pairs(self.classes or {}) do&lt;br /&gt;
		boxTable:addClass(class or nil)&lt;br /&gt;
	end&lt;br /&gt;
	boxTable&lt;br /&gt;
		:cssText(self.style or nil)&lt;br /&gt;
		:attr(&#039;role&#039;, &#039;presentation&#039;)&lt;br /&gt;
&lt;br /&gt;
	if self.attrs then&lt;br /&gt;
		boxTable:attr(self.attrs)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the left-hand image.&lt;br /&gt;
	local row = boxTable:tag(&#039;tr&#039;)&lt;br /&gt;
	if self.imageLeft then&lt;br /&gt;
		local imageLeftCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-image&#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageLeftCell so that the image&lt;br /&gt;
			-- is inside it. Divs use style=&amp;quot;width: 52px;&amp;quot;, which limits the&lt;br /&gt;
			-- image width to 52px. If any images in a div are wider than that,&lt;br /&gt;
			-- they may overlap with the text or cause other display problems.&lt;br /&gt;
			imageLeftCell = imageLeftCell:tag(&#039;div&#039;):css(&#039;width&#039;, &#039;52px&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageLeftCell:wikitext(self.imageLeft or nil)&lt;br /&gt;
	elseif self.imageEmptyCell then&lt;br /&gt;
		-- Some message boxes define an empty cell if no image is specified, and&lt;br /&gt;
		-- some don&#039;t. The old template code in templates where empty cells are&lt;br /&gt;
		-- specified gives the following hint: &amp;quot;No image. Cell with some width&lt;br /&gt;
		-- or padding necessary for text cell to have 100% width.&amp;quot;&lt;br /&gt;
		row:tag(&#039;td&#039;)&lt;br /&gt;
			:addClass(&#039;mbox-empty-cell&#039;)&lt;br /&gt;
			:cssText(self.imageEmptyCellStyle or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the text.&lt;br /&gt;
	local textCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-text&#039;)&lt;br /&gt;
	if self.useCollapsibleTextFields then&lt;br /&gt;
		-- The message box uses advanced text parameters that allow things to be&lt;br /&gt;
		-- collapsible. At the moment, only ambox uses this.&lt;br /&gt;
		textCell:cssText(self.textstyle or nil)&lt;br /&gt;
		local textCellDiv = textCell:tag(&#039;div&#039;)&lt;br /&gt;
		textCellDiv&lt;br /&gt;
			:addClass(&#039;mbox-text-span&#039;)&lt;br /&gt;
			:wikitext(self.issue or nil)&lt;br /&gt;
		if (self.talk or self.fix) and not self.isSmall then&lt;br /&gt;
			textCellDiv:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:wikitext(self.talk and (&#039; &#039; .. self.talk) or nil)&lt;br /&gt;
				:wikitext(self.fix and (&#039; &#039; .. self.fix) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		textCellDiv:wikitext(self.date and (&#039; &#039; .. self.date) or nil)&lt;br /&gt;
		if self.info and not self.isSmall then&lt;br /&gt;
			textCellDiv&lt;br /&gt;
				:tag(&#039;span&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:wikitext(self.info and (&#039; &#039; .. self.info) or nil)&lt;br /&gt;
		end&lt;br /&gt;
		if self.removalNotice then&lt;br /&gt;
			textCellDiv:tag(&#039;small&#039;)&lt;br /&gt;
				:addClass(&#039;hide-when-compact&#039;)&lt;br /&gt;
				:tag(&#039;i&#039;)&lt;br /&gt;
					:wikitext(string.format(&amp;quot; (%s)&amp;quot;, self.removalNotice))&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		-- Default text formatting - anything goes.&lt;br /&gt;
		textCell&lt;br /&gt;
			:cssText(self.textstyle or nil)&lt;br /&gt;
			:wikitext(self.text or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the right-hand image.&lt;br /&gt;
	if self.imageRight then&lt;br /&gt;
		local imageRightCell = row:tag(&#039;td&#039;):addClass(&#039;mbox-imageright&#039;)&lt;br /&gt;
		if self.imageCellDiv then&lt;br /&gt;
			-- If we are using a div, redefine imageRightCell so that the image&lt;br /&gt;
			-- is inside it.&lt;br /&gt;
			imageRightCell = imageRightCell:tag(&#039;div&#039;):css(&#039;width&#039;, &#039;52px&#039;)&lt;br /&gt;
		end&lt;br /&gt;
		imageRightCell&lt;br /&gt;
			:wikitext(self.imageRight or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add the below row.&lt;br /&gt;
	if self.below then&lt;br /&gt;
		boxTable:tag(&#039;tr&#039;)&lt;br /&gt;
			:tag(&#039;td&#039;)&lt;br /&gt;
				:attr(&#039;colspan&#039;, self.imageRight and &#039;3&#039; or &#039;2&#039;)&lt;br /&gt;
				:addClass(&#039;mbox-text&#039;)&lt;br /&gt;
				:cssText(self.textstyle or nil)&lt;br /&gt;
				:wikitext(self.below or nil)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add error message for invalid type parameters.&lt;br /&gt;
	if self.invalidTypeError then&lt;br /&gt;
		root:tag(&#039;div&#039;)&lt;br /&gt;
			:css(&#039;text-align&#039;, &#039;center&#039;)&lt;br /&gt;
			:wikitext(string.format(&lt;br /&gt;
				&#039;This message box is using an invalid &amp;quot;type=%s&amp;quot; parameter and needs fixing.&#039;,&lt;br /&gt;
				self.type or &#039;&#039;&lt;br /&gt;
			))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add categories.&lt;br /&gt;
	root:wikitext(self:renderCategories() or nil)&lt;br /&gt;
&lt;br /&gt;
	return tostring(root)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
-- Exports&lt;br /&gt;
--------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local p, mt = {}, {}&lt;br /&gt;
&lt;br /&gt;
function p._exportClasses()&lt;br /&gt;
	-- For testing.&lt;br /&gt;
	return {&lt;br /&gt;
		MessageBox = MessageBox&lt;br /&gt;
	}&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(boxType, args, cfgTables)&lt;br /&gt;
	local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))&lt;br /&gt;
	box:setParameters()&lt;br /&gt;
	box:setCategories()&lt;br /&gt;
	return box:export()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function mt.__index(t, k)&lt;br /&gt;
	return function (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 t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return setmetatable(p, mt)&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Finance&amp;diff=582</id>
		<title>Finance</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Finance&amp;diff=582"/>
		<updated>2025-08-29T03:13:02Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Reverted edit by Ampdot (talk) to last revision by 172.71.151.89&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Revenue ==&lt;br /&gt;
&lt;br /&gt;
=== Grants ===&lt;br /&gt;
Message [https://matrix.to/#/@moonfern:mesh.host moonfern] about Project Stratosphere (a rough prototype of a grant aggregator/search engine) to find publicly known grants that might be relevant to you. Project Stratosphere is still in development and may be unreliable.&lt;br /&gt;
&lt;br /&gt;
=== Crowdfunding ===&lt;br /&gt;
[https://manifund.org/ Manifund] can be used as a 501(c)3 eligible fiscal sponsor for projects with charitable or altruistic aims.&lt;br /&gt;
&lt;br /&gt;
=== P2P funding ===&lt;br /&gt;
Gifts within the [https://www.irs.gov/businesses/small-businesses-self-employed/frequently-asked-questions-on-gift-taxes annual or lifetime exclusion limit] are not taxable. If you would be put in a higher tax bracket than your recipient would be put in, less taxes would need be paid total if you gift the recipient the asset (such as stocks or crypto) and they sell it immediately, than if you sell it and gift them the returns. Make sure to compensate for the taxes they will need to pay when converting to stock, since they will inherit your [https://ttlc.intuit.com/turbotax-support/en-us/help-article/investment-income/determine-cost-basis-stock-received-gift/L4bZeNvpc_US_en_US cost basis].&lt;br /&gt;
&lt;br /&gt;
== Expenses ==&lt;br /&gt;
&lt;br /&gt;
=== Cryptocurrency ===&lt;br /&gt;
&lt;br /&gt;
==== On and off ramps ====&lt;br /&gt;
Kraken is the best centralized exchange (CEX) for buying cryptocurrencies. You can get the best rates by using [https://pro.kraken.com Kraken Pro] (it&#039;s free, just a different user interface with lower fees) and checking &amp;quot;Post only.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Coinbase is the best way to liquidate USDC for USD– it does so at a 1:1 ratio with high limits.&lt;br /&gt;
&lt;br /&gt;
==== Wallets ====&lt;br /&gt;
For Ethereum usage on desktop, Rabby is recommended. It supports hardware wallets, bridging between L2s, has an integrated browser for interacting with web3 applications (&amp;quot;dapps&amp;quot;), and you can pay gas using USDC. For Ethereum usage in a browser, Rainbow wallet is recommended.&lt;br /&gt;
&lt;br /&gt;
=== Medical debt ===&lt;br /&gt;
* Medical debt below $500 will not show on a credit report&lt;br /&gt;
* Once debt gets sent to collections, you can usually negotiate for a lump sum payment 20-40% off&lt;br /&gt;
* If the debt was sent to collections recently, you can often still pay with the hospital directly&lt;br /&gt;
* Ask the hospital or collections agency to itemize the bill, which will often reduce the amount&lt;br /&gt;
* (Charisma roll required) You can &amp;quot;call bait&amp;quot; a debt collector into committing an FDCPA violation, which can reduce the amount of debt by up to $1000&lt;br /&gt;
&lt;br /&gt;
==== See also ====&lt;br /&gt;
[https://www.reddit.com/r/UnethicalLifeProTips/comments/hr6ccy/ulpt_how_to_dispute_medical_debt_the_right/ How to dispute medical debt the right way]&lt;br /&gt;
&lt;br /&gt;
=== Reimbursements ===&lt;br /&gt;
When reimbursing friends, include &amp;quot;reimbursement&amp;quot; in the memo field. This ensures the IRS is aware the and the money is less likely to be scrutinized as possible income. The IRS has required Venmo, Cash App, PayPal, and other p2p money transfer apps to report transactions to them if the total received exceeded $5000 for the 2024 tax year, and intends to lower it to $600.&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Finance&amp;diff=581</id>
		<title>Finance</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Finance&amp;diff=581"/>
		<updated>2025-08-29T03:10:00Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Reverted edit by 172.71.151.89 (talk) to last revision by Ampdot&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Revenue ==&lt;br /&gt;
&lt;br /&gt;
=== Grants ===&lt;br /&gt;
Message [https://matrix.to/#/@moonfern:mesh.host moonfern] about Project Stratosphere (a rough prototype of a grant aggregator/search engine) to find publicly known grants that might be relevant to you. Project Stratosphere is still in development and may be unreliable.&lt;br /&gt;
&lt;br /&gt;
=== Crowdfunding ===&lt;br /&gt;
[https://manifund.org/ Manifund] can be used as a 501(c)3 eligible fiscal sponsor for projects with charitable or altruistic aims.&lt;br /&gt;
&lt;br /&gt;
=== P2P funding ===&lt;br /&gt;
Gifts within the [https://www.irs.gov/businesses/small-businesses-self-employed/frequently-asked-questions-on-gift-taxes annual or lifetime exclusion limit] are not taxable. If you would be put in a higher tax bracket than your recipient would be put in, less taxes would need be paid total if you gift the recipient the asset (such as stocks or crypto) and they sell it immediately, than if you sell it and gift them the returns. Make sure to compensate for the taxes they will need to pay when converting to stock, since they will inherit your [https://ttlc.intuit.com/turbotax-support/en-us/help-article/investment-income/determine-cost-basis-stock-received-gift/L4bZeNvpc_US_en_US cost basis].&lt;br /&gt;
&lt;br /&gt;
== Expenses ==&lt;br /&gt;
&lt;br /&gt;
=== Cryptocurrency ===&lt;br /&gt;
&lt;br /&gt;
==== On and off ramps ====&lt;br /&gt;
Kraken is the best centralized exchange (CEX) for buying cryptocurrencies. You can get the best rates by using [https://pro.kraken.com Kraken Pro] (it&#039;s free, just a different user interface with lower fees) and checking &amp;quot;Post only.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Coinbase is the best way to liquidate USDC for USD– it does so at a 1:1 ratio with high limits.&lt;br /&gt;
&lt;br /&gt;
==== Wallets ====&lt;br /&gt;
For Ethereum-only usage, Rabby is recommended. It supports hardware wallets, bridging between L2s, has an integrated browser for interacting with web3 applications (&amp;quot;dapps&amp;quot;), and you can pay gas using USDC.&lt;br /&gt;
&lt;br /&gt;
=== Medical debt ===&lt;br /&gt;
* Medical debt below $500 will not show on a credit report&lt;br /&gt;
* Once debt gets sent to collections, you can usually negotiate for a lump sum payment 20-40% off&lt;br /&gt;
* If the debt was sent to collections recently, you can often still pay with the hospital directly&lt;br /&gt;
* Ask the hospital or collections agency to itemize the bill, which will often reduce the amount&lt;br /&gt;
* (Charisma roll required) You can &amp;quot;call bait&amp;quot; a debt collector into committing an FDCPA violation, which can reduce the amount of debt by up to $1000&lt;br /&gt;
&lt;br /&gt;
==== See also ====&lt;br /&gt;
[https://www.reddit.com/r/UnethicalLifeProTips/comments/hr6ccy/ulpt_how_to_dispute_medical_debt_the_right/ How to dispute medical debt the right way]&lt;br /&gt;
&lt;br /&gt;
=== Reimbursements ===&lt;br /&gt;
When reimbursing friends, include &amp;quot;reimbursement&amp;quot; in the memo field. This ensures the IRS is aware the and the money is less likely to be scrutinized as possible income. The IRS has required Venmo, Cash App, PayPal, and other p2p money transfer apps to report transactions to them if the total received exceeded $5000 for the 2024 tax year, and intends to lower it to $600.&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=An_Ontology_of_Networking&amp;diff=579</id>
		<title>An Ontology of Networking</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=An_Ontology_of_Networking&amp;diff=579"/>
		<updated>2025-08-29T01:25:48Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Inbound networking is when people reach out to you&lt;br /&gt;
&lt;br /&gt;
Outbound networking is when you reach out to other people&lt;br /&gt;
&lt;br /&gt;
Good networking balances both methods, because they attract different people&lt;br /&gt;
&lt;br /&gt;
Warm networking is when outreach occurs through friends who know you, or know them&lt;br /&gt;
&lt;br /&gt;
Cold networking is when outreach occurs through public sources, such as email or twitter&lt;br /&gt;
&lt;br /&gt;
Good networking balances both methods, because they attract different people&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! &lt;br /&gt;
! Inbound&lt;br /&gt;
! Outbound&lt;br /&gt;
|-&lt;br /&gt;
! Warm&lt;br /&gt;
| Warm inbound&lt;br /&gt;
| Warm outbound&lt;br /&gt;
|-&lt;br /&gt;
! Cold&lt;br /&gt;
| Cold inbound&lt;br /&gt;
| Cold outbound&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=A_Cybernetic_Perspective_on_Social_Coordination_and_Community_Building&amp;diff=578</id>
		<title>A Cybernetic Perspective on Social Coordination and Community Building</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=A_Cybernetic_Perspective_on_Social_Coordination_and_Community_Building&amp;diff=578"/>
		<updated>2025-08-29T01:25:18Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Ampdot moved page A Cybernetic Perspective on Social Coordination and Community Building to Draft:A Cybernetic Perspective on Social Coordination and Community Building: Inappropriate for the main wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Draft:A Cybernetic Perspective on Social Coordination and Community Building]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Draft:A_Cybernetic_Perspective_on_Social_Coordination_and_Community_Building&amp;diff=577</id>
		<title>Draft:A Cybernetic Perspective on Social Coordination and Community Building</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Draft:A_Cybernetic_Perspective_on_Social_Coordination_and_Community_Building&amp;diff=577"/>
		<updated>2025-08-29T01:25:18Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Ampdot moved page A Cybernetic Perspective on Social Coordination and Community Building to Draft:A Cybernetic Perspective on Social Coordination and Community Building: Inappropriate for the main wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;https://en.wikipedia.org/wiki/The_purpose_of_a_system_is_what_it_does&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=User:Ampdot/ampstack&amp;diff=576</id>
		<title>User:Ampdot/ampstack</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=User:Ampdot/ampstack&amp;diff=576"/>
		<updated>2025-08-29T01:24:41Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: Ampdot moved page Ampstack to User:Ampdot/ampstack without leaving a redirect: Inappropriate for the main wiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ampstack zero =&lt;br /&gt;
absolute minimum set of technical specifications to ease integration with software and infrastructure by amp&lt;br /&gt;
&lt;br /&gt;
* Python&lt;br /&gt;
** amp is very good at Python and not so good at other languages&lt;br /&gt;
* Poetry&lt;br /&gt;
** standardized dependency management helpful for integration&lt;br /&gt;
* [https://github.com/CrazyPython/embed_server embed_server for embeddings]. Supports OpenAI and open-source embeddings.&lt;br /&gt;
** abstracts away API key and RAM management&lt;br /&gt;
** allows re-running programs without needing to load embedding model back into RAM&lt;br /&gt;
** implements caching&lt;br /&gt;
** allows moving compute-heavy portions across network boundary&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Mindsets&amp;diff=575</id>
		<title>Mindsets</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Mindsets&amp;diff=575"/>
		<updated>2025-08-29T01:23:49Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* On making effective plans: [https://www.scotthyoung.com/blog/2020/05/04/do-the-real-thing/ Do the Real Thing], or better vibes: [https://www.rationality.org/files/CFAR_Handbook_2021-01.pdf#page=192 Turbocharging]&lt;br /&gt;
* On forming long-lasting close friendships: [https://gist.github.com/gtallen1187/27a585fcf36d6e657db2 Scar Tissues Make Relationships Wear Out]&lt;br /&gt;
* On agency: [https://milan.cvitkovic.net/writing/things_youre_allowed_to_do/ Things You&#039;re Allowed to Do]&lt;br /&gt;
* On networking: [[An Ontology of Networking]]&lt;br /&gt;
* On learning new things: [https://web.archive.org/web/20250107025705/https://cohost.org/amplified/post/206049-the-rwx-framework the rwx framework]&lt;br /&gt;
* On dealing with maladaptive mental patterns: [[Self-love]]&lt;br /&gt;
* On doings things quickly: [https://patrickcollison.com/fast Fast], as a case study [https://www.stripes.com/theaters/us/2023-06-28/1-95-bridge-reopens-10577990.html How the I-95 bridge reopened just 12 days after fiery collapse], or more legibly [https://www.lesswrong.com/posts/EsxowsJsRopTGALCX/one-day-sooner One Day Sooner]&lt;br /&gt;
* On picking your research direction: [[Memes/All The Best Work Has Been Done Over Here]]&lt;br /&gt;
* On delivering fewer items quickly with less stress and why that&#039;s good: [https://less.works/less/principles/queueing_theory Queuing Theory] or shorter and with less jargon: [https://www.lesswrong.com/posts/yLLkWMDbC9ZNKbjDG/slack Slack]&lt;br /&gt;
* On project management: [https://less.works/ Large Scale Scrum]&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Amazon_Returns&amp;diff=574</id>
		<title>Amazon Returns</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Amazon_Returns&amp;diff=574"/>
		<updated>2025-08-29T01:23:19Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;You can use DoorDash to send a driver to pick up a package and take it to UPS for returns. You don&#039;t need to print anything, you send the QR code in driver chat after initiating the order.&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Business_Skills&amp;diff=573</id>
		<title>Business Skills</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Business_Skills&amp;diff=573"/>
		<updated>2025-08-29T01:23:02Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;* basic common sense!&lt;br /&gt;
* checking your email&lt;br /&gt;
* using your calendar&lt;br /&gt;
* creating win-win opportunities&lt;br /&gt;
** most failed business ideas come from people who think that business is all about scamming people&lt;br /&gt;
&lt;br /&gt;
business = you do stuff&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Japanese_learning_resources&amp;diff=572</id>
		<title>Japanese learning resources</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Japanese_learning_resources&amp;diff=572"/>
		<updated>2025-08-29T01:22:42Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Gamb&#039;s Guide ==&lt;br /&gt;
This is the main resource that I was using to give an order to learn things in. It&#039;s focused on being able to read untranslated visual novels in Japanese. It proposes:&lt;br /&gt;
&lt;br /&gt;
* Learning hiragana and katakana first&lt;br /&gt;
* Learning grammar from reading a textbook as fast as possible&lt;br /&gt;
* Then learning vocabulary from flashcards until you know 2000 - 6000 words&lt;br /&gt;
* Then reading native material (namely, VNs)&lt;br /&gt;
&lt;br /&gt;
== djtguide Learn Kana ==&lt;br /&gt;
A [https://djtguide.github.io/learn/kana.html kana recognition training game]. Shows you a kana and scores you on whether you recognize it, with the ability to choose which kana are shown (so you can fully learn five, and then the next five, and so on).   &lt;br /&gt;
&lt;br /&gt;
== Duolingo ==&lt;br /&gt;
Duolingo&#039;s focus on teaching is listening practice for individual Japanese sentences, and handwriting practise for kana and kanji.&lt;br /&gt;
&lt;br /&gt;
== WaniKani ==&lt;br /&gt;
WaniKani teaches reading individual words, focusing on reading kanji, hence the name.&lt;br /&gt;
&lt;br /&gt;
The advice for learning Japanese kanji given in Gamb&#039;s guide is that kanji don&#039;t appear on their own and don&#039;t have pronunciations independent of being in words; in Japanese, kanji are just sememes. There&#039;s hence no meaningful notion of &amp;quot;learning kanji&amp;quot; seperately from learning vocabulary.&lt;br /&gt;
&lt;br /&gt;
WaniKani disbelieves this, and instead&lt;br /&gt;
&lt;br /&gt;
* teaches a set of WaniKani platform-specific kanji-parts, called radicals, that each appear in many kanji. Because these are formed from the same generator of breaking down kanij, WaniKani&#039;s radical list has overlap with other lists of radicals&lt;br /&gt;
* once a radical has been learned, teaches the kanji that contain that radical, with their primary meaning and the list of possible pronunciations that it can take when it appears in a word&lt;br /&gt;
* once the kanji and its pronunciations have been learned, teaches words that contain that kanji.&lt;br /&gt;
&lt;br /&gt;
Each radical, kanji and word come with associated mneumonics for the shape and where relevant pronunciation.&lt;br /&gt;
&lt;br /&gt;
This means that rather than learning kanji as being drawn from the infinite space of possible squiggles, they&#039;re learned as draws from a more finite space of easier-to-learn WaniKani radicals; and rather than learning words as being drawn from a large space of valid strings of Japanese phonemes, from a more finite space of possible readings for their component kanji; at the cost of adding a lot of additional scaffolding to learn that isn&#039;t used at higher levels or outside of WaniKani. &lt;br /&gt;
&lt;br /&gt;
== Iago ==&lt;br /&gt;
&lt;br /&gt;
== Anki ==&lt;br /&gt;
&lt;br /&gt;
== Dictionaries ==&lt;br /&gt;
Wiktionary contains basically every Japanese word. The benefit I find from Wiktionary is that, for each word, it includes the Japanese word, and the Chinese etymology of the kanji, which can make the meaning clearer or more memorable. For example, the page for 食 has &lt;br /&gt;
&lt;br /&gt;
* every definition and reading of 食 used in Japanese&lt;br /&gt;
* the Kangxi radical and composition; in this case, it&#039;s 食 with no extra strokes&lt;br /&gt;
* the etymology; it explains that 食 in the Oracle Bone script was a picture of a mouth over a bowl of rice.&lt;br /&gt;
&lt;br /&gt;
The Oxford Beginner&#039;s Japanese Dictionary has a subset of Japanese words, because dictionaries are finite in size. It&#039;s a paper dictionary, which I like. It&#039;s bilingual between Japanese and British English &lt;br /&gt;
&lt;br /&gt;
Jisho&lt;br /&gt;
&lt;br /&gt;
== NHK News Easy ==&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Hormone_Replacement_Therapy&amp;diff=571</id>
		<title>Hormone Replacement Therapy</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Hormone_Replacement_Therapy&amp;diff=571"/>
		<updated>2025-08-29T01:22:27Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Estrogen ==&lt;br /&gt;
&lt;br /&gt;
=== Sourcing ===&lt;br /&gt;
[https://hrt.coffee/ hrt.coffee]&lt;br /&gt;
&lt;br /&gt;
[https://diyhrt.market/ diyhrt.market/]&lt;br /&gt;
&lt;br /&gt;
=== Dosing ===&lt;br /&gt;
[https://transfemscience.org/misc/injectable-e2-simulator/ Simple estrogen simulator from transfemscience.org]&lt;br /&gt;
&lt;br /&gt;
[https://estrannai.se/ Advanced estrogen simulator with support for dose stacking]&lt;br /&gt;
&lt;br /&gt;
=== Formulations ===&lt;br /&gt;
Enthanate has significantly worse absorption than cypionate.&lt;br /&gt;
&lt;br /&gt;
=== Stockpiling ===&lt;br /&gt;
TODO: Outline remaining steps on estrogen stockpiling project&lt;br /&gt;
[[Category:Information]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Draft:Shared_Infrastructure&amp;diff=570</id>
		<title>Draft:Shared Infrastructure</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Draft:Shared_Infrastructure&amp;diff=570"/>
		<updated>2025-08-29T01:21:25Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+&lt;br /&gt;
!Service&lt;br /&gt;
!Address&lt;br /&gt;
!Web login&lt;br /&gt;
!Notes&lt;br /&gt;
!Access Policy&lt;br /&gt;
|-&lt;br /&gt;
|Email&lt;br /&gt;
|@mesh.host&lt;br /&gt;
|https://webmail.migadu.com/&lt;br /&gt;
|Primary admin: [[User:Ampdot|ampdot]]&lt;br /&gt;
|Any node may request&lt;br /&gt;
|-&lt;br /&gt;
|Matrix&lt;br /&gt;
(Element)&lt;br /&gt;
|mesh.host&lt;br /&gt;
|https://app.element.io/#/login&lt;br /&gt;
|Running on [https://conduit.rs/ Conduit]&lt;br /&gt;
Primary admin: [https://matrix.to/#/@claire:mesh.host Claire]&lt;br /&gt;
|Any node may request&lt;br /&gt;
|-&lt;br /&gt;
|Elysium&lt;br /&gt;
|elysium.mesh.host&lt;br /&gt;
|N/A&lt;br /&gt;
|Primary admin: ampdot&lt;br /&gt;
DevOps volunteer: antra54 (Discord)&lt;br /&gt;
|As-needed for research use&lt;br /&gt;
|-&lt;br /&gt;
|Cyborgism Discord server&lt;br /&gt;
|&lt;br /&gt;
|&lt;br /&gt;
|Primary admin: janus&lt;br /&gt;
|Two moderators must approve&lt;br /&gt;
|-&lt;br /&gt;
|Wiki&lt;br /&gt;
|mesh.host/wiki&lt;br /&gt;
|https://mesh.host/wiki&lt;br /&gt;
|Primary admin: [[User:Ampdot|ampdot]]&lt;br /&gt;
|Anyone can contribute&lt;br /&gt;
|}&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Elysium&amp;diff=569</id>
		<title>Elysium</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Elysium&amp;diff=569"/>
		<updated>2025-08-29T01:20:51Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Elysium is a desktop computer used as a server, currently located in Seattle. In addition to general-purpose research and development use, it hosts several [https://ampdot.mesh.host/chapter2 Chapter II]-based ems which participate in [https://cyborgism.wiki/hypha/act_i Act I].&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
* 12900K - 16 cores, 24 threads @ 5.2GhZ&lt;br /&gt;
* 128GB high-bandwidth DDR5 RAM&lt;br /&gt;
* RTX 3090&lt;br /&gt;
* 8TB boot disk&lt;br /&gt;
* 4TB auxillary disk&lt;br /&gt;
* Up to 1Gb/s download speed&lt;br /&gt;
* Up to 50Mb/s upload speed&lt;br /&gt;
&lt;br /&gt;
== Setup instructions ==&lt;br /&gt;
&lt;br /&gt;
# Download and install [https://tailscale.com/ Tailscale]&lt;br /&gt;
#* Some VPNs are incompatible and you may need to disable them.&lt;br /&gt;
# Join using a Tailscale invite link&lt;br /&gt;
# [https://elysium.mesh.host/ Verify connectivity] by verify that that page loads&lt;br /&gt;
# While some services are available to all users, request appropriate permissions for user login&lt;br /&gt;
&lt;br /&gt;
== Recommended tools ==&lt;br /&gt;
&#039;&#039;&#039;systemctl&#039;&#039;&#039; is recommended for service management, via these aliases:&lt;br /&gt;
 alias sysu=&amp;quot;systemctl --user&amp;quot;&lt;br /&gt;
&lt;br /&gt;
 alias logu=&amp;quot;journalctl -e --user -u&amp;quot;&lt;br /&gt;
To make your systemctl units stay online even after you log out or after elysium reboots, write: (this is already enabled for many shared user accounts)&lt;br /&gt;
 loginctl enable-linger&lt;br /&gt;
If you install [https://mosh.org/ mosh], an alternative to ssh, your command-line connections will stay open even after losing internet, closing your laptop, or boarding a flight. You can put this in your local ~/.zshrc or ~/.bashrc to improve keystroke prediction:&lt;br /&gt;
 export MOSH_PREDICTION_DISPLAY=experimental&lt;br /&gt;
&#039;&#039;&#039;rsync&#039;&#039;&#039; is the recommended tool for uploading files. For example, to upload an em to the shared conjure account, you might run:&lt;br /&gt;
 rsync -r ./path/to/local/files conjure@elysium.mesh.host:/home/conjure/ems&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [https://cyborgism.wiki/hypha/chapter-ii-docs/elysium Documentation on conjure@elysium / using it with Chapter II at Cyborgism Wiki]&lt;br /&gt;
* [[Arcweld]]&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
	<entry>
		<id>https://mesh.host/wiki/index.php?title=Arcweld&amp;diff=568</id>
		<title>Arcweld</title>
		<link rel="alternate" type="text/html" href="https://mesh.host/wiki/index.php?title=Arcweld&amp;diff=568"/>
		<updated>2025-08-29T01:19:30Z</updated>

		<summary type="html">&lt;p&gt;Ampdot: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Arcweld&#039;&#039;&#039; is a server for the primary goal of rapidly and efficiently experimenting with open weights models, with secondary goals of 1) researching novel LLM inference technologies 2) reducing the cost of using hosted APIs when it would not interfere with the primary goal. It is not intended for training since it isn&#039;t the ideal way to purchase memory bandwidth per dollar (critical for training), although it isn&#039;t forbidden.&lt;br /&gt;
&lt;br /&gt;
== Specifications ==&lt;br /&gt;
&lt;br /&gt;
* Mac Studio M3 Ultra&lt;br /&gt;
** 819 GB/s memory bandwidth&lt;br /&gt;
** 60-core GPU&lt;br /&gt;
** 32-core Neural Engine&lt;br /&gt;
* 512GB Unified Memory&lt;br /&gt;
&lt;br /&gt;
== Setup instructions ==&lt;br /&gt;
&lt;br /&gt;
# Download and install [https://tailscale.com/ Tailscale]&lt;br /&gt;
#* Some VPNs are incompatible and you may need to disable them.&lt;br /&gt;
# Join using a Tailscale invite link&lt;br /&gt;
# If you&#039;ve been granted login access, `ssh sparks@arcweld` to access the shared inference account. &#039;&#039;&#039;You may have to reboot for it to work.&#039;&#039;&#039; You can also try manually editing the machine IPv4 inside Tailscale portal to something random that doesn&#039;t conflict with your LAN.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* [[Elysium]]&lt;br /&gt;
[[Category:Infrastructure]]&lt;/div&gt;</summary>
		<author><name>Ampdot</name></author>
	</entry>
</feed>