<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ANavboxBuilder</id>
	<title>Module:NavboxBuilder - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mbwiki.stairwaygames.work/w/index.php?action=history&amp;feed=atom&amp;title=Module%3ANavboxBuilder"/>
	<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:NavboxBuilder&amp;action=history"/>
	<updated>2026-04-07T18:06:05Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>https://mbwiki.stairwaygames.work/w/index.php?title=Module:NavboxBuilder&amp;diff=5703&amp;oldid=prev</id>
		<title>Admin coral island: Created page with &quot;-- &lt;nowiki&gt; local NBB = {}  -- Constants local EXPANDED, COLLAPSED = 1, 2  -- Easy access to all arguments local arguments = {}  -- Invokable - Navbox creation function NBB.create(frame)     if frame then arguments = getArguments(frame) end     if type(NBB.hlist) == &#039;boolean&#039; then NBB.hlist = NBB.hlist and &#039;hlist&#039; or &#039;&#039; end     if type(NBB.vlist) == &#039;boolean&#039; then NBB.vlist = NBB.vlist and &#039;vlist&#039; or &#039;&#039; end      local main = prepMain()     local sections = prepSections(m...&quot;</title>
		<link rel="alternate" type="text/html" href="https://mbwiki.stairwaygames.work/w/index.php?title=Module:NavboxBuilder&amp;diff=5703&amp;oldid=prev"/>
		<updated>2023-08-04T03:09:35Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;nowiki&amp;gt; local NBB = {}  -- Constants local EXPANDED, COLLAPSED = 1, 2  -- Easy access to all arguments local arguments = {}  -- Invokable - Navbox creation function NBB.create(frame)     if frame then arguments = getArguments(frame) end     if type(NBB.hlist) == &amp;#039;boolean&amp;#039; then NBB.hlist = NBB.hlist and &amp;#039;hlist&amp;#039; or &amp;#039;&amp;#039; end     if type(NBB.vlist) == &amp;#039;boolean&amp;#039; then NBB.vlist = NBB.vlist and &amp;#039;vlist&amp;#039; or &amp;#039;&amp;#039; end      local main = prepMain()     local sections = prepSections(m...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
local NBB = {}&lt;br /&gt;
&lt;br /&gt;
-- Constants&lt;br /&gt;
local EXPANDED, COLLAPSED = 1, 2&lt;br /&gt;
&lt;br /&gt;
-- Easy access to all arguments&lt;br /&gt;
local arguments = {}&lt;br /&gt;
&lt;br /&gt;
-- Invokable - Navbox creation&lt;br /&gt;
function NBB.create(frame)&lt;br /&gt;
    if frame then arguments = getArguments(frame) end&lt;br /&gt;
    if type(NBB.hlist) == &amp;#039;boolean&amp;#039; then NBB.hlist = NBB.hlist and &amp;#039;hlist&amp;#039; or &amp;#039;&amp;#039; end&lt;br /&gt;
    if type(NBB.vlist) == &amp;#039;boolean&amp;#039; then NBB.vlist = NBB.vlist and &amp;#039;vlist&amp;#039; or &amp;#039;&amp;#039; end&lt;br /&gt;
&lt;br /&gt;
    local main = prepMain()&lt;br /&gt;
    local sections = prepSections(main)&lt;br /&gt;
    &lt;br /&gt;
    local navbox = &amp;#039;&amp;#039;&lt;br /&gt;
    if #sections.list &amp;gt; 0 then navbox = makeNavbox(main, sections) end&lt;br /&gt;
    &lt;br /&gt;
    return navbox&lt;br /&gt;
end&lt;br /&gt;
-- Invokable - Return parameter documentation&lt;br /&gt;
function NBB.documentation(frame)&lt;br /&gt;
    local docs&lt;br /&gt;
    if not pcall(function () -- Try specified lang code&lt;br /&gt;
        local lang = mw.ustring.lower(mw.text.trim(tostring(frame.args[1])))&lt;br /&gt;
        docs = require(&amp;#039;Dev:NavboxBuilder/doc/&amp;#039; .. lang)&lt;br /&gt;
    end) then pcall(function () -- Then wiki lang&lt;br /&gt;
        local lang = mw.getContentLanguage():getCode()&lt;br /&gt;
        docs = require(&amp;#039;Dev:NavboxBuilder/doc/&amp;#039; .. lang)&lt;br /&gt;
    end) end&lt;br /&gt;
    if not docs then -- Then English&lt;br /&gt;
        docs = require(&amp;#039;Dev:NavboxBuilder/doc/en&amp;#039;) -- Then default&lt;br /&gt;
    end&lt;br /&gt;
    for k,v in pairs(NBB.params) do&lt;br /&gt;
        v = mw.ustring.gsub(v, &amp;#039;#&amp;#039;, tostring(NBB.n), 1)&lt;br /&gt;
        v = mw.ustring.gsub(v, &amp;#039;#&amp;#039;, tostring(NBB.m), 1)&lt;br /&gt;
        docs = mw.ustring.gsub(docs, &amp;#039;%%&amp;#039;..k..&amp;#039;%%&amp;#039;, v)&lt;br /&gt;
    end&lt;br /&gt;
    docs = mw.ustring.gsub(docs, &amp;#039;%%n%%&amp;#039;, NBB.n)&lt;br /&gt;
    docs = mw.ustring.gsub(docs, &amp;#039;%%m%%&amp;#039;, NBB.m)&lt;br /&gt;
    &lt;br /&gt;
    return docs&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Customizing default parameters&lt;br /&gt;
function NBB.changeParameters(params)&lt;br /&gt;
    if type(params) == &amp;#039;table&amp;#039; then&lt;br /&gt;
        for k,v in pairs(params) do&lt;br /&gt;
            if NBB.params[k] then&lt;br /&gt;
                if k:sub(1, 6) == &amp;#039;value_&amp;#039; then v = mw.ustring.lower(mw.text.trim(tostring(v) or &amp;#039;&amp;#039;)) end&lt;br /&gt;
                NBB.params[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return NBB&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Default parameter names&lt;br /&gt;
NBB.params = {&lt;br /&gt;
    -- Settings&lt;br /&gt;
    links = &amp;#039;Links&amp;#039;,&lt;br /&gt;
    state = &amp;#039;State&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    -- Fields&lt;br /&gt;
    title = &amp;#039;Title&amp;#039;,&lt;br /&gt;
    above = &amp;#039;Above&amp;#039;,&lt;br /&gt;
    below = &amp;#039;Below&amp;#039;,&lt;br /&gt;
    limage = &amp;#039;Left image&amp;#039;,&lt;br /&gt;
    rimage = &amp;#039;Right image&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    -- Sections&lt;br /&gt;
    header_n = &amp;#039;Header #&amp;#039;,&lt;br /&gt;
    layout_n = &amp;#039;Layout #&amp;#039;,&lt;br /&gt;
    state_n = &amp;#039;State #&amp;#039;,&lt;br /&gt;
    header_state = &amp;#039;Header state&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    -- Table layout&lt;br /&gt;
    limage_n = &amp;#039;Left image #&amp;#039;,&lt;br /&gt;
    rimage_n = &amp;#039;Right image #&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    -- Horizontal layout&lt;br /&gt;
    perrow_n = &amp;#039;Per row #&amp;#039;,&lt;br /&gt;
    span_n = &amp;#039;Span #&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    -- Groups&lt;br /&gt;
    group_n = &amp;#039;Group #&amp;#039;,&lt;br /&gt;
    group_n_m = &amp;#039;Group #.#&amp;#039;,&lt;br /&gt;
    list_n = &amp;#039;List #&amp;#039;,&lt;br /&gt;
    list_n_m = &amp;#039;List #.#&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    -- CSS&lt;br /&gt;
    navbox_class = &amp;#039;Navbox class&amp;#039;,&lt;br /&gt;
    navbox_style = &amp;#039;Navbox style&amp;#039;,&lt;br /&gt;
    title_class = &amp;#039;Title class&amp;#039;,&lt;br /&gt;
    title_style = &amp;#039;Title style&amp;#039;,&lt;br /&gt;
    base_class = &amp;#039;Base class&amp;#039;,&lt;br /&gt;
    base_style = &amp;#039;Base style&amp;#039;,&lt;br /&gt;
    above_class = &amp;#039;Above class&amp;#039;,&lt;br /&gt;
    above_style = &amp;#039;Above style&amp;#039;,&lt;br /&gt;
    below_class = &amp;#039;Below class&amp;#039;,&lt;br /&gt;
    below_style = &amp;#039;Below style&amp;#039;,&lt;br /&gt;
    image_class = &amp;#039;Image class&amp;#039;,&lt;br /&gt;
    image_style = &amp;#039;Image style&amp;#039;,&lt;br /&gt;
    limage_class = &amp;#039;Left image class&amp;#039;,&lt;br /&gt;
    limage_style = &amp;#039;Left image style&amp;#039;,&lt;br /&gt;
    rimage_class = &amp;#039;Right image class&amp;#039;,&lt;br /&gt;
    rimage_style = &amp;#039;Right image style&amp;#039;,&lt;br /&gt;
    header_class = &amp;#039;Header class&amp;#039;,&lt;br /&gt;
    header_style = &amp;#039;Header style&amp;#039;,&lt;br /&gt;
    header_n_class = &amp;#039;Header # class&amp;#039;,&lt;br /&gt;
    header_n_style = &amp;#039;Header # style&amp;#039;,&lt;br /&gt;
    limage_n_class = &amp;#039;Left image # class&amp;#039;,&lt;br /&gt;
    limage_n_style = &amp;#039;Left image # style&amp;#039;,&lt;br /&gt;
    rimage_n_class = &amp;#039;Right image # class&amp;#039;,&lt;br /&gt;
    rimage_n_style = &amp;#039;Right image # style&amp;#039;,&lt;br /&gt;
    group_class = &amp;#039;Group class&amp;#039;,&lt;br /&gt;
    group_style = &amp;#039;Group style&amp;#039;,&lt;br /&gt;
    subgroup_class = &amp;#039;Subgroup class&amp;#039;,&lt;br /&gt;
    subgroup_style = &amp;#039;Subgroup style&amp;#039;,&lt;br /&gt;
    group_n_class = &amp;#039;Group # class&amp;#039;,&lt;br /&gt;
    group_n_style = &amp;#039;Group # style&amp;#039;,&lt;br /&gt;
    group_n_m_class = &amp;#039;Group #.# class&amp;#039;,&lt;br /&gt;
    group_n_m_style = &amp;#039;Group #.# style&amp;#039;,&lt;br /&gt;
    list_class = &amp;#039;List class&amp;#039;,&lt;br /&gt;
    list_style = &amp;#039;List style&amp;#039;,&lt;br /&gt;
    list_n_class = &amp;#039;List # class&amp;#039;,&lt;br /&gt;
    list_n_style = &amp;#039;List # style&amp;#039;,&lt;br /&gt;
    list_n_m_class = &amp;#039;List #.# class&amp;#039;,&lt;br /&gt;
    list_n_m_style = &amp;#039;List #.# style&amp;#039;,&lt;br /&gt;
    &lt;br /&gt;
    -- Values&lt;br /&gt;
    value_expanded = &amp;#039;expanded&amp;#039;,&lt;br /&gt;
    value_collapsed = &amp;#039;collapsed&amp;#039;,&lt;br /&gt;
    value_table_layout = &amp;#039;table&amp;#039;,&lt;br /&gt;
    value_horizontal_layout = &amp;#039;horizontal&amp;#039;,&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- How n&amp;#039;s and m&amp;#039;s are displayed in documentations&lt;br /&gt;
NBB.n = &amp;#039;&amp;lt;span class=&amp;quot;accent&amp;quot;&amp;gt;n&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
NBB.m = &amp;#039;&amp;lt;span class=&amp;quot;accent&amp;quot;&amp;gt;m&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- Class names for horizontal and vertical lists&lt;br /&gt;
NBB.hlist = &amp;#039;hlist&amp;#039;&lt;br /&gt;
NBB.vlist = &amp;#039;vlist&amp;#039;&lt;br /&gt;
&lt;br /&gt;
-- Cleanup of arguments from frame and its parent&lt;br /&gt;
function getArguments(frame, useFrame, useParent)&lt;br /&gt;
    local args = {&lt;br /&gt;
        keys = {},&lt;br /&gt;
        frame = {},&lt;br /&gt;
        parent = {},&lt;br /&gt;
    }&lt;br /&gt;
    if frame and frame.args then&lt;br /&gt;
        local keys = {}&lt;br /&gt;
        if useFrame or useFrame == nil then&lt;br /&gt;
            for k,v in pairs(frame.args) do&lt;br /&gt;
                if type(k) == &amp;#039;string&amp;#039; then k = mw.text.trim(k) end&lt;br /&gt;
                if type(v) == &amp;#039;string&amp;#039; then v = mw.text.trim(v) end&lt;br /&gt;
                keys[k] = true&lt;br /&gt;
                args.frame[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        if frame.getParent and (useParent or useParent == nil) then&lt;br /&gt;
            local parent = frame:getParent()&lt;br /&gt;
            for k,v in pairs(parent.args) do&lt;br /&gt;
                if type(k) == &amp;#039;string&amp;#039; then k = mw.text.trim(k) end&lt;br /&gt;
                if type(v) == &amp;#039;string&amp;#039; then v = mw.text.trim(v) end&lt;br /&gt;
                keys[k] = true&lt;br /&gt;
                args.parent[k] = v&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        for k,v in pairs(keys) do table.insert(args.keys, k) end&lt;br /&gt;
    end&lt;br /&gt;
    return args&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns value of a customized parameter&lt;br /&gt;
function getValue(key, n, m)&lt;br /&gt;
    local param = NBB.params[key]&lt;br /&gt;
    n, m = tonumber(n), tonumber(m)&lt;br /&gt;
    if n then param = mw.ustring.gsub(param, &amp;#039;#&amp;#039;, tostring(n), 1) end&lt;br /&gt;
    if m then param = mw.ustring.gsub(param, &amp;#039;#&amp;#039;, tostring(m), 1) end&lt;br /&gt;
    &lt;br /&gt;
    local val = arguments.parent[param] or arguments.frame[param]&lt;br /&gt;
    if val and val ~= &amp;#039;&amp;#039; then return val, arguments.frame[param], arguments.parent[param] end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Checks the input for customized values&lt;br /&gt;
function checkValue(val, check)&lt;br /&gt;
    val = mw.ustring.lower(mw.text.trim(tostring(val) or &amp;#039;&amp;#039;))&lt;br /&gt;
    if type(check) == &amp;#039;table&amp;#039; then&lt;br /&gt;
        for k,v in pairs(check) do&lt;br /&gt;
            if NBB.params[&amp;#039;value_&amp;#039; .. k] then&lt;br /&gt;
                local test = NBB.params[&amp;#039;value_&amp;#039; .. k]&lt;br /&gt;
                if val == test then return v end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    else&lt;br /&gt;
        check = tostring(check)&lt;br /&gt;
        if NBB.params[&amp;#039;value_&amp;#039; .. check] then&lt;br /&gt;
            local test = NBB.params[&amp;#039;value_&amp;#039; .. check]&lt;br /&gt;
            if val == test then return true end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a list of values for parameters with variables&lt;br /&gt;
function getList(...)&lt;br /&gt;
    local lists = {}&lt;br /&gt;
    local patterns = {}&lt;br /&gt;
    for i,v in ipairs(arg) do&lt;br /&gt;
        if v then&lt;br /&gt;
            lists[i] = {}&lt;br /&gt;
            patterns[i] = &amp;#039;^&amp;#039;..mw.ustring.gsub(NBB.params[v], &amp;#039;#&amp;#039;, &amp;#039;([0-9]+)&amp;#039;)..&amp;#039;$&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    for i,k in ipairs(arguments.keys) do&lt;br /&gt;
        local v = arguments.parent[k] or arguments.frame[k]&lt;br /&gt;
        if v and v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
            for i,pattern in ipairs(patterns) do&lt;br /&gt;
                local n, m = mw.ustring.match(k, pattern)&lt;br /&gt;
                if m then&lt;br /&gt;
                    if not lists[i][tonumber(n)] then lists[i][tonumber(n)] = {} end&lt;br /&gt;
                    lists[i][tonumber(n)][tonumber(m)] = v&lt;br /&gt;
                    break&lt;br /&gt;
                elseif n then&lt;br /&gt;
                    lists[i][tonumber(n)] = v&lt;br /&gt;
                    break&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return unpack(lists)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Determine which section the row belongs to&lt;br /&gt;
function getSectionNo(test, list)&lt;br /&gt;
    for i=2,#list do&lt;br /&gt;
        if test &amp;lt; list[i] then return list[i-1] end&lt;br /&gt;
    end&lt;br /&gt;
    return list[#list] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Reads parameters and prepares an object with settings for the navbox&lt;br /&gt;
function prepMain()&lt;br /&gt;
    local main = {}&lt;br /&gt;
    &lt;br /&gt;
    main.title = getValue(&amp;#039;title&amp;#039;)&lt;br /&gt;
    if main.title then&lt;br /&gt;
        main.links = getValue(&amp;#039;links&amp;#039;)&lt;br /&gt;
        main.state = checkValue(getValue(&amp;#039;state&amp;#039;), {[&amp;#039;expanded&amp;#039;] = EXPANDED, [&amp;#039;collapsed&amp;#039;] = COLLAPSED})&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    main.above = getValue(&amp;#039;above&amp;#039;)&lt;br /&gt;
    main.below = getValue(&amp;#039;below&amp;#039;)&lt;br /&gt;
    main.limage = getValue(&amp;#039;limage&amp;#039;)&lt;br /&gt;
    main.rimage = getValue(&amp;#039;rimage&amp;#039;)&lt;br /&gt;
    return main&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Reads parameters and prepares objects with necessary settings for each section&lt;br /&gt;
function prepSections(main)&lt;br /&gt;
    local sections = {[0] = { rows = {} }}&lt;br /&gt;
    local headers, layouts, lists, sublists = getList(&amp;#039;header_n&amp;#039;, &amp;#039;layout_n&amp;#039;, &amp;#039;list_n&amp;#039;, &amp;#039;list_n_m&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    for k,v in pairs(headers) do&lt;br /&gt;
        sections[k] = { header = v, rows = {} }&lt;br /&gt;
    end&lt;br /&gt;
    for k,v in pairs(layouts) do&lt;br /&gt;
        if not sections[k] then&lt;br /&gt;
            sections[k] = { layout = v, rows = {} }&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    local numbers = getKeys(sections, true)&lt;br /&gt;
    &lt;br /&gt;
    for k,v in pairs(lists) do&lt;br /&gt;
        local sec = getSectionNo(k, numbers)&lt;br /&gt;
        sections[sec].rows[k] = { list = v, group = getValue(&amp;#039;group_n&amp;#039;, k) }&lt;br /&gt;
    end&lt;br /&gt;
    for k,list in pairs(sublists) do&lt;br /&gt;
        local sec = getSectionNo(k, numbers)&lt;br /&gt;
        local obj = { rows = {}, group = getValue(&amp;#039;group_n&amp;#039;, k) }&lt;br /&gt;
        for l,v in pairs(list) do&lt;br /&gt;
            obj.rows[l] = { list = v, group = getValue(&amp;#039;group_n_m&amp;#039;, k, l) }&lt;br /&gt;
        end&lt;br /&gt;
        sections[sec].rows[k] = obj&lt;br /&gt;
    end&lt;br /&gt;
    for _,v in ipairs(numbers) do&lt;br /&gt;
        local rows = getKeys(sections[v].rows)&lt;br /&gt;
        if #rows &amp;gt; 0 then&lt;br /&gt;
            sections[v].state = checkValue(getValue(&amp;#039;state_n&amp;#039;, v), {[&amp;#039;expanded&amp;#039;] = EXPANDED, [&amp;#039;collapsed&amp;#039;] = COLLAPSED})&lt;br /&gt;
                                or checkValue(getValue(&amp;#039;header_state&amp;#039;), {[&amp;#039;expanded&amp;#039;] = EXPANDED, [&amp;#039;collapsed&amp;#039;] = COLLAPSED})&lt;br /&gt;
            sections[v].layout = getValue(&amp;#039;layout_n&amp;#039;, v) or &amp;#039;table&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            sections[v] = nil&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    sections.list = getKeys(sections, true)&lt;br /&gt;
    return sections&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Returns a list of keys in a table&lt;br /&gt;
function getKeys(tab, sorted)&lt;br /&gt;
    local keys = {}&lt;br /&gt;
    if not tab then return keys end&lt;br /&gt;
    for k,v in pairs(tab) do&lt;br /&gt;
        table.insert(keys, k)&lt;br /&gt;
    end&lt;br /&gt;
    if sorted then table.sort(keys) end&lt;br /&gt;
    return keys&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Applies styles and classes from parameters to the element&lt;br /&gt;
function applyCSS(elem, ...)&lt;br /&gt;
    if not elem then return nil end&lt;br /&gt;
    local classes, styles = {}, {}&lt;br /&gt;
    for i,v in ipairs(arg) do&lt;br /&gt;
        local c, cP, cF, s, sP, sF&lt;br /&gt;
        if type(v) == &amp;#039;table&amp;#039; then&lt;br /&gt;
            local key = v[1]&lt;br /&gt;
            v[1] = key .. &amp;#039;_class&amp;#039;&lt;br /&gt;
            c, cF, cP = getValue(unpack(v))&lt;br /&gt;
            v[1] = key .. &amp;#039;_style&amp;#039;&lt;br /&gt;
            s, sF, sP = getValue(unpack(v))&lt;br /&gt;
        else&lt;br /&gt;
            v = tostring(v)&lt;br /&gt;
            c, cF, cP = getValue(v .. &amp;#039;_class&amp;#039;)&lt;br /&gt;
            s, sF, sP = getValue(v .. &amp;#039;_style&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
        if c then&lt;br /&gt;
            table.insert(classes, cF)&lt;br /&gt;
            table.insert(classes, cP)&lt;br /&gt;
        end&lt;br /&gt;
        if s then&lt;br /&gt;
            table.insert(styles, sF)&lt;br /&gt;
            table.insert(styles, sP)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if #classes &amp;gt; 0 then&lt;br /&gt;
        classes = mw.ustring.gsub(table.concat(classes, &amp;#039; &amp;#039;), &amp;#039;  +&amp;#039;, &amp;#039; &amp;#039;)&lt;br /&gt;
        elem:addClass(classes)&lt;br /&gt;
        end&lt;br /&gt;
    if #styles &amp;gt; 0 then&lt;br /&gt;
        styles = mw.ustring.gsub(table.concat(styles, &amp;#039;;&amp;#039;), &amp;#039;;;+&amp;#039;, &amp;#039;;&amp;#039;)&lt;br /&gt;
        styles = mw.ustring.gsub(styles, &amp;#039;;$&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
        elem:cssText(styles)&lt;br /&gt;
    end&lt;br /&gt;
    return elem&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Makes an element collapsible&lt;br /&gt;
function collapsible(elem, header, state)&lt;br /&gt;
    if state then&lt;br /&gt;
        elem:addClass(&amp;#039;mw-collapsible&amp;#039;)&lt;br /&gt;
        if state == COLLAPSED then elem:addClass(&amp;#039;mw-collapsed&amp;#039;) end&lt;br /&gt;
        if header then header:addClass(&amp;#039;mw-collapsible-toggle&amp;#039;) end&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Creates a navbox with prepared settings&lt;br /&gt;
function makeNavbox(main, sections)&lt;br /&gt;
    -- Structure&lt;br /&gt;
    local box, title, wrapper, tab, row, links, above, below, limage, rimage, content&lt;br /&gt;
    &lt;br /&gt;
    box = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
    if main.title then&lt;br /&gt;
        title = box:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
        if main.links then links = title:tag(&amp;#039;div&amp;#039;):wikitext(main.links .. &amp;#039; &amp;#039;) end&lt;br /&gt;
        title:tag(&amp;#039;span&amp;#039;):addClass(&amp;#039;navbox-title-text&amp;#039;):wikitext(main.title)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    wrapper = box:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    tab = wrapper:tag(&amp;#039;table&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    if main.above then&lt;br /&gt;
        above = tab:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;td&amp;#039;):newline():wikitext(main.above)&lt;br /&gt;
        above:done():newline()&lt;br /&gt;
    end&lt;br /&gt;
    row = tab:tag(&amp;#039;tr&amp;#039;)&lt;br /&gt;
    if main.limage then&lt;br /&gt;
        limage = row:tag(&amp;#039;td&amp;#039;):newline():wikitext(main.limage)&lt;br /&gt;
        limage:done():newline()&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    content = row:tag(&amp;#039;td&amp;#039;)&lt;br /&gt;
    for i,v in ipairs(sections.list) do content:node(makeSection(sections[v], v)) end&lt;br /&gt;
    if #content.nodes == 0 then return nil end&lt;br /&gt;
    &lt;br /&gt;
    if main.rimage then&lt;br /&gt;
        rimage = row:tag(&amp;#039;td&amp;#039;):newline():wikitext(main.rimage)&lt;br /&gt;
        rimage:done():newline()&lt;br /&gt;
    end&lt;br /&gt;
    if main.below then&lt;br /&gt;
        below = tab:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;td&amp;#039;):newline():wikitext(main.below)&lt;br /&gt;
        below:done():newline()&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Appearance&lt;br /&gt;
    box:addClass(&amp;#039;navbox&amp;#039;)&lt;br /&gt;
    applyCSS(box, &amp;#039;navbox&amp;#039;)&lt;br /&gt;
    wrapper:addClass(&amp;#039;navbox-table-wrapper&amp;#039;)&lt;br /&gt;
    tab:addClass(&amp;#039;navbox-table&amp;#039;)&lt;br /&gt;
    content:addClass(&amp;#039;navbox-content&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    if title then&lt;br /&gt;
        title:addClass(&amp;#039;navbox-title&amp;#039;)&lt;br /&gt;
        applyCSS(title, &amp;#039;title&amp;#039;)&lt;br /&gt;
        &lt;br /&gt;
        if collapsible(box, title, main.state) then wrapper:addClass(&amp;#039;mw-collapsible-content&amp;#039;) end&lt;br /&gt;
    end&lt;br /&gt;
    if links then links:addClass(&amp;#039;navbox-template-links&amp;#039;) end&lt;br /&gt;
    if above then&lt;br /&gt;
        above:addClass(&amp;#039;navbox-above navbox-base navbox-padding&amp;#039;)&lt;br /&gt;
        applyCSS(above, &amp;#039;base&amp;#039;, &amp;#039;above&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    if below then&lt;br /&gt;
        below:addClass(&amp;#039;navbox-below navbox-base navbox-padding&amp;#039;)&lt;br /&gt;
        applyCSS(below, &amp;#039;base&amp;#039;, &amp;#039;below&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    if limage then&lt;br /&gt;
        limage:addClass(&amp;#039;navbox-image&amp;#039;)&lt;br /&gt;
        applyCSS(limage, &amp;#039;image&amp;#039;, &amp;#039;limage&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    if rimage then&lt;br /&gt;
        rimage:addClass(&amp;#039;navbox-image&amp;#039;)&lt;br /&gt;
        applyCSS(rimage, &amp;#039;image&amp;#039;, &amp;#039;rimage&amp;#039;)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if limage or rimage then&lt;br /&gt;
        local cols = 1 + (limage and 1 or 0) + (rimage and 1 or 0)&lt;br /&gt;
        if cols &amp;gt; 1 then&lt;br /&gt;
            if above then above:attr(&amp;#039;colspan&amp;#039;, cols) end&lt;br /&gt;
            if below then below:attr(&amp;#039;colspan&amp;#039;, cols) end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return box&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Creates a single section&lt;br /&gt;
function makeSection(section, no)&lt;br /&gt;
    -- Structure&lt;br /&gt;
    local sec, header, wrapper&lt;br /&gt;
    &lt;br /&gt;
    sec = mw.html.create(&amp;#039;div&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    if section.header then header = sec:tag(&amp;#039;div&amp;#039;):wikitext(section.header) end&lt;br /&gt;
    wrapper = sec:tag(&amp;#039;div&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    -- Appearance&lt;br /&gt;
    sec:addClass(&amp;#039;navbox-section&amp;#039;)&lt;br /&gt;
    wrapper:addClass(&amp;#039;navbox-section-wrapper&amp;#039;)&lt;br /&gt;
    if header then&lt;br /&gt;
        header:addClass(&amp;#039;navbox-header navbox-base&amp;#039;)&lt;br /&gt;
        if collapsible(sec, header, section.state) then wrapper:addClass(&amp;#039;mw-collapsible-content&amp;#039;) end&lt;br /&gt;
        applyCSS(header, &amp;#039;base&amp;#039;, &amp;#039;header&amp;#039;, {&amp;#039;header_n&amp;#039;, no})&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Layout&lt;br /&gt;
    local layout&lt;br /&gt;
    for k,v in pairs(NBB.formats) do&lt;br /&gt;
        if checkValue(section.layout, k .. &amp;#039;_layout&amp;#039;) then&lt;br /&gt;
            layout = k&lt;br /&gt;
            break&lt;br /&gt;
        else&lt;br /&gt;
            if k == section.layout then&lt;br /&gt;
                layout = k&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    layout = layout or &amp;#039;table&amp;#039;&lt;br /&gt;
    section.layout = layout&lt;br /&gt;
    &lt;br /&gt;
    local res = NBB.formats[layout](section, no, wrapper)&lt;br /&gt;
    &lt;br /&gt;
    if res == nil then return nil end&lt;br /&gt;
    &lt;br /&gt;
    wrapper:node(res)&lt;br /&gt;
    wrapper:addClass(&amp;#039;navbox-&amp;#039; .. layout .. &amp;#039;-layout&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    return sec&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
NBB.formats = {}&lt;br /&gt;
&lt;br /&gt;
NBB.formats.table = function(section, no)&lt;br /&gt;
    local lists, deep, count, keys = {}, false, 0, getKeys(section.rows, true)&lt;br /&gt;
    if #keys == 0 then return nil end&lt;br /&gt;
    &lt;br /&gt;
    -- Structure&lt;br /&gt;
    local tab, limage, rimage&lt;br /&gt;
    &lt;br /&gt;
    section.limage = getValue(&amp;#039;limage_n&amp;#039;, no)&lt;br /&gt;
    section.rimage = getValue(&amp;#039;rimage_n&amp;#039;, no)&lt;br /&gt;
    &lt;br /&gt;
    tab = mw.html.create(&amp;#039;table&amp;#039;)&lt;br /&gt;
    for i1,v1 in ipairs(keys) do&lt;br /&gt;
        count = count + 1&lt;br /&gt;
        local row1 = section.rows[v1]&lt;br /&gt;
        &lt;br /&gt;
        -- Structure&lt;br /&gt;
        local tr, group, list&lt;br /&gt;
        &lt;br /&gt;
        tr = tab:tag(&amp;#039;tr&amp;#039;):addClass(&amp;#039;navbox-&amp;#039;..(count % 2 == 0 and &amp;#039;even&amp;#039; or &amp;#039;odd&amp;#039;))&lt;br /&gt;
        if i1 == 1 and section.limage then&lt;br /&gt;
            limage = tr:tag(&amp;#039;td&amp;#039;):newline():wikitext(section.limage)&lt;br /&gt;
            limage:done():newline()&lt;br /&gt;
        end&lt;br /&gt;
        if row1.group then group = tr:tag(&amp;#039;th&amp;#039;):wikitext(row1.group) end&lt;br /&gt;
        &lt;br /&gt;
        local keys = getKeys(row1.rows, true)&lt;br /&gt;
        if #keys &amp;gt; 0 then&lt;br /&gt;
            for i2,v2 in ipairs(keys) do&lt;br /&gt;
                local row2 = row1.rows[v2]&lt;br /&gt;
                &lt;br /&gt;
                -- Structure&lt;br /&gt;
                local tr, group, list = tr&lt;br /&gt;
                &lt;br /&gt;
                if i2 &amp;gt; 1 then&lt;br /&gt;
                    count = count + 1&lt;br /&gt;
                    tr = tab:tag(&amp;#039;tr&amp;#039;):addClass(&amp;#039;navbox-&amp;#039;..(count % 2 == 0 and &amp;#039;even&amp;#039; or &amp;#039;odd&amp;#039;))&lt;br /&gt;
                end&lt;br /&gt;
                if row2.group then&lt;br /&gt;
                    group = tr:tag(&amp;#039;th&amp;#039;):wikitext(row2.group)&lt;br /&gt;
                    deep = true&lt;br /&gt;
                end&lt;br /&gt;
                &lt;br /&gt;
                list = tr:tag(&amp;#039;td&amp;#039;):newline():wikitext(row2.list)&lt;br /&gt;
                list:done():newline()&lt;br /&gt;
                &lt;br /&gt;
                -- Appearance&lt;br /&gt;
                list:addClass(&amp;#039;navbox-list navbox-padding&amp;#039;):addClass(NBB.hlist or &amp;#039;&amp;#039;)&lt;br /&gt;
                applyCSS(list, &amp;#039;list&amp;#039;, {&amp;#039;list_n_m&amp;#039;, v1, v2})&lt;br /&gt;
                if not row2.group then list:attr(&amp;#039;colspan&amp;#039;, 2) end&lt;br /&gt;
                if not row1.group then table.insert(lists, list) end&lt;br /&gt;
                &lt;br /&gt;
                if group then&lt;br /&gt;
                    group:addClass(&amp;#039;navbox-subgroup navbox-base navbox-padding&amp;#039;)&lt;br /&gt;
                    applyCSS(group, &amp;#039;base&amp;#039;, &amp;#039;subgroup&amp;#039;, {&amp;#039;group_n_m&amp;#039;, v1, v2})&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            -- Structure&lt;br /&gt;
            list = tr:tag(&amp;#039;td&amp;#039;):newline():wikitext(row1.list)&lt;br /&gt;
            list:done():newline()&lt;br /&gt;
            table.insert(lists, list)&lt;br /&gt;
            &lt;br /&gt;
            -- Appearance&lt;br /&gt;
            list:addClass(&amp;#039;navbox-list navbox-padding&amp;#039;):addClass(NBB.hlist or &amp;#039;&amp;#039;)&lt;br /&gt;
            if not row1.group then list:attr(&amp;#039;colspan&amp;#039;, 2):addClass(&amp;#039;navbox-nogroup&amp;#039;) end&lt;br /&gt;
            applyCSS(list, &amp;#039;list&amp;#039;, {&amp;#039;list_n&amp;#039;, v1})&lt;br /&gt;
        end&lt;br /&gt;
        if i1 == 1 and section.rimage then&lt;br /&gt;
            rimage = tr:tag(&amp;#039;td&amp;#039;):newline():wikitext(section.rimage)&lt;br /&gt;
            rimage:done():newline()&lt;br /&gt;
        end&lt;br /&gt;
        &lt;br /&gt;
        -- Appearance&lt;br /&gt;
        if group then&lt;br /&gt;
            group:addClass(&amp;#039;navbox-group navbox-base navbox-padding&amp;#039;)&lt;br /&gt;
            if #keys &amp;gt; 1 then group:attr(&amp;#039;rowspan&amp;#039;, #keys) end&lt;br /&gt;
            applyCSS(group, &amp;#039;base&amp;#039;, &amp;#039;group&amp;#039;, {&amp;#039;group_n&amp;#039;, v1})&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    -- Appearance&lt;br /&gt;
    tab:addClass(&amp;#039;navbox-table&amp;#039;)&lt;br /&gt;
    &lt;br /&gt;
    for i,v in ipairs(lists) do&lt;br /&gt;
        local span = v:getAttr(&amp;#039;colspan&amp;#039;) or 1&lt;br /&gt;
        if deep then span = span + 1 end&lt;br /&gt;
        if span == 1 then span = nil end&lt;br /&gt;
        v:attr(&amp;#039;colspan&amp;#039;, span)&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    if limage then&lt;br /&gt;
        limage:addClass(&amp;#039;navbox-image&amp;#039;)&lt;br /&gt;
        applyCSS(limage, &amp;#039;image&amp;#039;, {&amp;#039;limage_n&amp;#039;, no})&lt;br /&gt;
        if count &amp;gt; 1 then limage:attr(&amp;#039;rowspan&amp;#039;, count) end&lt;br /&gt;
    end&lt;br /&gt;
    if rimage then&lt;br /&gt;
        rimage:addClass(&amp;#039;navbox-image&amp;#039;)&lt;br /&gt;
        applyCSS(rimage, &amp;#039;image&amp;#039;, {&amp;#039;rimage_n&amp;#039;, no})&lt;br /&gt;
        if count &amp;gt; 1 then rimage:attr(&amp;#039;rowspan&amp;#039;, count) end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return tab&lt;br /&gt;
end&lt;br /&gt;
NBB.formats.horizontal = function(section, no, wrapper)&lt;br /&gt;
    local lists, deep, count, keys = {}, false, 0, getKeys(section.rows, true)&lt;br /&gt;
    if #keys == 0 then return nil end&lt;br /&gt;
    &lt;br /&gt;
    -- Structure&lt;br /&gt;
    local res, wrap&lt;br /&gt;
    &lt;br /&gt;
    wrap = tonumber(getValue(&amp;#039;perrow_n&amp;#039;, no))&lt;br /&gt;
    if wrap then&lt;br /&gt;
        wrap = math.max(1, wrap)&lt;br /&gt;
        -- if wrap &amp;gt; 0 then&lt;br /&gt;
        --     wrapper:addClass(&amp;#039;navbox-static&amp;#039;):css(&amp;#039;--wrap&amp;#039;, wrap)&lt;br /&gt;
        -- end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    &lt;br /&gt;
    res = mw.html.create(&amp;#039;&amp;#039;)&lt;br /&gt;
    for i1,v1 in ipairs(keys) do&lt;br /&gt;
        local row1 = section.rows[v1]&lt;br /&gt;
        &lt;br /&gt;
        -- Structure&lt;br /&gt;
        local keys = getKeys(row1.rows, true)&lt;br /&gt;
        if #keys &amp;gt; 0 then&lt;br /&gt;
            for i2,v2 in ipairs(keys) do&lt;br /&gt;
                count = count + 1&lt;br /&gt;
                local row2 = row1.rows[v2]&lt;br /&gt;
                &lt;br /&gt;
                -- Structure&lt;br /&gt;
                local col, group, list&lt;br /&gt;
                &lt;br /&gt;
                col = res:tag(&amp;#039;div&amp;#039;):addClass(&amp;#039;navbox-&amp;#039;..(count % 2 == 0 and &amp;#039;even&amp;#039; or &amp;#039;odd&amp;#039;))&lt;br /&gt;
                if row2.group then group = col:tag(&amp;#039;div&amp;#039;):wikitext(row2.group) end&lt;br /&gt;
            &lt;br /&gt;
                if wrap then -- delete in case of css vars&lt;br /&gt;
                    col:css(&amp;#039;flex-basis&amp;#039;, 100/wrap .. &amp;#039;%&amp;#039;)&lt;br /&gt;
                end&lt;br /&gt;
                    &lt;br /&gt;
                list = col:tag(&amp;#039;div&amp;#039;):newline():wikitext(row2.list)&lt;br /&gt;
                list:done():newline()&lt;br /&gt;
                table.insert(lists, list)&lt;br /&gt;
                &lt;br /&gt;
                -- Appearance&lt;br /&gt;
                col:addClass(&amp;#039;navbox-col&amp;#039;)&lt;br /&gt;
                list:addClass(&amp;#039;navbox-list navbox-padding&amp;#039;):addClass(NBB.vlist or &amp;#039;&amp;#039;)&lt;br /&gt;
                applyCSS(list, &amp;#039;list&amp;#039;, {&amp;#039;list_n&amp;#039;, v1})&lt;br /&gt;
                &lt;br /&gt;
                if group then&lt;br /&gt;
                    group:addClass(&amp;#039;navbox-group navbox-base navbox-padding&amp;#039;)&lt;br /&gt;
                    applyCSS(group, &amp;#039;base&amp;#039;, &amp;#039;group&amp;#039;, {&amp;#039;group_n&amp;#039;, v1})&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        else&lt;br /&gt;
            count = count + 1&lt;br /&gt;
            -- Structure&lt;br /&gt;
            local col, group, list&lt;br /&gt;
            &lt;br /&gt;
            col = res:tag(&amp;#039;div&amp;#039;):addClass(&amp;#039;navbox-&amp;#039;..(count % 2 == 0 and &amp;#039;even&amp;#039; or &amp;#039;odd&amp;#039;))&lt;br /&gt;
            if row1.group then group = col:tag(&amp;#039;div&amp;#039;):wikitext(row1.group) end&lt;br /&gt;
            &lt;br /&gt;
            if wrap then&lt;br /&gt;
                local span = math.max(0, math.min(wrap, tonumber(getValue(&amp;#039;span_n&amp;#039;, v1)) or 1))&lt;br /&gt;
                col:css(&amp;#039;flex-basis&amp;#039;, span/wrap*100 .. &amp;#039;%&amp;#039;) -- delete in case of css vars&lt;br /&gt;
                -- if span ~= 1 then&lt;br /&gt;
                --     col:css(&amp;#039;--span&amp;#039;, span)&lt;br /&gt;
                -- end&lt;br /&gt;
            else&lt;br /&gt;
                col._span = tonumber(getValue(&amp;#039;span_n&amp;#039;, v1))&lt;br /&gt;
            end&lt;br /&gt;
            &lt;br /&gt;
            list = col:tag(&amp;#039;div&amp;#039;):newline():wikitext(row1.list)&lt;br /&gt;
            list:done():newline()&lt;br /&gt;
            table.insert(lists, list)&lt;br /&gt;
            &lt;br /&gt;
            -- Appearance&lt;br /&gt;
            col:addClass(&amp;#039;navbox-col&amp;#039;)&lt;br /&gt;
            list:addClass(&amp;#039;navbox-list navbox-padding&amp;#039;):addClass(NBB.vlist or &amp;#039;&amp;#039;)&lt;br /&gt;
            applyCSS(list, &amp;#039;list&amp;#039;, {&amp;#039;list_n&amp;#039;, v1})&lt;br /&gt;
            &lt;br /&gt;
            if group then&lt;br /&gt;
                group:addClass(&amp;#039;navbox-group navbox-base navbox-padding&amp;#039;)&lt;br /&gt;
                applyCSS(group, &amp;#039;base&amp;#039;, &amp;#039;group&amp;#039;, {&amp;#039;group_n&amp;#039;, v1})&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    if not wrap then&lt;br /&gt;
        wrap = #lists&lt;br /&gt;
        for i,v in ipairs(lists) do&lt;br /&gt;
            local col = v.parent&lt;br /&gt;
            col:css(&amp;#039;flex-basis&amp;#039;, math.max(0, math.min(wrap, col._span or 1))/wrap*100 .. &amp;#039;%&amp;#039;)&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return NBB&lt;/div&gt;</summary>
		<author><name>Admin coral island</name></author>
	</entry>
</feed>