<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ffxiv.consolegameswiki.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gurgum</id>
	<title>Final Fantasy XIV Online Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://ffxiv.consolegameswiki.com/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Gurgum"/>
	<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/wiki/Special:Contributions/Gurgum"/>
	<updated>2026-07-04T10:36:01Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.44.2</generator>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Desynthesis_results&amp;diff=1476218</id>
		<title>Module:Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Desynthesis_results&amp;diff=1476218"/>
		<updated>2026-07-04T01:22:02Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: set &amp;quot;Has desynthesis result&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local icon = require(&amp;quot;Module:Icon&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local function itemIconFromData(data)&lt;br /&gt;
    if not data then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(icon.gameIconWithLabel({&lt;br /&gt;
        icon = data[&amp;quot;Has game icon&amp;quot;],&lt;br /&gt;
        link = data[&amp;quot;Pagename&amp;quot;],&lt;br /&gt;
        type = data[&amp;quot;Has context&amp;quot;],&lt;br /&gt;
        dyeCount = tonumber(data[&amp;quot;Has dye channels&amp;quot;]) or 0,&lt;br /&gt;
        size = &amp;quot;small&amp;quot;,&lt;br /&gt;
        text = data[&amp;quot;Has canonical name&amp;quot;],&lt;br /&gt;
    }))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])[[Category:Items with no desynthesis results]]&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        if data and data[&amp;quot;Pagename&amp;quot;] then&lt;br /&gt;
            mw.smw.set({ [&amp;quot;Has desynthesis result&amp;quot;] = data[&amp;quot;Pagename&amp;quot;] })&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            itemIconFromData(data),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Category:Items_with_no_desynthesis_results&amp;diff=1476215</id>
		<title>Category:Items with no desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Category:Items_with_no_desynthesis_results&amp;diff=1476215"/>
		<updated>2026-07-04T00:58:37Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Created page with &amp;quot;__HIDDENCAT__ This category includes items that do not have any desynthesis results data. The category is applied by {{tl|desynthesis results}}.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__HIDDENCAT__&lt;br /&gt;
This category includes items that do not have any desynthesis results data. The category is applied by {{tl|desynthesis results}}.&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Desynthesis_results&amp;diff=1476214</id>
		<title>Module:Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Desynthesis_results&amp;diff=1476214"/>
		<updated>2026-07-04T00:56:06Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: set category when there are no results&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])[[Category:Items with no desynthesis results]]&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476212</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476212"/>
		<updated>2026-07-04T00:33:54Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: remove old function&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local icon = require(&amp;quot;Module:Icon&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local function itemIconFromData(data)&lt;br /&gt;
    if not data then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(icon.gameIconWithLabel({&lt;br /&gt;
        icon = data[&amp;quot;Has game icon&amp;quot;],&lt;br /&gt;
        link = data[&amp;quot;Pagename&amp;quot;],&lt;br /&gt;
        type = data[&amp;quot;Has context&amp;quot;],&lt;br /&gt;
        dyeCount = tonumber(data[&amp;quot;Has dye channels&amp;quot;]) or 0,&lt;br /&gt;
        size = &amp;quot;small&amp;quot;,&lt;br /&gt;
        text = data[&amp;quot;Has canonical name&amp;quot;],&lt;br /&gt;
    }))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        if data and data[&amp;quot;Pagename&amp;quot;] then&lt;br /&gt;
            mw.smw.set({ [&amp;quot;Has desynthesis result&amp;quot;] = data[&amp;quot;Pagename&amp;quot;] })&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            itemIconFromData(data),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476210</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476210"/>
		<updated>2026-07-04T00:29:51Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: set data&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local icon = require(&amp;quot;Module:Icon&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local function itemIconFromData(data)&lt;br /&gt;
    if not data then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(icon.gameIconWithLabel({&lt;br /&gt;
        icon = data[&amp;quot;Has game icon&amp;quot;],&lt;br /&gt;
        link = data[&amp;quot;Pagename&amp;quot;],&lt;br /&gt;
        type = data[&amp;quot;Has context&amp;quot;],&lt;br /&gt;
        dyeCount = tonumber(data[&amp;quot;Has dye channels&amp;quot;]) or 0,&lt;br /&gt;
        size = &amp;quot;small&amp;quot;,&lt;br /&gt;
        text = data[&amp;quot;Has canonical name&amp;quot;],&lt;br /&gt;
    }))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        if data and data[&amp;quot;Pagename&amp;quot;] then&lt;br /&gt;
            mw.smw.set({ [&amp;quot;Has desynthesis result&amp;quot;] = data[&amp;quot;Pagename&amp;quot;] })&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            itemIconFromData(data),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476209</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476209"/>
		<updated>2026-07-04T00:27:11Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: to string&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local icon = require(&amp;quot;Module:Icon&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local function itemIconFromData(data)&lt;br /&gt;
    if not data then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return tostring(icon.gameIconWithLabel({&lt;br /&gt;
        icon = data[&amp;quot;Has game icon&amp;quot;],&lt;br /&gt;
        link = data[&amp;quot;Pagename&amp;quot;],&lt;br /&gt;
        type = data[&amp;quot;Has context&amp;quot;],&lt;br /&gt;
        dyeCount = tonumber(data[&amp;quot;Has dye channels&amp;quot;]) or 0,&lt;br /&gt;
        size = &amp;quot;small&amp;quot;,&lt;br /&gt;
        text = data[&amp;quot;Has canonical name&amp;quot;],&lt;br /&gt;
    }))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            itemIconFromData(data),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476208</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476208"/>
		<updated>2026-07-04T00:25:09Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local icon = require(&amp;quot;Module:Icon&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local function itemIconFromData(data)&lt;br /&gt;
    if not data then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return icon.gameIconWithLabel({&lt;br /&gt;
        icon = data[&amp;quot;Has game icon&amp;quot;],&lt;br /&gt;
        link = data[&amp;quot;Pagename&amp;quot;],&lt;br /&gt;
        type = data[&amp;quot;Has context&amp;quot;],&lt;br /&gt;
        dyeCount = tonumber(data[&amp;quot;Has dye channels&amp;quot;]) or 0,&lt;br /&gt;
        size = &amp;quot;small&amp;quot;,&lt;br /&gt;
        text = data[&amp;quot;Has canonical name&amp;quot;],&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data)&lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            itemIconFromData(data),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476207</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476207"/>
		<updated>2026-07-04T00:21:26Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: add icon method&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local icon = require(&amp;quot;Module:Icon&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
local function itemIconFromData(data)&lt;br /&gt;
    if not data then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return icon.gameIconWithLabel({&lt;br /&gt;
        icon = data[&amp;quot;Has game icon&amp;quot;],&lt;br /&gt;
        link = data[&amp;quot;Pagename&amp;quot;],&lt;br /&gt;
        type = data[&amp;quot;Has context&amp;quot;],&lt;br /&gt;
        dyeCount = tonumber(data[&amp;quot;Has dye channels&amp;quot;]) or 0,&lt;br /&gt;
        size = &amp;quot;small&amp;quot;,&lt;br /&gt;
        text = data[&amp;quot;Has canonical name&amp;quot;],&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data) &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476206</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476206"/>
		<updated>2026-07-04T00:18:40Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data) &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476200</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476200"/>
		<updated>2026-07-03T23:38:32Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename#&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        mainlabel = &amp;quot;pagename&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data) &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476199</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476199"/>
		<updated>2026-07-03T23:34:24Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        mainlabel = &amp;quot;pagename&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data) &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476198</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476198"/>
		<updated>2026-07-03T23:33:18Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon = icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        mainlabel = &amp;quot;pagename&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data) &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476195</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476195"/>
		<updated>2026-07-03T23:31:36Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        mainlabel = &amp;quot;pagename&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data) &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476194</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476194"/>
		<updated>2026-07-03T23:30:19Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        mainlabel = &amp;quot;pagename&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data) &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476193</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476193"/>
		<updated>2026-07-03T23:27:49Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data) &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476192</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476192"/>
		<updated>2026-07-03T23:22:13Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        mw.logObject(data) &lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476191</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476191"/>
		<updated>2026-07-03T23:10:44Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Undo revision 1476190 by Gurgum (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476190</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476190"/>
		<updated>2026-07-03T23:08:13Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[==[&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
]==]&lt;br /&gt;
&lt;br /&gt;
local function itemDataFromID(id)&lt;br /&gt;
    local results = mw.smw.ask({&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
    })&lt;br /&gt;
    return results and results[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function pageNameFromData(data)&lt;br /&gt;
    return data and data[1] or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromData(data)&lt;br /&gt;
    if not data then&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return mw.getCurrentFrame():expandTemplate{&lt;br /&gt;
        title = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
        args = {&lt;br /&gt;
            Pagename = data[1],&lt;br /&gt;
            [&amp;quot;Has context&amp;quot;] = data[&amp;quot;Has context&amp;quot;],&lt;br /&gt;
            [&amp;quot;Has game icon&amp;quot;] = data[&amp;quot;Has game icon&amp;quot;],&lt;br /&gt;
            [&amp;quot;Has game icon frame type&amp;quot;] = data[&amp;quot;Has game icon frame type&amp;quot;],&lt;br /&gt;
            [&amp;quot;Has canonical name&amp;quot;] = data[&amp;quot;Has canonical name&amp;quot;],&lt;br /&gt;
            [&amp;quot;Has dye channels&amp;quot;] = data[&amp;quot;Has dye channels&amp;quot;],&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
    local resultPages = {}&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        local data = itemDataFromID(reward.Id)&lt;br /&gt;
        local pageName = pageNameFromData(data)&lt;br /&gt;
        if pageName then&lt;br /&gt;
            table.insert(resultPages, pageName)&lt;br /&gt;
        end&lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromData(data),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
    if #resultPages &amp;gt; 0 then&lt;br /&gt;
        mw.smw.set({ [&amp;quot;Has desynthesis result&amp;quot;] = resultPages })&lt;br /&gt;
    end&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=User:Gurgum/sandbox/Desynthesis_results&amp;diff=1476189</id>
		<title>User:Gurgum/sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=User:Gurgum/sandbox/Desynthesis_results&amp;diff=1476189"/>
		<updated>2026-07-03T22:43:18Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Created page with &amp;quot;{{#invoke: Sandbox/Desynthesis results | main | id = 3045 |  }}&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#invoke: Sandbox/Desynthesis results | main&lt;br /&gt;
| id = 3045&lt;br /&gt;
| &lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476188</id>
		<title>Module:Sandbox/Desynthesis results</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Module:Sandbox/Desynthesis_results&amp;diff=1476188"/>
		<updated>2026-07-03T22:41:44Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: original&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;function renderQty(min, max)&lt;br /&gt;
    if min == max then&lt;br /&gt;
        return tostring(min)&lt;br /&gt;
    end&lt;br /&gt;
    return (&amp;quot;%d–%d&amp;quot;):format(min, max)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function gameIconFromID(id)&lt;br /&gt;
    return mw.getCurrentFrame():callParserFunction(&amp;quot;#ask&amp;quot;, {&lt;br /&gt;
        (&amp;quot;[[Has context::Item]][[Has internal ID::%d]]&amp;quot;):format(id),&lt;br /&gt;
        &amp;quot;?=Pagename&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has context&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has game icon frame type&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has canonical name&amp;quot;,&lt;br /&gt;
        &amp;quot;?Has dye channels&amp;quot;,&lt;br /&gt;
        limit = 1,&lt;br /&gt;
        searchlabel = &amp;quot;&amp;quot;,&lt;br /&gt;
        format = &amp;quot;plainlist&amp;quot;,&lt;br /&gt;
        link = &amp;quot;none&amp;quot;,&lt;br /&gt;
        [&amp;quot;named args&amp;quot;] = &amp;quot;yes&amp;quot;,&lt;br /&gt;
        template = &amp;quot;Game icon format&amp;quot;,&lt;br /&gt;
    })&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.renderTable(id)&lt;br /&gt;
    id = tonumber(id)&lt;br /&gt;
&lt;br /&gt;
    -- Desynthesis data is huge, so it&#039;s split up into multiple JSON files&lt;br /&gt;
    -- that we need to be able to handle. On the wiki these are under&lt;br /&gt;
    -- Module:Desynthesis with subpages that group every 1000 item IDs where&lt;br /&gt;
    -- IDs 1 through 1000 go in 001000.json, 1001-2000 go in 002000.json, etc.&lt;br /&gt;
    --&lt;br /&gt;
    -- Attempt to load the appropriate JSON file; if there is no such file, or&lt;br /&gt;
    -- the file doesn&#039;t contain data for this item, return an error.&lt;br /&gt;
    local name = (&amp;quot;Module:Desynthesis/%03d000.json&amp;quot;):format(math.floor((id - 1) / 1000) + 1)&lt;br /&gt;
    local success, dataOrError = pcall(&lt;br /&gt;
        mw.loadJsonData,&lt;br /&gt;
        name&lt;br /&gt;
    )&lt;br /&gt;
    local sourceData&lt;br /&gt;
    if success then&lt;br /&gt;
        sourceData = dataOrError.Sources[id]&lt;br /&gt;
    end -- otherwise, leave sourceData nil&lt;br /&gt;
&lt;br /&gt;
    if not sourceData then&lt;br /&gt;
        return (&amp;quot;No data yet. (via [https://xivstats.com/desynth?source=%s xivstats.com])&amp;quot;):format(id)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local rewards = sourceData.Rewards&lt;br /&gt;
    -- shallow copy into a new table so we can sort it&lt;br /&gt;
    local mutableRewards = {}&lt;br /&gt;
    for k, v in ipairs(rewards) do&lt;br /&gt;
        mutableRewards[k] = v&lt;br /&gt;
    end&lt;br /&gt;
    mw.dumpObject(mutableRewards)&lt;br /&gt;
&lt;br /&gt;
    -- sort by chance of obtaining, descending&lt;br /&gt;
    table.sort(mutableRewards, function(a, b) return a.Pct &amp;gt; b.Pct end)&lt;br /&gt;
&lt;br /&gt;
    local result = &amp;quot;{| class=\&amp;quot;desynthesis-results-table stdt&amp;amp;#95;&amp;amp;#95;table&amp;amp;#95;v2 crafting sortable\&amp;quot;\n! Item\n! Quantity\n! Chance\n&amp;quot;&lt;br /&gt;
    for _, reward in ipairs(mutableRewards) do&lt;br /&gt;
        result = result .. (&amp;quot;|-\n| %s\n| %s\n| %.2f%%\n&amp;quot;):format(&lt;br /&gt;
            gameIconFromID(reward.Id),&lt;br /&gt;
            renderQty(reward.Min, reward.Max),&lt;br /&gt;
            reward.Pct * 100&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    result = result .. (&amp;quot;|- class=sortbottom\n! align=center colspan=3 | Based on %d desynth attempts &amp;amp;bull; Data provided by [https://xivstats.com/desynth?source=%s xivstats.com]\n|}&amp;quot;):format(sourceData.Records, id)&lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local id = frame.args.id or &amp;quot;&amp;quot;&lt;br /&gt;
    local header = frame.args.header or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if id == &amp;quot;&amp;quot; then&lt;br /&gt;
        return &amp;quot;&amp;lt;span class=error&amp;gt;Error: no item ID provided.&amp;lt;/span&amp;gt;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local table = p.renderTable(id)&lt;br /&gt;
    if not table then&lt;br /&gt;
        if header == &amp;quot;&amp;quot; then&lt;br /&gt;
            return (&amp;quot;&amp;lt;span class=error&amp;gt;Error: No data for desynthesis source %d&amp;lt;/span&amp;gt;&amp;quot;):format(id)&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;quot;&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if header ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        header = frame:preprocess(header) .. &amp;quot;\n&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
    return header .. table&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Yellow_Cornflower_Wristlets&amp;diff=1476186</id>
		<title>Yellow Cornflower Wristlets</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Yellow_Cornflower_Wristlets&amp;diff=1476186"/>
		<updated>2026-07-03T22:30:53Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Accessory infobox&lt;br /&gt;
| name = Yellow Cornflower Wristlets&lt;br /&gt;
| icon = yellow cornflower wristlets icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 189-3-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = bracelets&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = &lt;br /&gt;
| defense-hq = 1&lt;br /&gt;
| magic-defense = &lt;br /&gt;
| magic-defense-hq = 1&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = alchemist&lt;br /&gt;
| set-name = Wearable Flowers Sets&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = &lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = e1ec541d7c7&lt;br /&gt;
| id-gt = 51201&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = class&lt;br /&gt;
| sheet = &lt;br /&gt;
| type = Bracelets&lt;br /&gt;
| class = Alchemist&lt;br /&gt;
| level = 89&lt;br /&gt;
| rank = &lt;br /&gt;
| durability = 80&lt;br /&gt;
| difficulty = 3400&lt;br /&gt;
| max-quality = 7100&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = &lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 2748&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Yellow Cornflowers&lt;br /&gt;
| ingredient2 = 1 Bear Fat&lt;br /&gt;
| ingredient3 = 1 Ambrosial Water&lt;br /&gt;
| ingredient4 = 8 Water Crystal&lt;br /&gt;
| ingredient5 = 8 Lightning Crystal&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51201}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
File:Yellow Cornflower Wristlets front.png&lt;br /&gt;
File:Yellow Cornflower Wristlets side.png&lt;br /&gt;
File:Yellow Cornflower Wristlets rear.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Worn_Twill_Trousers&amp;diff=1476185</id>
		<title>Worn Twill Trousers</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Worn_Twill_Trousers&amp;diff=1476185"/>
		<updated>2026-07-03T22:30:50Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Worn Twill Trousers&lt;br /&gt;
| icon = worn twill trousers icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 6269-2-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = legs&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = 9&lt;br /&gt;
| defense-hq = 10&lt;br /&gt;
| magic-defense = 16&lt;br /&gt;
| magic-defense-hq = 18&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = weaver&lt;br /&gt;
| set-name = Hooded Tunics and Twill Trousers&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 2&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = &lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = c953a541c25&lt;br /&gt;
| id-gt = 52624&lt;br /&gt;
| ec-name = succubus-hooded&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Weaver XII&lt;br /&gt;
| type = Legs&lt;br /&gt;
| class = Weaver&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = 4&lt;br /&gt;
| durability = 70&lt;br /&gt;
| difficulty = 10040&lt;br /&gt;
| max-quality = 21200&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4740&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Indigo Twill Cloth&lt;br /&gt;
| ingredient2 = 2 Urqopacha Linen&lt;br /&gt;
| ingredient3 = 1 Sarcenet Cloth&lt;br /&gt;
| ingredient4 = 1 Antelope Horn&lt;br /&gt;
| ingredient5 = 3 Lightning Cluster&lt;br /&gt;
| ingredient6 = 3 Wind Cluster&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52624}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Worn_Bell-bottom_Twill_Trousers&amp;diff=1476184</id>
		<title>Worn Bell-bottom Twill Trousers</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Worn_Bell-bottom_Twill_Trousers&amp;diff=1476184"/>
		<updated>2026-07-03T22:30:48Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Worn Bell-bottom Twill Trousers&lt;br /&gt;
| icon = worn bell-bottom twill trousers icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 6270-2-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = legs&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = 9&lt;br /&gt;
| defense-hq = 10&lt;br /&gt;
| magic-defense = 16&lt;br /&gt;
| magic-defense-hq = 18&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = weaver&lt;br /&gt;
| set-name = Hooded Tunics and Twill Trousers&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 2&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = &lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 059a487dd89&lt;br /&gt;
| id-gt = 52625&lt;br /&gt;
| ec-name = oversized-succubus-hooded&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Weaver XII&lt;br /&gt;
| type = Legs&lt;br /&gt;
| class = Weaver&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = 4&lt;br /&gt;
| durability = 70&lt;br /&gt;
| difficulty = 10040&lt;br /&gt;
| max-quality = 21200&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4740&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Indigo Twill Cloth&lt;br /&gt;
| ingredient2 = 2 Urqopacha Linen&lt;br /&gt;
| ingredient3 = 1 Sarcenet Cloth&lt;br /&gt;
| ingredient4 = 1 Antelope Horn&lt;br /&gt;
| ingredient5 = 3 Lightning Cluster&lt;br /&gt;
| ingredient6 = 3 Wind Cluster&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52625}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Worn_Baggy_Twill_Trousers&amp;diff=1476183</id>
		<title>Worn Baggy Twill Trousers</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Worn_Baggy_Twill_Trousers&amp;diff=1476183"/>
		<updated>2026-07-03T22:30:47Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Worn Baggy Twill Trousers&lt;br /&gt;
| icon = worn baggy twill trousers icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 6271-2-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = legs&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = 9&lt;br /&gt;
| defense-hq = 10&lt;br /&gt;
| magic-defense = 16&lt;br /&gt;
| magic-defense-hq = 18&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = weaver&lt;br /&gt;
| set-name = Hooded Tunics and Twill Trousers&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 2&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = &lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = fe622da0de7&lt;br /&gt;
| id-gt = 52626&lt;br /&gt;
| ec-name = form-fitting-succubus-hooded&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Weaver XII&lt;br /&gt;
| type = Legs&lt;br /&gt;
| class = Weaver&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = 4&lt;br /&gt;
| durability = 70&lt;br /&gt;
| difficulty = 10040&lt;br /&gt;
| max-quality = 21200&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4740&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Indigo Twill Cloth&lt;br /&gt;
| ingredient2 = 2 Urqopacha Linen&lt;br /&gt;
| ingredient3 = 1 Sarcenet Cloth&lt;br /&gt;
| ingredient4 = 1 Antelope Horn&lt;br /&gt;
| ingredient5 = 3 Lightning Cluster&lt;br /&gt;
| ingredient6 = 3 Wind Cluster&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52626}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=White_Cornflower_Wristlets&amp;diff=1476182</id>
		<title>White Cornflower Wristlets</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=White_Cornflower_Wristlets&amp;diff=1476182"/>
		<updated>2026-07-03T22:30:33Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Accessory infobox&lt;br /&gt;
| name = White Cornflower Wristlets&lt;br /&gt;
| icon = white cornflower wristlets icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 189-7-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = bracelets&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = &lt;br /&gt;
| defense-hq = 1&lt;br /&gt;
| magic-defense = &lt;br /&gt;
| magic-defense-hq = 1&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = alchemist&lt;br /&gt;
| set-name = Wearable Flowers Sets&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = &lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 3756a3be20b&lt;br /&gt;
| id-gt = 51205&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = class&lt;br /&gt;
| sheet = &lt;br /&gt;
| type = Bracelets&lt;br /&gt;
| class = Alchemist&lt;br /&gt;
| level = 89&lt;br /&gt;
| rank = &lt;br /&gt;
| durability = 80&lt;br /&gt;
| difficulty = 3400&lt;br /&gt;
| max-quality = 7100&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = &lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 2748&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 White Cornflowers&lt;br /&gt;
| ingredient2 = 1 Bear Fat&lt;br /&gt;
| ingredient3 = 1 Ambrosial Water&lt;br /&gt;
| ingredient4 = 8 Water Crystal&lt;br /&gt;
| ingredient5 = 8 Lightning Crystal&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51205}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
File:White Cornflower Wristlets front.png&lt;br /&gt;
File:White Cornflower Wristlets side.png&lt;br /&gt;
File:White Cornflower Wristlets rear.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Vagrant_Keeper&amp;diff=1476181</id>
		<title>Vagrant Keeper</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Vagrant_Keeper&amp;diff=1476181"/>
		<updated>2026-07-03T22:30:29Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Vagrant Keeper&lt;br /&gt;
| icon = vagrant keeper icon1.png&lt;br /&gt;
| image = vagrant keeper.png&lt;br /&gt;
| description = A king among vagrant cascades, and lord of the falls of Westbound Zorgor.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on extra large canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 770&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 119&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 7a9b2f5f5a6&lt;br /&gt;
| id-gt = 52005&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 100 ★★★★&lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Skies]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Appearing out of nowhere, borne on sudden, ever-shifting air currents, these tunicates are widely feared as spectral messengers from the dark depths of Zorgor—not to mention their penchant for grabbing the ankles of unwary passersby.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Westbound Zorgor]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 95&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Required Tome&#039;&#039;&#039;:{{i|Tome of Ichthyological Folklore - Xak Tural}}&lt;br /&gt;
&lt;br /&gt;
{{evt|service=youtube|id=qVscIT0N5Wk|dimensions=400|description=Video guide by Fruity Snacks}}&lt;br /&gt;
&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Extra Large Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52005}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Tylosaurus&amp;diff=1476180</id>
		<title>Tylosaurus</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Tylosaurus&amp;diff=1476180"/>
		<updated>2026-07-03T22:30:25Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Tylosaurus&lt;br /&gt;
| icon = tylosaurus icon1.png&lt;br /&gt;
| image = tylosaurus.png&lt;br /&gt;
| description = Comparable to whales in terms of size, this colossal scalekin has endured since ancient times.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on large canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 16&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = e138bd95479&lt;br /&gt;
| id-gt = 51224&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Deriving from its protruding cylindrical snout, this ancient scalekin&#039;s name roughly translates to “knobbed lizard.” Some specimens grow to such a colossal size that they are mistaken for whales.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Unnamed Spectral Current]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Large Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51224}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Tiger_Mantis&amp;diff=1476179</id>
		<title>Tiger Mantis</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Tiger_Mantis&amp;diff=1476179"/>
		<updated>2026-07-03T22:30:11Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Tiger Mantis&lt;br /&gt;
| icon = tiger mantis icon1.png&lt;br /&gt;
| image = tiger mantis.png&lt;br /&gt;
| description = Though its striped carapace evokes a sense of feline ferocity, these mantis shrimp are in actual fact almost hilariously timorous.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on small canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 16&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 0bd774fab80&lt;br /&gt;
| id-gt = 51244&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Although large for mantis shrimp, these tiger-striped crustaceans are extremely timid. They spend much of their time cowering on the seabed, rarely moving unless swept up in a spectral current.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Thavnair Spectral Current]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Small Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51244}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Thavnasaurus&amp;diff=1476178</id>
		<title>Thavnasaurus</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Thavnasaurus&amp;diff=1476178"/>
		<updated>2026-07-03T22:30:10Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Thavnasaurus&lt;br /&gt;
| icon = thavnasaurus icon1.png&lt;br /&gt;
| image = thavnasaurus.png&lt;br /&gt;
| description = Much loved by the local populace, these surprisingly gentle scalekin inhabit the waters around Thavnair.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on large canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = white&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 2&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = fcc217beb9f&lt;br /&gt;
| id-gt = 51235&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This ancient reptile inhabits the seas near Thavnair, where it enjoys enduring favor amongst the populace, appearing in folklore and myriad local tales. For despite its glistening maw of razor-sharp teeth, the Thavnasaurus has a remarkably gentle temperament.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Thavnair Margin]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: Any&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Large Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51235}}&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Succubus_Hooded_Tunic&amp;diff=1476177</id>
		<title>Succubus Hooded Tunic</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Succubus_Hooded_Tunic&amp;diff=1476177"/>
		<updated>2026-07-03T22:30:05Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Succubus Hooded Tunic&lt;br /&gt;
| icon = succubus hooded tunic icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 6269-2-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = body&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = 9&lt;br /&gt;
| defense-hq = 10&lt;br /&gt;
| magic-defense = 16&lt;br /&gt;
| magic-defense-hq = 18&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = weaver&lt;br /&gt;
| set-name = Hooded Tunics and Twill Trousers&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 2&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = y&lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 226e4eee9a6&lt;br /&gt;
| id-gt = 52615&lt;br /&gt;
| ec-name = succubus-hooded&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Weaver XII&lt;br /&gt;
| type = Body&lt;br /&gt;
| class = Weaver&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = 4&lt;br /&gt;
| durability = 70&lt;br /&gt;
| difficulty = 10040&lt;br /&gt;
| max-quality = 21200&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4740&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Sweatcloth&lt;br /&gt;
| ingredient2 = 2 Urqopacha Linen&lt;br /&gt;
| ingredient3 = 1 Thunderyards Silk&lt;br /&gt;
| ingredient4 = 1 Bat Fang&lt;br /&gt;
| ingredient5 = 3 Lightning Cluster&lt;br /&gt;
| ingredient6 = 3 Wind Cluster&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52615}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Straight-cut_Twill_Trousers&amp;diff=1476176</id>
		<title>Straight-cut Twill Trousers</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Straight-cut_Twill_Trousers&amp;diff=1476176"/>
		<updated>2026-07-03T22:30:04Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Straight-cut Twill Trousers&lt;br /&gt;
| icon = straight-cut twill trousers icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 6269-1-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = legs&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = 9&lt;br /&gt;
| defense-hq = 10&lt;br /&gt;
| magic-defense = 16&lt;br /&gt;
| magic-defense-hq = 18&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = weaver&lt;br /&gt;
| set-name = Hooded Tunics and Twill Trousers&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 2&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = &lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 289ec16ad55&lt;br /&gt;
| id-gt = 52621&lt;br /&gt;
| ec-name = plain-hooded&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Weaver XII&lt;br /&gt;
| type = Legs&lt;br /&gt;
| class = Weaver&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = 4&lt;br /&gt;
| durability = 70&lt;br /&gt;
| difficulty = 10040&lt;br /&gt;
| max-quality = 21200&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4740&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Indigo Twill Cloth&lt;br /&gt;
| ingredient2 = 2 Urqopacha Linen&lt;br /&gt;
| ingredient3 = 1 Sarcenet Cloth&lt;br /&gt;
| ingredient4 = 1 Linen Yarn&lt;br /&gt;
| ingredient5 = 3 Lightning Cluster&lt;br /&gt;
| ingredient6 = 3 Wind Cluster&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52621}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Stonewashed_Twill_Trousers&amp;diff=1476175</id>
		<title>Stonewashed Twill Trousers</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Stonewashed_Twill_Trousers&amp;diff=1476175"/>
		<updated>2026-07-03T22:30:03Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Stonewashed Twill Trousers&lt;br /&gt;
| icon = stonewashed twill trousers icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 6269-3-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = legs&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = 9&lt;br /&gt;
| defense-hq = 10&lt;br /&gt;
| magic-defense = 16&lt;br /&gt;
| magic-defense-hq = 18&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = weaver&lt;br /&gt;
| set-name = Hooded Tunics and Twill Trousers&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 2&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = &lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = b9fbfbfceaf&lt;br /&gt;
| id-gt = 52627&lt;br /&gt;
| ec-name = festival-hooded&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Weaver XII&lt;br /&gt;
| type = Legs&lt;br /&gt;
| class = Weaver&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = 4&lt;br /&gt;
| durability = 70&lt;br /&gt;
| difficulty = 10040&lt;br /&gt;
| max-quality = 21200&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4740&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Indigo Twill Cloth&lt;br /&gt;
| ingredient2 = 2 Urqopacha Linen&lt;br /&gt;
| ingredient3 = 1 Sarcenet Cloth&lt;br /&gt;
| ingredient4 = 1 Cactuar Needle&lt;br /&gt;
| ingredient5 = 3 Lightning Cluster&lt;br /&gt;
| ingredient6 = 3 Wind Cluster&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52627}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Stonewashed_Bell-bottom_Twill_Trousers&amp;diff=1476174</id>
		<title>Stonewashed Bell-bottom Twill Trousers</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Stonewashed_Bell-bottom_Twill_Trousers&amp;diff=1476174"/>
		<updated>2026-07-03T22:29:58Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Stonewashed Bell-bottom Twill Trousers&lt;br /&gt;
| icon = stonewashed bell-bottom twill trousers icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 6270-3-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = legs&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = 9&lt;br /&gt;
| defense-hq = 10&lt;br /&gt;
| magic-defense = 16&lt;br /&gt;
| magic-defense-hq = 18&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = weaver&lt;br /&gt;
| set-name = Hooded Tunics and Twill Trousers&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 2&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = &lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = b78a1319d97&lt;br /&gt;
| id-gt = 52628&lt;br /&gt;
| ec-name = oversized-festival-hooded&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Weaver XII&lt;br /&gt;
| type = Legs&lt;br /&gt;
| class = Weaver&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = 4&lt;br /&gt;
| durability = 70&lt;br /&gt;
| difficulty = 10040&lt;br /&gt;
| max-quality = 21200&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4740&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Indigo Twill Cloth&lt;br /&gt;
| ingredient2 = 2 Urqopacha Linen&lt;br /&gt;
| ingredient3 = 1 Sarcenet Cloth&lt;br /&gt;
| ingredient4 = 1 Cactuar Needle&lt;br /&gt;
| ingredient5 = 3 Lightning Cluster&lt;br /&gt;
| ingredient6 = 3 Wind Cluster&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52628}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Stonewashed_Baggy_Twill_Trousers&amp;diff=1476173</id>
		<title>Stonewashed Baggy Twill Trousers</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Stonewashed_Baggy_Twill_Trousers&amp;diff=1476173"/>
		<updated>2026-07-03T22:29:45Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Stonewashed Baggy Twill Trousers&lt;br /&gt;
| icon = stonewashed baggy twill trousers icon1.png&lt;br /&gt;
| image = &lt;br /&gt;
| image-male = &lt;br /&gt;
| image-female = &lt;br /&gt;
| model = 6271-3-0-0&lt;br /&gt;
| requires = any&lt;br /&gt;
| type = legs&lt;br /&gt;
| level = 1&lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| attributes = &lt;br /&gt;
| defense = 9&lt;br /&gt;
| defense-hq = 10&lt;br /&gt;
| magic-defense = 16&lt;br /&gt;
| magic-defense-hq = 18&lt;br /&gt;
| rarity = white&lt;br /&gt;
| flavor-text = &lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 1&lt;br /&gt;
| value-hq = 2&lt;br /&gt;
| repair = weaver&lt;br /&gt;
| set-name = Hooded Tunics and Twill Trousers&lt;br /&gt;
| materia-slots = &lt;br /&gt;
| adv-melding = &lt;br /&gt;
| convertible = y&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 2&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| crest-worthy = &lt;br /&gt;
| storable = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 785c9ad6121&lt;br /&gt;
| id-gt = 52629&lt;br /&gt;
| ec-name = form-fitting-festival-hooded&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Weaver XII&lt;br /&gt;
| type = Legs&lt;br /&gt;
| class = Weaver&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = 4&lt;br /&gt;
| durability = 70&lt;br /&gt;
| difficulty = 10040&lt;br /&gt;
| max-quality = 21200&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4740&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Indigo Twill Cloth&lt;br /&gt;
| ingredient2 = 2 Urqopacha Linen&lt;br /&gt;
| ingredient3 = 1 Sarcenet Cloth&lt;br /&gt;
| ingredient4 = 1 Cactuar Needle&lt;br /&gt;
| ingredient5 = 3 Lightning Cluster&lt;br /&gt;
| ingredient6 = 3 Wind Cluster&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52629}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=&amp;quot;packed&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Spectral_Starfish&amp;diff=1476172</id>
		<title>Spectral Starfish</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Spectral_Starfish&amp;diff=1476172"/>
		<updated>2026-07-03T22:29:42Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Spectral Starfish&lt;br /&gt;
| icon = spectral starfish icon1.png&lt;br /&gt;
| image = spectral starfish.png&lt;br /&gt;
| description = Exposure to spectral currents has endowed the flesh of this rare starfish with crystalline properties.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on small canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 16&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 949a5a7b598&lt;br /&gt;
| id-gt = 51217&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Prolonged exposure to high concentrations of aether has partially crystallized these curious wavekin. They are frequently sighted at the forefront of spectral currents, calling to mind stars streaking across the firmament.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Unnamed Margin]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Small Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51217}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Spectral_Grouper&amp;diff=1476171</id>
		<title>Spectral Grouper</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Spectral_Grouper&amp;diff=1476171"/>
		<updated>2026-07-03T22:29:41Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Spectral Grouper&lt;br /&gt;
| icon = spectral grouper icon1.png&lt;br /&gt;
| image = spectral grouper.png&lt;br /&gt;
| description = This species of grouper is commonly sighted riding spectral currents. The aether it thus absorbs has transformed its flesh into a near-crystalline state.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on medium canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 16&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = fd1ba39ebcf&lt;br /&gt;
| id-gt = 51237&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The semi-crystalline flesh of this grouper results from absorbing a surfeit of aether over its lifespan—most of which it spends swimming at the vanguard of spectral currents.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Thavnair Margin]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Medium Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51237}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Specterfish&amp;diff=1476170</id>
		<title>Specterfish</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Specterfish&amp;diff=1476170"/>
		<updated>2026-07-03T22:29:39Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Specterfish&lt;br /&gt;
| icon = specterfish icon1.png&lt;br /&gt;
| image = specterfish.png&lt;br /&gt;
| description = These moderately sized wavekin are so eerily pale as to be mistaken for water-bound spirits of the dead.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on medium canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = white&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 2&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 32e8935a5bb&lt;br /&gt;
| id-gt = 51210&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Many sailors consider these fish to be an ill omen, likening their pallid, shimmering forms to the souls of those lost at sea. Such superstition is easily derided—until one witnesses the chilling sight of these nigh ethereal creatures undulating beneath the waves.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Unnamed Margin]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Medium Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51210}}&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Simolestes&amp;diff=1476169</id>
		<title>Simolestes</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Simolestes&amp;diff=1476169"/>
		<updated>2026-07-03T22:29:35Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Simolestes&lt;br /&gt;
| icon = simolestes icon1.png&lt;br /&gt;
| image = simolestes.png&lt;br /&gt;
| description = This monstrous scalekin has a notably strong skull—one of many evolutionary advantages that include razor-sharp teeth and unparalleled bulk.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on extra large canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = white&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 2&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 1ce46f4bffb&lt;br /&gt;
| id-gt = 51234&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Though this leviathan is equipped with noteworthy jaws capable of shredding prey to pieces, this scalekin&#039;s name actually means “blunt-nosed thief.” Presumably this is a reference to it snatching the lives of any creatures foolish enough to contest its reign in the depths.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Thavnair Margin]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: Any&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Extra Large Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51234}}&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Silverdart&amp;diff=1476168</id>
		<title>Silverdart</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Silverdart&amp;diff=1476168"/>
		<updated>2026-07-03T22:29:23Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Silverdart&lt;br /&gt;
| icon = silverdart icon1.png&lt;br /&gt;
| image = silverdart.png&lt;br /&gt;
| description = The snouts of these aerodynamic wavekin are painfully sharp—so much so that they are occasionally used as darts when dried.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on medium canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 16&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = f5940c03880&lt;br /&gt;
| id-gt = 51242&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When dried, these slender, sharp-nosed fish make for excellent projectiles. Some Thavnairian merchants have even taken to launching them at wall-mounted maps, planning their next excursion based on where the silver snout pierces the parchment. One wonders how many businesses have floundered as the result of an errant throw.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Thavnair Spectral Current]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Medium Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51242}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Silkfin&amp;diff=1476167</id>
		<title>Silkfin</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Silkfin&amp;diff=1476167"/>
		<updated>2026-07-03T22:29:23Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Silkfin&lt;br /&gt;
| icon = silkfin icon1.png&lt;br /&gt;
| image = silkfin.png&lt;br /&gt;
| description = Revered by inhabitants of fishing villages throughout Thavnair, the distinctive splotches that speckle this graceful wavekin make it easy to spot from a distance.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on medium canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 16&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 1b2d8f35f38&lt;br /&gt;
| id-gt = 51238&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This subspecies is revered as a sign of good fortune in fishing villages across Thavnair. Its boldly patterned flanks are easily visible from above the water&#039;s surface, and sightings are said to precipitate a bumper catch for the day.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Thavnair Margin]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Medium Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51238}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Shined_Copper_Shark&amp;diff=1476166</id>
		<title>Shined Copper Shark</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Shined_Copper_Shark&amp;diff=1476166"/>
		<updated>2026-07-03T22:29:22Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Shined Copper Shark&lt;br /&gt;
| icon = shined copper shark icon1.png&lt;br /&gt;
| image = shined copper shark.png&lt;br /&gt;
| description = A king among copper sharks, and lord of the waters of Canal Town North.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on extra large canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 770&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 119&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 1c3b22ccf40&lt;br /&gt;
| id-gt = 52006&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 100 ★★★★&lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This gargantuan shark gleams with the brilliance of burnished copper. Some believe this luster results from a diet rich in Endless and their aether.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Canal Town North]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 100&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: Ghost Nipper&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: Between 8 AM to 1 PM&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: Fog&lt;br /&gt;
*&#039;&#039;&#039;Required Tome&#039;&#039;&#039;:{{i|Tome of Ichthyological Folklore - Alexandria}}&lt;br /&gt;
&lt;br /&gt;
{{evt|service=youtube|id=MN_KLTu_-tM|dimensions=400|description=Video guide by Fruity Snacks}}&lt;br /&gt;
&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Extra Large Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=52006}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Semicircular_Outdoor_Stage&amp;diff=1476165</id>
		<title>Semicircular Outdoor Stage</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Semicircular_Outdoor_Stage&amp;diff=1476165"/>
		<updated>2026-07-03T22:29:15Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Semicircular Outdoor Stage&lt;br /&gt;
| icon = semicircular outdoor stage icon1.png&lt;br /&gt;
| image = Semicircular Outdoor Stage.jpeg&lt;br /&gt;
| description = For thespians whose brilliance cannot be bound by the stifling walls of a theater.&lt;br /&gt;
| type = other&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Outdoor Furnishing&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = carpenter&lt;br /&gt;
| rarity = white&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 690&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 57&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = cc77449246c&lt;br /&gt;
| id-gt = 51271&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = class&lt;br /&gt;
| sheet = &lt;br /&gt;
| type = Outdoor Furnishing&lt;br /&gt;
| class = Carpenter&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = &lt;br /&gt;
| durability = 80&lt;br /&gt;
| difficulty = 6600&lt;br /&gt;
| max-quality = 12000&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = Unavailable&lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4207&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = &lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 5 Dark Mahogany Lumber&lt;br /&gt;
| ingredient2 = 6 Ceiba Lumber&lt;br /&gt;
| ingredient3 = 2 Shroud Seedling&lt;br /&gt;
| ingredient4 = 3 Growth Formula Lambda&lt;br /&gt;
| ingredient5 = 5 Firebricks&lt;br /&gt;
| ingredient6 = 32 Wind Crystal&lt;br /&gt;
| ingredient7 = 32 Ice Crystal&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
{{deployed from|showHeader=Y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51271}}&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=packed&amp;gt;&lt;br /&gt;
Semicircular Outdoor Stage night.jpeg|At night&lt;br /&gt;
Semicircular Outdoor Stage size.jpeg|Pictured beside a Lavender Beds small house&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Saurian_Tabard_of_Aiming&amp;diff=1476164</id>
		<title>Saurian Tabard of Aiming</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Saurian_Tabard_of_Aiming&amp;diff=1476164"/>
		<updated>2026-07-03T22:29:14Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Saurian Tabard of Aiming&lt;br /&gt;
| icon = saurian tabard of aiming icon1.png&lt;br /&gt;
| model = 119-4-0-0&lt;br /&gt;
| requires = Aiming&lt;br /&gt;
| type = body&lt;br /&gt;
| level = 50&lt;br /&gt;
| ilvl = 90&lt;br /&gt;
| attributes = {{attribute increase|dexterity|27|30}}{{attribute increase|vitality|29|32}}{{attribute increase|skill speed|22|25}}{{attribute increase|direct hit rate|32|36}}&lt;br /&gt;
| defense = 87&lt;br /&gt;
| defense-hq = 97&lt;br /&gt;
| magic-defense = 87&lt;br /&gt;
| magic-defense-hq = 97&lt;br /&gt;
| rarity = green&lt;br /&gt;
| flavor-text =&lt;br /&gt;
| value = 177&lt;br /&gt;
| value-hq = 195&lt;br /&gt;
| seals = &lt;br /&gt;
| repair = Leatherworker&lt;br /&gt;
| npc-repair = &lt;br /&gt;
| set-name = Ancient Armor&lt;br /&gt;
| materia-slots = 2&lt;br /&gt;
| adv-melding =&lt;br /&gt;
| convertible = y&lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 1&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-level = 90.00&lt;br /&gt;
| crest-worthy = y&lt;br /&gt;
| storable =&lt;br /&gt;
| patch = 2.2&lt;br /&gt;
| release = a realm reborn&lt;br /&gt;
| id-edb = cdb8fb839d8&lt;br /&gt;
| id-gt = 7499&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Leatherworker I&lt;br /&gt;
| type = Body&lt;br /&gt;
| class = Leatherworker&lt;br /&gt;
| level = 50&lt;br /&gt;
| rank = 3&lt;br /&gt;
| durability = 80&lt;br /&gt;
| difficulty = 420&lt;br /&gt;
| max-quality = 2750&lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = &lt;br /&gt;
| qs-craftsmanship = 451&lt;br /&gt;
| hq = &lt;br /&gt;
| craftsmanship = 391&lt;br /&gt;
| craftsmanship-rec = &lt;br /&gt;
| control = 374&lt;br /&gt;
| control-rec = &lt;br /&gt;
| aspect = &lt;br /&gt;
| specialization = &lt;br /&gt;
| ingredient1 = 2 Saurian Leather&lt;br /&gt;
| ingredient2 = 2 Terminus Putty&lt;br /&gt;
| ingredient3 = 1 Hippogryph Leather&lt;br /&gt;
| ingredient4 = 1 Darksteel Rings&lt;br /&gt;
| ingredient5 = 1 Rose Gold Nugget&lt;br /&gt;
| ingredient6 = 2 Earth Cluster&lt;br /&gt;
| ingredient7 = 1 Wind Cluster&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
===From Items===&lt;br /&gt;
{{contained in}}&lt;br /&gt;
&lt;br /&gt;
==Used For==&lt;br /&gt;
===Crafting Ingredient===&lt;br /&gt;
{{recipe list}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results}}&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=packed&amp;gt;&lt;br /&gt;
File:Saurian Tabard of Aiming front.png&lt;br /&gt;
File:Saurian Tabard of AIming left side.png&lt;br /&gt;
File:Saurian Tabard of Aiming rear.png&lt;br /&gt;
File:Saurian Tabard of Aiming right side.png&lt;br /&gt;
File:Ancient aiming attire.png|Ancient aiming attire&lt;br /&gt;
File:Cashmere of Aiming img1.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Saurian_Shirt_of_Striking&amp;diff=1476163</id>
		<title>Saurian Shirt of Striking</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Saurian_Shirt_of_Striking&amp;diff=1476163"/>
		<updated>2026-07-03T22:29:12Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Armor infobox&lt;br /&gt;
| name = Saurian Shirt of Striking&lt;br /&gt;
| icon = saurian_shirt_of_striking_icon1.png&lt;br /&gt;
| model = 122-3-0-0&lt;br /&gt;
| requires = striking-scouting&lt;br /&gt;
| type = body&lt;br /&gt;
| level = 50&lt;br /&gt;
| ilvl = 90&lt;br /&gt;
| attributes = {{attribute increase|strength|27|30}}{{attribute increase|dexterity|27|30}}{{attribute increase|vitality|29|32}}{{attribute increase|critical hit|25|25}}{{attribute increase|determination|32|36}}&lt;br /&gt;
| defense = 87&lt;br /&gt;
| defense-hq = 97&lt;br /&gt;
| magic-defense = 87&lt;br /&gt;
| magic-defense-hq = 97&lt;br /&gt;
| rarity = green&lt;br /&gt;
| flavor-text =&lt;br /&gt;
| value = 177&lt;br /&gt;
| value-hq = 195&lt;br /&gt;
| seals = 518&lt;br /&gt;
| repair = Leatherworker&lt;br /&gt;
| npc-repair = &lt;br /&gt;
| set-name = Ancient Armor&lt;br /&gt;
| materia-slots = 2&lt;br /&gt;
| adv-melding =&lt;br /&gt;
| convertible = y&lt;br /&gt;
| dyeable = y&lt;br /&gt;
| dye-count = 1&lt;br /&gt;
| projectable = y&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-level = 90&lt;br /&gt;
| crest-worthy = y&lt;br /&gt;
| storable =&lt;br /&gt;
| patch = 2.2&lt;br /&gt;
| release = &lt;br /&gt;
| id-edb = 807dc818d14&lt;br /&gt;
| id-gt = 7493&lt;br /&gt;
}} __NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| name = Saurian Shirt of Striking&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Leatherworker I&lt;br /&gt;
| type = body&lt;br /&gt;
| class = leatherworker&lt;br /&gt;
| level = 50&lt;br /&gt;
| rank = 3&lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis =&lt;br /&gt;
| craftsmanship = 391&lt;br /&gt;
| control = 374&lt;br /&gt;
| qs-craftsmanship = 451&lt;br /&gt;
| durability = 80&lt;br /&gt;
| difficulty = 420&lt;br /&gt;
| max-quality = 2750&lt;br /&gt;
| ingredient1 = 2 Saurian Leather&lt;br /&gt;
| ingredient2 = 2 Terminus Putty&lt;br /&gt;
| ingredient3 = 1 Hippogryph Leather&lt;br /&gt;
| ingredient4 = 1 Undyed Felt&lt;br /&gt;
| ingredient5 = 1 Silk Thread&lt;br /&gt;
| ingredient6 = 1 Rose Gold Nugget&lt;br /&gt;
| ingredient7 = 2 Earth Cluster&lt;br /&gt;
| ingredient8 = 1 Wind Cluster&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Used For==&lt;br /&gt;
===Crafting Ingredient===&lt;br /&gt;
{{recipe list}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results}}&lt;br /&gt;
&lt;br /&gt;
{{clear}}&lt;br /&gt;
==Gallery==&lt;br /&gt;
&amp;lt;gallery heights=200px mode=packed&amp;gt;&lt;br /&gt;
File:Saurian Shirt of Striking front.png&lt;br /&gt;
File:Saurian Shirt of Striking left side.png&lt;br /&gt;
File:Saurian Shirt of Striking rear.png&lt;br /&gt;
File:Saurian Shirt of Striking right side.png&lt;br /&gt;
File:Ancient slaying attire.png|Ancient slaying attire&lt;br /&gt;
file:saurian-shirt-striking.jpg&lt;br /&gt;
File:Class - Pugilist.jpg&lt;br /&gt;
File:Saurian of Striking img1.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Satrapsaurus&amp;diff=1476162</id>
		<title>Satrapsaurus</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Satrapsaurus&amp;diff=1476162"/>
		<updated>2026-07-03T22:29:11Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Satrapsaurus&lt;br /&gt;
| icon = satrapsaurus icon1.png&lt;br /&gt;
| image = satrapsaurus.png&lt;br /&gt;
| description = Understood to have persisted in Thavnair since ancient times, this scalekin is currently the subject of feverish Sharlayan scholarship.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on large canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 16&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 31020fa43f7&lt;br /&gt;
| id-gt = 51243&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Over the millennia, this ancient species has been much transformed by its time spent traversing spectral currents. In recent years, this specimen has garnered significant attention among Sharlayan scholars devoted to the study of underwater aetheric currents.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Thavnair Spectral Current]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Large Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51243}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Royal_Handmaiden_(Fish)&amp;diff=1476161</id>
		<title>Royal Handmaiden (Fish)</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Royal_Handmaiden_(Fish)&amp;diff=1476161"/>
		<updated>2026-07-03T22:29:00Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Royal Handmaiden&lt;br /&gt;
| icon = royal handmaiden (fish) icon1.png&lt;br /&gt;
| image = royal handmaiden (fish).png&lt;br /&gt;
| description = Allegedly, this many-hued wavekin began its existence as an envoy&#039;s attendant who took an unfortunate plunge overboard.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on small canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = white&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 2&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 0aeb5030697&lt;br /&gt;
| id-gt = 51216&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Legend has it that an envoy&#039;s attendant fell from their vessel while traversing the seas, whereupon they assumed a new, aquatic form beneath the waves—kimono transforming into scale, stitch by vibrant stitch.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Unnamed Margin]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: Any&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Small Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51216}}&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Royal_Favorite&amp;diff=1476160</id>
		<title>Royal Favorite</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Royal_Favorite&amp;diff=1476160"/>
		<updated>2026-07-03T22:28:59Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Royal Favorite&lt;br /&gt;
| icon = royal favorite icon1.png&lt;br /&gt;
| image = royal favorite.png&lt;br /&gt;
| description = Legends say this vibrantly patterned wavekin was once a royal attendant sadly swallowed up by the waves.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on small canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = green&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 16&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 4ca24ae06c1&lt;br /&gt;
| id-gt = 51221&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Tales speak of a royal attendant who plunged from their ship, only to transform into a resplendent wavekin in the inky depths. Some say they now ply the spectral currents with grace and determination, hoping to be reunited with their beloved former lord.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Unnamed Spectral Current]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Small Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51221}}&lt;br /&gt;
[[Category:Dawntrail Legendary Fish]]&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Rod_of_Nihility_Display&amp;diff=1476159</id>
		<title>Rod of Nihility Display</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Rod_of_Nihility_Display&amp;diff=1476159"/>
		<updated>2026-07-03T22:28:56Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Rod of Nihility Display&lt;br /&gt;
| icon = rod of nihility display icon1.png&lt;br /&gt;
| image = Rod of Nihility Display.jpeg&lt;br /&gt;
| description = A pitch-dark display stand. The tenebrous aura of a powerful voidsent emanates from within.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;※One per estate only.&lt;br /&gt;
| type = other&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Tabletop&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = goldsmith&lt;br /&gt;
| rarity = white&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 770&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 30&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = e640befb082&lt;br /&gt;
| id-gt = 51252&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Acquisition==&lt;br /&gt;
===Crafting Recipe===&lt;br /&gt;
{{Recipe&lt;br /&gt;
| source = recipe sheet&lt;br /&gt;
| sheet = Master Goldsmith XII&lt;br /&gt;
| type = Tabletop&lt;br /&gt;
| class = Goldsmith&lt;br /&gt;
| level = 100&lt;br /&gt;
| rank = 4&lt;br /&gt;
| durability = 70&lt;br /&gt;
| difficulty = 10040&lt;br /&gt;
| max-quality = 21200&lt;br /&gt;
| quality-req = &lt;br /&gt;
| yield = 1&lt;br /&gt;
| quick-synthesis = Unavailable&lt;br /&gt;
| qs-craftsmanship = &lt;br /&gt;
| qs-control = &lt;br /&gt;
| hq = Unavailable&lt;br /&gt;
| craftsmanship = &lt;br /&gt;
| craftsmanship-rec = 4740&lt;br /&gt;
| control = &lt;br /&gt;
| specialization = y&lt;br /&gt;
| equipment-req = &lt;br /&gt;
| expert-recipe = &lt;br /&gt;
| collectable = &lt;br /&gt;
| ingredient1 = 1 Arm of Unmaking&lt;br /&gt;
| ingredient2 = 2 Rose Garnet&lt;br /&gt;
| ingredient3 = 2 Double Duraluminum Ingot&lt;br /&gt;
| ingredient4 = 1 Ra&#039;Kaznar Ingot&lt;br /&gt;
| ingredient5 = 1 Black Star&lt;br /&gt;
| ingredient6 = 3 Wind Cluster&lt;br /&gt;
| ingredient7 = 3 Fire Cluster&lt;br /&gt;
}}{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
{{deployed from|showHeader=Y}}&lt;br /&gt;
==Used For==&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51252}}&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Rhotanosaurus&amp;diff=1476158</id>
		<title>Rhotanosaurus</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Rhotanosaurus&amp;diff=1476158"/>
		<updated>2026-07-03T22:28:56Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Rhotanosaurus&lt;br /&gt;
| icon = rhotanosaurus icon1.png&lt;br /&gt;
| image = rhotanosaurus.png&lt;br /&gt;
| description = These vicious ancient scalekin have dominated the realm&#039;s oceans for millennia.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on extra large canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = white&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 2&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 2e6c4912666&lt;br /&gt;
| id-gt = 51215&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Unlike its mosasaur cousins that stalk the waters of inland Gyr Abania, this scalekin freely roams the realm&#039;s oceans. Despite presiding over a much larger habitat, its innate ferocity remains unchanged.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Unnamed Margin]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: Any&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Extra Large Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51215}}&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
	<entry>
		<id>https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Rhotano_Roosterfish&amp;diff=1476157</id>
		<title>Rhotano Roosterfish</title>
		<link rel="alternate" type="text/html" href="https://ffxiv.consolegameswiki.com/mediawiki/index.php?title=Rhotano_Roosterfish&amp;diff=1476157"/>
		<updated>2026-07-03T22:28:53Z</updated>

		<summary type="html">&lt;p&gt;Gurgum: Text replacement - &amp;quot;{{Desynthesis results&amp;quot; to &amp;quot;{{desynthesis results&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Item infobox&lt;br /&gt;
| name = Rhotano Roosterfish&lt;br /&gt;
| icon = rhotano roosterfish icon1.png&lt;br /&gt;
| image = rhotano roosterfish.png&lt;br /&gt;
| description = Bright of scale and ferocious in temperament, this large saltwater specimen is a common sight between Thavnair and Eorzea.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;[Suitable for printing on large canvases.]&lt;br /&gt;
| type = crafting material&lt;br /&gt;
| effects = &lt;br /&gt;
| effects-hq = &lt;br /&gt;
| material-type = Seafood&lt;br /&gt;
| unique = &lt;br /&gt;
| untradable = &lt;br /&gt;
| unsellable = &lt;br /&gt;
| dyeable = &lt;br /&gt;
| dye-count = &lt;br /&gt;
| rarity = white&lt;br /&gt;
| level = &lt;br /&gt;
| ilvl = 1&lt;br /&gt;
| desynthesizable = y&lt;br /&gt;
| desynth-class = culinarian&lt;br /&gt;
| race = &lt;br /&gt;
| gender = &lt;br /&gt;
| recast = &lt;br /&gt;
| recast-hq = &lt;br /&gt;
| cost = &lt;br /&gt;
| value = 2&lt;br /&gt;
| value-hq = &lt;br /&gt;
| seals = &lt;br /&gt;
| patch = 7.5&lt;br /&gt;
| release = dawntrail&lt;br /&gt;
| id-edb = 89789c39d74&lt;br /&gt;
| id-gt = 51214&lt;br /&gt;
}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
==Basic Information==&lt;br /&gt;
*&#039;&#039;&#039;Recommended [[Fishing]] Level&#039;&#039;&#039;: 1 &lt;br /&gt;
*&#039;&#039;&#039;Fish Type&#039;&#039;&#039;: [[Deep Sea]]&lt;br /&gt;
*&#039;&#039;&#039;[[Aquarium]] Type&#039;&#039;&#039;: None&lt;br /&gt;
*&#039;&#039;&#039;Sizes&#039;&#039;&#039;: Smallest - ??im, Largest - ??im&lt;br /&gt;
&#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This exceptionally aggressive wavekin is a common sight in the waters betwixt Thavnair and Eorzea. Some jokingly remark that its temperament must be learned from the pirates who ply their cutthroat trade in the region.&lt;br /&gt;
==Acquisition==&lt;br /&gt;
{{vendor list|hideIfEmpty=y}}&lt;br /&gt;
{{quest list||item-rewards=y|conditions=Has item reward::{{#titleparts:{{PAGENAME}}}}|hideIfEmpty=y}}&lt;br /&gt;
===[[Fishing Log: Unnamed Margin]]===&lt;br /&gt;
*&#039;&#039;&#039;Hole Level&#039;&#039;&#039;: 1&lt;br /&gt;
*&#039;&#039;&#039;[[Baits]]&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Mooch]]ed from&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;Condition&#039;&#039;&#039;: ???&lt;br /&gt;
*&#039;&#039;&#039;[[Weather]]&#039;&#039;&#039;: ???&lt;br /&gt;
==Used For==&lt;br /&gt;
{{see also|Large Angler&#039;s Canvas}}&lt;br /&gt;
==={{i|Desynthesis}}===&lt;br /&gt;
{{desynthesis results|id=51214}}&lt;/div&gt;</summary>
		<author><name>Gurgum</name></author>
	</entry>
</feed>