Full Code of max-ri/Guidelime for AI

master f07119983e1b cached
86 files
27.4 MB
7.2M tokens
1 requests
Copy disabled (too large) Download .txt
Showing preview only (30,299K chars total). Download the full file to get everything.
Repository: max-ri/Guidelime
Branch: master
Commit: f07119983e1b
Files: 86
Total size: 27.4 MB

Directory structure:
gitextract_32tprem4/

├── .gitignore
├── .pkgmeta
├── Guidelime/
│   ├── ActionButtons.lua
│   ├── Bindings.xml
│   ├── CurrentGuide.lua
│   ├── CustomCode.lua
│   ├── Data/
│   │   ├── ClassicCodex.lua
│   │   ├── ClassicCodexCorrections.lua
│   │   ├── Data.lua
│   │   ├── FlightmasterDB.lua
│   │   ├── FlightmasterDB_Locales.lua
│   │   ├── Internal/
│   │   │   ├── CreaturesDB.lua
│   │   │   ├── CreaturesDB_Locales.lua
│   │   │   ├── ItemsDB.lua
│   │   │   ├── ItemsDB_Locales.lua
│   │   │   ├── ObjectsDB.lua
│   │   │   ├── ObjectsDB_Locales.lua
│   │   │   ├── QuestsDB.lua
│   │   │   ├── QuestsDB_Locales.lua
│   │   │   └── corrections.lua
│   │   ├── MapDB.lua
│   │   ├── PositionTools.lua
│   │   ├── Questie.lua
│   │   ├── QuestieCorrections.lua
│   │   ├── QuestsTools.lua
│   │   ├── SkillDB.lua
│   │   ├── SkillDB_Locales.lua
│   │   └── SpellDB.lua
│   ├── Editor.lua
│   ├── EditorTools.lua
│   ├── Events.lua
│   ├── Frames.lua
│   ├── GuideParser.lua
│   ├── Guidelime-Cata.toc
│   ├── Guidelime-Mists.toc
│   ├── Guidelime-TBC.toc
│   ├── Guidelime-Vanilla.toc
│   ├── Guidelime-Wrath.toc
│   ├── Guidelime.lua
│   ├── Guides.lua
│   ├── Icons/
│   │   ├── Arrow.blp
│   │   ├── ArrowLicense.txt
│   │   ├── TitleHighlight.blp
│   │   ├── black.blp
│   │   ├── check.blp
│   │   ├── discord.tga
│   │   ├── getflightpoint.blp
│   │   ├── hearth.blp
│   │   ├── lime.blp
│   │   ├── lime0.blp
│   │   ├── lime_arrow.blp
│   │   ├── lime_marker.blp
│   │   ├── lime_marker_friz.blp
│   │   ├── lime_marker_friz_green.blp
│   │   ├── limev.blp
│   │   ├── paypal.tga
│   │   ├── questunavailable.blp
│   │   ├── repair.blp
│   │   ├── scroll.blp
│   │   └── set_hearth.blp
│   ├── Import.lua
│   ├── Libs/
│   │   ├── CallbackHandler-1.0/
│   │   │   ├── CallbackHandler-1.0.lua
│   │   │   └── CallbackHandler-1.0.xml
│   │   ├── HereBeDragons/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── CallbackHandler-1.0/
│   │   │   │   ├── CallbackHandler-1.0.lua
│   │   │   │   └── CallbackHandler-1.0.xml
│   │   │   ├── HereBeDragons-2.0.lua
│   │   │   ├── HereBeDragons-Migrate.lua
│   │   │   ├── HereBeDragons-Pins-2.0.lua
│   │   │   ├── HereBeDragons.toc
│   │   │   └── LibStub/
│   │   │       ├── LibStub.lua
│   │   │       └── LibStub.toc
│   │   ├── LibDBIcon-1.0/
│   │   │   ├── LibDBIcon-1.0.lua
│   │   │   └── lib.xml
│   │   ├── LibDataBroker-1.1/
│   │   │   └── LibDataBroker-1.1.lua
│   │   └── LibStub/
│   │       └── LibStub.lua
│   ├── Localization.lua
│   ├── MainWindow.lua
│   ├── Map.lua
│   ├── Options.lua
│   ├── QuestLog-Classic.lua
│   ├── QuestLog.lua
│   └── QuestScan.lua
├── Guidelime_MyGuideExample/
│   ├── Guidelime_MyGuideExample.toc
│   └── MyGuide.lua
└── README.md

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
*
!Guidelime
!Guidelime/**
!Guidelime_MyGuideExample
!README.md
!.pkgmeta
!.gitignore


================================================
FILE: .pkgmeta
================================================
enable-nolib-creation: no
package-as: Guidelime

move-folders:
   Guidelime/Guidelime : Guidelime

ignore:
   - Guidelime_MyGuideExample


================================================
FILE: Guidelime/ActionButtons.lua
================================================
local addonName, addon = ...
local L = addon.L

addon.D = addon.D or {}; local D = addon.D     -- Data/Data
addon.SP = addon.SP or {}; local SP = addon.SP -- Data/SpellDB
addon.EV = addon.EV or {}; local EV = addon.EV -- Events
addon.F = addon.F or {}; local F = addon.F     -- Frames
addon.CG = addon.CG or {}; local CG = addon.CG -- CurrentGuide
addon.M = addon.M or {}; local M = addon.M     -- Map
addon.MW = addon.MW or {}; local MW = addon.MW -- MainWindow
addon.QT = addon.QT or {}; local QT = addon.QT -- Data/QuestTools

addon.AB = addon.AB or {}; local AB = addon.AB -- ActionButtons

-- for key bindings
_G["BINDING_NAME_GUIDELIME_TARGET_1"] = L.TARGET_1
_G["BINDING_NAME_GUIDELIME_USE_ITEM_1"] = string.format(L.USE_ITEM_X, 1)
for i = 2, 5 do
	_G["BINDING_NAME_GUIDELIME_TARGET_" .. i] = string.format(L.TARGET_X, i)
	_G["BINDING_NAME_GUIDELIME_USE_ITEM_" .. i] = string.format(L.USE_ITEM_X, i)
end

function AB.resetButtons(buttons)
	if not buttons then return end
	for _, button in pairs(buttons) do
		if button:IsShown() then
			if InCombatLockdown() then
				EV.updateAfterCombat = true
				return 
			end
			ClearOverrideBindings(button)
			button:Hide()
		end
	end
end

-- ordering of raid markers to use
-- default to triangle for friends because it is green and skull for enemies
AB.targetRaidMarkerIndex = {4, 6, 3, 5, 1, 2, 7, 8}	

function AB.getTargetButtonIconText(npcId)
	if AB.targetNpcIdMarker == null or AB.targetNpcIdMarker[npcId] == null then return "" end
	return AB.getTargetMarkerIconText(AB.targetNpcIdMarker[npcId]) .. " "
end

function AB.getTargetMarkerIconText(marker)
	if marker and marker > 0 then
		return "|TInterface\\TargetingFrame\\UI-RaidTargetingIcon_" .. marker .. ":12|t"
	else
		return "|T" .. addon.icons.TARGET_BUTTON .. ":12|t"
	end
end

function AB.createTargetButton(i)
	local button = MW.mainFrame.targetButtons[i]
	if not button then
		button = CreateFrame("BUTTON", "GuidelimeTargetButton" .. i, MW.mainFrame, "SecureActionButtonTemplate")
		button.index = i
		button:SetSize(32, 32)
		button:SetAttribute("type", "macro")
		button.texture = button:CreateTexture(nil, "BACKGROUND")
		button.texture:SetTexture(i == "Multi" and addon.icons.MULTI_TARGET_BUTTON or addon.icons.TARGET_BUTTON)
		button.texture:SetPoint("TOPLEFT", button, -2, 1)					
		button.texture:SetPoint("BOTTOMRIGHT", button, 2, -2)
		button.texture2 = button:CreateTexture(nil, "OVERLAY")
		button.texture2:SetTexture("Interface\\TargetingFrame\\UI-RaidTargetingIcons")
		button.texture2:SetPoint("TOPLEFT", button, 20, -22)					
		button.texture2:SetPoint("BOTTOMRIGHT", button, -2, 0)
		button.hotkey = button:CreateFontString(nil, "ARTWORK", "NumberFontNormalSmallGray")
		button.hotkey:SetSize(32, 10)
		button.hotkey:SetPoint("TOPRIGHT", button, 0, -1)
		button.hotkey:SetJustifyH("RIGHT")
		button:RegisterForClicks("AnyUp", "AnyDown")
		button:SetMouseClickEnabled(true)
		MW.mainFrame.targetButtons[i] = button
	end
	button:ClearAllPoints()
	return button
end

-- global function to be used in the macro: Set target marker on target if it does not have one already; remove existing marker when no target
function LIME(iconId)
	SetRaidTarget("player", iconId)
	SetRaidTarget("player", 0)
	if UnitGUID("target") and not GetRaidTargetIndex("target") then SetRaidTarget("target", iconId) end
end

local function getTargetMacro(t)
	return "/targetexact " .. t.name .. 
		(t.marker and "\n/run LIME(".. t.marker .. ")" or "")
end

local function getTargetMacroMulti(targets)
	local macro = ""
	for i, t in ipairs(targets) do
		local m = getTargetMacro(t)
		local maxMacroLength
		if select(4, GetBuildInfo()) >= 20505 and select(4, GetBuildInfo()) < 30000 then		
			maxMacroLength = 240
		else
			maxMacroLength = 1022
		end
		if #macro + #m > maxMacroLength then
			if addon.debugging then print("LIME: target macro multi is too long") end
			--if addon.debugging then print("LIME: target macro -", macro) end
			return macro
		end
		macro = macro .. m .. "\n"
	end
	if addon.debugging then print("LIME: target macro multi length is", #macro) end
	--if addon.debugging then print("LIME: target macro -", macro) end
	return macro
end

local function getTooltipHint(newline, disable)
	if disable or GuidelimeData.keyBound then return "" end
	return (newline and "\n" or "") .. MW.COLOR_INACTIVE .. L.TOOLTIP_HINT_KEY_BIND_BUTTON .. "|r"
end

local function getTargetTooltip(t, last)
	return GuidelimeData.showTooltips and 
		(table.concat({string.format(L.TARGET_TOOLTIP, MW["COLOR_" .. QT.isFriendlyNpc(t.npcId)] .. t.name .. "|r"), M.getMapTooltip(t.element)}, "\n") ..
		getTooltipHint(true, last == false))
		
end

local function getTargetTooltipMulti(targets)
	if not GuidelimeData.showTooltips then return end
	local tooltips = {}
	for i, t in ipairs(targets) do
		tooltips[i] = getTargetTooltip(t, i == #targets)
	end
	return table.concat(tooltips, "\n")
end

local function keyBindButton(button, bindingName, buttonName, functionName)
	local key = GetBindingKey(bindingName)
	if key then
		button.hotkey:SetText(_G["KEY_" .. key] or key)
		SetOverrideBindingClick(button, true, key, buttonName)
		if addon.debugging then print("LIME: binding " .. key .. " to " .. functionName) end
		GuidelimeData.keyBound = true
		button.hotkey:Show()
	else
		button.hotkey:Hide()
	end
end

function AB.updateTargetButtons()
	if not MW.mainFrame then return end
	if MW.mainFrame.targetButtons == nil then
		MW.mainFrame.targetButtons = {}
	else
		AB.resetButtons(MW.mainFrame.targetButtons)
	end
	if not GuidelimeDataChar.showTargetButtons or not CG.currentGuide or not CG.currentGuide.firstActiveIndex then return end
	local targets = {}
	local i = 1
	local iFriendly = 1
	local iHostile = #AB.targetRaidMarkerIndex
	for s = CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex do
		local step = CG.currentGuide.steps[s]
		if step.active then
			for _, element in ipairs(step.elements) do
				if element.t == "TARGET" and element.targetNpcId > 0 and 
					(not element.attached or not element.attached.completed) and
					(not element.attached or element.attached.t ~= "COMPLETE" or CG.isQuestObjectiveActive(element.attached.questId, element.objectives, element.attached.objective)) and
					(element.generated or not D.contains(CG.currentGuide.activeQuestNpcs, element.targetNpcId)) then
					if addon.debugging then print("LIME: show target button for npc", element.targetNpcId) end
					if InCombatLockdown() then
						EV.updateAfterCombat = true
						return 
					end
					local name = QT.getNPCName(element.targetNpcId)
					if name then
						local t = D.find(targets, function(t) return t.name == name end)
						if not t then
							local marker
							if GuidelimeData.targetRaidMarkers and iFriendly <= iHostile then
								local friendly = QT.isFriendlyNpc(element.targetNpcId) == 'Friendly'
								if friendly then
									marker = AB.targetRaidMarkerIndex[iFriendly]
									iFriendly = iFriendly + 1
								else
									marker = AB.targetRaidMarkerIndex[iHostile]
									iHostile = iHostile - 1
								end
							end
							targets[i] = {name = name, index = i, marker = marker, npcId = element.targetNpcId}
							if GuidelimeDataChar.maxNumOfTargetButtons > 0 and i >= GuidelimeDataChar.maxNumOfTargetButtons then break end
							i = i + 1
						end
					end
				end
			end
		end
	end
	local pos = 1
	if #targets > 1 then
		local button = AB.createTargetButton("Multi")
		button.texture2:Hide()
		button:SetPoint("TOP" .. GuidelimeDataChar.showTargetButtons, MW.mainFrame, "TOP" .. GuidelimeDataChar.showTargetButtons, 
			GuidelimeDataChar.showTargetButtons == "LEFT" and -36 or (GuidelimeDataChar.mainFrameShowScrollBar and 60 or 37), -2)
		button:SetAttribute("macrotext", "/cleartarget\n" .. getTargetMacroMulti(targets))
		F.setTooltip(button, getTargetTooltipMulti(targets))
		keyBindButton(button, "GUIDELIME_TARGET_1", "GuidelimeTargetButtonMulti", "multi target")
		button:Show()
		pos = 2
	end
	AB.targetNpcIdMarker = {}
	for _, t in ipairs(targets) do
		local button = AB.createTargetButton(t.index)
		AB.targetNpcIdMarker[t.npcId] = t.marker or 0
		if t.marker then
			SetRaidTargetIconTexture(button.texture2, t.marker)
			button.texture2:Show()
		else
			button.texture2:Hide()
		end
		button:SetPoint("TOP" .. GuidelimeDataChar.showTargetButtons, MW.mainFrame, "TOP" .. GuidelimeDataChar.showTargetButtons, 
			GuidelimeDataChar.showTargetButtons == "LEFT" and -36 or (GuidelimeDataChar.mainFrameShowScrollBar and 60 or 37), 
			39 - pos * 41)
		button.npc = t.name
		button.marker = t.marker
		button:SetAttribute("macrotext", "/cleartarget\n" .. getTargetMacro(t))
		F.setTooltip(button, getTargetTooltip(t))
		keyBindButton(button, "GUIDELIME_TARGET_" .. pos, "GuidelimeTargetButton" .. t.index, t.name)
		button:Show()
		pos = pos + 1
	end
	AB.numberOfTargetButtons = pos - 1
end

function AB.createUseItemButton(i)
	local button = MW.mainFrame.useButtons[i]
	if not button then
		button = CreateFrame("BUTTON", "GuidelimeUseItemButton" .. i, MW.mainFrame, "SecureActionButtonTemplate")
		button:SetSize(32, 32)
		button.texture = button:CreateTexture(nil,"BACKGROUND")
		button.texture:SetPoint("TOPLEFT", button, -2, 1)					
		button.texture:SetPoint("BOTTOMRIGHT", button, 2, -2)
		button.cooldown = CreateFrame("Cooldown", nil, button, "CooldownFrameTemplate")
        button.cooldown:SetSize(32, 32)
        button.cooldown:SetPoint("CENTER", button, "CENTER", 0, 0)
		button.hotkey = button:CreateFontString(nil, "ARTWORK", "NumberFontNormalSmallGray")
		button.hotkey:SetSize(32, 10)
		button.hotkey:SetPoint("TOPRIGHT", button, 0, -1)
		button.hotkey:SetJustifyH("RIGHT")
		button.count = button:CreateFontString(nil, "ARTWORK", "NumberFontNormal")
		button.count:SetPoint("BOTTOMRIGHT", button, -1, 1)
		button.count:SetJustifyH("RIGHT")
		button:RegisterForClicks("AnyUp", "AnyDown")
		button:SetMouseClickEnabled(true)
		button.Update = function(self)
            local start, duration, enable
			if self.spellId then
            	start, duration, enable = GetSpellCooldown(self.spellId)
			else
            	start, duration, enable = QT.GetItemCooldown(self.itemId)
			end
            if enable == 1 and duration > 0 then
                self.cooldown:Show()
                self.cooldown:SetCooldown(start, duration)
            else
                self.cooldown:Hide()
            end
		end
		MW.mainFrame.useButtons[i] = button
	end
	button.spellId = nil
	button.cooldown:Hide()
	button:ClearAllPoints()
	return button
end

function AB.updateUseItemButtons()
	if not MW.mainFrame then return end
	if MW.mainFrame.useButtons == nil then
		MW.mainFrame.useButtons = {}
	else
		AB.resetButtons(MW.mainFrame.useButtons)
	end
	if not GuidelimeDataChar.showUseItemButtons or not CG.currentGuide or not CG.currentGuide.firstActiveIndex then return end
	local i = 1
	local startPos = GuidelimeDataChar.showUseItemButtons == GuidelimeDataChar.showTargetButtons and AB.numberOfTargetButtons and AB.numberOfTargetButtons > 0 and (AB.numberOfTargetButtons * 42 + 5) or 0
	local previousIds = {}
	for s = CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex do
		local step = CG.currentGuide.steps[s]
		if step.active then
			for _, element in ipairs(step.elements) do
				if element.t == "USE_ITEM" and element.useItemId > 0 and
					not (step.useItemElement and element.generated) and not (element.attached and element.attached.completed) and
					not D.contains(previousIds, element.useItemId) then
					if addon.debugging then print("LIME: show use item button for item", element.useItemId) end
					if InCombatLockdown() then
						EV.updateAfterCombat = true
						return 
					end
					local button = AB.createUseItemButton(i)
					button:SetPoint("TOP" .. GuidelimeDataChar.showUseItemButtons, MW.mainFrame, "TOP" .. GuidelimeDataChar.showUseItemButtons, 
						GuidelimeDataChar.showUseItemButtons == "LEFT" and -36 or (GuidelimeDataChar.mainFrameShowScrollBar and 60 or 37), 
						39 - i * 41 - startPos)
					button.itemId = element.useItemId
					button.texture:SetTexture(GetItemIcon(button.itemId))
					local name = EV.GetItemInfo(button.itemId)
					if name then
						button:SetAttribute("type", "item")
						button:SetAttribute("item", name)
						--F.setTooltip(button, name .. "\n" .. (QT.getUseItemTooltip(button.itemId) or ""))
						F.setTooltip(button, "item:" .. button.itemId, function(self, s) 
							GameTooltip:SetHyperlink(s)
							GameTooltip:AddLine(getTooltipHint())
						end)
						keyBindButton(button, "GUIDELIME_USE_ITEM_" .. i, "GuidelimeUseItemButton" .. i, name)
					end
					local count = GetItemCount(button.itemId) or 0
					button.count:SetText(count ~= 1 and count or "")
					button.texture:SetAlpha((count > 0 and 1) or 0.5)
					button:Show()
					button:Update()
					table.insert(previousIds, element.useItemId)
					i = i + 1
				elseif element.t == "SPELL" and element.spellId ~= 0 and not element.completed then
				
					local id
					if element.spellId and GetSpellInfo(element.spellId) then id = element.spellId end
					if id == nil then id = SP.getSpellId(element.spell) end
					if addon.debugging then print("LIME: show button for spell", id) end
					if InCombatLockdown() then
						EV.updateAfterCombat = true
						return 
					end
					local name, _, icon = GetSpellInfo(id)
					if name then
						local button = AB.createUseItemButton(i)
						button:SetPoint("TOP" .. GuidelimeDataChar.showUseItemButtons, MW.mainFrame, "TOP" .. GuidelimeDataChar.showUseItemButtons, 
							GuidelimeDataChar.showUseItemButtons == "LEFT" and -36 or (GuidelimeDataChar.mainFrameShowScrollBar and 60 or 37), 
							39 - i * 41 - startPos)
						button.spellId = id
						button.texture:SetTexture(icon or addon.icons.SPELL)
						button.texture:SetAlpha(1)
						button:SetAttribute("type", "spell")
						button:SetAttribute("spell", name)
						if not IsSpellKnown(id) then
							local index = SP.getTradeSkillIndex(name)
							if index then
								button:SetAttribute("type", "macro")
								button:SetAttribute("macrotext", "/run DoTradeSkill(" .. index .. ")")
								local count = select(3, GetTradeSkillInfo(index))
								button.count:SetText(count)
								button.texture:SetAlpha((count > 0 and 1) or 0.2)
							else
								button:SetAlpha(0.2)
							end
						end
						F.setTooltip(button, "spell:" .. id, function(self, s) 
							GameTooltip:SetHyperlink(s)
							GameTooltip:AddLine(getTooltipHint())
						end)
						keyBindButton(button, "GUIDELIME_USE_ITEM_" .. i, "GuidelimeUseItemButton" .. i, name)
						button:Show()
						button:Update()
						if GuidelimeDataChar.maxNumOfItemButtons > 0 and i >= GuidelimeDataChar.maxNumOfItemButtons then break end
						i = i + 1
					end
				end
			end
		end
	end
end


================================================
FILE: Guidelime/Bindings.xml
================================================
<Bindings>
	<Binding name="GUIDELIME_TOGGLE" category="BINDING_HEADER_GUIDELIME">
		Guidelime.toggleMainFrame()
	</Binding>
	<Binding name="GUIDELIME_TOGGLE_MAP_MARKERS" category="BINDING_HEADER_GUIDELIME">
		Guidelime.toggleMapMarkers()
	</Binding>
	<Binding name="GUIDELIME_TOGGLE_MINIMAP_MARKERS" category="BINDING_HEADER_GUIDELIME">
		Guidelime.toggleMinimapMarkers()
	</Binding>
	<Binding name="GUIDELIME_TARGET_1" header="TARGET" category="BINDING_HEADER_GUIDELIME">
		--for targeting an npc
	</Binding>
	<Binding name="GUIDELIME_TARGET_2" category="BINDING_HEADER_GUIDELIME">
		--for targeting an npc
	</Binding>
	<Binding name="GUIDELIME_TARGET_3" category="BINDING_HEADER_GUIDELIME">
		--for targeting an npc
	</Binding>
	<Binding name="GUIDELIME_TARGET_4" category="BINDING_HEADER_GUIDELIME">
		--for targeting an npc
	</Binding>
	<Binding name="GUIDELIME_TARGET_5" category="BINDING_HEADER_GUIDELIME">
		--for targeting an npc
	</Binding>
	<Binding name="GUIDELIME_USE_ITEM_1" header="USE_ITEMS" category="BINDING_HEADER_GUIDELIME">
		--for using a quest item
	</Binding>
	<Binding name="GUIDELIME_USE_ITEM_2" category="BINDING_HEADER_GUIDELIME">
		--for using a quest item
	</Binding>
	<Binding name="GUIDELIME_USE_ITEM_3" category="BINDING_HEADER_GUIDELIME">
		--for using a quest item
	</Binding>
	<Binding name="GUIDELIME_USE_ITEM_4" category="BINDING_HEADER_GUIDELIME">
		--for using a quest item
	</Binding>
	<Binding name="GUIDELIME_USE_ITEM_5" category="BINDING_HEADER_GUIDELIME">
		--for using a quest item
	</Binding>
</Bindings>


================================================
FILE: Guidelime/CurrentGuide.lua
================================================
local addonName, addon = ...
local L = addon.L

local HBD = LibStub("HereBeDragons-2.0")

addon.D = addon.D or {}; local D = addon.D     -- Data/Data
addon.FM = addon.FM or {}; local FM = addon.FM -- Data/FlightMasterDB
addon.PT = addon.PT or {}; local PT = addon.PT -- Data/PositionTools
addon.QT = addon.QT or {}; local QT = addon.QT -- Data/QuestTools
addon.SK = addon.SK or {}; local SK = addon.SK -- Data/SkillDB
addon.SP = addon.SP or {}; local SP = addon.SP -- Data/SpellDB
addon.AB = addon.AB or {}; local AB = addon.AB -- ActionButtons
addon.CC = addon.CC or {}; local CC = addon.CC -- CustomCode
addon.EV = addon.EV or {}; local EV = addon.EV -- Events
addon.F = addon.F or {}; local F = addon.F     -- Frames
addon.M = addon.M or {}; local M = addon.M     -- Map
addon.MW = addon.MW or {}; local MW = addon.MW -- MainWindow
addon.GP = addon.GP or {}; local GP = addon.GP -- GuideParser
addon.QS = addon.QS or {}; local QS = addon.QS -- QuestScan

addon.CG = addon.CG or {}; local CG = addon.CG -- CurrentGuide

CG.DEFAULT_GOTO_RADIUS = 6
CG.GOTO_HYSTERESIS_FACTOR = 2

function CG.loadCurrentGuide(reset)

	local guide = addon.guides[GuidelimeDataChar.currentGuide]
	
	CG.quests = {}
	CG.questIds = {}

	if guide == nil then
		if addon.debugging then
			print("LIME: available guides:")
			for name in pairs(addon.guides) do
				print("LIME: " .. name)
			end
			print("LIME: guide \"" .. (GuidelimeDataChar.currentGuide or "") .. "\" not found")
		end
		GuidelimeDataChar.currentGuide = nil
		CG.currentGuide = {steps = {}}
		GuidelimeDataChar.completedSteps = {}
		QS.resetScannedQuests()
		return
	end
	
	if not CG.currentGuide or guide.group ~= CG.currentGuide.group then QS.resetScannedQuests() end

	CG.currentGuide = {}
	CG.currentGuide.name = GuidelimeDataChar.currentGuide
	CG.currentGuide.steps = {}
	CG.currentGuide.next = guide.next
	CG.currentGuide.group = guide.group
	
	if GuidelimeDataChar.guideSize[GuidelimeDataChar.currentGuide] ~= #guide.steps then
		GuidelimeDataChar.completedSteps = {}
		GuidelimeDataChar.guideSkip[GuidelimeDataChar.currentGuide] = {}
		GuidelimeDataChar.guideSize[GuidelimeDataChar.currentGuide] = #guide.steps
	end
	if GuidelimeDataChar.guideSkip[GuidelimeDataChar.currentGuide] == nil then
		GuidelimeDataChar.guideSkip[GuidelimeDataChar.currentGuide] = {}
	end
	if reset then
		GuidelimeDataChar.completedSteps = {}
	end
	--print(format(L.LOAD_MESSAGE, CG.currentGuide.name))
	guide = GP.parseGuide(guide, guide.group)
	if guide == nil then return end
	addon.guides[GuidelimeDataChar.currentGuide] = guide
	if guide.unknownQuests > 0 and select(4, GetBuildInfo()) >= 20000 and addon.dataSource == "DB" then
		CG.currentGuide.steps = {{elements = {{text = 
			(addon.QUESTIE.isDataSourceInstalled() or addon.CLASSIC_CODEX.isDataSourceInstalled()) and L.ERROR_TBC_DATA_SOURCE or L.ERROR_TBC_DATA_SOURCE_INSTALL
		}}}}
		CG.currentGuide.next = nil
		return
	end

	local time
	if addon.debugging then time = debugprofilestop() end

	local completed = QT.GetQuestsCompleted()
	local lastGoto
	for _, step in ipairs(guide.steps) do
		local loadLine = D.applies(step)
		local filteredElements = {}
		for _, element in ipairs(step.elements) do
			if not element.generated and
				((element.text ~= nil and element.text ~= "") or 
				(element.t ~= "TEXT" and element.t ~= "NAME" and element.t ~= "NEXT" and element.t ~= "DETAILS" and element.t ~= "GUIDE_APPLIES" and 
				element.t ~= "DOWNLOAD" and element.t ~= "AUTO_ADD_COORDINATES_GOTO" and element.t ~= "AUTO_ADD_COORDINATES_LOC" and element.t ~= "AUTO_ADD_USE_ITEM"))
			then
				table.insert(filteredElements, element)
			end
		end
		step.elements = filteredElements
		if #step.elements == 0 then loadLine = false end
		if loadLine then
			table.insert(CG.currentGuide.steps, step)
			step.index = #CG.currentGuide.steps
			local i = 1
			while i <= #step.elements do
				local element = step.elements[i]
				element.available = true

				if element.t == "ACCEPT" or element.t == "COMPLETE" or element.t == "TURNIN" or element.t == "XP" or element.t == "REPUTATION" or element.t == "SPELL" or element.t == "LEARN" or element.t == "SKILL" then
					if step.manual == nil then step.manual = false end
				elseif element.t == "TRAIN" or element.t == "VENDOR" or element.t == "REPAIR" or element.t == "SET_HEARTH" or element.t == "GET_FLIGHT_POINT" then
					step.manual = true
				elseif element.t == "GOTO" then
					if step.manual == nil then step.manual = false end
					if lastGoto ~= nil then lastGoto.lastGoto = false end
					element.lastGoto = true
					lastGoto = element
				end
				if element.questId ~= nil then
					if CG.quests[element.questId] == nil then CG.quests[element.questId] = {} end
					if not D.contains(CG.questIds, element.questId) then table.insert(CG.questIds, element.questId) end 
					CG.quests[element.questId].title = element.title
					CG.quests[element.questId].completed = completed[element.questId] ~= nil and completed[element.questId]
					CG.quests[element.questId].finished = CG.quests[element.questId].completed
					if QT.getQuestPrequests(element.questId) ~= nil then
						for _, id in ipairs(QT.getQuestPrequests(element.questId)) do
							if QT.getQuestApplies(id) then
								if CG.quests[id] == nil then CG.quests[id] = {} end
								CG.quests[id].completed = completed[id] ~= nil and completed[id]
								if CG.quests[id].followup == nil then CG.quests[id].followup = {} end
								table.insert(CG.quests[id].followup, element.questId)
							end
						end
					end
					if CG.quests[element.questId].lastStep == nil then CG.quests[element.questId].lastStep = {} end
					CG.quests[element.questId].lastStep[element.t] = element
					if element.t == "COMPLETE" and CG.quests[element.questId].objectives == nil then
						CG.quests[element.questId].objectives = {}
						local objectives = QT.getQuestObjectives(element.questId)
						if objectives ~= nil then
							for i, objective in ipairs(objectives) do
								CG.quests[element.questId].objectives[i] = {type = objective.type, desc = objective.names[1]}
							end
						end
					end
					if guide.autoAddCoordinatesGOTO and not step.hasGoto and not step.optional then
						if CG.addElement(CG.updatePosElement(PT.getQuestPosition(element.questId, element.t, element.objective, lastGoto), {t = "GOTO"}), element) then
							i = i + 1 
						end
					end
					if element.races ~= nil or element.classes ~= nil then
						CG.addElement({t = "APPLIES", races = element.races, classes = element.classes, faction = element.faction}, element)
						i = i + 1
					end
				elseif element.t == "FLY" then
					if guide.autoAddCoordinatesGOTO and not step.hasGoto and not step.optional then
						CG.addElement({t = "GOTO", specialLocation = "NEAREST_FLIGHT_POINT", radius = CG.DEFAULT_GOTO_RADIUS}, element)
						i = i + 1
					end						
				elseif element.t == "GET_FLIGHT_POINT" then
					if guide.autoAddCoordinatesGOTO and not step.hasGoto and not step.optional then
						if CG.addElement(CG.updatePosElement(FM.getFlightPoint(element.flightmaster), {t = "GOTO"}), element) then
							i = i + 1 
						end
					end						
				elseif element.t == "COLLECT_ITEM" then
					guide.itemUpdate = true
					if step.manual == nil then step.manual = false end
					if guide.autoAddCoordinatesGOTO and 
						not step.hasGoto and not step.optional and not step.targetElement then
						if CG.addElement(CG.updatePosElement(PT.getItemPosition(element.itemId, lastGoto), {t = "GOTO"}), element) then
							i = i + 1 
						end
					end
				elseif element.t == "USE_ITEM" then
					if not element.generated then step.useItemElement = true end
				elseif element.t == "TARGET" then
					if not element.generated then 
						step.targetElement = true
						if guide.autoAddCoordinatesGOTO and not step.hasGoto and not step.optional then
							if CG.addElement(CG.updatePosElement(PT.getNPCPosition(element.targetNpcId, lastGoto), {t = "GOTO"}), element) then	
								i = i + 1 
							end
						end
					end
				elseif guide.autoAddUseItem and not step.useItemElement and element.t == "HEARTH" then
					CG.addElement({t = "USE_ITEM", useItemId = 6948, title = ""}, element, 1)
					i = i + 1
				end
				i = i + 1
			end
			if step.manual == nil then step.manual = true end
			if step.completeWithNext == nil then step.completeWithNext = false end
			if step.completeWithNext then step.optional = true end
			if step.optional == nil then step.optional = false end
			step.skip = GuidelimeDataChar.guideSkip[CG.currentGuide.name][step.index] or GuidelimeDataChar.completedSteps[step.index] or false
			step.active = false
			step.wasActive = false
			step.completed = false
			step.available = true
		end
	end
	if addon.debugging then print("LIME: loadCurrentGuide " .. math.floor(debugprofilestop() - time) .. " ms") end

	CC.parseCustomLuaCode()
	
	QS.scanGuideQuests(guide.name)
end

function CG.addElement(newElement, element, offset, keepIndex)
	if not newElement then return end
	newElement.step = element.step
	newElement.attached = element
	newElement.generated = true
	newElement.available = true
	table.insert(element.step.elements, element.index + (offset or 0), newElement)
	if not keepIndex then
		for j = element.step.index + (offset or 0), #element.step.elements do
			element.step.elements[j].index = j
		end
	else
		newElement.index = element.index + (offset or 0)
	end
	if newElement.t == "GOTO" then
		if lastGoto ~= nil and lastGoto.step.line == element.step.line then lastGoto.lastGoto = false end
		newElement.lastGoto = true
		lastGoto = newElement
	end
	return newElement
end
	
function CG.updatePosElement(pos, element)
	if not pos or not pos.x then return end 
	if not element then element = {} end
	for k,v in pairs(pos) do element[k] = v end
	element.radius = element.radius or CG.DEFAULT_GOTO_RADIUS
	return element
end

function CG.loadStepUseItems(i, recheck)
	local step = CG.currentGuide.steps[i]
	if addon.guides[GuidelimeDataChar.currentGuide].autoAddUseItem and GuidelimeDataChar.showUseItemButtons and not step.useItemElement then
		local j = 1
		local previousUseItems = {}
		while j <= #step.elements do
			local element = step.elements[j]
			if recheck and element.t == "USE_ITEM" then
				table.insert(previousUseItems, element.useItemId)
			elseif element.questId ~= nil and element.available then
				if element.t == "ACCEPT" and not recheck then
					local itemId = QT.getItemStartingQuest(element.questId)
					if itemId then
						CG.addElement({t = "USE_ITEM", useItemId = itemId, title = ""}, element)
						j = j + 1
					end
				elseif element.t == "COMPLETE" or element.t == "TURNIN" then
					local items = QT.getUsableQuestItems(element.questId)
					if items then
						for _, itemId in ipairs(items) do
							if QT.questItemIsFor[itemId] == element.t and not D.contains(previousUseItems, itemId) then
								CG.addElement({t = "USE_ITEM", useItemId = itemId, title = ""}, element)
								j = j + 1
							end
						end
					end
				end
			end
			j = j + 1
		end
	end
end

local function loadQuestStepOnActivation(i)
	local time
	if addon.debugging then time = debugprofilestop() end
	local step = CG.currentGuide.steps[i]
	if addon.guides[GuidelimeDataChar.currentGuide].autoAddCoordinatesLOC and (GuidelimeData.showMapMarkersLOC or GuidelimeData.showMinimapMarkersLOC) and not step.hasLoc then
		local j = 1
		while j <= #step.elements do
			local element = step.elements[j]
			if element.questId ~= nil and element.available then
				local positions = PT.getQuestPositionsLimited(element.questId, element.t, element.objective, GuidelimeData.maxNumOfMarkersLOC, true)
				if positions ~= nil then
					local objectives = QT.getQuestObjectives(element.questId, element.t)						
					for _, pos in ipairs(positions) do
						local locElement = CG.addElement(CG.updatePosElement(pos, {t = "LOC"}),	element, 0, true)
						if element.t == "COMPLETE" then
							locElement.markerTyp = objectives and pos.objectives and pos.objectives[1] and objectives[pos.objectives[1]] and objectives[pos.objectives[1]].type or "LOC"
						else
							locElement.markerTyp = element.t
						end
						j = j + 1
					end
					for k = j, #step.elements do
						step.elements[k].index = k
					end
				end
			end
			j = j + 1
		end
	end
	if addon.guides[GuidelimeDataChar.currentGuide].autoAddTarget and GuidelimeDataChar.showTargetButtons then
		local j = 1
		while j <= #step.elements do
			local element = step.elements[j]
			if element.questId ~= nil and element.available then
				element.questNpcs = QT.getQuestNPCs(element.questId, element.t, element.objective)
				if element.questNpcs then
					for _, npc in ipairs(element.questNpcs) do
						CG.addElement({t = "TARGET", targetNpcId = npc.id, title = "", objectives = npc.objectives}, element)
						j = j + 1
					end
				end
			end
			j = j + 1
		end
	end
	if addon.debugging then print("LIME: loadQuestStepOnActivation " .. i .. " " .. math.floor(debugprofilestop() - time) .. " ms") end
end

local function loadStepOnActivation(i)
	local time
	if addon.debugging then time = debugprofilestop() end
	local step = CG.currentGuide.steps[i]
	if addon.guides[GuidelimeDataChar.currentGuide].autoAddCoordinatesLOC and (GuidelimeData.showMapMarkersLOC or GuidelimeData.showMinimapMarkersLOC) and not step.hasLoc then
		local j = 1
		while j <= #step.elements do
			local element = step.elements[j]
			if element.t == "COLLECT_ITEM" and not step.targetElement then
				local positions = PT.getItemPositionsLimited(element.itemId, GuidelimeData.maxNumOfMarkersLOC, true)
				if positions ~= nil then
					for _, pos in ipairs(positions) do
						CG.addElement(CG.updatePosElement(pos, {t = "LOC", markerTyp = "item"}), element, 0, true)
						j = j + 1
					end
					for k = j, #step.elements do
						step.elements[k].index = k
					end
				end
			elseif element.t == "TARGET" and not element.generated and not D.contains(CG.currentGuide.activeQuestNpcs, element.targetNpcId) then
				local positions = PT.getNPCPositionsLimited(element.targetNpcId, GuidelimeData.maxNumOfMarkersLOC, true)
				if positions ~= nil then
					for _, pos in ipairs(positions) do
						CG.addElement(CG.updatePosElement(pos, {t = "LOC", markerTyp = "npc"}), element, 0, true)
						j = j + 1
					end
					for k = j, #step.elements do
						step.elements[k].index = k
					end
				end
			end
			j = j + 1
		end
	end
	CG.loadStepUseItems(i)
	C_Timer.After(1, function()
		if addon.debugging then print("LIME: recheck use items for step", step.line) end
		CG.loadStepUseItems(i, true)
		AB.updateUseItemButtons()
	end)
	if addon.debugging then print("LIME: loadStepOnActivation " .. i .. " " .. math.floor(debugprofilestop() - time) .. " ms") end
end

function CG.getQuestText(id, t, title, colored)
	local q = ""
	if (GuidelimeData.showQuestLevels or GuidelimeData.showMinimumQuestLevels) then
		q = q .. "["
		if GuidelimeData.showMinimumQuestLevels then
			q = q .. MW.getRequiredLevelColor(QT.getQuestMinimumLevel(id)) .. (QT.getQuestMinimumLevel(id) or "")
		end
		if GuidelimeData.showMinimumQuestLevels and GuidelimeData.showQuestLevels then
			if colored == true then
				q = q .. "|r"
			else
				q = q .. GuidelimeData.fontColorInactive
			end
			q = q .. "-"
		end
		if GuidelimeData.showQuestLevels then
			q = q .. MW.getLevelColor(QT.getQuestLevel(id)) .. (QT.getQuestLevel(id) or "")
			if QT.getQuestType(id) == "Dungeon" then 
				q = q .. "D" 
			elseif QT.getQuestType(id) == "Raid" then 
				q = q .. "R" 
			elseif QT.getQuestType(id) == "Elite" then 
				q = q .. "+" 
			elseif QT.getQuestType(id) == "Group" then 
				q = q .. "P" 
			end
		end
		if colored == true then
			q = q .. "|r"
		else
			q = q .. GuidelimeData.fontColorInactive
		end
		q = q .. "]"
	end
	if colored == nil or colored then q = q .. GuidelimeData["fontColor" .. (t or "ACCEPT")] end
	q = q .. (title or QT.getQuestNameById(id) or id)
	if GuidelimeData.showQuestIds then q = q .. "(#" .. id .. ")" end
	if colored == nil or colored then q = q .. "|r" end
	return q
end

local function getSkipQuests(id, skipQuests, newSkipQuests)
	if newSkipQuests == nil then newSkipQuests = {} end
	if CG.quests[id] ~= nil and CG.quests[id].followup ~= nil and #CG.quests[id].followup > 0 then
		for _, fid in ipairs(CG.quests[id].followup) do
			if CG.currentGuide.unavailableQuests[fid] == nil and skipQuests[fid] == nil then
				table.insert(newSkipQuests, fid)
				skipQuests[fid] = true
				getSkipQuests(fid, skipQuests, newSkipQuests)
			end
		end
	end
	return newSkipQuests
end

function CG.getQuestObjectiveIcon(id, objective, showItemIcon)
	if CG.quests[id] == nil or CG.quests[id].objectives == nil then return "" end
	local a, b = objective, objective
	if objective == nil then a = 1; b = #CG.quests[id].objectives end
	local text = ""
	local icons = {}
	for i = a, b do
		local o = CG.quests[id].objectives[i]
		if o ~= nil and not o.done then
			local type = o.type
			if type == nil or addon.icons[type] == nil then type = "COMPLETE" end
			local _,icon
			if type == "item" and showItemIcon then
				local objectives = QT.getQuestObjectives(id)
				if objectives ~= nil and objectives[i] ~= nil and objectives[i].type == 'item' then
					icon = GetItemIcon(objectives[i].ids.item[1])
				end
			end
			if icon == nil and icons[type] == nil then
				icon = addon.icons[type]
				icons[type] = true
			end
			if icon ~= nil then text = text .. "|T" .. icon .. ":12|t" end
		end
	end
	return text
end	

function CG.getQuestObjectiveText(id, objectives, indent, npcId, objectId)
	local objectiveList = QT.getQuestObjectives(id)
	if objectiveList == nil then return "" end
	if objectives == true then
		objectives = {}; for i = 1, #objectiveList do objectives[i] = i end
	end
	local text = ""
	if npcId ~= nil and (#objectives ~= 1 or objectiveList[objectives[1]] == nil or (objectiveList[objectives[1]].type ~= "npc" and objectiveList[objectives[1]].type ~= "monster")) then
		if QT.getNPCName(npcId) ~= nil then
			text = (indent or "") .. "|T" .. addon.icons.monster .. ":12|t" .. QT.getNPCName(npcId)
		end
	elseif objectId ~= nil and (#objectives ~= 1 or objectiveList[objectives[1]] == nil or objectiveList[objectives[1]].type ~= "object") then
		if QT.getObjectName(objectId) ~= nil then
			text = (indent or "") .. "|T" .. addon.icons.object .. ":12|t" .. QT.getObjectName(objectId)
		end
	end
	for _, i in ipairs(objectives) do
		local o
		if CG.quests[id] ~= nil and CG.quests[id].logIndex ~= nil and CG.quests[id].objectives ~= nil then	o = CG.quests[id].objectives[i] end
		if o == nil and objectiveList[i] ~= nil then
			if text ~= "" then text = text .. "\n" end
			local type = objectiveList[i].type
			if type == nil or addon.icons[type] == nil then type = "COMPLETE" end
			text = text	.. (indent or "") .. "- " .. "|T" .. addon.icons[type] .. ":12|t" .. (objectiveList[i].names[1] or "")
		elseif o ~= nil and not o.done and o.desc ~= nil and o.desc ~= "" then
			local icon = CG.getQuestObjectiveIcon(id, i, true)
			if text ~= "" then text = text .. "\n" end
			text = text .. (indent or "") .. "- " .. icon .. o.desc
		end
	end
	return text
end

function CG.getQuestIcon(questId, t, objective, finished)
	if t == "ACCEPT" and (QT.getQuestMinimumLevel(questId) or 0) > D.level then
		return "|T" .. addon.icons.ACCEPT_UNAVAILABLE .. ":12|t"
	elseif t == "TURNIN" and not finished then
		return "|T" .. addon.icons.TURNIN_INCOMPLETE .. ":12|t"
	elseif t == "COMPLETE" then
		return CG.getQuestObjectiveIcon(questId, objective)
	else
		return "|T" .. (addon.icons[t] or addon.icons.COMPLETE) .. ":12|t"
	end
end

function CG.getElementIcon(element, prevElement)
	if element.completed and element.t ~= "GOTO" then
		return "|T" .. addon.icons.COMPLETED .. ":12|t"
	elseif element.available == false then
		return "|T" .. addon.icons.UNAVAILABLE .. ":12|t"
	elseif GP.getSuperCode(element.t) == "QUEST" then
		return CG.getQuestIcon(element.questId, element.t, element.objective, element.finished)
	elseif element.t == "LOC" or element.t == "GOTO" then
		if not GuidelimeData.showMapMarkersInGuide then
			return ""
		elseif element.t == "LOC" and ((prevElement ~= nil and prevElement.t == "LOC") or (element.markerTyp ~= nil)) then
			-- Dont show an icon for subsequent LOC elements. Also dont show LOC for quest steps since there would be the same icon twice
			return ""
		elseif element.mapIndex == 0 and M.arrowFrame ~= nil and GuidelimeDataChar.showArrow then
			return M.getArrowIconText()
		elseif element.mapIndex ~= nil then
			return M.getMapMarkerText(element)
		end
	elseif element.t == "SPELL" or element.t == "LEARN" or element.t == "SKILL" then
		if element.spellId and GetSpellInfo(element.spellId) then
			return "|T" .. (select(3, GetSpellInfo(element.spellId)) or addon.icons[element.t]) .. ":12|t"
		elseif element.spell and SP.spells[element.spell] then
			return "|T" .. (SP.spells[element.spell].icon or addon.icons[element.t]) .. ":12|t"
		elseif element.skill then
			return "|T" .. SK.getSkillIcon(element.skill) .. ":12|t"
		end
	elseif element.t == "USE_ITEM" and element.title ~= "" then
		return "|T" .. (GetItemIcon(element.useItemId) or addon.icons.item) .. ":12|t"
	elseif element.t == "APPLIES" then
		local text = ""
		if D.contains(element.races, D.race) and element.faction == nil then
			--text = text .. "|T" .. addon.icons[D.race:upper()] .. ":12|t"
			text = text .. D.getRaceIconText(D.race, D.sex) 
		end
		if D.contains(element.classes, D.class) then
			--text = text .. "|T" .. addon.icons[D.class:upper()] .. ":12|t"
			text = text .. D.getClassIconText(D.class)
		end
		return text
	elseif addon.icons[element.t] ~= nil and (not prevElement or element.t ~= prevElement.t) then
		return "|T" .. addon.icons[element.t] .. ":12|t"
	end
	return ""
end

function CG.getStepText(step)
	local text = ""
	local tooltip = ""
	local skipTooltip = ""
	local skipText = ""
	local skipQuests = {}
	local trackQuest = {}
	local itemText = ""

	if GuidelimeData.showLineNumbers and step.line ~= nil then text = text .. step.line .. " " end
	if not step.active then
		text = text .. GuidelimeData.fontColorInactive
	elseif step.manual then
		skipTooltip = L.STEP_MANUAL
	else
		skipTooltip = L.STEP_SKIP
	end
	local prevElement
	for _, element in ipairs(step.elements) do
		element.textStartPos = #text
		text = text .. CG.getElementIcon(element, prevElement)
		if element.available and not element.completed and element.t == "ACCEPT" and (QT.getQuestMinimumLevel(element.questId) or 0) > D.level then
			if tooltip ~= "" then tooltip = tooltip .. "\n" end
			local q = CG.getQuestText(element.questId, element.t)
			tooltip = tooltip .. L.QUEST_REQUIRED_LEVEL:format(q, QT.getQuestMinimumLevel(element.questId))
		end
		if element.text ~= nil then
			if step.active or element.textInactive == nil then
				text = text .. element.text
			else
				text = text .. element.textInactive
			end
		end
		if GP.getSuperCode(element.t) == "QUEST" then
			text = text .. CG.getQuestText(element.questId, element.t, element.title, step.active)
			if element.available and not element.completed then
				if CG.quests[element.questId].lastStep[element.t] == element then
					local newSkipQuests = getSkipQuests(element.questId, skipQuests)
					if #newSkipQuests > 0 then
						if skipText ~= "" then skipText = skipText .. "\n\n" end
						if #newSkipQuests == 1 then
							skipText = skipText .. L.STEP_FOLLOWUP_QUEST:format(CG.getQuestText(element.questId, element.t)) ..":\n"
						else
							skipText = skipText .. L.STEP_FOLLOWUP_QUESTS:format(CG.getQuestText(element.questId, element.t)) ..":\n"
						end
						for _, id in ipairs(newSkipQuests) do
							skipText = skipText .. "\n|T" .. addon.icons.UNAVAILABLE .. ":12|t" .. CG.getQuestText(id)
						end
						if #newSkipQuests == 1 then
							skipText = skipText .. "\n\n" .. L.STEP_FOLLOWUP_QUEST_CONT:format(CG.getQuestText(element.questId, element.t))
						else
							skipText = skipText .. "\n\n" .. L.STEP_FOLLOWUP_QUESTS_CONT:format(CG.getQuestText(element.questId, element.t))
						end
					end
				end
				if element.t == "COMPLETE" or element.t == "TURNIN" then
					if element.objective == nil then
						trackQuest[element.questId] = true
					elseif trackQuest[element.questId] ~= true then
						if trackQuest[element.questId] == nil then trackQuest[element.questId] = {} end
						if not D.contains(trackQuest[element.questId], element.objective) then table.insert(trackQuest[element.questId], element.objective) end
					end
				end
			end
		elseif element.t == "COLLECT_ITEM" then
			local name,_,rarity = EV.GetItemInfo(element.itemId)
			local colour = ITEM_QUALITY_COLORS[1].hex
			if name then
				if step.active then
					colour = ITEM_QUALITY_COLORS[rarity].hex
					local iconId = GetItemIcon(element.itemId)
					local icon = "|T" .. iconId .. ":12|t"
					local count = GetItemCount(element.itemId)
					if count >= element.qty then
						count = element.qty
					end
					itemText = string.format("%s\n    - %s%s: %d/%d",itemText,icon,name,count,element.qty)
				end
			end
			name = element.title or name
			if name and name ~= "" then
				if step.active then
					text = text .. colour .. name .. "|r"
				else
					text = text .. name
				end
			end
		elseif element.t == "USE_ITEM" and element.title ~= "" then
			local name,_,rarity = EV.GetItemInfo(element.useItemId)
			local colour = ITEM_QUALITY_COLORS[1].hex
			if name then
				if step.active then
					colour = ITEM_QUALITY_COLORS[rarity].hex
				end
			end
			name = element.title or name
			if name and name ~= "" then
				if step.active then
					text = text .. colour .. name .. "|r"
				else
					text = text .. name
				end
			end
		elseif element.t == "TARGET" and element.title ~= "" then
			local npc = QT.getNPCName(element.targetNpcId)
			text = text .. AB.getTargetButtonIconText(element.targetNpcId)
			local name = element.title or npc
			if name and name ~= "" then
				if step.active then
					text = text .. MW["COLOR_" .. QT.isFriendlyNpc(element.targetNpcId)] .. name .. "|r"
				else
					text = text .. name
				end
			end
		elseif element.t == "SPELL" and element.title ~= "" then
			local name = element.title or SP.getLocalizedName(element.spell)
			if name and name ~= "" then
				if step.active then
					text = text .. MW.COLOR_WHITE .. name .. "|r"
				else
					text = text .. name
				end
			end
		elseif element.t == "SKILL" and step.active then
			local rank, max = SK.getSkillRank(element.skill)
			if rank then
				itemText = string.format("\n    - %d/%d", rank, element.skillMin)
			end
		end
		if element.textStartPos == #text then element.empty = true end
		if element.empty == nil or not element.empty then prevElement = element end
	end
	if step.skippedQuests ~= nil and #step.skippedQuests > 0 then
		if tooltip ~= "" then tooltip = tooltip .. "\n" end
		tooltip = tooltip .. "|T" .. addon.icons.UNAVAILABLE .. ":12|t"
		tooltip = tooltip .. L.SKIPPING_QUEST
	elseif step.missingPrequests ~= nil and #step.missingPrequests > 0 then
		if tooltip ~= "" then tooltip = tooltip .. "\n" end
		tooltip = tooltip .. "|T" .. addon.icons.UNAVAILABLE .. ":12|t"
		if #step.missingPrequests == 1 then
			tooltip = tooltip .. L.MISSING_PREQUEST
		else
			tooltip = tooltip .. L.MISSING_PREQUESTS
		end
		for _, id in ipairs(step.missingPrequests) do
			tooltip = tooltip .. " " ..CG.getQuestText(id)
		end
	end
	for id, objectives in pairs(trackQuest) do
		if step.active then
			text = text .. "\n" .. CG.getQuestObjectiveText(id, objectives, "    ")
		else
			if tooltip ~= "" then tooltip = tooltip .. "\n" end
			tooltip = tooltip .. CG.getQuestObjectiveText(id, objectives)
		end
	end
	text = text .. itemText
	return text, tooltip, skipText, skipTooltip
end

function CG.updateStepText(i)
	local step = CG.currentGuide.steps[i]
	if MW.mainFrame.steps == nil or MW.mainFrame.steps[i] == nil or MW.mainFrame.steps[i].textBox == nil or not MW.mainFrame.steps[i].visible then return end
	local text, tooltip, skipText, skipTooltip = CG.getStepText(step)
	if text ~= MW.mainFrame.steps[i].textBox:GetText() then
		MW.mainFrame.steps[i].textBox:SetText(text)
	end
	MW.mainFrame.steps[i].skipText = skipText
	if GuidelimeData.showTooltips then
		MW.mainFrame.steps[i].textBox.tooltip = tooltip
		MW.mainFrame.steps[i].tooltip = skipTooltip
	else
		MW.mainFrame.steps[i].textBox.tooltip = nil
		MW.mainFrame.steps[i].tooltip = nil
	end
end

local function updateStepCompletion(i, completedIndexes)
	local step = CG.currentGuide.steps[i]

	local autoCompleteStep
	local wasCompleted = step.completed
	if not step.manual then	step.completed = nil end
	step.itemsCollected = nil
	for _, element in ipairs(step.elements) do
		if element.t == "ACCEPT" then
			element.completed = CG.quests[element.questId].completed or CG.quests[element.questId].logIndex ~= nil
			if step.completed == nil or not element.completed then step.completed = element.completed end
			autoCompleteStep = true
		elseif element.t == "COMPLETE" then
			element.completed =
				CG.quests[element.questId].completed or
				CG.quests[element.questId].finished or
				(element.objective ~= nil and 
					CG.quests[element.questId].objectives ~= nil and 
					CG.quests[element.questId].objectives[element.objective] ~= nil and
					CG.quests[element.questId].objectives[element.objective].done)
			if step.completed == nil or not element.completed then step.completed = element.completed end
			autoCompleteStep = true
		elseif element.t == "TURNIN" then
			element.finished = CG.quests[element.questId].finished
			element.completed = CG.quests[element.questId].completed
			if step.completed == nil or not element.completed then step.completed = element.completed end
			autoCompleteStep = true
		elseif element.t == "XP" then
			element.completed = element.level <= D.level
			if element.xp ~= nil and element.level == D.level then
				if element.xpType == "REMAINING" then
					if element.xp < (D.xpMax - D.xp) then element.completed = false end
				elseif element.xpType == "PERCENTAGE" then
					if D.xpMax == 0 or element.xp > (D.xp / D.xpMax) then element.completed = false end
				else
					if element.xp > D.xp then element.completed = false end
				end
			end
			if step.completed == nil or not element.completed then step.completed = element.completed end
			autoCompleteStep = true
		elseif element.t == "REPUTATION" then
			element.completed = D.isRequiredReputation(element.reputation, element.repMin, element.repMax)
			if step.completed == nil or not element.completed then step.completed = element.completed end
			autoCompleteStep = true
		elseif element.t == "LEARN" or element.t == "SKILL" then
			if element.spell then
				element.completed = SP.isRequiredSpell(element.spell, element.spellMin, element.spellMax)
			elseif element.skill then
				element.completed = SK.isRequiredSkill(element.skill, element.skillMin, nil, element.maxSkillMin)
			end
			if step.completed == nil or not element.completed then step.completed = element.completed end
			autoCompleteStep = true
		elseif element.t == "COLLECT_ITEM" and step.active then
			if (element.qty > 0 and GetItemCount(element.itemId) >= element.qty) or (element.qty == 0 and GetItemCount(element.itemId) == 0) then
				element.completed = true
				if step.itemsCollected == nil then step.itemsCollected = true end
			else
				element.completed = false
				step.itemsCollected = false
			end
			if step.completed == nil or not element.completed then step.completed = element.completed end
			autoCompleteStep = true
		end
	end
	-- check goto last so that go to does not matter when all other objectives are completed
	local nonGotoCompleted = step.completed or wasCompleted
	for _, element in ipairs(step.elements) do
		if element.t == "GOTO"  then
			--if addon.debugging then print("LIME : zone coordinates", x, y, element.mapID) end
			if nonGotoCompleted then--step.skip check was redundant, this fixes a bug where you were unable to manually reactivate skipped goto steps
				element.completed = true
			elseif element.attached ~= nil and element.attached.completed then
				element.completed = true
			elseif element.completed and not element.lastGoto and element.attached == nil then
				-- do not reactivate unless it is the last goto of the step
			elseif D.wx ~= nil and D.wy ~= nil and element.wx ~= nil and element.wy ~= nil and D.instance == element.instance and D.isAlive() and step.active then
				local radius = element.radius * element.radius
				-- add some hysteresis
				if element.completed then radius = radius * CG.GOTO_HYSTERESIS_FACTOR end
				element.completed = (D.wx - element.wx) * (D.wx - element.wx) + (D.wy - element.wy) * (D.wy - element.wy) <= radius
			else
				element.completed = false
			end
			if step.completed == nil or not element.completed then step.completed = element.completed end
		end
	end
	if step.completed == nil then step.completed = step.completeWithNext and wasCompleted end
	
	--skips the completeWithNext check if the step is already complete, fixing a bug where the step persisted even when all elements were complete
	if not step.completed and i < #CG.currentGuide.steps and step.completeWithNext ~= nil and step.completeWithNext then
		local nstep = CG.currentGuide.steps[i + 1]
		local c = nstep.completed or nstep.skip or not nstep.available
		if step.completed ~= c then
			--if addon.debugging then print("LIME: complete with next ", i - 1, c, nstep.skip, nstep.available) end
			step.completed = c
		end
	end

	if step.completed ~= wasCompleted and not D.contains(completedIndexes, i) then
		if not autoCompleteStep then
			GuidelimeDataChar.completedSteps[step.index] = step.completed
		end
		table.insert(completedIndexes, i)
	end
end

local function updateStepAvailability(i, changedIndexes, scheduled)
	local step = CG.currentGuide.steps[i]
	local wasAvailable = step.available
	step.available = nil
	step.missingPrequests = {}
	step.skippedQuests = {}
	for _, element in ipairs(step.elements) do
		element.available = true
		if element.t == "ACCEPT" then
			if not element.completed then
				local missingPrequests = QT.getMissingPrequests(element.questId, function(id) return CG.quests[id].completed or scheduled.TURNIN[id] end)
				if #missingPrequests > 0 then
					element.available = false
					CG.currentGuide.unavailableQuests[element.questId] = true
					for _, id in ipairs(missingPrequests) do
						if not D.contains(step.missingPrequests, id) then
							table.insert(step.missingPrequests, id)
						end
					end
				end
			end
		elseif element.t == "COMPLETE" or element.t == "TURNIN" then
			if not scheduled.ACCEPT[element.questId] and not element.completed and CG.quests[element.questId].logIndex == nil then
				element.available = false
				if scheduled.SKIP[element.questId] then
					if not D.contains(step.skippedQuests, element.questId) then
						table.insert(step.skippedQuests, element.questId)
					end
				else
					if not D.contains(step.missingPrequests, element.questId) then
						table.insert(step.missingPrequests, element.questId)
					end
				end
			end
		end
		if element.t == "ACCEPT" or element.t == "COMPLETE" or element.t == "TURNIN" then
			if not step.skip and element.available then
				scheduled[element.t][element.questId] = true
			elseif not scheduled[element.t][element.questId] and step.skip and not element.completed and CG.quests[element.questId].lastStep[element.t] == element then
				element.available = false
				scheduled.SKIP[element.questId] = true
			end
			if not element.completed then step.available = step.available or false or element.available	end
		elseif element.t == "XP" or element.t == "REPUTATION" or element.t == "LEARN" or element.t == "SKILL" then
			if not element.completed then step.available = true end			
		end
	end
	if step.available == nil then step.available = true end
	if step.manual and not step.completed then step.available = true end

	if step.available ~= wasAvailable and not D.contains(changedIndexes, i) then
		table.insert(changedIndexes, i)
	end
end

local function updateStepsCompletion(changedIndexes)
	--if addon.debugging then print("LIME: update steps completion") end
	CG.currentGuide.unavailableQuests = {}
	repeat
		local numNew = #changedIndexes
		local scheduled = {ACCEPT = {}, COMPLETE = {}, TURNIN = {}, SKIP = {}}
		for i, step in ipairs(CG.currentGuide.steps) do
			if not step.skip then
				updateStepCompletion(i, changedIndexes)
				if step.itemsCollected and step.completed then
					step.skip = true --once all items are collected, don't re-enable the step again if you lose the item later
				end
				updateStepAvailability(i, changedIndexes, scheduled)
				if MW.mainFrame.steps ~= nil and MW.mainFrame.steps[i] ~= nil and MW.mainFrame.steps[i].visible then
					MW.mainFrame.steps[i]:SetChecked(step.completed or step.skip)
					MW.mainFrame.steps[i]:SetEnabled(not step.completed or step.skip)
				end
			end
		end
	until(numNew == #changedIndexes)
	--if addon.debugging then print("LIME: changed", #changedIndexes) end
end

function CG.stepIsVisible(step)
	return ((not step.completed and (not step.skip or not step.available)) or GuidelimeDataChar.showCompletedSteps) and
			(step.available or GuidelimeDataChar.showUnavailableSteps) and
			D.hasRequirements(step)
end

local function keepFading()
	local update = false
	local isFading = false
	for i, step in ipairs(CG.currentGuide.steps) do
		if step.fading ~= nil then
			if not CG.stepIsVisible(step) then
				step.active = false
				--if addon.debugging then print("LIME: fade out", i, step.fading) end
				if step.fading <= 0 then
					step.fading = nil
					--if addon.debugging then print("LIME: fade out", i) end
					update = true
				else
					step.fading = step.fading - 0.2
					if step.fading < 0 then step.fading = 0 end
					if MW.mainFrame.steps ~= nil and MW.mainFrame.steps[i] ~= nil and MW.mainFrame.steps[i].visible then
						MW.mainFrame.steps[i]:SetAlpha(step.fading)
					end
					isFading = true
				end
			else
				step.fading = nil
				if MW.mainFrame.steps ~= nil and MW.mainFrame.steps[i] ~= nil and MW.mainFrame.steps[i].visible then MW.mainFrame.steps[i]:SetAlpha(1) end
			end
		end
	end
	if isFading then
		C_Timer.After(0.1, function()
			keepFading()
		end)
	elseif update and (not GuidelimeDataChar.showCompletedSteps or not GuidelimeDataChar.showUnavailableSteps) then
		MW.updateMainFrame()
	end
end

local function fadeoutStep(indexes)
	for _, i in ipairs(indexes) do
		local step = CG.currentGuide.steps[i]
		step.fading = 1
	end
	keepFading()
end

function CG.stopFading()
	for _, step in ipairs(CG.currentGuide.steps) do
		step.fading = nil
	end
end

function CG.updateStepsActivation()
	CG.currentGuide.activeQuests = {}
	CG.currentGuide.activeQuestNpcs = {}
	for i, step in ipairs(CG.currentGuide.steps) do
		step.active = not step.completed and not step.skip and step.available and D.hasRequirements(step)
		if step.active then
			for j, pstep in ipairs(CG.currentGuide.steps) do
				if j == i then break end
				if not pstep.optional and not pstep.skip and not pstep.completed and pstep.available and D.hasRequirements(pstep) then
					step.active = false
					break
				end
			end
		end
		if step.active then
			if not step.wasActive then
				loadQuestStepOnActivation(i)
			end
			for _, element in ipairs(step.elements) do
				if not element.completed and (element.t == "ACCEPT" or element.t == "TURNIN") then
					table.insert(CG.currentGuide.activeQuests, element.questId)
				end
				if element.questNpcs ~= nil then
					for _, npc in ipairs(element.questNpcs) do
						table.insert(CG.currentGuide.activeQuestNpcs, npc.id)
					end
				end
			end
		end
	end
	for i, step in ipairs(CG.currentGuide.steps) do
		if step.active and not step.wasActive then
			loadStepOnActivation(i)
			step.wasActive = true
		end
	end
	-- accepting a follow up: maybe a quest dialog is still open and the quest just became active? try to accept it in that case
	if not IsShiftKeyDown() and EV.isQuestAuto(GuidelimeData.autoAcceptQuests, EV.lastQuestOpened) then
		AcceptQuest()
	end
end

local function updateFirstActiveIndex()
	local oldFirstActiveIndex = CG.currentGuide.firstActiveIndex
	CG.currentGuide.firstActiveIndex = nil
	CG.currentGuide.lastActiveIndex = nil
	for i, step in ipairs(CG.currentGuide.steps) do
		if (step.active or step.fading ~= nil) then
			if CG.currentGuide.firstActiveIndex == nil then CG.currentGuide.firstActiveIndex = i end
			CG.currentGuide.lastActiveIndex = i
		end
	end
	if MW.mainFrame.message ~= nil then
		for _, message in ipairs(MW.mainFrame.message) do
			if CG.currentGuide.firstActiveIndex ~= nil then
				message:Hide()
			else
				message:Show()
			end
		end
	end
	if addon.debugging then print("LIME: firstActiveIndex ", CG.currentGuide.firstActiveIndex) end
	return oldFirstActiveIndex ~= CG.currentGuide.firstActiveIndex
end

function CG.getQuestActiveObjectives(id, objective)
	local objectiveList = QT.getQuestObjectives(id)
	if objectiveList == nil then return {} end
	local objectives
	if objective == nil then
		objectives = {}; for i = 1, #objectiveList do objectives[i] = i end
	else
		objectives = {objective}
	end
	local active = {}
	for _, i in ipairs(objectives) do
		local o
		if CG.quests[id] ~= nil and CG.quests[id].logIndex ~= nil and CG.quests[id].objectives ~= nil then	o = CG.quests[id].objectives[i] end
		if o == nil or (not o.done and o.desc ~= nil and o.desc ~= "") then
			table.insert(active, i)
		end
	end
	return active
end

function CG.isQuestObjectiveActive(questId, searchObjectives, filterObjective)
	if questId == nil or searchObjectives == nil then return true end
	local objectives = CG.getQuestActiveObjectives(questId, filterObjective)
	local found = false
	for _, o in ipairs(searchObjectives) do
		if D.contains(objectives, o) or o > #QT.getQuestObjectives(questId) then found = true; break; end
	end
	return found
end

function CG.updateStepsText()
	--if addon.debugging then print("LIME: update step texts") end
	if MW.mainFrame == nil then return end
	if CG.currentGuide == nil then return end
	for i in ipairs(CG.currentGuide.steps) do
		CG.updateStepText(i)
	end
end

function CG.scrollToFirstActive()
	C_Timer.After(0.2, function()
		if MW.mainFrame:GetTop() then
			local top = CG.currentGuide.firstActiveIndex ~= nil and 
				MW.mainFrame.steps ~= nil and
				MW.mainFrame.steps[CG.currentGuide.firstActiveIndex] ~= nil and
				MW.mainFrame.steps[CG.currentGuide.firstActiveIndex]:GetTop() ~= nil and
				MW.mainFrame.steps[CG.currentGuide.firstActiveIndex]:GetTop() + MW.GAP
			local bottom = MW.mainFrame.bottomElement and MW.mainFrame.bottomElement:GetBottom()
			for _, message in ipairs(MW.mainFrame.message or {}) do
				if message:IsShown() then 
					bottom = message:GetBottom() 
					if not top then top = message:GetTop() + MW.GAP end
				end
			end
			if bottom and MW.mainFrame.scrollFrame:GetTop() - bottom + MW.mainFrame.scrollFrame:GetVerticalScroll() <= MW.mainFrame.scrollFrame:GetHeight() then
				MW.mainFrame.scrollFrame:SetVerticalScroll(0)
			elseif bottom and top and top < bottom + MW.mainFrame.scrollFrame:GetHeight() then
				MW.mainFrame.scrollFrame:SetVerticalScroll(MW.mainFrame.scrollFrame:GetVerticalScroll() + 
					MW.mainFrame.scrollFrame:GetTop() - bottom - MW.mainFrame.scrollFrame:GetHeight())
			elseif top then
				MW.mainFrame.scrollFrame:SetVerticalScroll(MW.mainFrame.scrollFrame:GetVerticalScroll() + 
					MW.mainFrame.scrollFrame:GetTop() - top)
			end
			if addon.debugging then print("LIME: scrollToFirstActive", MW.mainFrame.scrollFrame:GetVerticalScroll(), CG.currentGuide.firstActiveIndex and CG.currentGuide.steps[CG.currentGuide.firstActiveIndex] and CG.currentGuide.steps[CG.currentGuide.firstActiveIndex].line) end
		end
	end)
end

function CG.updateSteps(completedIndexes)
	if MW.mainFrame == nil then return end
	if CG.currentGuide == nil then return end
	if F.showingTooltip then GameTooltip:Hide(); F.showingTooltip = false end

	local customCodeData = CC.customCodeData
	local isStepActive = {}
	if customCodeData then
		for i,v in ipairs(customCodeData) do
			if v.data and v.data.step then
				isStepActive[i] = v.data.step.active
				if v.OnStepUpdate then
					v.OnStepUpdate(v.data,v.args,"OnStepUpdate")
				end
			end
		end
	end

	--local time
	--if addon.debugging then time = debugprofilestop() end
	--if addon.debugging then print("LIME: update steps " .. GetTime()) end
	if completedIndexes == nil then completedIndexes = {} end
	updateStepsCompletion(completedIndexes)
	--if addon.debugging then print("LIME: updateStepsCompletion " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
	CG.updateStepsActivation()
	--if addon.debugging then print("LIME: updateStepsActivation " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
	fadeoutStep(completedIndexes)
	--if addon.debugging then print("LIME: fadeoutStep " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
	local scrollToFirstActive = updateFirstActiveIndex()
	--if addon.debugging then print("LIME: updateFirstActiveIndex " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
	M.updateStepsMapIcons()
	--if addon.debugging then print("LIME: updateStepsMapIcons " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end
	AB.updateTargetButtons()
	AB.updateUseItemButtons()
	CG.updateStepsText()
	if scrollToFirstActive then	CG.scrollToFirstActive() end
	--if addon.debugging then print("LIME: updateStepsText " .. math.floor(debugprofilestop() - time) .. " ms"); time = debugprofilestop() end

	if customCodeData then
		for i,v in ipairs(customCodeData) do
			if v.data and v.data.step then
				local step = v.data.step
				if v.OnStepActivation and step.active and not isStepActive[i] then
					--print(step.index)
					v.OnStepActivation(v.data,v.args,"OnStepActivation")
				elseif v.OnStepCompletion and isStepActive[i] == not step.active and (step.completed or step.skip) then
					v.OnStepCompletion(v.data,v.args,"OnStepCompletion")
				end
			end
		end
	end
end

function CG.setStepSkip(value, a, b)
	if a == nil then a = 1; b = #CG.currentGuide.steps end
	if b == nil then b = a end
	local indexes = {}
	for i = a, b do
		local step = CG.currentGuide.steps[i]
		step.skip = value
		GuidelimeDataChar.guideSkip[CG.currentGuide.name][i] = step.skip
		GuidelimeDataChar.completedSteps[i] = GuidelimeDataChar.completedSteps[i] and value
		table.insert(indexes, i)
	end
	if not value and not GuidelimeDataChar.showUnavailableSteps then
		MW.updateMainFrame()
	else
		CG.updateSteps(indexes)
	end
end

function CG.skipCurrentSteps()
	if CG.currentGuide ~= nil and CG.currentGuide.firstActiveIndex ~= nil and
		CG.currentGuide.lastActiveIndex ~= nil then
		CG.setStepSkip(true, CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex)
	end
end

function CG.forEveryActiveElement(func)
	if CG.currentGuide ~= nil and CG.currentGuide.firstActiveIndex ~= nil and
		CG.currentGuide.lastActiveIndex ~= nil then
		for i = CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex do
			local step = CG.currentGuide.steps[i]
			--if addon.debugging then print("LIME:", step.text, step.optional) end
			for _, element in ipairs(step.elements) do
				if not element.completed then
					if func(element) == false then return end
				end
			end
		end
	end
end

function CG.completeSemiAutomaticByType(t)
	CG.forEveryActiveElement(function(element)
		if not element.completed and element.t == t then
			CG.completeSemiAutomatic(element)
			return false
		end
	end)
end

function CG.completeSemiAutomatic(element)
	element.completed = true
	local step = element.step
	local complete = true
	if not step.manual and not step.optional then
		for _, element in ipairs(step.elements) do
			if not element.completed and
				(element.t == "ACCEPT" or
				element.t == "COMPLETE" or
				element.t == "TURNIN" or
				element.t == "XP" or 
				element.t == "REPUTATION" or
				element.t == "LEARN" or
				element.t == "SKILL") then
				CG.updateSteps()
				return
			end
		end
	end
	GuidelimeDataChar.completedSteps[step.index] = true
	step.skip = true
	CG.updateSteps({step.index})
end

function CG.getElementByTextPos(pos, step)
	for j, element in ipairs(CG.currentGuide.steps[step].elements) do
		if element.textStartPos > pos then return j - 1 end
	end
	return #CG.currentGuide.steps[step].elements
end

function CG.simulateCompleteCurrentSteps()
	if CG.currentGuide ~= nil and CG.currentGuide.firstActiveIndex ~= nil and
		CG.currentGuide.lastActiveIndex ~= nil then
		--if addon.debugging then print("LIME:", CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex) end
		for i = CG.currentGuide.firstActiveIndex, CG.currentGuide.lastActiveIndex do
			local step = CG.currentGuide.steps[i]
			--if addon.debugging then print("LIME:", step.text, step.optional) end
			for _, element in ipairs(step.elements) do
				if not element.completed then
					if element.t == "ACCEPT" then
						if CG.quests[element.questId] == nil then CG.quests[element.questId] = {} end
						CG.quests[element.questId].logIndex = -1
					elseif element.t == "COMPLETE" then
						if CG.quests[element.questId] == nil then CG.quests[element.questId] = {} end
						CG.quests[element.questId].finished = true
					elseif element.t == "TURNIN" then
						if CG.quests[element.questId] == nil then CG.quests[element.questId] = {} end
						CG.quests[element.questId].completed = true
					end
				end
			end
		end
		CG.updateSteps()
	end
end

================================================
FILE: Guidelime/CustomCode.lua
================================================
local addonName, addon = ...
local L = addon.L

addon.D = addon.D or {}; local D = addon.D     -- Data/Data

addon.CC = addon.CC or {}; local CC = addon.CC -- CustomCode

function CC.parseCustomLuaCode()
	CC.wipeFrameData()
	local guide = addon.guides[GuidelimeDataChar.currentGuide]
	if not (guide and guide.group) then return end
	local groupTable = Guidelime[guide.group]
	if not groupTable then Guidelime[guide.group] = true end
	

	if type(groupTable) == "table" then
		local frameCounter = 0
		groupTable.__index = groupTable

		for stepLine, step in ipairs(guide.steps) do
			if D.applies(step) then 
				if step.eval and step.event then
					local args = {}
					local eval = nil
					for arg in step.eval:gmatch('[^,]+') do
						if not eval then
							eval = arg:gsub("%s","")
						else
							local c = string.match(arg,"^%s*(.*%S+)%s*$")
							if c then table.insert(args,c) end
						end
					end
					if eval then
						frameCounter = frameCounter + 1
						step.event = step.event:gsub("%s","")
						if step.event == "" then 
							step.event = groupTable[eval]() or "OnStepActivation"
						end
						local eventList = {}
						for event in step.event:gmatch('[^,]+') do
							table.insert(eventList,event)
						end
						CC.registerStep(groupTable,eventList,eval,args,frameCounter,guide,step)
					end
				end
			end
		end
	end
end

function CC.registerStep(self,eventList,eval,args,frameCounter,guide,step)

	if frameCounter > #CC.customCodeData+1  then
		return
	end
	if #CC.customCodeData < frameCounter then
		table.insert(CC.customCodeData,CreateFrame("Frame"))
	end

	if type(self[eval]) ~= "function" then
		return 
	end

	local frame = CC.customCodeData[frameCounter]
	frame.data = {}
	frame.data.guide = guide
	frame.data.step = step
	frame.args = args

	setmetatable(frame.data, self)

	local function EventHandler(s,...) --Executes the function if step is active or if it's specified on a 0 element step (e.g. guide name)
		if s.data.step.active or #s.data.step.elements == 0 or s.data.persistent then 
			self[eval](s.data,args,...)
		end
	end
	local OnUpdate
	for _,eventRaw in pairs(eventList) do
		local event = {}
		eventRaw:gsub("[^:]+",function(e)
			table.insert(event,e)
		end)
		
		--print(eval,event)
		if event[1] == "OnUpdate" then
			OnUpdate = true
			frame:SetScript("OnUpdate",EventHandler)
		elseif event[1] == "OnLoad" then
			self[eval](frame.data,args,"OnLoad")
		elseif event[1] == "OnStepActivation" then
			frame.OnStepActivation = self[eval]
		elseif event[1] == "OnStepCompletion" then
			frame.OnStepCompletion = self[eval]
		elseif event[1] == "OnStepUpdate" then
			frame.OnStepUpdate = self[eval]
		else
			if #event == 1 then
				if not pcall(frame.RegisterEvent,frame,event[1]) then
					print("Error loading guide: Ignoring invalid event name at line "..step.line..": "..event[1])
				end
			else
				if not pcall(frame.RegisterUnitEvent,frame,unpack(event)) then
					print("Error loading guide: Ignoring invalid event name at line "..step.line)
				end
			end
		end
	end
	if not OnUpdate then
		CC.customCodeData[frameCounter]:SetScript("OnEvent",EventHandler)
	end
end

function CC.wipeFrameData()
	if not CC.customCodeData then
		CC.customCodeData = {}
	end
	for _,frame in pairs(CC.customCodeData) do
		frame:SetScript("OnUpdate", nil)
		frame:SetScript("OnEvent", nil)
		frame:UnregisterAllEvents()
		frame.OnStepActivation = nil
		frame.OnStepCompletion = nil
		frame.OnStepUpdate = nil
		frame.args = nil
		if frame.data then
			frame.data.persistent = nil
			frame.data.timer = nil
		end
		frame.data = nil
	end
end


================================================
FILE: Guidelime/Data/ClassicCodex.lua
================================================
local addonName, addon = ...
local L = addon.L

local HBD = LibStub("HereBeDragons-2.0")

addon.D = addon.D or {}; local D = addon.D                                                 -- Data/Data
addon.DM = addon.DM or {}; local DM = addon.DM                                             -- Data/MapDB
addon.QT = addon.QT or {}; local QT = addon.QT                                             -- Data/QuestTools
addon.GP = addon.GP or {}; local GP = addon.GP                                             -- GuideParser

addon.CLASSIC_CODEX = addon.CLASSIC_CODEX or {}; local CLASSIC_CODEX = addon.CLASSIC_CODEX -- Data/ClassicCodex

function CLASSIC_CODEX.isDataSourceInstalled()
	return CodexDB ~= nil
end

function CLASSIC_CODEX.getQuestIDs()
	local ids = {}
	for id, q in pairs(CodexDB.quests.data) do
		table.insert(ids, id)
	end
	return ids
end

function CLASSIC_CODEX.isQuestId(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return false end
	return CodexDB.quests.data[id] ~= nil
end

function CLASSIC_CODEX.getQuestName(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.loc[id]
	if quest == nil then return end
	return quest.T
end

-- not supported
function CLASSIC_CODEX.getQuestSort(id) return nil end

function CLASSIC_CODEX.getQuestPrequests(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	if quest.pre ~= nil then return type(quest.pre) == "number" and {quest.pre} or quest.pre end 
	if quest.preg ~= nil then return type(quest.preg) == "number" and {quest.preg} or quest.preg end
end

function CLASSIC_CODEX.getQuestOneOfPrequests(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	return quest.pre ~= nil
end

-- not supported
function CLASSIC_CODEX.getQuestType(id) return nil end

function CLASSIC_CODEX.getQuestLevel(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	return quest.lvl
end

function CLASSIC_CODEX.getQuestMinimumLevel(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	return quest.min
end

function CLASSIC_CODEX.getQuestNext(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	return quest.next
end

function CLASSIC_CODEX.getQuestRaces(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	local bitmask = quest.race
	if bitmask == nil or bitmask == 0 then return end
	local races = {}
	for i, race in ipairs({"Human", "Orc", "Dwarf", "NightElf", "Undead", "Tauren", "Gnome", "Troll", "", "BloodElf", "Draenei"}) do
		if race ~= "" and D.hasbit(bitmask, D.bit(i)) then 
			table.insert(races, race) 
		end
	end
	return races
end

function CLASSIC_CODEX.getQuestClasses(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	local bitmask = quest.class
	if bitmask == nil or bitmask == 0 then return end
	local classes = {}
	for i, class in pairs({"Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Shaman", "Mage", "Warlock", "Druid"}) do
		if class ~= "" and D.hasbit(bitmask, D.bit(i)) then 
			table.insert(classes, class) 
		end
	end
	return classes
end

function CLASSIC_CODEX.getQuestFaction(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	local bitmask = quest.race
	if bitmask == nil then return end
	if bitmask == 77 or bitmask == 1101 then return "Alliance" end
	if bitmask == 178 or bitmask == 690 then return "Horde" end
end

function CLASSIC_CODEX.getQuestObjective(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.loc[id]
	if quest == nil then return end
	return quest.O
end

function CLASSIC_CODEX.getQuestReputation(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	if quest.repu ~= nil then
		return quest.repu.id, quest.repu.min
	end
end
	

function CLASSIC_CODEX.getQuestPositions(id, typ, index, filterZone)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	if index == 0 then index = nil end
	if type(index) == "number" then index = {index} end
	local ids = {npc = {}, object = {}, item = {}}
	local objectives = {npc = {}, object = {}, item = {}}
	if GP.getSuperCode(typ) == "QUEST" then
		for i, o in ipairs(QT.getQuestObjectives(id, typ) or {}) do
			if index == nil or D.contains(index, i) then
				local type = o.type == "monster" and "npc" or o.type
				for _, oid in ipairs(o.ids[type]) do
					table.insert(ids[type], oid)
					if objectives[type][oid] == nil then objectives[type][oid] = {} end
					table.insert(objectives[type][oid], i)
				end
			end
		end
	elseif typ == "COLLECT_ITEM" then
		ids.item = {id}
		objectives.item[id] = {}
	else
		return
	end
	for _, itemId in ipairs(ids.item) do
		local item = CodexDB.items.data[itemId]
		--if item == nil then error("item " .. itemId .. " not found for quest " .. questid .. typ) end
		--if addon.debugging then print("LIME: item", itemId .. " " .. item[6]) end
		if item ~= nil then
			if item.U ~= nil then
				for npcId, chance in pairs(item.U) do
					if not D.contains(ids.npc, npcId) then table.insert(ids.npc, npcId) end
					if objectives.npc[npcId] == nil then objectives.npc[npcId] = {} end
					for _, c in ipairs(objectives.item[itemId]) do table.insert(objectives.npc[npcId], c) end
				end
			end
			if item.O ~= nil then
				for objectId, chance in pairs(item.O) do
					if not D.contains(ids.object, objectId) then table.insert(ids.object, objectId) end
					if objectives.object[objectId] == nil then objectives.object[objectId] = {} end
					for _, c in ipairs(objectives.item[itemId]) do table.insert(objectives.object[objectId], c) end
				end
			end
		end
	end
	local positions = {}
	local filterZoneId
	if filterZone ~= nil then filterZoneId = DM.mapIDs[filterZone] end
	for _, npcId in ipairs(ids.npc) do
		local npc = CodexDB.units.data[npcId]
		--if npc == nil then error("npc " .. npcId .. " not found for quest " .. questid .. typ) end
		--if addon.debugging then print("LIME: npc", npc[1]) end
		if npc ~= nil and npc.coords ~= nil then
			for _, pos in ipairs(npc.coords) do
				if filterZone == nil or filterZone == CodexMap.zones[pos[3]] then
					table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], npcId = npcId, objectives = objectives.npc[npcId]})
				end
			end
		end
	end
	for _, objectId in ipairs(ids.object) do
		local object = CodexDB.objects.data[objectId]
		--if object == nil then error("object " .. objectId .. " not found for quest " .. id .. typ) end
		--if addon.debugging then print("LIME: object", object[1]) end
		if object ~= nil and object.coords ~= nil then
			for _, pos in ipairs(object.coords) do
				if filterZone == nil or filterZone == CodexMap.zones[pos[3]] then
					table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], objectId = objectId, objectives = objectives.object[objectId]})
				end
			end
		end
	end
	local i = 1
	while i <= #positions do
		local pos = positions[i]
		if pos.wx == -1 and pos.wy == -1 then
			-- locations inside instances are marked with -1,-1
			table.remove(positions, i)
		else
			pos.mapID = DM.mapIDs[pos.zone]
			pos.wx, pos.wy, pos.instance = HBD:GetWorldCoordinatesFromZone(pos.x / 100, pos.y / 100, pos.mapID)
			--if addon.debugging then print("LIME: found position", pos.wx, pos.wy, pos.instance) end
			if pos.wx == nil then
				if addon.debugging then print("LIME: error transforming (", pos.x, ",", pos.y, pos.zone, DM.mapIDs[pos.zone], ") into world coordinates for quest #", id) end
				table.remove(positions, i)
			else
				i = i + 1
			end
		end
	end
	--if addon.debugging then print("LIME: found ", #positions, "positions") end
	return positions
end

function CLASSIC_CODEX.getNPCPositions(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local positions = {}
	local npc = CodexDB.units.data[id]
	--if npc == nil then error("npc " .. npcId .. " not found for quest " .. questid .. typ) end
	--if addon.debugging then print("LIME: npc", npc[1]) end
	if npc ~= nil and npc.coords ~= nil then
		for _, pos in ipairs(npc.coords) do
			table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], npcId = id})
		end
	end
	local i = 1
	while i <= #positions do
		local pos = positions[i]
		if pos.wx == -1 and pos.wy == -1 then
			-- locations inside instances are marked with -1,-1
			table.remove(positions, i)
		else
			pos.mapID = DM.mapIDs[pos.zone]
			pos.wx, pos.wy, pos.instance = HBD:GetWorldCoordinatesFromZone(pos.x / 100, pos.y / 100, pos.mapID)
			--if addon.debugging then print("LIME: found position", pos.wx, pos.wy, pos.instance) end
			if pos.wx == nil then
				if addon.debugging then print("LIME: error transforming (", pos.x, ",", pos.y, pos.zone, DM.mapIDs[pos.zone], ") into world coordinates for npc #", id) end
				table.remove(positions, i)
			else
				i = i + 1
			end
		end
	end
	--if addon.debugging then print("LIME: found ", #positions, "positions") end
	return positions
end

function CLASSIC_CODEX.getItemPositions(id, typ, index, filterZone)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local ids = {npc = {}, object = {}}
	local item = CodexDB.items.data[id]
	if item ~= nil then
		if item.U ~= nil then
			for npcId, chance in pairs(item.U) do
				if not D.contains(ids.npc, npcId) then table.insert(ids.npc, npcId) end
			end
		end
		if item.O ~= nil then
			for objectId, chance in pairs(item.O) do
				if not D.contains(ids.object, objectId) then table.insert(ids.object, objectId) end
			end
		end
	end
	local positions = {}
	for _, npcId in ipairs(ids.npc) do
		local npc = CodexDB.units.data[npcId]
		--if npc == nil then error("npc " .. npcId .. " not found for quest " .. questid .. typ) end
		--if addon.debugging then print("LIME: npc", npc[1]) end
		if npc ~= nil and npc.coords ~= nil then
			for _, pos in ipairs(npc.coords) do
				table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], npcId = npcId})
			end
		end
	end
	for _, objectId in ipairs(ids.object) do
		local object = CodexDB.objects.data[objectId]
		--if object == nil then error("object " .. objectId .. " not found for quest " .. id .. typ) end
		--if addon.debugging then print("LIME: object", object[1]) end
		if object ~= nil and object.coords ~= nil then
			for _, pos in ipairs(object.coords) do
				if filterZone == nil or filterZone == CodexMap.zones[pos[3]] then
					table.insert(positions, {x = pos[1], y = pos[2], zone = DM.zoneNames[CodexMap.zones[pos[3]]] or CodexMap.zones[pos[3]], objectId = objectId})
				end
			end
		end
	end
	local i = 1
	while i <= #positions do
		local pos = positions[i]
		if pos.wx == -1 and pos.wy == -1 then
			-- locations inside instances are marked with -1,-1
			table.remove(positions, i)
		else
			pos.mapID = DM.mapIDs[pos.zone]
			pos.wx, pos.wy, pos.instance = HBD:GetWorldCoordinatesFromZone(pos.x / 100, pos.y / 100, pos.mapID)
			--if addon.debugging then print("LIME: found position", pos.wx, pos.wy, pos.instance) end
			if pos.wx == nil then
				if addon.debugging then print("LIME: error transforming (", pos.x, ",", pos.y, pos.zone, DM.mapIDs[pos.zone], ") into world coordinates for item #", id) end
				table.remove(positions, i)
			else
				i = i + 1
			end
		end
	end
	--if addon.debugging then print("LIME: found ", #positions, "positions") end
	return positions
end

function CLASSIC_CODEX.getQuestNPCs(id, typ, index)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local ids = {npc = {}, object = {}, item = {}}
	local objectives = {npc = {}, object = {}, item = {}}
	if GP.getSuperCode(typ) == "QUEST" then
		for i, o in ipairs(QT.getQuestObjectives(id, typ) or {}) do
			if index == nil or index == 0 or index == i then
				local type = o.type == "monster" and "npc" or o.type
				for _, oid in ipairs(o.ids[type]) do
					table.insert(ids[type], oid)
					if objectives[type][oid] == nil then objectives[type][oid] = {} end
					table.insert(objectives[type][oid], i)
				end
			end
		end
	elseif typ == "COLLECT_ITEM" then
		ids.item = {id}
		objectives.item[id] = {}
	else
		return
	end
	for _, itemId in ipairs(ids.item) do
		local item = CodexDB.items.data[itemId]
		if item ~= nil then
			if item.U ~= nil then
				for npcId, chance in pairs(item.U) do
					if not D.contains(ids.npc, npcId) then table.insert(ids.npc, npcId) end
					if objectives.npc[npcId] == nil then objectives.npc[npcId] = {} end
					for _, c in ipairs(objectives.item[itemId]) do table.insert(objectives.npc[npcId], c) end
				end
			end
		end
	end
	local npcs = {}
	for _, id in ipairs(ids.npc) do
		table.insert(npcs, {id = id; objectives = objectives.npc[id]})
	end
	return npcs
end

-- returns a type (npc/item/object) and a list of names for quest source / each objective / turn in; e.g. {{type="item", names={"Huge Gnoll Claw", "Hogger"}, ids={item={1931},npc={448}} for id = 176, typ = "COMPLETE"
function CLASSIC_CODEX.getQuestObjectives(id, typ)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	if typ == "ACCEPT" then 
		list = quest.start
	elseif typ == "COMPLETE" then
		list = quest.obj
	elseif typ == "TURNIN" then
		list = quest["end"]
	else
		return
	end
	if list == nil then return end
	--if addon.debugging then print("LIME: getQuestObjectives " .. typ .. " " .. id .. " " .. #list) end
	local objectives = {}
	if list.U ~= nil then
		for _, npcId in ipairs(list.U) do
			local npcName = CodexDB.units.loc[npcId]
			table.insert(objectives, {type = typ == "COMPLETE" and "monster" or "npc", names = {npcName or npcId}, ids = {npc = {npcId}}})
		end
	end
	if list.O ~= nil then
		for _, objId in ipairs(list.O) do
			local objName = CodexDB.objects.loc[objId]
			table.insert(objectives, {type = "object", names = {objName or objId}, ids = {object = {objId}}})
		end
	end
	local idsReceived = {}
	if list.IR ~= nil then
		for _, itemId in ipairs(list.IR) do
			idsReceived[itemId] = true
		end
	end
	if list.I ~= nil then
		for _, itemId in ipairs(list.I) do
			if not idsReceived[itemId] then
				local itemName = CodexDB.items.loc[itemId]
				local objective = {type = "item", names = {itemName or itemId}, ids = {item = {itemId}}}
				local item = CodexDB.items.data[itemId]
				if item ~= nil then
					if item.U ~= nil then
						objective.ids.npc = {}
						for unitId, chance in pairs(item.U) do
							table.insert(objective.ids.npc, unitId)
							local npcName = CodexDB.units.loc[unitId]
							if npcName and not D.contains(objective.names, npcName) then table.insert(objective.names, npcName) end
						end
					end
					if item.O ~= nil then
						objective.ids.object = {}
						for objectId, chance in pairs(item.O) do
							table.insert(objective.ids.object, objectId)
							local objName = CodexDB.objects.loc[objectId]
							if objName and not D.contains(objective.names, objName) then table.insert(objective.names, objName) end
						end
					end
				end
				table.insert(objectives, objective)
			end
		end
	end
	-- apply corrections for objective order
	if typ == "COMPLETE" and CLASSIC_CODEX.correctionsObjectiveOrder[id] then
		local objectives2 = {}
		for i, j in ipairs(CLASSIC_CODEX.correctionsObjectiveOrder[id]) do
			objectives2[i] = objectives[j]
		end
		objectives = objectives2
	end
	-- apply corrections for missing objectives
	-- e.g. kill credit objectives as in https://tbc.wowhead.com/quest=10482/fel-orc-scavengers
	-- or https://tbc.wowhead.com/quest=9935/wanted-giselda-the-crone (kill credit + kill)
	if typ == "COMPLETE" and CLASSIC_CODEX.correctionsObjectives[id] then
		for i, o in pairs(CLASSIC_CODEX.correctionsObjectives[id]) do
			objectives[i] = o
		end
	end
	return objectives
end

function CLASSIC_CODEX.getQuestItems(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	local quest = CodexDB.quests.data[id]
	if quest == nil then return end
	if quest.obj == nil then return end
	local items = {}
	if quest.obj.IR ~= nil then
		for _, itemId in ipairs(quest.obj.IR) do
			table.insert(items, itemId)
		end
	end
	if quest.obj.I ~= nil then
		for _, itemId in ipairs(quest.obj.I) do
			if not D.contains(items, itemId) then
				table.insert(items, itemId)
			end
		end
	end
	return items
end

function CLASSIC_CODEX.getNPCName(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	return CodexDB.units.loc[id]
end

function CLASSIC_CODEX.getObjectName(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	return CodexDB.objects.loc[id]
end

function CLASSIC_CODEX.getItemName(id)
	if id == nil or not CLASSIC_CODEX.isDataSourceInstalled() then return end
	return CodexDB.items.loc[id]
end



================================================
FILE: Guidelime/Data/ClassicCodexCorrections.lua
================================================
local addonName, addon = ...

-- add kill credit objectives as these are not supported by ClassicCodex
addon.CLASSIC_CODEX.correctionsObjectives = {
		[11537] = {
			[2] = {
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						24999, -- [1]
						25001, -- [2]
						25002, -- [3]
						25008, -- [4]
						25068, -- [5]
					},
				},
				["names"] = {
					"Burning Legion Demon", -- [1]
				},
			},
		},
		[9670] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						17681, -- [1]
						17680, -- [2]
					},
				},
				["names"] = {
					"Expedition Researcher Freed", -- [1]
					"Expedition Researcher", -- [2]
				},
			}, -- [1]
		},
		[11538] = {
			[2] = {
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						24999, -- [1]
						25001, -- [2]
						25002, -- [3]
						25008, -- [4]
						25068, -- [5]
					},
				},
				["names"] = {
					"Burning Legion Demon", -- [1]
				},
			},
		},
		[11174] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						4392, -- [1]
						4393, -- [2]
						4394, -- [3]
					},
				},
				["names"] = {
					"Oozes Dissolved", -- [1]
					"Corrosive Swamp Ooze", -- [2]
				},
			}, -- [1]
		},
		[10562] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						21786, -- [1]
						21419, -- [2]
					},
				},
				["names"] = {
					"Infernal Attacker", -- [1]
				},
			}, -- [1]
		},
		[10702] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						21864, -- [1]
						21878, -- [2]
						21879, -- [3]
						22145, -- [4]
						23020, -- [5]
						21978, -- [6]
					},
				},
				["names"] = {
					"Shadowmoon Valley Wildlife", -- [1]
				},
			}, -- [1]
		},
		[9935] = {
			[2] = {
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						17146, -- [1]
						17147, -- [2]
						17148, -- [3]
						18397, -- [4]
						18658, -- [5]
						21276, -- [6]
					},
				},
				["names"] = {
					"Kil'sorrow Agent", -- [1]
				},
			},
		},
		[10873] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						22459, -- [1]
						22355, -- [2]
					},
				},
				["names"] = {
					"Sha'tar Warrior Freed", -- [1]
					"Freed Sha'tar Warrior", -- [2]
				},
			}, -- [1]
		},
		[10545] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						19998, -- [1]
						20334, -- [2]
						20723, -- [3]
						20726, -- [4]
						20730, -- [5]
						20731, -- [6]
						20732, -- [7]
						21296, -- [8]
						21975, -- [9]
						19995, -- [10]
					},
				},
				["names"] = {
					"Bladespire Ogres drunken", -- [1]
					"Bladespire Brute", -- [2]
				},
			}, -- [1]
		},
		[10703] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						21864, -- [1]
						21878, -- [2]
						21879, -- [3]
						22145, -- [4]
						23020, -- [5]
						21978, -- [6]
					},
				},
				["names"] = {
					"Shadowmoon Valley Wildlife", -- [1]
				},
			}, -- [1]
		},
		[10184] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						20934, -- [1]
						19881, -- [2]
					},
				},
				["names"] = {
					"Severed Spirit", -- [1]
				},
			}, -- [1]
		},
		[10502] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						19948, -- [1]
						19952, -- [2]
						19956, -- [3]
						19957, -- [4]
						19992, -- [5]
						20095, -- [6]
						20116, -- [7]
						21238, -- [8]
						21254, -- [9]
						21294, -- [10]
						21319, -- [11]
						19991, -- [12]
					},
				},
				["names"] = {
					"Bloodmaul Ogres killed", -- [1]
					"Bloodmaul Brute", -- [2]
				},
			}, -- [1]
		},
		[10864] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						16867, -- [1]
						16870, -- [2]
						16878, -- [3]
						19295, -- [4]
						19312, -- [5]
						19410, -- [6]
						19411, -- [7]
						19413, -- [8]
						19414, -- [9]
						19415, -- [10]
						22334, -- [11]
					},
				},
				["names"] = {
					"Shattered Hand Souls Reaped", -- [1]
					"Shattered Hand Orc", -- [2]
				},
			}, -- [1]
		},
		[11169] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						4344, -- [1]
						4345, -- [2]
					},
				},
				["names"] = {
					"Totem Tests Performed", -- [1]
					"Mottled Drywallow Crocolisk", -- [2]
				},
			}, -- [1]
		},
		[10836] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						21717, -- [1]
						21718, -- [2]
						21719, -- [3]
						21720, -- [4]
						22251, -- [5]
						22252, -- [6]
						22274, -- [7]
						22331, -- [8]
						23188, -- [9]
						23209, -- [10]
						23213, -- [11]
						22197, -- [12]
					},
				},
				["names"] = {
					"Dragonmaw Orc", -- [1]
				},
			}, -- [1]
		},
		[10503] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						19998, -- [1]
						20334, -- [2]
						20723, -- [3]
						20726, -- [4]
						20730, -- [5]
						20731, -- [6]
						20732, -- [7]
						21296, -- [8]
						21975, -- [9]
						19995, -- [10]
					},
				},
				["names"] = {
					"Bladespire Ogres killed", -- [1]
					"Bladespire Brute", -- [2]
				},
			}, -- [1]
		},
		[11096] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						22143, -- [1]
						22144, -- [2]
						22148, -- [3]
						23022, -- [4]
						23450, -- [5]
					},
				},
				["names"] = {
					"Gordunni Ogre", -- [1]
					"Gordunni Proxy", -- [2]
				},
			}, -- [1]
		},
		[10595] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						21786, -- [1]
						21419, -- [2]
					},
				},
				["names"] = {
					"Infernal Attacker", -- [1]
				},
			}, -- [1]
		},
		[10813] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						19440, -- [1]
						22177, -- [2]
					},
				},
				["names"] = {
					"Eye of Grillok Returned", -- [1]
					"Eye of Grillok Quest Credit Bunny", -- [2]
				},
			}, -- [1]
		},
		[10504] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						19998, -- [1]
						20334, -- [2]
						20723, -- [3]
						20726, -- [4]
						20730, -- [5]
						20731, -- [6]
						20732, -- [7]
						21296, -- [8]
						21975, -- [9]
						19995, -- [10]
					},
				},
				["names"] = {
					"Bladespire Ogres killed", -- [1]
					"Bladespire Brute", -- [2]
				},
			}, -- [1]
		},
		[10512] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						19998, -- [1]
						20334, -- [2]
						20723, -- [3]
						20726, -- [4]
						20730, -- [5]
						20731, -- [6]
						20732, -- [7]
						21296, -- [8]
						21975, -- [9]
						19995, -- [10]
					},
				},
				["names"] = {
					"Bladespire Ogres drunken", -- [1]
					"Bladespire Brute", -- [2]
				},
			}, -- [1]
		},
		[10505] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						19948, -- [1]
						19952, -- [2]
						19956, -- [3]
						19957, -- [4]
						19992, -- [5]
						20095, -- [6]
						20116, -- [7]
						21238, -- [8]
						21254, -- [9]
						21294, -- [10]
						21319, -- [11]
						19991, -- [12]
					},
				},
				["names"] = {
					"Bloodmaul Ogres killed", -- [1]
					"Bloodmaul Brute", -- [2]
				},
			}, -- [1]
		},
		[11086] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						22341, -- [1]
						22342, -- [2]
						22343, -- [3]
						22363, -- [4]
						22393, -- [5]
						23393, -- [6]
					},
				},
				["names"] = {
					"Deathshadow Agent", -- [1]
				},
			}, -- [1]
		},
		[11156] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						23595, -- [1]
						23594, -- [2]
					},
				},
				["names"] = {
					"Direhorn Grimtotems killed", -- [1]
					"Grimtotem Destroyer", -- [2]
				},
			}, -- [1]
		},
		[10482] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						16876, -- [1]
						16925, -- [2]
						17595, -- [3]
						18952, -- [4]
						19701, -- [5]
						21161, -- [6]
					},
				},
				["names"] = {
					"Bonechewer Orc", -- [1]
				},
			}, -- [1]
		},
		[11885] = {
			[4] = {
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						23204, -- [1]
						23162, -- [2]
					},
				},
				["names"] = {
					"Vakkiz the Windrager", -- [1]
				},
			},
		},
		[9936] = {
			[2] = {
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						17146, -- [1]
						17147, -- [2]
						17148, -- [3]
						18397, -- [4]
						18658, -- [5]
						21276, -- [6]
					},
				},
				["names"] = {
					"Kil'sorrow Agent", -- [1]
				},
			},
		},
		[8346] = {
			{
				["type"] = "monster",
				["ids"] = {
					["npc"] = {
						15294, -- [1]
						15274, -- [2]
					},
				},
				["names"] = {
					"Mana Tap creature", -- [1]
					"Mana Wyrm", -- [2]
				},
			}, -- [1]
		},
	}

-- correct order of objectives where ClassicCodex does not have objectives in the same order as in quest log
addon.CLASSIC_CODEX.correctionsObjectiveOrder = {
		[8167] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[24] = {
		},
		[10221] = {
			1, -- [1]
		},
		[8191] = {
			2, -- [1]
			1, -- [2]
		},
		[10269] = {
		},
		[3085] = {
		},
		[4129] = {
		},
		[3093] = {
		},
		[4145] = {
			1, -- [1]
			3, -- [2]
			4, -- [3]
			2, -- [4]
		},
		[3101] = {
		},
		[3105] = {
		},
		[3109] = {
		},
		[10397] = {
			1, -- [1]
			2, -- [2]
		},
		[3117] = {
		},
		[3121] = {
		},
		[10445] = {
			2, -- [1]
			1, -- [2]
		},
		[392] = {
		},
		[10493] = {
			2, -- [1]
			1, -- [2]
		},
		[393] = {
		},
		[10541] = {
		},
		[3161] = {
			1, -- [1]
		},
		[4281] = {
		},
		[10621] = {
		},
		[10637] = {
			1, -- [1]
		},
		[8606] = {
			1, -- [1]
		},
		[8622] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10685] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[6384] = {
		},
		[10733] = {
		},
		[8702] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10765] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[10797] = {
		},
		[10813] = {
		},
		[8782] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[10861] = {
			2, -- [1]
			1, -- [2]
		},
		[10877] = {
			1, -- [1]
		},
		[405] = {
		},
		[10909] = {
			1, -- [1]
		},
		[10941] = {
		},
		[8910] = {
			2, -- [1]
			1, -- [2]
		},
		[408] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[8958] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[11021] = {
		},
		[8990] = {
			1, -- [1]
			[3] = 2,
		},
		[9006] = {
			2, -- [1]
			1, -- [2]
		},
		[9022] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[411] = {
		},
		[9054] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9070] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[1649] = {
		},
		[9102] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9118] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9134] = {
		},
		[6624] = {
		},
		[9166] = {
		},
		[9182] = {
			1, -- [1]
		},
		[9198] = {
			1, -- [1]
		},
		[9214] = {
			3, -- [1]
			1, -- [2]
			4, -- [3]
			2, -- [4]
		},
		[417] = {
			[2] = 1,
		},
		[11293] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[9278] = {
		},
		[9310] = {
		},
		[9326] = {
		},
		[11405] = {
		},
		[3369] = {
		},
		[3373] = {
		},
		[9406] = {
		},
		[1691] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[9438] = {
		},
		[11533] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[1701] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[1703] = {
		},
		[9534] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[6824] = {
			2, -- [1]
			4, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[9582] = {
			1, -- [1]
		},
		[9598] = {
		},
		[430] = {
		},
		[4841] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[3449] = {
			nil, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
			4, -- [5]
		},
		[9726] = {
			2, -- [1]
			1, -- [2]
		},
		[3461] = {
		},
		[4881] = {
		},
		[9774] = {
			1, -- [1]
		},
		[11885] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[11933] = {
		},
		[9902] = {
			1, -- [1]
		},
		[3505] = {
			2, -- [1]
			1, -- [2]
		},
		[9934] = {
		},
		[9950] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[440] = {
		},
		[3521] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[441] = {
		},
		[3541] = {
		},
		[10078] = {
			1, -- [1]
			3, -- [2]
			4, -- [3]
			2, -- [4]
		},
		[444] = {
		},
		[445] = {
		},
		[10142] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[446] = {
		},
		[5089] = {
		},
		[10190] = {
			1, -- [1]
		},
		[7642] = {
			2, -- [1]
			4, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[2159] = {
		},
		[449] = {
		},
		[2239] = {
		},
		[5145] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[3601] = {
			2, -- [1]
			1, -- [2]
			4, -- [3]
			3, -- [4]
		},
		[1803] = {
		},
		[8287] = {
		},
		[8303] = {
		},
		[11140] = {
			1, -- [1]
		},
		[3621] = {
		},
		[5201] = {
			2, -- [1]
			1, -- [2]
		},
		[3629] = {
		},
		[5217] = {
		},
		[5225] = {
			[2] = 1,
		},
		[1821] = {
			4, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[456] = {
			2, -- [1]
			1, -- [2]
		},
		[10494] = {
			2, -- [1]
			1, -- [2]
		},
		[457] = {
			2, -- [1]
			1, -- [2]
		},
		[10542] = {
			2, -- [1]
			1, -- [2]
		},
		[4987] = {
		},
		[10574] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[677] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[460] = {
		},
		[8575] = {
		},
		[5321] = {
		},
		[10912] = {
			1, -- [1]
		},
		[8623] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8639] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8655] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[5361] = {
		},
		[8687] = {
			1, -- [1]
		},
		[8703] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[465] = {
		},
		[8735] = {
			4, -- [1]
			1, -- [2]
			3, -- [3]
			2, -- [4]
		},
		[8783] = {
			1, -- [1]
			2, -- [2]
		},
		[7841] = {
			2, -- [1]
			1, -- [2]
			4, -- [3]
			3, -- [4]
		},
		[5441] = {
			1, -- [1]
		},
		[10894] = {
		},
		[7504] = {
		},
		[5465] = {
		},
		[8895] = {
		},
		[8911] = {
			2, -- [1]
			1, -- [2]
		},
		[10974] = {
			[2] = 1,
		},
		[10990] = {
			1, -- [1]
		},
		[8959] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[3781] = {
		},
		[8991] = {
			1, -- [1]
			2, -- [2]
			nil, -- [3]
			3, -- [4]
		},
		[9007] = {
			2, -- [1]
			1, -- [2]
		},
		[9039] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9055] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[5561] = {
			1, -- [1]
		},
		[9087] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[11150] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[11166] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[9135] = {
		},
		[7648] = {
		},
		[5842] = {
		},
		[9183] = {
			1, -- [1]
		},
		[2942] = {
			[2] = 1,
		},
		[3841] = {
		},
		[3845] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[11294] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[2975] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[9295] = {
		},
		[396] = {
		},
		[7736] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[7066] = {
		},
		[485] = {
		},
		[3881] = {
			2, -- [1]
			1, -- [2]
		},
		[9391] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[3090] = {
		},
		[11486] = {
		},
		[9455] = {
		},
		[3905] = {
		},
		[3909] = {
		},
		[3913] = {
		},
		[3375] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[3921] = {
		},
		[491] = {
		},
		[492] = {
		},
		[493] = {
		},
		[5841] = {
		},
		[31] = {
		},
		[5881] = {
		},
		[9727] = {
			2, -- [1]
			1, -- [2]
		},
		[7944] = {
		},
		[11122] = {
			1, -- [1]
		},
		[9775] = {
		},
		[3823] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[499] = {
		},
		[9823] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[9839] = {
			2, -- [1]
			1, -- [2]
		},
		[10155] = {
			1, -- [1]
			2, -- [2]
		},
		[4005] = {
		},
		[8740] = {
			1, -- [1]
			2, -- [2]
		},
		[9903] = {
			1, -- [1]
		},
		[9919] = {
		},
		[9935] = {
			1, -- [1]
		},
		[9191] = {
			1, -- [1]
		},
		[1114] = {
		},
		[9999] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[121] = {
		},
		[10031] = {
			2, -- [1]
			1, -- [2]
		},
		[6522] = {
		},
		[8120] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[1120] = {
		},
		[10127] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[510] = {
		},
		[4081] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[8168] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[32] = {
		},
		[8184] = {
			2, -- [1]
			1, -- [2]
		},
		[8192] = {
			2, -- [1]
			1, -- [2]
		},
		[514] = {
		},
		[515] = {
			1, -- [1]
			nil, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[516] = {
			2, -- [1]
			1, -- [2]
		},
		[6362] = {
		},
		[6185] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[10335] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[8304] = {
			2, -- [1]
			1, -- [2]
		},
		[521] = {
		},
		[522] = {
		},
		[4135] = {
		},
		[524] = {
		},
		[525] = {
		},
		[8416] = {
		},
		[529] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[8464] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[531] = {
		},
		[8496] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[4183] = {
		},
		[779] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[8544] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[536] = {
			2, -- [1]
			1, -- [2]
		},
		[10623] = {
		},
		[8592] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[539] = {
			2, -- [1]
			1, -- [2]
		},
		[8624] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[541] = {
			4, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[542] = {
		},
		[10719] = {
		},
		[10735] = {
		},
		[10751] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[1164] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[7522] = {
		},
		[10815] = {
		},
		[550] = {
		},
		[551] = {
		},
		[5081] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[10895] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[10911] = {
			2, -- [1]
			1, -- [2]
		},
		[4450] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8912] = {
			2, -- [1]
			1, -- [2]
		},
		[10991] = {
			1, -- [1]
		},
		[11007] = {
		},
		[9968] = {
			2, -- [1]
			1, -- [2]
		},
		[8992] = {
			1, -- [1]
			[3] = 2,
		},
		[11055] = {
			1, -- [1]
		},
		[2258] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9040] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9056] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9072] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9088] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[6601] = {
		},
		[2282] = {
			[2] = 1,
		},
		[9184] = {
			1, -- [1]
		},
		[9200] = {
			1, -- [1]
		},
		[9232] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[6681] = {
			1, -- [1]
		},
		[4642] = {
			[2] = 1,
		},
		[4382] = {
			2, -- [1]
			1, -- [2]
		},
		[383] = {
		},
		[9328] = {
		},
		[2338] = {
		},
		[9360] = {
		},
		[3065] = {
		},
		[8183] = {
		},
		[10738] = {
		},
		[4121] = {
		},
		[9440] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[4730] = {
		},
		[593] = {
		},
		[11535] = {
			[2] = 1,
		},
		[10301] = {
			[2] = 1,
		},
		[9520] = {
		},
		[9536] = {
			2, -- [1]
			1, -- [2]
		},
		[3097] = {
		},
		[10349] = {
		},
		[3113] = {
		},
		[10413] = {
		},
		[4810] = {
		},
		[9632] = {
		},
		[9648] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[12492] = {
		},
		[8446] = {
		},
		[9696] = {
		},
		[608] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[7668] = {
			1, -- [1]
		},
		[610] = {
		},
		[4882] = {
		},
		[8558] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8574] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[4906] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[9824] = {
			1, -- [1]
			2, -- [2]
		},
		[10669] = {
			1, -- [1]
		},
		[8638] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[9872] = {
		},
		[11935] = {
		},
		[2478] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			5, -- [4]
			6, -- [5]
			4, -- [6]
		},
		[6392] = {
		},
		[622] = {
		},
		[7025] = {
			2, -- [1]
			1, -- [2]
		},
		[624] = {
		},
		[7041] = {
			1, -- [1]
		},
		[5002] = {
		},
		[10749] = {
		},
		[8766] = {
			4, -- [1]
			2, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[2] = {
		},
		[407] = {
		},
		[8942] = {
			2, -- [1]
			1, -- [2]
		},
		[632] = {
		},
		[4481] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[409] = {
			1, -- [1]
		},
		[10144] = {
			1, -- [1]
			2, -- [2]
		},
		[5082] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[637] = {
		},
		[10192] = {
			nil, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[10208] = {
			2, -- [1]
			1, -- [2]
		},
		[4513] = {
			1, -- [1]
		},
		[641] = {
		},
		[10256] = {
			1, -- [1]
		},
		[9038] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[10288] = {
		},
		[645] = {
		},
		[646] = {
		},
		[2586] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[11101] = {
		},
		[10368] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[11117] = {
			1, -- [1]
		},
		[5202] = {
		},
		[2606] = {
		},
		[8385] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[654] = {
			4, -- [1]
			[6] = 1,
			[7] = 2,
			[4] = 3,
		},
		[10464] = {
		},
		[10480] = {
			1, -- [1]
		},
		[10496] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[10512] = {
		},
		[9086] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[8497] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[413] = {
		},
		[662] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[10592] = {
		},
		[8561] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[414] = {
		},
		[8593] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[1665] = {
		},
		[668] = {
		},
		[10688] = {
			1, -- [1]
		},
		[670] = {
		},
		[1667] = {
			1, -- [1]
		},
		[10736] = {
		},
		[8705] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[674] = {
		},
		[8737] = {
			1, -- [1]
		},
		[10800] = {
			1, -- [1]
		},
		[10816] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[8785] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[8801] = {
		},
		[10864] = {
		},
		[10880] = {
		},
		[9246] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[7505] = {
		},
		[10739] = {
		},
		[8897] = {
		},
		[8913] = {
			2, -- [1]
			1, -- [2]
		},
		[8929] = {
		},
		[10992] = {
			1, -- [1]
		},
		[2754] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[5514] = {
		},
		[5522] = {
		},
		[2766] = {
		},
		[5538] = {
		},
		[9041] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9057] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9073] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[697] = {
		},
		[9105] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9121] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[420] = {
		},
		[7649] = {
		},
		[702] = {
		},
		[9185] = {
			1, -- [1]
		},
		[9201] = {
			1, -- [1]
		},
		[3365] = {
		},
		[9233] = {
		},
		[11205] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[708] = {
		},
		[9281] = {
			2, -- [1]
			1, -- [2]
		},
		[9518] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[7729] = {
			2, -- [1]
			1, -- [2]
		},
		[9550] = {
		},
		[11392] = {
		},
		[11408] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[2858] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[5242] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[717] = {
			1, -- [1]
			[3] = 2,
		},
		[7785] = {
		},
		[2874] = {
		},
		[5210] = {
		},
		[5762] = {
		},
		[11536] = {
			[2] = 1,
		},
		[723] = {
		},
		[724] = {
		},
		[725] = {
		},
		[5146] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[9569] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[728] = {
		},
		[5050] = {
		},
		[7929] = {
		},
		[9633] = {
		},
		[4986] = {
		},
		[2930] = {
			[2] = 1,
		},
		[30] = {
			[2] = 1,
		},
		[2938] = {
		},
		[736] = {
			nil, -- [1]
			2, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[2946] = {
		},
		[2950] = {
			2, -- [1]
			1, -- [2]
		},
		[9761] = {
			2, -- [1]
			1, -- [2]
		},
		[439] = {
		},
		[9793] = {
		},
		[2966] = {
		},
		[2970] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[3513] = {
		},
		[2978] = {
		},
		[2982] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[9103] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9905] = {
			1, -- [1]
		},
		[3785] = {
			[3] = 1,
		},
		[9230] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[3002] = {
		},
		[9969] = {
			2, -- [1]
			1, -- [2]
		},
		[9985] = {
		},
		[6026] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[5049] = {
		},
		[3022] = {
		},
		[10334] = {
		},
		[8105] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[3561] = {
		},
		[3569] = {
		},
		[10129] = {
			1, -- [1]
			2, -- [2]
		},
		[10145] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[10702] = {
		},
		[9331] = {
		},
		[8169] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10209] = {
			[2] = 1,
		},
		[8185] = {
			2, -- [1]
			1, -- [2]
		},
		[10241] = {
			2, -- [1]
			1, -- [2]
		},
		[770] = {
		},
		[3082] = {
		},
		[10289] = {
		},
		[10305] = {
			1, -- [1]
		},
		[3094] = {
		},
		[3098] = {
		},
		[3102] = {
		},
		[777] = {
		},
		[10385] = {
			1, -- [1]
		},
		[3114] = {
		},
		[3118] = {
		},
		[64217] = {
			2, -- [1]
			1, -- [2]
		},
		[10449] = {
		},
		[10465] = {
		},
		[10481] = {
			1, -- [1]
		},
		[10497] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[6282] = {
			1, -- [1]
			4, -- [2]
			3, -- [3]
			2, -- [4]
		},
		[8482] = {
		},
		[8498] = {
			1, -- [1]
		},
		[3637] = {
		},
		[10577] = {
		},
		[6322] = {
		},
		[8562] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[793] = {
			1, -- [1]
			[3] = 2,
		},
		[10641] = {
			1, -- [1]
		},
		[795] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[8626] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[1805] = {
			1, -- [1]
		},
		[8658] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[6386] = {
		},
		[10737] = {
		},
		[8706] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10769] = {
			1, -- [1]
			2, -- [2]
		},
		[10785] = {
		},
		[10801] = {
		},
		[8770] = {
			1, -- [1]
		},
		[8786] = {
			1, -- [1]
		},
		[8802] = {
		},
		[453] = {
		},
		[10881] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[10897] = {
			2, -- [1]
			3, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[10913] = {
			2, -- [1]
			1, -- [2]
		},
		[10929] = {
			[2] = 1,
		},
		[8898] = {
		},
		[10961] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[10977] = {
		},
		[10993] = {
		},
		[4483] = {
			2, -- [1]
			4, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[8978] = {
		},
		[8994] = {
			2, -- [1]
			[3] = 1,
		},
		[10430] = {
		},
		[455] = {
			2, -- [1]
			1, -- [2]
		},
		[822] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[9058] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[824] = {
		},
		[9090] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9106] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[6610] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[11185] = {
		},
		[11201] = {
			[2] = 1,
		},
		[830] = {
		},
		[831] = {
		},
		[9202] = {
			1, -- [1]
		},
		[5233] = {
			[2] = 1,
		},
		[9234] = {
			4, -- [1]
			2, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[9250] = {
		},
		[9266] = {
			2, -- [1]
			1, -- [2]
		},
		[9075] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[8559] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[461] = {
		},
		[11377] = {
			[2] = 1,
		},
		[3362] = {
			2, -- [1]
			1, -- [2]
		},
		[11409] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[3370] = {
		},
		[3374] = {
			1, -- [1]
		},
		[10734] = {
		},
		[9426] = {
			2, -- [1]
			1, -- [2]
		},
		[4723] = {
		},
		[4731] = {
		},
		[10750] = {
		},
		[11537] = {
			1, -- [1]
		},
		[5385] = {
		},
		[9522] = {
			2, -- [1]
			1, -- [2]
		},
		[853] = {
		},
		[9554] = {
		},
		[9112] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[10830] = {
			1, -- [1]
		},
		[9602] = {
		},
		[9618] = {
		},
		[8691] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[469] = {
		},
		[10942] = {
		},
		[3446] = {
		},
		[54] = {
		},
		[864] = {
		},
		[4867] = {
			1, -- [1]
		},
		[9746] = {
			2, -- [1]
			1, -- [2]
		},
		[4883] = {
		},
		[868] = {
			1, -- [1]
		},
		[9794] = {
		},
		[9810] = {
			2, -- [1]
			1, -- [2]
		},
		[871] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[872] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[8627] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[11086] = {
		},
		[11118] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[9906] = {
			2, -- [1]
			1, -- [2]
		},
		[4963] = {
			[2] = 1,
		},
		[3510] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[879] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[3518] = {
		},
		[3522] = {
		},
		[3526] = {
		},
		[883] = {
		},
		[884] = {
		},
		[885] = {
		},
		[3542] = {
		},
		[7632] = {
		},
		[5051] = {
			[3] = 1,
		},
		[478] = {
		},
		[890] = {
		},
		[3562] = {
		},
		[892] = {
		},
		[893] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[894] = {
		},
		[8946] = {
		},
		[10226] = {
			[2] = 1,
		},
		[5123] = {
		},
		[481] = {
		},
		[8227] = {
		},
		[900] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[3602] = {
			1, -- [1]
		},
		[5163] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[9247] = {
		},
		[4186] = {
		},
		[905] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[906] = {
		},
		[333] = {
		},
		[8371] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[909] = {
		},
		[3638] = {
			[2] = 1,
		},
		[5235] = {
			[2] = 1,
		},
		[10482] = {
		},
		[10498] = {
			2, -- [1]
			1, -- [2]
		},
		[9535] = {
		},
		[10404] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9631] = {
		},
		[10562] = {
		},
		[4294] = {
			[2] = 1,
		},
		[10594] = {
		},
		[4983] = {
		},
		[10626] = {
			2, -- [1]
			1, -- [2]
		},
		[922] = {
		},
		[9711] = {
		},
		[924] = {
			1, -- [1]
		},
		[9826] = {
		},
		[8659] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[927] = {
		},
		[928] = {
		},
		[8707] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[930] = {
		},
		[931] = {
		},
		[10802] = {
			1, -- [1]
		},
		[8771] = {
			1, -- [1]
		},
		[8787] = {
			2, -- [1]
			1, -- [2]
		},
		[935] = {
		},
		[7490] = {
		},
		[7498] = {
		},
		[7506] = {
		},
		[940] = {
		},
		[10946] = {
		},
		[8915] = {
			2, -- [1]
			1, -- [2]
		},
		[59] = {
		},
		[944] = {
		},
		[9904] = {
			1, -- [1]
		},
		[3782] = {
		},
		[947] = {
			2, -- [1]
			1, -- [2]
		},
		[9011] = {
			2, -- [1]
			1, -- [2]
		},
		[11074] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[9043] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[7602] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[952] = {
		},
		[11138] = {
		},
		[9107] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9871] = {
		},
		[956] = {
		},
		[7650] = {
		},
		[6323] = {
		},
		[9187] = {
			1, -- [1]
		},
		[9203] = {
			1, -- [1]
		},
		[502] = {
		},
		[9235] = {
			4, -- [1]
			2, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[7810] = {
		},
		[1118] = {
		},
		[2019] = {
		},
		[9299] = {
		},
		[967] = {
		},
		[968] = {
		},
		[138] = {
		},
		[9330] = {
		},
		[11195] = {
		},
		[508] = {
		},
		[5067] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[7786] = {
			1, -- [1]
			3, -- [2]
			4, -- [3]
			2, -- [4]
		},
		[61] = {
		},
		[511] = {
		},
		[9475] = {
			1, -- [1]
		},
		[9491] = {
			[2] = 1,
		},
		[3914] = {
		},
		[6129] = {
			1, -- [1]
		},
		[513] = {
		},
		[4146] = {
			1, -- [1]
		},
		[9571] = {
		},
		[9587] = {
		},
		[9603] = {
		},
		[2078] = {
			1, -- [1]
		},
		[5843] = {
		},
		[5083] = {
		},
		[9667] = {
			1, -- [1]
		},
		[6241] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9699] = {
		},
		[527] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[7938] = {
		},
		[9747] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[6281] = {
		},
		[262] = {
		},
		[997] = {
		},
		[9811] = {
		},
		[9827] = {
		},
		[6321] = {
		},
		[8560] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[9875] = {
		},
		[6361] = {
		},
		[8640] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[9923] = {
			1, -- [1]
		},
		[9939] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[9955] = {
			1, -- [1]
		},
		[8656] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[6385] = {
		},
		[6027] = {
			[2] = 1,
		},
		[544] = {
			4, -- [1]
			2, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[8704] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10703] = {
		},
		[2198] = {
		},
		[3565] = {
		},
		[4062] = {
		},
		[10115] = {
			2, -- [1]
			1, -- [2]
		},
		[264] = {
		},
		[12194] = {
		},
		[1020] = {
		},
		[4082] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[8170] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[1023] = {
			1, -- [1]
		},
		[8186] = {
			2, -- [1]
			1, -- [2]
		},
		[1026] = {
			1, -- [1]
		},
		[12306] = {
			[2] = 1,
		},
		[10275] = {
		},
		[554] = {
		},
		[10307] = {
			1, -- [1]
		},
		[10943] = {
		},
		[1038] = {
			1, -- [1]
		},
		[8308] = {
		},
		[560] = {
		},
		[4482] = {
			3, -- [1]
			2, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[563] = {
		},
		[1048] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8388] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[1052] = {
		},
		[10467] = {
		},
		[9008] = {
			2, -- [1]
			1, -- [2]
		},
		[10499] = {
			2, -- [1]
			1, -- [2]
		},
		[1060] = {
		},
		[10531] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[9024] = {
			2, -- [1]
			1, -- [2]
		},
		[9104] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[10579] = {
		},
		[10595] = {
		},
		[10611] = {
			2, -- [1]
			1, -- [2]
		},
		[4292] = {
			1, -- [1]
		},
		[10643] = {
			1, -- [1]
		},
		[9120] = {
		},
		[6363] = {
		},
		[1358] = {
		},
		[8660] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[6387] = {
		},
		[8692] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10755] = {
		},
		[1092] = {
		},
		[1094] = {
		},
		[36] = {
		},
		[10819] = {
		},
		[1100] = {
		},
		[8804] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[578] = {
		},
		[1106] = {
		},
		[8411] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[2318] = {
		},
		[1112] = {
		},
		[8900] = {
		},
		[8916] = {
			2, -- [1]
			1, -- [2]
		},
		[8932] = {
			2, -- [1]
			1, -- [2]
		},
		[8948] = {
		},
		[4484] = {
			4, -- [1]
			2, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[4492] = {
		},
		[8996] = {
		},
		[4508] = {
		},
		[5155] = {
			4, -- [1]
			2, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[9044] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[71] = {
		},
		[1136] = {
			1, -- [1]
		},
		[9092] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9108] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[8917] = {
			2, -- [1]
			1, -- [2]
		},
		[11407] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[9156] = {
			2, -- [1]
			1, -- [2]
		},
		[9172] = {
		},
		[9188] = {
			1, -- [1]
		},
		[9204] = {
			1, -- [1]
		},
		[9220] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9236] = {
			4, -- [1]
			2, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[9252] = {
			2, -- [1]
			1, -- [2]
		},
		[9268] = {
			2, -- [1]
			1, -- [2]
		},
		[9074] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9300] = {
		},
		[4510] = {
		},
		[9332] = {
		},
		[2339] = {
			nil, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
			4, -- [5]
		},
		[9364] = {
			1, -- [1]
		},
		[4521] = {
			2, -- [1]
			1, -- [2]
		},
		[11487] = {
		},
		[9472] = {
			1, -- [1]
		},
		[2359] = {
			1, -- [1]
			2, -- [2]
		},
		[1182] = {
			[2] = 1,
		},
		[4732] = {
		},
		[594] = {
		},
		[1188] = {
		},
		[10242] = {
		},
		[2383] = {
		},
		[1194] = {
		},
		[1196] = {
		},
		[9109] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9588] = {
		},
		[9604] = {
		},
		[5283] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[3181] = {
		},
		[9616] = {
		},
		[11020] = {
			1, -- [1]
		},
		[607] = {
		},
		[620] = {
		},
		[10152] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9936] = {
			1, -- [1]
		},
		[2439] = {
		},
		[9764] = {
		},
		[9780] = {
			1, -- [1]
		},
		[623] = {
		},
		[9812] = {
		},
		[9828] = {
		},
		[9984] = {
		},
		[1121] = {
		},
		[1238] = {
		},
		[2479] = {
		},
		[9924] = {
			1, -- [1]
		},
		[9940] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[78] = {
		},
		[10096] = {
			2, -- [1]
			1, -- [2]
		},
		[9071] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[10004] = {
		},
		[2941] = {
		},
		[7067] = {
			[2] = 1,
		},
		[635] = {
		},
		[161] = {
		},
		[1262] = {
		},
		[8241] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[647] = {
		},
		[5068] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[10148] = {
		},
		[5226] = {
		},
		[5234] = {
		},
		[1276] = {
		},
		[80] = {
		},
		[5531] = {
		},
		[10244] = {
		},
		[11186] = {
		},
		[666] = {
			[2] = 1,
		},
		[1288] = {
		},
		[8625] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[669] = {
		},
		[81] = {
		},
		[8309] = {
			nil, -- [1]
			2, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[8657] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8689] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[2603] = {
			2, -- [1]
			1, -- [2]
		},
		[5220] = {
		},
		[10832] = {
			1, -- [1]
		},
		[10468] = {
		},
		[5252] = {
		},
		[7521] = {
			1, -- [1]
			3, -- [2]
			4, -- [3]
			2, -- [4]
		},
		[8485] = {
		},
		[8501] = {
			1, -- [1]
		},
		[8977] = {
		},
		[11040] = {
		},
		[9009] = {
			2, -- [1]
			1, -- [2]
		},
		[11072] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[11120] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[10644] = {
		},
		[9089] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[8629] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[1338] = {
		},
		[10708] = {
		},
		[84] = {
		},
		[10740] = {
		},
		[10756] = {
		},
		[10772] = {
		},
		[8741] = {
		},
		[8690] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10820] = {
			2, -- [1]
			1, -- [2]
		},
		[10836] = {
		},
		[8805] = {
			1, -- [1]
		},
		[7483] = {
			4, -- [1]
			3, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[292] = {
		},
		[7499] = {
		},
		[7507] = {
		},
		[1368] = {
		},
		[8901] = {
		},
		[10964] = {
		},
		[10980] = {
			1, -- [1]
		},
		[2751] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[2850] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[2759] = {
		},
		[9361] = {
			1, -- [1]
		},
		[9013] = {
			2, -- [1]
			1, -- [2]
		},
		[2771] = {
			2, -- [1]
			1, -- [2]
		},
		[1388] = {
		},
		[9061] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9077] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9093] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[7627] = {
			2, -- [1]
			1, -- [2]
		},
		[7761] = {
		},
		[7643] = {
			[2] = 1,
		},
		[7651] = {
		},
		[9173] = {
			2, -- [1]
			1, -- [2]
		},
		[9189] = {
		},
		[9205] = {
			1, -- [1]
		},
		[9409] = {
		},
		[9237] = {
			3, -- [1]
			2, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[3089] = {
		},
		[2882] = {
			[2] = 1,
		},
		[9521] = {
		},
		[1420] = {
		},
		[89] = {
			2, -- [1]
			1, -- [2]
		},
		[2851] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[11412] = {
			1, -- [1]
		},
		[2859] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[5724] = {
		},
		[727] = {
		},
		[7787] = {
		},
		[8350] = {
		},
		[2879] = {
			[5] = 1,
		},
		[10674] = {
			1, -- [1]
		},
		[11540] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9509] = {
		},
		[7905] = {
		},
		[735] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[2903] = {
		},
		[9573] = {
			2, -- [1]
			1, -- [2]
		},
		[1456] = {
			1, -- [1]
		},
		[9605] = {
		},
		[9621] = {
		},
		[5844] = {
		},
		[7907] = {
		},
		[1468] = {
		},
		[92] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[2943] = {
		},
		[2947] = {
		},
		[7937] = {
		},
		[7945] = {
		},
		[1480] = {
		},
		[739] = {
			2, -- [1]
			1, -- [2]
		},
		[9813] = {
		},
		[2501] = {
			1, -- [1]
		},
		[9845] = {
			1, -- [1]
		},
		[9861] = {
		},
		[1492] = {
		},
		[741] = {
		},
		[11972] = {
		},
		[2990] = {
		},
		[94] = {
		},
		[751] = {
		},
		[6143] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[6028] = {
		},
		[400] = {
		},
		[1512] = {
		},
		[3201] = {
		},
		[11065] = {
			1, -- [1]
		},
		[1518] = {
		},
		[763] = {
		},
		[10193] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[1524] = {
		},
		[1526] = {
			[2] = 1,
		},
		[10225] = {
		},
		[6146] = {
			1, -- [1]
		},
		[8171] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[96] = {
		},
		[8187] = {
			2, -- [1]
			1, -- [2]
		},
		[10245] = {
		},
		[3086] = {
		},
		[3083] = {
		},
		[3087] = {
		},
		[3091] = {
		},
		[8278] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[10341] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[3103] = {
		},
		[3107] = {
		},
		[8342] = {
			2, -- [1]
			1, -- [2]
		},
		[4181] = {
		},
		[3119] = {
		},
		[10369] = {
			1, -- [1]
		},
		[8338] = {
		},
		[10469] = {
		},
		[781] = {
		},
		[8470] = {
		},
		[8486] = {
			2, -- [1]
			1, -- [2]
		},
		[8502] = {
			1, -- [1]
		},
		[10545] = {
		},
		[8534] = {
			1, -- [1]
		},
		[6324] = {
		},
		[4267] = {
		},
		[4293] = {
			[2] = 1,
		},
		[8598] = {
		},
		[10625] = {
			1, -- [1]
		},
		[6364] = {
		},
		[8594] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8662] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10725] = {
		},
		[8694] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10757] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[10773] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[10657] = {
			1, -- [1]
			[3] = 2,
		},
		[10805] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[10821] = {
			1, -- [1]
		},
		[8790] = {
			2, -- [1]
			1, -- [2]
		},
		[10853] = {
			1, -- [1]
		},
		[3182] = {
		},
		[4421] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[10721] = {
			1, -- [1]
		},
		[8738] = {
			1, -- [1]
		},
		[10817] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[8902] = {
		},
		[8918] = {
			2, -- [1]
			1, -- [2]
		},
		[8934] = {
			2, -- [1]
			1, -- [2]
		},
		[8950] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[11013] = {
		},
		[11029] = {
			[2] = 1,
		},
		[10849] = {
		},
		[4509] = {
		},
		[1642] = {
		},
		[9046] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[1646] = {
		},
		[9078] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[4451] = {
		},
		[9110] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[1654] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			[5] = 4,
		},
		[1656] = {
		},
		[4581] = {
		},
		[8914] = {
			2, -- [1]
			1, -- [2]
		},
		[9190] = {
			1, -- [1]
		},
		[9206] = {
			1, -- [1]
		},
		[8930] = {
		},
		[4621] = {
			2, -- [1]
			1, -- [2]
		},
		[819] = {
		},
		[11089] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[826] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9302] = {
		},
		[11169] = {
		},
		[829] = {
		},
		[9170] = {
			2, -- [1]
			3, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[11413] = {
		},
		[9186] = {
			1, -- [1]
		},
		[9398] = {
			2, -- [1]
			1, -- [2]
		},
		[1690] = {
			2, -- [1]
			1, -- [2]
		},
		[1692] = {
		},
		[106] = {
		},
		[4733] = {
		},
		[832] = {
		},
		[1700] = {
		},
		[1702] = {
		},
		[1704] = {
		},
		[11133] = {
			1, -- [1]
		},
		[3301] = {
		},
		[107] = {
		},
		[6844] = {
		},
		[9606] = {
		},
		[840] = {
		},
		[3366] = {
		},
		[4763] = {
			[5] = 1,
		},
		[9670] = {
		},
		[9538] = {
		},
		[11052] = {
		},
		[10098] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[9698] = {
		},
		[6922] = {
		},
		[6962] = {
			2, -- [1]
			1, -- [2]
		},
		[2855] = {
			2, -- [1]
			1, -- [2]
		},
		[9798] = {
		},
		[10130] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[12193] = {
		},
		[10162] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[897] = {
		},
		[9878] = {
			2, -- [1]
			1, -- [2]
		},
		[10306] = {
			1, -- [1]
		},
		[9910] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[3507] = {
		},
		[3511] = {
		},
		[902] = {
		},
		[9974] = {
			2, -- [1]
			1, -- [2]
		},
		[7044] = {
			2, -- [1]
			1, -- [2]
		},
		[3630] = {
		},
		[3634] = {
		},
		[57] = {
			2, -- [1]
			1, -- [2]
		},
		[10054] = {
			2, -- [1]
			4, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[10466] = {
		},
		[10086] = {
			2, -- [1]
			1, -- [2]
		},
		[8547] = {
		},
		[10118] = {
			2, -- [1]
			1, -- [2]
		},
		[10134] = {
		},
		[3563] = {
		},
		[5085] = {
		},
		[10182] = {
			1, -- [1]
		},
		[10198] = {
		},
		[10174] = {
		},
		[2205] = {
		},
		[10246] = {
			2, -- [1]
			1, -- [2]
		},
		[10722] = {
		},
		[10278] = {
			[2] = 1,
		},
		[5149] = {
			1, -- [1]
		},
		[1802] = {
		},
		[1804] = {
			1, -- [1]
		},
		[113] = {
		},
		[8311] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[10754] = {
		},
		[8739] = {
			1, -- [1]
		},
		[3627] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[10422] = {
			1, -- [1]
		},
		[3635] = {
		},
		[3639] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[10470] = {
		},
		[5245] = {
			nil, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
			4, -- [5]
		},
		[10502] = {
		},
		[8471] = {
		},
		[939] = {
			[2] = 1,
		},
		[10550] = {
		},
		[10566] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[10582] = {
			2, -- [1]
			1, -- [2]
		},
		[5301] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[941] = {
		},
		[942] = {
		},
		[8599] = {
		},
		[10662] = {
		},
		[8631] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8931] = {
			2, -- [1]
			1, -- [2]
		},
		[10710] = {
		},
		[116] = {
			1, -- [1]
			4, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[8695] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8711] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10774] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[8979] = {
			2, -- [1]
			1, -- [2]
		},
		[3786] = {
			[3] = 1,
		},
		[8775] = {
			1, -- [1]
		},
		[8791] = {
		},
		[8807] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[7484] = {
			4, -- [1]
			3, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[950] = {
		},
		[10902] = {
			4, -- [1]
			2, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[7508] = {
		},
		[8887] = {
		},
		[8903] = {
			[2] = 1,
		},
		[8919] = {
			2, -- [1]
			1, -- [2]
		},
		[8935] = {
			2, -- [1]
			1, -- [2]
		},
		[8951] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[9059] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[7564] = {
		},
		[8999] = {
			2, -- [1]
			1, -- [2]
		},
		[3791] = {
			[2] = 1,
		},
		[1898] = {
		},
		[11094] = {
		},
		[119] = {
		},
		[9079] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9095] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9111] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[11174] = {
		},
		[7644] = {
		},
		[9159] = {
			2, -- [1]
			1, -- [2]
		},
		[9175] = {
		},
		[1918] = {
		},
		[1920] = {
			1, -- [1]
		},
		[3843] = {
		},
		[9239] = {
			3, -- [1]
			2, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[9255] = {
		},
		[11318] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[9091] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[3633] = {
		},
		[7732] = {
		},
		[3641] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[7738] = {
		},
		[10606] = {
			2, -- [1]
			1, -- [2]
		},
		[8242] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[5763] = {
		},
		[11538] = {
			1, -- [1]
		},
		[1948] = {
			1, -- [1]
			2, -- [2]
		},
		[9447] = {
			1, -- [1]
		},
		[9731] = {
		},
		[11542] = {
			4, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[7828] = {
			2, -- [1]
			1, -- [2]
		},
		[1960] = {
			1, -- [1]
		},
		[3923] = {
		},
		[5805] = {
		},
		[123] = {
		},
		[63] = {
			[2] = 1,
		},
		[6388] = {
		},
		[9623] = {
		},
		[9707] = {
		},
		[6142] = {
			[2] = 1,
		},
		[1978] = {
		},
		[1016] = {
			1, -- [1]
		},
		[10163] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[6131] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[1024] = {
		},
		[5901] = {
			[2] = 1,
		},
		[10243] = {
		},
		[1028] = {
		},
		[1030] = {
		},
		[6391] = {
		},
		[5941] = {
		},
		[7928] = {
		},
		[4127] = {
		},
		[1058] = {
			1, -- [1]
			4, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[8484] = {
		},
		[9911] = {
		},
		[8548] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[4284] = {
			4, -- [1]
			3, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[10627] = {
			2, -- [1]
			1, -- [2]
		},
		[8596] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[6571] = {
			1, -- [1]
			4, -- [2]
			3, -- [3]
			2, -- [4]
		},
		[6029] = {
		},
		[1080] = {
			1, -- [1]
		},
		[68] = {
		},
		[10055] = {
			2, -- [1]
			1, -- [2]
		},
		[8708] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10087] = {
			1, -- [1]
			2, -- [2]
		},
		[6607] = {
			1, -- [1]
			3, -- [2]
			4, -- [3]
			2, -- [4]
		},
		[10135] = {
		},
		[8772] = {
			1, -- [1]
		},
		[10835] = {
		},
		[4083] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[8] = {
		},
		[6133] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[12278] = {
		},
		[2203] = {
			1, -- [1]
		},
		[129] = {
		},
		[6181] = {
		},
		[4142] = {
		},
		[1122] = {
		},
		[8312] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[1124] = {
		},
		[9060] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[4182] = {
			2, -- [1]
			4, -- [2]
			3, -- [3]
			1, -- [4]
		},
		[2279] = {
		},
		[1146] = {
		},
		[1148] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[10471] = {
		},
		[10503] = {
		},
		[6285] = {
		},
		[1168] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[2118] = {
			1, -- [1]
		},
		[11401] = {
		},
		[8536] = {
			1, -- [1]
		},
		[8552] = {
		},
		[74] = {
		},
		[6341] = {
		},
		[11539] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[10663] = {
		},
		[2160] = {
		},
		[4542] = {
		},
		[8664] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[136] = {
		},
		[8696] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8712] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8728] = {
			1, -- [1]
			4, -- [2]
			3, -- [3]
			2, -- [4]
		},
		[8784] = {
		},
		[10807] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[8776] = {
			1, -- [1]
		},
		[2200] = {
		},
		[8808] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[9325] = {
		},
		[6862] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[8856] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[139] = {
		},
		[10935] = {
			1, -- [1]
		},
		[8904] = {
			[2] = 1,
		},
		[8920] = {
			2, -- [1]
			1, -- [2]
		},
		[140] = {
		},
		[8952] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[5253] = {
		},
		[1220] = {
		},
		[141] = {
		},
		[9016] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[2459] = {
			1, -- [1]
			[3] = 2,
		},
		[11095] = {
		},
		[9064] = {
		},
		[9080] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9096] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[2280] = {
		},
		[143] = {
		},
		[1240] = {
		},
		[1242] = {
		},
		[9176] = {
			2, -- [1]
			1, -- [2]
		},
		[144] = {
		},
		[1252] = {
		},
		[6661] = {
			1, -- [1]
		},
		[9240] = {
			3, -- [1]
			2, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[145] = {
		},
		[565] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[79] = {
		},
		[9304] = {
		},
		[146] = {
		},
		[9047] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[2340] = {
		},
		[9368] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[11431] = {
			1, -- [1]
		},
		[7500] = {
		},
		[6622] = {
		},
		[5124] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8810] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[4734] = {
		},
		[4742] = {
			4, -- [1]
			2, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[11543] = {
			4, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[149] = {
		},
		[10712] = {
			1, -- [1]
		},
		[9544] = {
			1, -- [1]
		},
		[4722] = {
		},
		[9576] = {
		},
		[6023] = {
			2, -- [1]
			1, -- [2]
		},
		[5236] = {
		},
		[6861] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[602] = {
		},
		[891] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[10692] = {
			2, -- [1]
			3, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[8661] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[152] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[9720] = {
			1, -- [1]
			4, -- [2]
			3, -- [3]
			2, -- [4]
		},
		[9736] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[2440] = {
		},
		[10724] = {
			1, -- [1]
		},
		[8693] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8709] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8773] = {
			1, -- [1]
		},
		[154] = {
		},
		[8789] = {
			2, -- [1]
			1, -- [2]
		},
		[6981] = {
		},
		[9045] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[1392] = {
		},
		[11156] = {
		},
		[9301] = {
		},
		[2871] = {
		},
		[7029] = {
			1, -- [1]
		},
		[8641] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[2500] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9557] = {
		},
		[7061] = {
		},
		[5022] = {
		},
		[9669] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[683] = {
		},
		[9781] = {
			1, -- [1]
		},
		[2967] = {
		},
		[10120] = {
		},
		[11024] = {
		},
		[159] = {
		},
		[10168] = {
			1, -- [1]
		},
		[10184] = {
		},
		[6004] = {
			3, -- [1]
			2, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[160] = {
		},
		[2782] = {
		},
		[8201] = {
			1, -- [1]
		},
		[10197] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[10280] = {
		},
		[10229] = {
		},
		[5158] = {
		},
		[5166] = {
			2, -- [1]
			4, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[162] = {
		},
		[8313] = {
		},
		[3095] = {
		},
		[10392] = {
			1, -- [1]
			2, -- [2]
		},
		[5206] = {
			1, -- [1]
		},
		[3099] = {
		},
		[5222] = {
			[2] = 1,
		},
		[5230] = {
		},
		[10472] = {
		},
		[3115] = {
		},
		[7301] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[5262] = {
		},
		[737] = {
		},
		[1582] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[8630] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8537] = {
			1, -- [1]
		},
		[10600] = {
			2, -- [1]
			1, -- [2]
		},
		[10741] = {
		},
		[8585] = {
			2, -- [1]
			1, -- [2]
		},
		[8710] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[4381] = {
			2, -- [1]
			1, -- [2]
		},
		[8633] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8774] = {
			1, -- [1]
		},
		[8665] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10728] = {
		},
		[8697] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[8806] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[10776] = {
			1, -- [1]
			[3] = 2,
		},
		[10792] = {
			1, -- [1]
			4, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[10808] = {
			1, -- [1]
		},
		[7461] = {
			2, -- [1]
			1, -- [2]
		},
		[10840] = {
			2, -- [1]
			1, -- [2]
		},
		[8809] = {
			1, -- [1]
			2, -- [2]
		},
		[7485] = {
			4, -- [1]
			3, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[6564] = {
		},
		[8857] = {
		},
		[5462] = {
		},
		[8889] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[8905] = {
			2, -- [1]
			1, -- [2]
		},
		[8921] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[172] = {
		},
		[2752] = {
			2, -- [1]
			1, -- [2]
		},
		[2756] = {
			2, -- [1]
			1, -- [2]
		},
		[2760] = {
		},
		[5526] = {
			[2] = 1,
		},
		[9017] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[2772] = {
			2, -- [1]
			1, -- [2]
		},
		[9049] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[11093] = {
			1, -- [1]
		},
		[9081] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[11144] = {
			[2] = 1,
		},
		[9113] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[8322] = {
		},
		[9238] = {
			3, -- [1]
			2, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[11208] = {
		},
		[9177] = {
		},
		[3110] = {
		},
		[3122] = {
		},
		[4725] = {
		},
		[9241] = {
			3, -- [1]
			2, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[6804] = {
			1, -- [1]
		},
		[4765] = {
		},
		[1712] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[1714] = {
		},
		[178] = {
		},
		[2848] = {
			2, -- [1]
			1, -- [2]
		},
		[2852] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[2856] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[2860] = {
		},
		[9401] = {
		},
		[7781] = {
		},
		[11041] = {
			1, -- [1]
			2, -- [2]
		},
		[2876] = {
		},
		[9042] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9154] = {
		},
		[1243] = {
		},
		[9513] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9052] = {
			2, -- [1]
			1, -- [2]
		},
		[842] = {
		},
		[10872] = {
			2, -- [1]
			1, -- [2]
		},
		[7861] = {
			2, -- [1]
			1, -- [2]
		},
		[3523] = {
		},
		[351] = {
		},
		[10009] = {
			nil, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[5061] = {
		},
		[3482] = {
		},
		[2932] = {
		},
		[5141] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[9705] = {
		},
		[3566] = {
			2, -- [1]
			1, -- [2]
		},
		[2948] = {
			2, -- [1]
			1, -- [2]
		},
		[5902] = {
		},
		[5229] = {
			[2] = 1,
		},
		[3643] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[10518] = {
		},
		[164] = {
		},
		[2972] = {
		},
		[2976] = {
		},
		[9865] = {
			2, -- [1]
			1, -- [2]
		},
		[8535] = {
			1, -- [1]
		},
		[9897] = {
		},
		[1838] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[1846] = {
			[2] = 1,
		},
		[9945] = {
			2, -- [1]
			1, -- [2]
		},
		[5341] = {
			2, -- [1]
			3, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[8777] = {
			1, -- [1]
		},
		[6022] = {
			[2] = 1,
		},
		[6030] = {
		},
		[8663] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10726] = {
		},
		[1858] = {
			[3] = 1,
		},
		[5219] = {
			[2] = 1,
		},
		[10838] = {
			[2] = 1,
		},
		[3642] = {
			[2] = 1,
		},
		[118] = {
		},
		[10137] = {
			1, -- [1]
			2, -- [2]
		},
		[7604] = {
			1, -- [1]
		},
		[10169] = {
		},
		[10185] = {
			2, -- [1]
			1, -- [2]
		},
		[12] = {
			2, -- [1]
			1, -- [2]
		},
		[7636] = {
			nil, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
			4, -- [5]
		},
		[8189] = {
			2, -- [1]
			1, -- [2]
		},
		[3084] = {
		},
		[3088] = {
		},
		[10313] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[3096] = {
		},
		[3100] = {
		},
		[8314] = {
		},
		[8330] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[10393] = {
		},
		[3116] = {
		},
		[3120] = {
		},
		[8867] = {
			1, -- [1]
			2, -- [2]
		},
		[8410] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[10473] = {
		},
		[10505] = {
		},
		[8474] = {
		},
		[10978] = {
		},
		[11026] = {
			1, -- [1]
		},
		[5861] = {
		},
		[10585] = {
			1, -- [1]
		},
		[198] = {
		},
		[7501] = {
		},
		[6342] = {
		},
		[8602] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[199] = {
		},
		[8634] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[1467] = {
		},
		[8666] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[6390] = {
		},
		[8698] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[6568] = {
		},
		[8940] = {
			2, -- [1]
			1, -- [2]
		},
		[8746] = {
			1, -- [1]
			2, -- [2]
		},
		[4383] = {
			2, -- [1]
			1, -- [2]
		},
		[10825] = {
		},
		[993] = {
		},
		[10857] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[10873] = {
		},
		[8188] = {
			2, -- [1]
			1, -- [2]
		},
		[8858] = {
		},
		[8190] = {
			2, -- [1]
			1, -- [2]
		},
		[7783] = {
		},
		[8906] = {
			2, -- [1]
			1, -- [2]
		},
		[8922] = {
		},
		[8938] = {
			2, -- [1]
			1, -- [2]
		},
		[8954] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[8970] = {
			[2] = 1,
		},
		[10183] = {
		},
		[9002] = {
			2, -- [1]
			1, -- [2]
		},
		[4511] = {
		},
		[11081] = {
		},
		[9050] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9066] = {
			2, -- [1]
			1, -- [2]
		},
		[9082] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9098] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9114] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9130] = {
		},
		[11193] = {
		},
		[9162] = {
		},
		[9178] = {
			1, -- [1]
		},
		[9194] = {
			1, -- [1]
		},
		[7502] = {
		},
		[6662] = {
		},
		[9242] = {
			3, -- [1]
			2, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[131] = {
		},
		[11321] = {
		},
		[132] = {
		},
		[1074] = {
		},
		[9322] = {
			2, -- [1]
			4, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[9338] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[3364] = {
		},
		[3368] = {
		},
		[1396] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[8628] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[9418] = {
		},
		[9434] = {
		},
		[4727] = {
		},
		[11513] = {
			1, -- [1]
		},
		[4743] = {
			1, -- [1]
		},
		[135] = {
		},
		[9514] = {
		},
		[6365] = {
		},
		[6389] = {
		},
		[10855] = {
			1, -- [1]
		},
		[6501] = {
		},
		[9594] = {
			1, -- [1]
			2, -- [2]
		},
		[9000] = {
			2, -- [1]
			1, -- [2]
		},
		[9626] = {
		},
		[9048] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[11404] = {
		},
		[11003] = {
		},
		[9069] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9706] = {
		},
		[8899] = {
		},
		[9738] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[8557] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[6124] = {
			1, -- [1]
		},
		[157] = {
		},
		[4903] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[10216] = {
			1, -- [1]
			4, -- [2]
			3, -- [3]
			2, -- [4]
		},
		[9834] = {
			1, -- [1]
		},
		[2604] = {
			2, -- [1]
			1, -- [2]
		},
		[10504] = {
		},
		[10831] = {
			[2] = 1,
		},
		[7509] = {
			[2] = 1,
		},
		[3504] = {
		},
		[8953] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[5518] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[220] = {
		},
		[9033] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[9994] = {
		},
		[3528] = {
			1, -- [1]
		},
		[11096] = {
		},
		[5023] = {
		},
		[9805] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[9097] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[5047] = {
		},
		[5582] = {
		},
		[5063] = {
			3, -- [1]
			1, -- [2]
			4, -- [3]
			2, -- [4]
		},
		[8460] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[223] = {
		},
		[3568] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[10727] = {
		},
		[14] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[1189] = {
		},
		[8508] = {
			[2] = 1,
		},
		[5127] = {
			2, -- [1]
			1, -- [2]
		},
		[11400] = {
		},
		[1423] = {
		},
		[5151] = {
			[2] = 1,
		},
		[8539] = {
			1, -- [1]
		},
		[5167] = {
			2, -- [1]
			4, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[10346] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9030] = {
		},
		[5862] = {
		},
		[184] = {
		},
		[10410] = {
		},
		[3632] = {
		},
		[5223] = {
		},
		[10458] = {
			1, -- [1]
			2, -- [2]
		},
		[10474] = {
		},
		[5247] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[7302] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[8556] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[2609] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[8507] = {
			1, -- [1]
		},
		[5942] = {
		},
		[10586] = {
			1, -- [1]
			[3] = 2,
		},
		[230] = {
		},
		[9849] = {
			1, -- [1]
		},
		[8587] = {
		},
		[8603] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[231] = {
		},
		[5343] = {
			2, -- [1]
			3, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[2980] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[8667] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[232] = {
		},
		[8699] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10762] = {
		},
		[8731] = {
			1, -- [1]
		},
		[233] = {
		},
		[10810] = {
		},
		[8779] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[9933] = {
		},
		[234] = {
		},
		[8572] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[3106] = {
		},
		[8859] = {
		},
		[5463] = {
		},
		[8891] = {
		},
		[8907] = {
			2, -- [1]
			1, -- [2]
		},
		[8923] = {
		},
		[8939] = {
			2, -- [1]
			1, -- [2]
		},
		[11002] = {
		},
		[5464] = {
		},
		[5519] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[9003] = {
			2, -- [1]
			1, -- [2]
		},
		[11066] = {
			1, -- [1]
		},
		[114] = {
		},
		[11098] = {
		},
		[238] = {
		},
		[11130] = {
		},
		[11146] = {
		},
		[9115] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[11178] = {
		},
		[10297] = {
		},
		[3092] = {
		},
		[9179] = {
			1, -- [1]
		},
		[240] = {
		},
		[3104] = {
		},
		[3108] = {
		},
		[9243] = {
			3, -- [1]
			2, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[9259] = {
			2, -- [1]
			1, -- [2]
		},
		[8346] = {
		},
		[3128] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[5144] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[9323] = {
			2, -- [1]
			4, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[8538] = {
			1, -- [1]
			2, -- [2]
			4, -- [3]
			3, -- [4]
		},
		[8586] = {
			2, -- [1]
			1, -- [2]
		},
		[64063] = {
			2, -- [1]
			1, -- [2]
		},
		[243] = {
		},
		[5727] = {
		},
		[10602] = {
			1, -- [1]
		},
		[6570] = {
		},
		[9451] = {
		},
		[11514] = {
			1, -- [1]
		},
		[3908] = {
		},
		[3912] = {
		},
		[10793] = {
		},
		[8762] = {
			1, -- [1]
			2, -- [2]
		},
		[3924] = {
			[3] = 1,
		},
		[8778] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[63866] = {
			1, -- [1]
		},
		[4463] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[11001] = {
			1, -- [1]
		},
		[9034] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[5847] = {
		},
		[11097] = {
		},
		[5863] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[11209] = {
			1, -- [1]
		},
		[7926] = {
		},
		[9723] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[6626] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[5903] = {
			[2] = 1,
		},
		[4728] = {
		},
		[210] = {
		},
		[9803] = {
			[2] = 1,
		},
		[4184] = {
		},
		[9835] = {
			2, -- [1]
			1, -- [2]
		},
		[7908] = {
		},
		[1429] = {
		},
		[120] = {
		},
		[251] = {
		},
		[10923] = {
			1, -- [1]
		},
		[3884] = {
		},
		[216] = {
			2, -- [1]
			1, -- [2]
		},
		[252] = {
		},
		[8700] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[9995] = {
		},
		[6261] = {
		},
		[8632] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[3564] = {
		},
		[9020] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[2585] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[9292] = {
		},
		[7735] = {
		},
		[10123] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[3640] = {
			[2] = 1,
		},
		[255] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[8765] = {
			2, -- [1]
			3, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[8166] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[9996] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[265] = {
		},
		[1025] = {
			4, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[6343] = {
		},
		[1029] = {
		},
		[10938] = {
		},
		[8955] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[9019] = {
			1, -- [1]
			2, -- [2]
			3, -- [3]
		},
		[9083] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[10347] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9099] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[10651] = {
			2, -- [1]
			3, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[1045] = {
			1, -- [1]
			2, -- [2]
		},
		[10411] = {
			2, -- [1]
			1, -- [2]
		},
		[11242] = {
		},
		[263] = {
			2, -- [1]
			1, -- [2]
		},
		[1053] = {
			4, -- [1]
			3, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[10475] = {
		},
		[1057] = {
			1, -- [1]
			4, -- [2]
			3, -- [3]
			2, -- [4]
		},
		[10507] = {
			1, -- [1]
		},
		[8476] = {
			2, -- [1]
			1, -- [2]
		},
		[266] = {
		},
		[1065] = {
		},
		[4264] = {
		},
		[8540] = {
			1, -- [1]
		},
		[10603] = {
			1, -- [1]
			[3] = 2,
		},
		[10619] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[269] = {
		},
		[1077] = {
		},
		[1079] = {
			1, -- [1]
		},
		[2161] = {
		},
		[7639] = {
		},
		[8668] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[272] = {
			[2] = 1,
		},
		[1089] = {
			nil, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[10763] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[8732] = {
			[2] = 1,
		},
		[274] = {
		},
		[4384] = {
			2, -- [1]
			1, -- [2]
		},
		[8780] = {
			2, -- [1]
			1, -- [2]
		},
		[2201] = {
			nil, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[10859] = {
			1, -- [1]
		},
		[9467] = {
			1, -- [1]
		},
		[1245] = {
		},
		[8860] = {
		},
		[1111] = {
		},
		[10939] = {
		},
		[8908] = {
			2, -- [1]
			1, -- [2]
		},
		[1117] = {
		},
		[280] = {
		},
		[8956] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[323] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[4496] = {
			2, -- [1]
			1, -- [2]
		},
		[282] = {
		},
		[4512] = {
			[2] = 1,
			[3] = 2,
		},
		[9036] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[11099] = {
		},
		[9068] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9084] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9100] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[9116] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[286] = {
		},
		[1145] = {
		},
		[1147] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[9180] = {
		},
		[9196] = {
			1, -- [1]
		},
		[8924] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[8941] = {
			2, -- [1]
			1, -- [2]
		},
		[9244] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[5231] = {
			[2] = 1,
		},
		[9276] = {
			2, -- [1]
			1, -- [2]
		},
		[291] = {
		},
		[248] = {
		},
		[9324] = {
		},
		[7503] = {
		},
		[293] = {
		},
		[11419] = {
		},
		[9388] = {
			2, -- [1]
			1, -- [2]
			4, -- [3]
			3, -- [4]
		},
		[11451] = {
		},
		[1179] = {
		},
		[3112] = {
		},
		[1183] = {
		},
		[9468] = {
		},
		[11531] = {
		},
		[11547] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9516] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[1193] = {
			2, -- [1]
			1, -- [2]
		},
		[10633] = {
		},
		[1197] = {
			[2] = 1,
		},
		[9195] = {
			1, -- [1]
		},
		[10029] = {
		},
		[4808] = {
		},
		[4784] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[9101] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[9389] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[303] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
			4, -- [4]
		},
		[9692] = {
			1, -- [1]
			nil, -- [2]
			2, -- [3]
			3, -- [4]
			4, -- [5]
		},
		[10395] = {
		},
		[4864] = {
			2, -- [1]
			1, -- [2]
		},
		[1219] = {
		},
		[1221] = {
			1, -- [1]
		},
		[306] = {
		},
		[10523] = {
		},
		[1067] = {
		},
		[268] = {
		},
		[9836] = {
		},
		[8620] = {
			[9] = 1,
		},
		[1087] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[1091] = {
		},
		[1239] = {
		},
		[1241] = {
		},
		[311] = {
		},
		[4976] = {
		},
		[8764] = {
			2, -- [1]
			3, -- [2]
			4, -- [3]
			1, -- [4]
		},
		[9980] = {
			2, -- [1]
			1, -- [2]
		},
		[1251] = {
		},
		[1253] = {
		},
		[7063] = {
		},
		[1103] = {
		},
		[10060] = {
			2, -- [1]
			4, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[8424] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[5048] = {
		},
		[5056] = {
			1, -- [1]
		},
		[1119] = {
		},
		[1269] = {
		},
		[2241] = {
		},
		[8989] = {
			1, -- [1]
			[3] = 2,
		},
		[5096] = {
		},
		[10204] = {
		},
		[10220] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[2561] = {
		},
		[5128] = {
		},
		[10268] = {
		},
		[322] = {
		},
		[6543] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[5160] = {
		},
		[8285] = {
		},
		[8301] = {
			1, -- [1]
		},
		[11051] = {
			1, -- [1]
		},
		[10380] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9148] = {
		},
		[9164] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[5216] = {
			[2] = 1,
		},
		[12491] = {
		},
		[5232] = {
		},
		[328] = {
		},
		[10492] = {
			2, -- [1]
			1, -- [2]
		},
		[329] = {
		},
		[10524] = {
			nil, -- [1]
			2, -- [2]
			1, -- [3]
			3, -- [4]
		},
		[1319] = {
		},
		[1321] = {
		},
		[11403] = {
		},
		[8541] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[332] = {
		},
		[8573] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
			4, -- [4]
		},
		[2661] = {
		},
		[1175] = {
			1, -- [1]
			3, -- [2]
			2, -- [3]
		},
		[334] = {
		},
		[8637] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[11515] = {
			1, -- [1]
		},
		[8669] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[336] = {
		},
		[8701] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[337] = {
		},
		[298] = {
		},
		[9564] = {
		},
		[10812] = {
		},
		[8781] = {
			1, -- [1]
		},
		[301] = {
		},
		[1359] = {
		},
		[8829] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[7495] = {
		},
		[8861] = {
		},
		[1367] = {
		},
		[10940] = {
		},
		[8909] = {
			2, -- [1]
			1, -- [2]
		},
		[1469] = {
		},
		[10988] = {
			1, -- [1]
		},
		[2753] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[2757] = {
		},
		[11036] = {
		},
		[346] = {
		},
		[9021] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[2773] = {
			2, -- [1]
			1, -- [2]
		},
		[11100] = {
		},
		[1391] = {
		},
		[9037] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[1395] = {
		},
		[7631] = {
			1, -- [1]
		},
		[9133] = {
		},
		[7647] = {
			2, -- [1]
			1, -- [2]
		},
		[9165] = {
			1, -- [1]
		},
		[9181] = {
			1, -- [1]
		},
		[9197] = {
			1, -- [1]
		},
		[9117] = {
			3, -- [1]
			4, -- [2]
			1, -- [3]
			2, -- [4]
		},
		[353] = {
		},
		[9245] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[354] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[319] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[310] = {
		},
		[9948] = {
			1, -- [1]
		},
		[2845] = {
		},
		[2849] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[2853] = {
		},
		[2857] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[358] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[9405] = {
		},
		[1435] = {
			1, -- [1]
		},
		[10012] = {
		},
		[9453] = {
		},
		[11516] = {
		},
		[11532] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[9501] = {
		},
		[10140] = {
		},
		[10188] = {
			1, -- [1]
		},
		[9549] = {
			2, -- [1]
			1, -- [2]
		},
		[320] = {
		},
		[10252] = {
			nil, -- [1]
			1, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[1457] = {
		},
		[5248] = {
		},
		[8621] = {
			3, -- [1]
			4, -- [2]
			2, -- [3]
			1, -- [4]
		},
		[366] = {
		},
		[1465] = {
		},
		[2933] = {
		},
		[23] = {
		},
		[7927] = {
		},
		[2945] = {
		},
		[2949] = {
		},
		[5904] = {
		},
		[9773] = {
			1, -- [1]
		},
		[5384] = {
			1, -- [1]
		},
		[371] = {
			2, -- [1]
			1, -- [2]
		},
		[2969] = {
		},
		[1487] = {
			1, -- [1]
			4, -- [2]
			2, -- [3]
			3, -- [4]
		},
		[2977] = {
		},
		[373] = {
		},
		[10924] = {
			1, -- [1]
		},
		[8957] = {
			2, -- [1]
			3, -- [2]
			1, -- [3]
		},
		[1425] = {
		},
		[375] = {
			2, -- [1]
			1, -- [2]
		},
		[9949] = {
			3, -- [1]
			1, -- [2]
			2, -- [3]
		},
		[376] = {
			2, -- [1]
			1, -- [2]
		},
		[9981] = {
			2, -- [1]
			1, -- [2]
		},
		[9997] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
		},
		[10013] = {
		},
		[1511] = {
		},
		[10045] = {
			2, -- [1]
			1, -- [2]
			3, -- [3]
			4, -- [4]
		},
		[1515] = {
		},
		[9373] = {
		},
		[5728] = {
			2, -- [1]
			1, -- [2]
		},
		[1521] = {
		},
		[361] = {
		},
		[370] = {
			3, -- [1]
			2, -- [2]
			1, -- [3]
		},
		[1527] = {
		},
		[9821] = {
			1, -- [1]
		},
		[372] = {
			2, -- [1]
			1, -- [2]
		},
	}


================================================
FILE: Guidelime/Data/Data.lua
================================================
local addonName, addon = ...
local L = addon.L

local HBD = LibStub("HereBeDragons-2.0")

addon.SK = addon.SK or {}; local SK = addon.SK -- Data/SkillDB
addon.SP = addon.SP or {}; local SP = addon.SP -- Data/SpellDB

addon.D = addon.D or {}; local D = addon.D     -- Data/Data

D.factions = {"Alliance", "Horde"}
D.races = {Human = "Alliance", NightElf = "Alliance", Dwarf = "Alliance", Gnome = "Alliance", Orc = "Horde", Troll = "Horde", Tauren = "Horde", Undead = "Horde", Draenei = "Alliance", BloodElf = "Horde", Worgen = "Alliance", Goblin = "Horde", Pandaren = "Neutral"}
D.raceIDs = {Human = 1, NightElf = 4, Dwarf = 3, Gnome = 7, Orc = 2, Troll = 8, Tauren = 6, Undead = 5, BloodElf = 10, Draenei = 11, Worgen = 22, Goblin = 9, Pandaren = 24}
D.classes = {"Warrior", "Rogue", "Mage", "Warlock", "Hunter", "Priest", "Druid", "Paladin", "Shaman", "DeathKnight", "Monk"}
D.classesWithFaction = {}
D.classesPerRace = {
	Human = {"Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Mage", "Warlock", "DeathKnight", "Monk"},
	NightElf = {"Warrior", "Hunter", "Rogue", "Priest", "Mage", "Druid", "DeathKnight", "Monk"},
	Dwarf = {"Warrior", "Paladin", "Hunter", "Rogue", "Priest", "Shaman", "Mage", "Warlock", "DeathKnight", "Monk"},
	Gnome = {"Warrior", "Rogue", "Priest", "Mage", "Warlock", "DeathKnight", "Monk"},
	Orc = {"Warrior", "Hunter", "Rogue", "Shaman", "Mage", "Warlock", "DeathKnight", "Monk"},
	Troll = {"Warrior", "Hunter", "Rogue", "Priest", "Shaman", "Mage", "Warlock", "Druid", "DeathKnight", "Monk"},
	Tauren = {"Warrior", "Paladin", "Hunter", "Priest", "Shaman", "Druid", "DeathKnight", "Monk"},
	Undead = {"Warrior", "Hunter", "Rogue", "Priest", "Mage", "Warlock", "DeathKnight", "Monk"},
	Draenei = {"Hunter", "Mage", "Paladin", "Priest", "Shaman", "Warrior", "DeathKnight", "Monk"},
	BloodElf = {"Warrior", "Hunter", "Mage", "Paladin", "Priest", "Rogue", "Warlock", "DeathKnight", "Monk"},
	Worgen = {"Warrior", "Hunter", "Rogue", "Priest", "Mage", "Warlock", "Druid", "DeathKnight"},
	Goblin = {"Warrior", "Hunter", "Rogue", "Priest", "Shaman", "Mage", "Warlock", "DeathKnight"},
	Pandaren = {"Hunter", "Mage", "Monk", "Priest", "Rogue", "Shaman", "Warrior"}
}
function D.getClass(class)
	class = class:upper():gsub(" ","")
	for i, c in ipairs(D.classes) do
		if c:upper() == class then return c end
	end
end
function D.getRace(race)
	race = race:upper():gsub(" ","")
	if race == "SCOURGE" then return "Undead" end
	for r, f in pairs(D.races) do
		if r:upper() == race then return r end
	end
end
function D.getSex(sex)
	if type(sex) == "number" then
		return sex == 2 and "Male" or "Female"
	else
		return sex:upper() == "MALE" and "Male" or "Female"
	end
end

D.class = D.getClass(select(2, UnitClass("player")))
D.race = D.getRace(select(2, UnitRace("player")))
D.sex = D.getSex(UnitSex("player"))
D.faction = UnitFactionGroup("player")
D.level = UnitLevel("player")
D.xp = UnitXP("player")
D.xpMax = UnitXPMax("player")
D.wx, D.wy, D.instance = HBD:GetPlayerWorldPosition()
D.face = GetPlayerFacing()

D.reputations = {
	bootybay = 21,
	ironforge = 47,
	gnomeregan = 54,
	thoriumbrotherhood = 59,
	undercity = 68,
	darnassus = 69,
	syndicate = 70,
	stormwind = 72,
	orgrimmar = 76,
	thunderbluff = 81,
	bloodsailbuccaneers = 87,
	gelkisclancentaur = 92,
	magramclancentaur = 93,
	zandalartribe = 270,
	ravenholdt = 349,
	gadgetzan = 369,
	ratchet = 470,
	wildhammerclan = 471,
	leagueofarathor = 509,
	defilers = 510,
	argentdawn = 529,
	darkspeartrolls = 530,
	timbermawhold = 576,
	everlook = 577,
	wintersabertrainers = 589,
	cenarioncircle = 609,
	frostwolfclan = 729,
	stormpikeguard = 730,
	hydraxianwaterlords = 749,
	shendralar = 809,
	warsongoutriders = 889,
	silverwingsentinels = 890,
	darkmoonfaire = 909,
	broodofnozdormu = 910,
	silvermooncity = 911,
	tranquillien = 922,
	exodar = 930,
	aldor = 932,
	consortium = 933,
	scryers = 934,
	shatar = 935,
	maghar = 941,
	cenarionexpedition = 942,
	honorhold = 946,
	thrallmar = 947,
	violeteye = 967,
	sporeggar = 970,
	kurenai = 978,
	keepersoftime = 989,
	scaleofthesands = 990,
	lowercity = 1011,
	ashtonguedeathsworn = 1012,
	netherwing = 1015,
	shatariskyguard = 1031,
	ogrila = 1038,
	shatteredsunoffensive = 1077,
	
	valianceexpedition = 1050,
	silvercovenant = 1094,
	explorersleague = 1068,
	frostborn = 1126,
	warsongoffensive = 1085,
	sunreavers = 1124,
	handofvengeance = 1067,
	taunka = 1064,
	oracles = 1105,
	frenzyhearttribe = 1104,
	
	guild = 1169,
	gilneas = 1134,
	earthenring = 1135,
	guardiansofhyjal = 1158,
	therazane = 1171,
	dragonmawclan = 1172,
	ramkahen = 1173,
	wildhammerclan = 1174,
	baradinswardens = 1177,
	hellscreamsreach = 1178,
	avengersofhyjal = 1204,
	bilgewatercartel = 1133,
	
	goldenlotus = 1269, 
	orderofthecloudserpent = 1271, 
	anglers = 1302, 
	natpagle = 1358, 
	tillers	= 1272, 
	augustcelestials = 1341, 
	shadopan = 1270, 
	klaxxi = 1337, 
	shadopanassault = 1435, 
	lorewalkers = 1345, 
	blackprince = 1359, 
	sunreaveronslaught = 1388, 
	pearlfinjinyu = 1242, 
	kirintoroffensive = 1387, 
	operationshieldwall = 1376, 
	dominanceoffensive = 1375, 
	tinamudclaw = 1280, 
	emperorshaohao = 1492, 
	ella = 1275, 
	foresthozen = 1228, 
	shangxisacademy = 1216, 
	ginamudclaw = 1281, 
	sho = 1278, 
	fishfellreed = 1282, 
	brewmasters = 1351, 
	cheechee = 1277, 
	haohanmudclaw = 1279, 
	akamastrust = 1416, 
	darkspearrebellion = 1440, 
	joguthedrunk = 1273, 
	farmerfung = 1283, 
	oldhillpaw = 1276
}

D.racesPerFaction = {}
for race, faction in pairs(D.races) do
	if D.racesPerFaction[faction] == nil then D.racesPerFaction[faction] = {} end
	table.insert(D.racesPerFaction[faction], race)
end

D.classesPerFaction = {}
for i, class in ipairs(D.classes) do
	for i, faction in ipairs(D.factions) do
		if D.classesWithFaction[class] or faction == faction then
			if D.classesPerFaction[faction] == nil then D.classesPerFaction[faction] = {} end
			table.insert(D.classesPerFaction[faction], class)
		end
	end
end

function D.isClass(class)
	return D.getClass(class) ~= nil
end
function D.isRace(race)
	return D.getRace(race) ~= nil
end
function D.getFaction(faction)
	faction = faction:upper()
	for i, f in ipairs(D.factions) do
		if f:upper() == faction then return f end
	end
end
function D.isFaction(faction)
	return D.getFaction(faction) ~= nil
end
function D.getLocalizedRace(race)
	if C_CreatureInfo == nil then return race end
	local raceInfo = C_CreatureInfo.GetRaceInfo(D.raceIDs[race])
	return raceInfo and raceInfo.raceName or race
end
function D.getLocalizedClass(class)
	return LOCALIZED_CLASS_NAMES_MALE[class:upper()] or class
end

function D.getReputation(rep)
	return D.reputations[string.gsub(string.gsub(string.lower(rep), "[' ]", ""), "^the", "")]
end
function D.isReputation(rep)
	return D.getReputation(rep) ~= nil
end
function D.getLocalizedReputation(id)
	local name = GetFactionInfoByID(id)
	return name
end
function D.isRequiredReputation(id, repMin, repMax)
	local _, _, standing, _, _, value = GetFactionInfoByID(id)
	if repMin ~= nil and value < repMin then return false end
	if repMax ~= nil and value >= repMax then return false end
	return true
end

function D.contains(array, value)
	if not array then return end
	for i, v in ipairs(array) do
		if type(value) == "function" then
			if value(v) then return true end
		else
			if v == value then return true end
		end
	end
	return false
end

function D.find(array, func)
	if not array then return end
	for i, v in ipairs(array) do
		if func(v) then return v end
	end
end

function D.containsIgnoreCase(array, value)
	return D.contains(array, function(v) return v:upper() == value:upper() end)
end

function D.containsKey(table, value)
	for k, v in pairs(table) do
		if type(value) == "function" then
			if value(k) then return true end
		else
			if k == value then return true end
		end
	end
	return false
end

function D.applies(guide)
	if guide == nil then return false end
	if guide.races ~= nil then
		if not D.contains(guide.races, D.race) then return false end
	end
	if guide.classes ~= nil then
		if not D.contains(guide.classes, D.class) then return false end
	end
	if guide.faction ~= nil and guide.faction ~= D.faction then return false end
	return true
end

function D.hasRequirements(guide)
	if guide == nil then return true end
	if guide.reputation and not D.isRequiredReputation(guide.reputation, guide.repMin, guide.repMax) then return false end
	if guide.skillReq and not SK.isRequiredSkill(guide.skillReq, guide.skillMin, guide.skillMax) then return false end
	if guide.spellReq and not SP.isRequiredSpell(guide.spellReq, guide.spellMin, guide.spellMax) then return false end
	if guide.itemReq and not D.hasItem(guide.itemReq, guide.itemMin, guide.itemMax) then return false end
	return true
end

function D.isAlive()
	return not UnitIsDeadOrGhost("player")
	--return HBD:GetPlayerZone() == nil or C_DeathInfo.GetCorpseMapPosition(HBD:GetPlayerZone()) == nil
end

function D.bit(p)
  return 2 ^ (p - 1)  -- 1-based indexing
end

-- Typical call:  if hasbit(x, bit(3)) then ...
function D.hasbit(x, p)
  return x % (p + p) >= p       
end

function D.hasItem(itemReq, itemMin, itemMax)
	-- note that itemMin is not "minimum number of items", but "greater than" (not "greater or equal"), analog itemMax
	-- as pattern match for element.t == "APPLIES" in GuideParser.lua does not allow for <= or >=

	local itemcnt = GetItemCount(tonumber(itemReq))

	if itemMin ~= nil then return (itemcnt > itemMin) end
	if itemMax ~= nil then return (itemcnt < itemMax) end

	return nil
end

D.RACE_ICON_TCOORDS = {
	["Human"] = {
		["Male"] = {0, 0.125, 0, 0.25},
		["Female"]	= {0, 0.125, 0.5, 0.75},  
	},
	["Dwarf"] = {
		["Male"] = {0.125, 0.25, 0, 0.25},
		["Female"]	= {0.125, 0.25, 0.5, 0.75},
	},
	["Gnome"] = {
		["Male"] = {0.25, 0.375, 0, 0.25},
		["Female"]	= {0.25, 0.375, 0.5, 0.75},
	},
	["NightElf"] = {
		["Male"] = {0.375, 0.5, 0, 0.25},
		["Female"]	= {0.375, 0.5, 0.5, 0.75},
	},
	["Tauren"] = {
		["Male"] = {0, 0.125, 0.25, 0.5},
		["Female"]	= {0, 0.125, 0.75, 1.0},   
	},
	["Undead"] = {
		["Male"] = {0.125, 0.25, 0.25, 0.5},
		["Female"]	= {0.125, 0.25, 0.75, 1.0}, 
	},
	["Troll"] = {
		["Male"] = {0.25, 0.375, 0.25, 0.5},
		["Female"]	= {0.25, 0.375, 0.75, 1.0}, 
	},
	["Orc"] = {
		["Male"] = {0.375, 0.5, 0.25, 0.5},
		["Female"] = {0.375, 0.5, 0.75, 1.0}, 
	},
	["BloodElf"] = {
		["Male"] = {0.5, 0.625, 0.25, 0.5},
		["Female"] = {0.5, 0.625, 0.75, 1.0}, 
	},
	["Draenei"] = {
		["Male"] = {0.5, 0.625, 0, 0.25},
		["Female"] = {0.5, 0.625, 0.5, 0.75}, 
	},
	["Worgen"] = {
		["Male"] = {0.625, 0.75, 0, 0.25},
		["Female"] = {0.625, 0.75, 0.5, 0.75}, 
	},
	["Goblin"] = {
		["Male"] = {0.625, 0.75, 0.25, 0.5},
		["Female"] = {0.625, 0.75, 0.75, 1.0}, 
	},
	["Pandaren"] = {
		["Male"] = {0.75, 0.875, 0, 0.25},
		["Female"] = {0.75, 0.875, 0.5, 0.75}, 
	},	
};

function D.getRaceIconText(race, sex, size)
	local coords = D.RACE_ICON_TCOORDS[D.getRace(race)][D.getSex(sex)]
	return "|TInterface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-RACES:" .. (size or 12) .. ":" .. (size or 12) .. ":0:0:128:128:" .. 
		coords[1] * 128 .. ":" .. coords[2] * 128 .. ":" .. coords[3] * 128 .. ":" .. coords[4] * 128 .. ":::|t"
end

function D.getClassIconText(class, size)
	-- cf https://wowpedia.fandom.com/wiki/Class_icon; alternative icon suggestions there as well
	local coords = CLASS_ICON_TCOORDS[D.getClass(class):upper()]
	return "|TInterface\\GLUES\\CHARACTERCREATE\\UI-CHARACTERCREATE-CLASSES:" .. (size or 12) .. ":" .. (size or 12) .. ":0:0:128:128:" .. 
		coords[1] * 128 .. ":" .. coords[2] * 128 .. ":" .. coords[3] * 128 .. ":" .. coords[4] * 128 .. ":::|t"
end


================================================
FILE: Guidelime/Data/FlightmasterDB.lua
================================================
local addonName, addon = ...

local HBD = LibStub("HereBeDragons-2.0")

addon.DM = addon.DM or {}; local DM = addon.DM -- Data/MapDB
addon.PT = addon.PT or {}; local PT = addon.PT -- Data/PositionTools

addon.FM = addon.FM or {}; local FM = addon.FM -- Data/FlightmasterDB

FM.flightmasterDB = {
	[2] = {npcId = 352, zone = "Stormwind City", name = "Dungar Longdrink", place = "Stormwind", faction = "Alliance", id = 2},
	[4] = {npcId = 523, zone = "Westfall", name = "Thor", place = "Sentinel Hill", faction = "Alliance", id = 4},
	[5] = {npcId = 931, zone = "Redridge Mountains", name = "Ariena Stormfeather", place = "Lakeshire", faction = "Alliance", id = 5},
	[20] = {npcId = 1387, zone = "Stranglethorn Vale", name = "Thysta", place = "Grom'gol Base Camp", faction = "Horde", id = 20},
	[7] = {npcId = 1571, zone = "Wetlands", name = "Shellei Brondir", place = "Menethil Harbor", faction = "Alliance", id = 7},
	[8] = {npcId = 1572, zone = "Loch Modan", name = "Thorgrum Borrelson", place = "Thelsamar", faction = "Alliance", id = 8},
	[6] = {npcId = 1573, zone = "Ironforge", name = "Gryth Thurden", faction = "Alliance", id = 6},
	[10] = {npcId = 2226, zone = "Silverpine Forest", name = "Karos Razok", place = "The Sepulcher", faction = "Horde", id = 10},
	[71] = {npcId = 2299, zone = "Burning Steppes", name = "Borgus Stoutarm", place = "Morgan's Vigil", faction = "Alliance", id = 71},
	[13] = {npcId = 2389, zone = "Hillsbrad Foothills", name = "Zarise", place = "Tarren Mill", faction = "Horde", id = 13},
	[12] = {npcId = 2409, zone = "Duskwood", name = "Felicia Maline", place = "Darkshire", faction = "Alliance", id = 12},
	[14] = {npcId = 2432, zone = "Hillsbrad Foothills", name = "Darla Harris", place = "Southshore", faction = "Alliance", id = 14},
	[16] = {npcId = 2835, zone = "Arathi Highlands", name = "Cedrik Prose", place = "Refuge Pointe", faction = "Alliance", id = 16},
	[17] = {npcId = 2851, zone = "Arathi Highlands", name = "Urda", place = "Hammerfall", faction = "Horde", id = 17},
	[18] = {npcId = 2858, zone = "Stranglethorn Vale", name = "Gringer", place = "Booty Bay", faction = "Horde", id = 18},
	[19] = {npcId = 2859, zone = "Stranglethorn Vale", name = "Gyll", place = "Booty Bay", faction = "Alliance", id = 19},
	[21] = {npcId = 2861, zone = "Badlands", name = "Gorrik", place = "Kargath", faction = "Horde", id = 21},
	[74] = {npcId = 2941, zone = "Searing Gorge", name = "Lanie Reed", place = "Thorium Point", faction = "Alliance", id = 74},	
	[22] = {npcId = 2995, zone = "Mulgore", name = "Tal", place = "Thunder Bluff", faction = "Horde", id = 22},
	[75] = {npcId = 3305, zone = "Searing Gorge", name = "Grisha", place = "Thorium Point", faction = "Horde", id = 75},	
	[23] = {npcId = 3310, zone = "Orgrimmar", name = "Doras", faction = "Horde", id = 23},	            
	[25] = {npcId = 3615, zone = "The Barrens", name = "Devrak", place = "Crossroads", faction = "Horde", id = 25},	      
	[27] = {npcId = 3838, zone = "Teldrassil", name = "Vesprystus", place = "Rut'theran Village", faction = "Alliance", id = 27},           
	[26] = {npcId = 3841, zone = "Darkshore", name = "Caylais Moonfeather", place = "Auberdine", faction = "Alliance", id = 26},            
	[28] = {npcId = 4267, zone = "Ashenvale", name = "Daelyshia ", place = "Astranaar", faction = "Alliance", id = 28},            
	[29] = {npcId = 4312, zone = "Stonetalon Mountains", name = "Tharm", place = "Sun Rock Retreat", faction = "Horde", id = 29},  
	[76] = {npcId = 4314, zone = "The Hinterlands", name = "Gorkas", place = "Revantusk Village", faction = "Horde", id = 76},       
	[30] = {npcId = 4317, zone = "Thousand Needles", name = "Nyse", place = "Freewind Post", faction = "Horde", id = 30},      
	[31] = {npcId = 4319, zone = "Feralas", name = "Thyssiana", place = "Thalanaar", faction = "Alliance", id = 31},               
	[32] = {npcId = 4321, zone = "Dustwallow Marsh", name = "Baldruc", place = "Theramore", faction = "Alliance", id = 32},      
	[33] = {npcId = 4407, zone = "Stonetalon Mountains", name = "Teloren", place = "Stonetalon Peak", faction = "Alliance", id = 33},  
	[11] = {npcId = 4551, zone = "Undercity", name = "Michael Garrett", faction = "Horde", id = 11},                  
	[56] = {npcId = 6026, zone = "Swamp of Sorrows", name = "Breyk", place = "Stonard", faction = "Horde", id = 56},
	[37] = {npcId = 6706, zone = "Desolace", name = "Baritanas Skyriver", place = "Nijel's Point", faction = "Alliance", id = 37},
	[38] = {npcId = 6726, zone = "Desolace", name = "Thalon", place = "Shadowprey Village", faction = "Horde", id = 38},  
	[39] = {npcId = 7823, zone = "Tanaris", name = "Bera Stonehammer", place = "Gadgetzan", faction = "Alliance", id = 39},
	[40] = {npcId = 7824, zone = "Tanaris", name = "Bulkrek Ragefist", place = "Gadgetzan", faction = "Horde", id = 40},  
	[43] = {npcId = 8018, zone = "The Hinterlands", name = "Guthrum Thunderfist", place = "Aerie Peak", faction = "Alliance", id = 43},
	[41] = {npcId = 8019, zone = "Feralas", name = "Fyldren Moonfeather", place = "Feathermoon", faction = "Alliance", id = 41},
	[42] = {npcId = 8020, zone = "Feralas", name = "Shyn", place = "Camp Mojache", faction = "Horde", id = 42},  
	[45] = {npcId = 8609, zone = "Blasted Lands", name = "Alexandra Constantine", place = "Nethergarde Keep", faction = "Alliance", id = 45},
	[44] = {npcId = 8610, zone = "Azshara", name = "Kroum", place = "Valormok", faction = "Horde", id = 44},  
	[77] = {npcId = 10378, zone = "The Barrens", name = "Omusa Thunderhorn", place = "Camp Taurajo", faction = "Horde", id = 77},  
	[49] = {npcId = 10897, zone = "Moonglade", name = "Sindrayl", faction = "Alliance", id = 49},
	[52] = {npcId = 11138, zone = "Winterspring", name = "Maethrya", place = "Everlook", faction = "Alliance", id = 52},
	[53] = {npcId = 11139, zone = "Winterspring", name = "Yugrek", place = "Everlook", faction = "Horde", id = 53},  
	[55] = {npcId = 11899, zone = "Dustwallow Marsh", name = "Shardi", place = "Brackenwall Village", faction = "Horde", id = 55},  
	[48] = {npcId = 11900, zone = "Felwood", name = "Brakkar", place = "Bloodvenom Post", faction = "Horde", id = 48},  
	[58] = {npcId = 11901, zone = "Ashenvale", name = "Andruk", place = "Zoram'gar Outpost", faction = "Horde", id = 58},  
	[64] = {npcId = 12577, zone = "Azshara", name = "Jarrodenus", place = "Talrendis Point", faction = "Alliance", id = 64},
	[65] = {npcId = 12578, zone = "Felwood", name = "Mishellena", place = "Talonbranch Glade", faction = "Alliance", id = 65},
	[66] = {npcId = 12596, zone = "Western Plaguelands", name = "Bibilfaz Featherwhistle", place = "Chillwind Camp", faction = "Alliance", id = 66},
	[61] = {npcId = 12616, zone = "Ashenvale", name = "Vhulgra", place = "Splintertree Post", faction = "Horde", id = 61},  
	[67] = {npcId = 12617, zone = "Eastern Plaguelands", name = "Khaelyn Steelwing", place = "Light's Hope Chapel", faction = "Alliance", id = 67},
	[68] = {npcId = 12636, zone = "Eastern Plaguelands", name = "Georgia", place = "Light's Hope Chapel", faction = "Horde", id = 68},
	[69] = {npcId = 12740, zone = "Moonglade", name = "Faustron", faction = "Horde", id = 69},  
	[70] = {npcId = 13177, zone = "Burning Steppes", name = "Vahgruk", place = "Flame Crest", faction = "Horde", id = 70},  
	[72] = {npcId = 15177, zone = "Silithus", name = "Cloud Skydancer", place = "Cenarion Hold", faction = "Alliance", id = 72},
	[73] = {npcId = 15178, zone = "Silithus", name = "Runk Windtamer", place = "Cenarion Hold", faction = "Horde", id = 73},  
	[79] = {npcId = 10583, zone = "Un'Goro Crater", name = "Gryfe", place = "Marshal's Refuge", id = 79},
	[80] = {npcId = 16227, zone = "The Barrens", name = "Bragok", place = "Ratchet", id = 80},
}

-- Burning Crusade
if select(4, GetBuildInfo()) >= 20000 then
	FM.flightmasterDB[82] = {npcId = 16192, zone = "Silvermoon City", name = "Skymistress Gloaming", faction = "Horde", id = 82}
	FM.flightmasterDB[83] = {npcId = 16189, zone = "Ghostlands", name = "Skymaster Sunwing", place = "Tranquillien", faction = "Horde", id = 83}
	FM.flightmasterDB[93] = {npcId = 17554, zone = "Bloodmyst Isle", name = "Laando", place = "Blood Watch", faction = "Alliance", id = 93}
	FM.flightmasterDB[94] = {npcId = 17555, zone = "The Exodar", name = "Stephanos", faction = "Alliance", id = 94}
	FM.flightmasterDB[99] = {npcId = 16587, zone = "Hellfire Peninsula", name = "Barley", place = "Thrallmar", faction = "Horde", id = 99}
	FM.flightmasterDB[100] = {npcId = 16822, zone = "Hellfire Peninsula", name = "Flightmaster Krill Bitterhue", place = "Honor Hold", faction = "Alliance", id = 100}
	FM.flightmasterDB[101] = {npcId = 18785, zone = "Hellfire Peninsula", name = "Kuma", place = "Temple of Telhamat", faction = "Alliance", id = 101}
	FM.flightmasterDB[102] = {npcId = 18942, zone = "Hellfire Peninsula", name = "Innalia", place = "Falcon Watch", faction = "Horde", id = 102}
	FM.flightmasterDB[117] = {npcId = 18788, zone = "Zangarmarsh", name = "Munci", place = "Telredor", faction = "Alliance", id = 117}
	FM.flightmasterDB[118] = {npcId = 18791, zone = "Zangarmarsh", name = "Du'ga", place = "Zabra'jin", faction = "Horde", id = 118}
	FM.flightmasterDB[119] = {npcId = 18789, zone = "Nagrand", name = "Furgu", place = "Telaar", faction = "Alliance", id = 119}
	FM.flightmasterDB[120] = {npcId = 18808, zone = "Nagrand", name = "Gursha", place = "Garadar", faction = "Horde", id = 120}
	FM.flightmasterDB[121] = {npcId = 18809, zone = "Terokkar Forest", name = "Furnan Skysoar", place = "Allerian Stronghold", faction = "Alliance", id = 121}
	FM.flightmasterDB[122] = {npcId = 18938, zone = "Netherstorm", name = "Krexcil", place = "Area 52", id = 122}
	FM.flightmasterDB[123] = {npcId = 19317, zone = "Shadowmoon Valley", name = "Drek'Gol", place = "Shadowmoon Village", faction = "Horde", id = 123}
	FM.flightmasterDB[124] = {npcId = 18939, zone = "Shadowmoon Valley", name = "Brubeck Stormfoot", place = "Wildhammer Stronghold", faction = "Alliance", id = 124}
	FM.flightmasterDB[125] = {npcId = 18937, zone = "Blades Edge Mountains", name = "Amerun Leafshade", place = "Sylvanaar", faction = "Alliance", id = 125}
	FM.flightmasterDB[126] = {npcId = 18953, zone = "Blades Edge Mountains", name = "Unoke Tenderhoof", place = "Thunderlord Stronghold", faction = "Horde", id = 126}
	FM.flightmasterDB[127] = {npcId = 18807, zone = "Terokkar Forest", name = "Kerna", place = "Stonebreaker Hold", faction = "Horde", id = 127}
	FM.flightmasterDB[128] = {npcId = 18940, zone = "Terokkar Forest", name = "Nutral", place = "Shattrath", id = 128}
	FM.flightmasterDB[129] = {npcId = 18931, zone = "Hellfire Peninsula", name = "Amish Wildhammer", place = "The Dark Portal", faction = "Alliance", id = 129}
	FM.flightmasterDB[130] = {npcId = 18930, zone = "Hellfire Peninsula", name = "Vlagga Freyfeather", place = "The Dark Portal", faction = "Horde", id = 130}
	FM.flightmasterDB[139] = {npcId = 19583, zone = "Netherstorm", name = "Grennik", place = "The Stormspire", id = 139}
	FM.flightmasterDB[140] = {npcId = 19581, zone = "Shadowmoon Valley", name = "Maddix", place = "Altar of Sha'tar", id = 140}
	FM.flightmasterDB[141] = {npcId = 19558, zone = "Hellfire Peninsula", name = "Amilya Airheart", place = "Spinebreaker Ridge", faction = "Horde", id = 141}
	FM.flightmasterDB[149] = {npcId = 20234, zone = "Hellfire Peninsula", name = "Runetog Wildhammer", place = "Shatter Point", faction = "Alliance", id = 149}
	FM.flightmasterDB[150] = {npcId = 20515, zone = "Netherstorm", name = "Harpax", place = "Cosmowrench", id = 150}
	FM.flightmasterDB[151] = {npcId = 20762, zone = "Zangarmarsh", name = "Gur'zil", place = "Swamprat Post", faction = "Horde", id = 151}
	FM.flightmasterDB[156] = {npcId = 21107, zone = "Blades Edge Mountains", name = "Rip Pedalslam", place = "Toshley's Station", faction = "Alliance", id = 156}
	FM.flightmasterDB[159] = {npcId = 21766, zone = "Shadowmoon Valley", name = "Alieshor", place = "Sanctum of the Stars", id = 159}
	FM.flightmasterDB[160] = {npcId = 22216, zone = "Blades Edge Mountains", name = "Fhyn Leafshadow", place = "Evergrove", id = 160}
	FM.flightmasterDB[163] = {npcId = 22455, zone = "Blades Edge Mountains", name = "Sky-Master Maxxor", place = "Mok'Nathal Village", faction = "Horde", id = 163}
	FM.flightmasterDB[164] = {npcId = 22485, zone = "Zangarmarsh", name = "Halu", place = "Orebor Harborage", faction = "Alliance", id = 164}
	FM.flightmasterDB[205] = {npcId = 24851, zone = "Ghostlands", name = "Kiz Coilspanner", place = "Zul'Aman", id = 205}
	FM.flightmasterDB[213] = {npcId = 26560, zone = "Isle of Quel Danas", name = "Ohura", place = "Shattered Sun Staging Area", id = 213}
	FM.flightmasterDB[166] = {npcId = 22931, zone = "Felwood", name = "Gorrim", place = "Emerald Sanctuary", id = 166}
	FM.flightmasterDB[167] = {npcId = 22935, zone = "Ashenvale", name = "Suralais Farwind", place = "Forest Song", faction = "Alliance", id = 167}
	FM.flightmasterDB[179] = {npcId = 23612, zone = "Dustwallow Marsh", name = "Dyslix Silvergrub", place = "Mudsprocket", id = 179}
	FM.flightmasterDB[195] = {npcId = 24366, zone = "Stranglethorn Vale", name = "Nizzle", place = "Rebel Camp", faction = "Alliance", id = 195}
	FM.flightmasterDB[205] = {npcId = 24851, zone = "Ghostlands", name = "Kiz Coilspanner", place = "Zul'Aman", id = 205}
	FM.flightmasterDB[213] = {npcId = 26560, zone = "Shattered Sun Staging Area", name = "Ohura", id = 213}
end

-- Wrath of the Lich King
if select(4, GetBuildInfo()) >= 30000 then
	FM.flightmasterDB[245] = {npcId = 26879, zone = "Borean Tundra", name = "Tomas Riverwell", place = "Valiance Keep", faction = "Alliance", id = 245}
	FM.flightmasterDB[246] = {npcId = 26602, zone = "Borean Tundra", name = "Kara Thricestar", place = "Fizzcrank Airstrip", faction = "Alliance", id = 246}
	FM.flightmasterDB[257] = {npcId = 25288, zone = "Borean Tundra", name = "Turida Coldwind", place = "Warsong Hold", faction = "Horde", id = 257}
	FM.flightmasterDB[258] = {npcId = 26847, zone = "Borean Tundra", name = "Omu Spiritbreeze", place = "Taunka'le Village", faction = "Horde", id = 258}
	FM.flightmasterDB[259] = {npcId = 26848, zone = "Borean Tundra", name = "Kimbiza", place = "Bor'gorok Outpost", faction = "Horde", id = 259}
	FM.flightmasterDB[289] = {npcId = 24795, zone = "Borean Tundra", name = "Surristrasz", place = "Amber Ledge", id = 289}
	FM.flightmasterDB[296] = {npcId = 28195, zone = "Borean Tundra", name = "Bilko Driftspark", place = "Unu'pe", id = 296}
	FM.flightmasterDB[226] = {npcId = 27046, zone = "Coldarra", name = "Warmage Adami", place = "Transitus Shield", id = 226}
	FM.flightmasterDB[336] = {npcId = 30271, zone = "Crystalsong Forest", name = "Galendror Whitewing", place = "Windrunner's Overlook", faction = "Alliance", id = 336}
	FM.flightmasterDB[337] = {npcId = 30269, zone = "Crystalsong Forest", name = "Skymaster Baeric ", place = "Sunreaver's Command", faction = "Horde", id = 337}
	FM.flightmasterDB[310] = {npcId = 28674, zone = "Dalaran", name = "Aludane Whitecloud", id = 310}
	FM.flightmasterDB[244] = {npcId = 26878, zone = "Dragonblight", name = "Rodney Wells", place = "Wintergarde Keep", faction = "Alliance", id = 244}
	FM.flightmasterDB[247] = {npcId = 26881, zone = "Dragonblight", name = "Palena Silvercloud ", place = "Stars' Rest", faction = "Alliance", id = 247}
	FM.flightmasterDB[251] = {npcId = 26877, zone = "Dragonblight", name = "Derek Rammel", place = "Fordragon Hold", faction = "Alliance", id = 251}
	FM.flightmasterDB[252] = {npcId = 26851, zone = "Dragonblight", name = "Nethestrasz", place = "Wyrmrest Temple", id = 252}
	FM.flightmasterDB[254] = {npcId = 26845, zone = "Dragonblight", name = "Junter Weiss", place = "Venomspite", faction = "Horde", id = 254}
	FM.flightmasterDB[256] = {npcId = 26566, zone = "Dragonblight", name = "Narzun Skybreaker", place = "Agmar's Hammer", faction = "Horde", id = 256}
	FM.flightmasterDB[260] = {npcId = 26850, zone = "Dragonblight", name = "Numo Spiritbreeze", place = "Kor'koron Vanguard", faction = "Horde", id = 260}
	FM.flightmasterDB[294] = {npcId = 28196, zone = "Dragonblight", name = "Cid Flounderfix", place = "Moa'ki", id = 294}
	FM.flightmasterDB[249] = {npcId = 26853, zone = "Grizzly Hills", name = "Makki Wintergale", place = "Camp Oneqwah", faction = "Horde", id = 249}
	FM.flightmasterDB[250] = {npcId = 26852, zone = "Grizzly Hills", name = "Kragh", place = "Conquest Hold", faction = "Horde", id = 250}
	FM.flightmasterDB[253] = {npcId = 26880, zone = "Grizzly Hills", name = "Vana Grey", place = "Amberpine Lodge", faction = "Alliance", id = 253}
	FM.flightmasterDB[255] = {npcId = 26876, zone = "Grizzly Hills", name = "Samuel Clearbook", place = "Westfall Brigade", faction = "Alliance", id = 255}
	FM.flightmasterDB[183] = {npcId = 23736, zone = "Howling Fjord", name = "Pricilla Winterwind", place = "Valgarde Port", faction = "Alliance", id = 183}
	FM.flightmasterDB[184] = {npcId = 24061, zone = "Howling Fjord", name = "James Ormsby", place = "Fort Wildervar", faction = "Alliance", id = 184}
	FM.flightmasterDB[185] = {npcId = 23859, zone = "Howling Fjord", name = "Greer Orehammer", place = "Westguard Keep", faction = "Alliance", id = 185}
	FM.flightmasterDB[190] = {npcId = 24155, zone = "Howling Fjord", name = "Tobias Sarkhoff", place = "New Agamand", faction = "Horde", id = 190}
	FM.flightmasterDB[191] = {npcId = 27344, zone = "Howling Fjord", name = "Bat Handler Adeline", place = "Vengeance Landing", faction = "Horde", id = 191}
	FM.flightmasterDB[192] = {npcId = 24032, zone = "Howling Fjord", name = "Celea Frozenmane", place = "Camp Winterhoof", faction = "Horde", id = 192}
	FM.flightmasterDB[248] = {npcId = 26844, zone = "Howling Fjord", name = "Lilleth Radescu", place = "Apothecary Camp", faction = "Horde", id = 248}
	FM.flightmasterDB[295] = {npcId = 28197, zone = "Howling Fjord", name = "Kip Trawlskip", place = "Kamagua", id = 295}
	FM.flightmasterDB[325] = {npcId = 31078, zone = "Icecrown", name = "Dreadwind", place = "Death's Rise", id = 325}
	FM.flightmasterDB[333] = {npcId = 30314, zone = "Icecrown", name = "Morlia Doomwing", place = "The Shadow Vault", faction = "Horde", id = 333}
	FM.flightmasterDB[334] = {npcId = 33849, zone = "Icecrown", name = "Helidan Lightwing", place = "The Argent Vanguard", id = 334}
	FM.flightmasterDB[335] = {npcId = 31069, zone = "Icecrown", name = "Penumbrius", place = "Crusaders' Pinnacle", id = 335}
	FM.flightmasterDB[308] = {npcId = 28574, zone = "Sholazar Basin", name = "Marvin Wobblesprocket", place = "River's Heart", id = 308}
	FM.flightmasterDB[309] = {npcId = 28037, zone = "Sholazar Basin", name = "The Spirit of Gnomeregan", place = "Nesingwary Base Camp", id = 309}
	FM.flightmasterDB[320] = {npcId = 29721, zone = "The Storm Peaks", name = "Skizzle Slickslide", place = "K3", id = 320}
	FM.flightmasterDB[321] = {npcId = 29750, zone = "The Storm Peaks", name = "Faldorf Bitterchill", place = "Frosthold", faction = "Alliance", id = 321}
	FM.flightmasterDB[322] = {npcId = 32571, zone = "The Storm Peaks", name = "Halvdan ", place = "Dun Nifflelem", id = 322}
	FM.flightmasterDB[323] = {npcId = 29757, zone = "The Storm Peaks", name = "Kabarg Windtamer", place = "Grom'arsh Crash-Site", faction = "Horde", id = 323}
	FM.flightmasterDB[324] = {npcId = 29762, zone = "The Storm Peaks", name = "Hyeyoung Parka", place = "Camp Tunka'lo", faction = "Horde", id = 324}
	FM.flightmasterDB[326] = {npcId = 29951, zone = "The Storm Peaks", name = "Shavalius the Fancy", place = "Ulduar", id = 326}
	FM.flightmasterDB[327] = {npcId = 29950, zone = "The Storm Peaks", name = "Breck Rockbrow", place = "Bouldercrag's Refuge", id = 327}
	FM.flightmasterDB[303] = {npcId = 30869, zone = "Wintergrasp", name = "Arzo Safeflight", place = "Valiance Landing Camp", faction = "Alliance", id = 303}
	FM.flightmasterDB[332] = {npcId = 30870, zone = "Wintergrasp", name = "Herzo Safeflight", place = "Warsong Camp", faction = "Horde", id = 332}
	FM.flightmasterDB[290] = {npcId = 28623, zone = "Zul'Drak", name = "Gurric", place = "Argent Stand", faction = "Horde", id = 290}
	FM.flightmasterDB[305] = {npcId = 28615, zone = "Zul'Drak", name = "Baneflight", place = "Ebon Watch", id = 305}
	FM.flightmasterDB[306] = {npcId = 28618, zone = "Zul'Drak", name = "Danica Saint", place = "Light's Breach", id = 306}
	FM.flightmasterDB[307] = {npcId = 28624, zone = "Zul'Drak", name = "Maaka", place = "Zim'Torga", id = 307}
	FM.flightmasterDB[331] = {npcId = 30569, zone = "Zul'Drak", name = "Rafae", place = "Gundrak", id = 331}
	FM.flightmasterDB[383] = {npcId = 37888, zone = "Western Plaguelands", name = "Frax Bucketdrop", place = "Thondoril River", id = 383}
	FM.flightmasterDB[384] = {npcId = 37915, zone = "Tirisfal", name = "Timothy Cunningham", place = "The Bulwark", faction = "Horde", id = 384}
end

-- Cataclysm
if select(4, GetBuildInfo()) >= 40000 then
	FM.flightmasterDB[2] = {zone = "Elwynn", place = "Stormwind", faction = "Alliance", id = 2, wx = 489.65600585938, wy = -8841.0595703125, instance = 0}
	FM.flightmasterDB[4] = {zone = "Westfall", place = "Sentinel Hill", faction = "Alliance", id = 4, wx = 1034.3900146484, wy = -10551.900390625, instance = 0}
	FM.flightmasterDB[5] = {zone = "Redridge", place = "Lakeshire", faction = "Alliance", id = 5, wx = -2231.3999023438, wy = -9429.099609375, instance = 0}
	FM.flightmasterDB[6] = {zone = "Dun Morogh", place = "Ironforge", faction = "Alliance", id = 6, wx = -1155.4399414062, wy = -4821.7797851562, instance = 0}
	FM.flightmasterDB[7] = {zone = "Wetlands", place = "Menethil Harbor", faction = "Alliance", id = 7, wx = -777.69598388672, wy = -3787.8100585938, instance = 0}
	FM.flightmasterDB[8] = {zone = "Loch Modan", place = "Thelsamar", faction = "Alliance", id = 8, wx = -2930.0100097656, wy = -5421.91015625, instance = 0}
	FM.flightmasterDB[10] = {zone = "Silverpine Forest", place = "The Sepulcher", faction = "Horde", id = 10, wx = 1536.5899658203, wy = 478.85998535156, instance = 0}
	FM.flightmasterDB[11] = {zone = "Tirisfal", place = "Undercity", faction = "Horde", id = 11, wx = 267.9700012207, wy = 1568.6199951172, instance = 0}
	FM.flightmasterDB[12] = {zone = "Duskwood", place = "Darkshire", faction = "Alliance", id = 12, wx = -1261.6500244141, wy = -10515.5, instance = 0}
	FM.flightmasterDB[13] = {zone = "Hillsbrad", place = "Tarren Mill", faction = "Horde", id = 13, wx = -874.20300292969, wy = -17.70660018921, instance = 0}
	FM.flightmasterDB[14] = {zone = "Hillsbrad", place = "Southshore", id = 14, wx = -515.47998046875, wy = -711.47998046875, instance = 0}
	FM.flightmasterDB[16] = {zone = "Arathi", place = "Refuge Pointe", faction = "Alliance", id = 16, wx = -2515.1101074219, wy = -1240.5300292969, ins
Download .txt
gitextract_32tprem4/

├── .gitignore
├── .pkgmeta
├── Guidelime/
│   ├── ActionButtons.lua
│   ├── Bindings.xml
│   ├── CurrentGuide.lua
│   ├── CustomCode.lua
│   ├── Data/
│   │   ├── ClassicCodex.lua
│   │   ├── ClassicCodexCorrections.lua
│   │   ├── Data.lua
│   │   ├── FlightmasterDB.lua
│   │   ├── FlightmasterDB_Locales.lua
│   │   ├── Internal/
│   │   │   ├── CreaturesDB.lua
│   │   │   ├── CreaturesDB_Locales.lua
│   │   │   ├── ItemsDB.lua
│   │   │   ├── ItemsDB_Locales.lua
│   │   │   ├── ObjectsDB.lua
│   │   │   ├── ObjectsDB_Locales.lua
│   │   │   ├── QuestsDB.lua
│   │   │   ├── QuestsDB_Locales.lua
│   │   │   └── corrections.lua
│   │   ├── MapDB.lua
│   │   ├── PositionTools.lua
│   │   ├── Questie.lua
│   │   ├── QuestieCorrections.lua
│   │   ├── QuestsTools.lua
│   │   ├── SkillDB.lua
│   │   ├── SkillDB_Locales.lua
│   │   └── SpellDB.lua
│   ├── Editor.lua
│   ├── EditorTools.lua
│   ├── Events.lua
│   ├── Frames.lua
│   ├── GuideParser.lua
│   ├── Guidelime-Cata.toc
│   ├── Guidelime-Mists.toc
│   ├── Guidelime-TBC.toc
│   ├── Guidelime-Vanilla.toc
│   ├── Guidelime-Wrath.toc
│   ├── Guidelime.lua
│   ├── Guides.lua
│   ├── Icons/
│   │   ├── Arrow.blp
│   │   ├── ArrowLicense.txt
│   │   ├── TitleHighlight.blp
│   │   ├── black.blp
│   │   ├── check.blp
│   │   ├── discord.tga
│   │   ├── getflightpoint.blp
│   │   ├── hearth.blp
│   │   ├── lime.blp
│   │   ├── lime0.blp
│   │   ├── lime_arrow.blp
│   │   ├── lime_marker.blp
│   │   ├── lime_marker_friz.blp
│   │   ├── lime_marker_friz_green.blp
│   │   ├── limev.blp
│   │   ├── paypal.tga
│   │   ├── questunavailable.blp
│   │   ├── repair.blp
│   │   ├── scroll.blp
│   │   └── set_hearth.blp
│   ├── Import.lua
│   ├── Libs/
│   │   ├── CallbackHandler-1.0/
│   │   │   ├── CallbackHandler-1.0.lua
│   │   │   └── CallbackHandler-1.0.xml
│   │   ├── HereBeDragons/
│   │   │   ├── CHANGELOG.md
│   │   │   ├── CallbackHandler-1.0/
│   │   │   │   ├── CallbackHandler-1.0.lua
│   │   │   │   └── CallbackHandler-1.0.xml
│   │   │   ├── HereBeDragons-2.0.lua
│   │   │   ├── HereBeDragons-Migrate.lua
│   │   │   ├── HereBeDragons-Pins-2.0.lua
│   │   │   ├── HereBeDragons.toc
│   │   │   └── LibStub/
│   │   │       ├── LibStub.lua
│   │   │       └── LibStub.toc
│   │   ├── LibDBIcon-1.0/
│   │   │   ├── LibDBIcon-1.0.lua
│   │   │   └── lib.xml
│   │   ├── LibDataBroker-1.1/
│   │   │   └── LibDataBroker-1.1.lua
│   │   └── LibStub/
│   │       └── LibStub.lua
│   ├── Localization.lua
│   ├── MainWindow.lua
│   ├── Map.lua
│   ├── Options.lua
│   ├── QuestLog-Classic.lua
│   ├── QuestLog.lua
│   └── QuestScan.lua
├── Guidelime_MyGuideExample/
│   ├── Guidelime_MyGuideExample.toc
│   └── MyGuide.lua
└── README.md
Copy disabled (too large) Download .json
Condensed preview — 86 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (34,680K chars).
[
  {
    "path": ".gitignore",
    "chars": 86,
    "preview": "*\n!Guidelime\n!Guidelime/**\n!Guidelime_MyGuideExample\n!README.md\n!.pkgmeta\n!.gitignore\n"
  },
  {
    "path": ".pkgmeta",
    "chars": 137,
    "preview": "enable-nolib-creation: no\npackage-as: Guidelime\n\nmove-folders:\n   Guidelime/Guidelime : Guidelime\n\nignore:\n   - Guidelim"
  },
  {
    "path": "Guidelime/ActionButtons.lua",
    "chars": 14798,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D     -- Data/Data\naddon.SP = a"
  },
  {
    "path": "Guidelime/Bindings.xml",
    "chars": 1551,
    "preview": "<Bindings>\n\t<Binding name=\"GUIDELIME_TOGGLE\" category=\"BINDING_HEADER_GUIDELIME\">\n\t\tGuidelime.toggleMainFrame()\n\t</Bindi"
  },
  {
    "path": "Guidelime/CurrentGuide.lua",
    "chars": 49608,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
  },
  {
    "path": "Guidelime/CustomCode.lua",
    "chars": 3593,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D     -- Data/Data\n\naddon.CC = "
  },
  {
    "path": "Guidelime/Data/ClassicCodex.lua",
    "chars": 17646,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
  },
  {
    "path": "Guidelime/Data/ClassicCodexCorrections.lua",
    "chars": 76942,
    "preview": "local addonName, addon = ...\n\n-- add kill credit objectives as these are not supported by ClassicCodex\naddon.CLASSIC_COD"
  },
  {
    "path": "Guidelime/Data/Data.lua",
    "chars": 11623,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.SK = addon.SK or {}; loc"
  },
  {
    "path": "Guidelime/Data/FlightmasterDB.lua",
    "chars": 77570,
    "preview": "local addonName, addon = ...\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.DM = addon.DM or {}; local DM = addon.DM -"
  },
  {
    "path": "Guidelime/Data/FlightmasterDB_Locales.lua",
    "chars": 317966,
    "preview": "local addonName, addon = ...\n\naddon.FM.flightmasterDB_Locales = {\n[\"deDE\"] = {\n\t[1] = \"Abtei von Nordhain\",\n\t[2] = \"Stur"
  },
  {
    "path": "Guidelime/Data/Internal/CreaturesDB.lua",
    "chars": 9159257,
    "preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
  },
  {
    "path": "Guidelime/Data/Internal/CreaturesDB_Locales.lua",
    "chars": 1710726,
    "preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
  },
  {
    "path": "Guidelime/Data/Internal/ItemsDB.lua",
    "chars": 773701,
    "preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
  },
  {
    "path": "Guidelime/Data/Internal/ItemsDB_Locales.lua",
    "chars": 663478,
    "preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
  },
  {
    "path": "Guidelime/Data/Internal/ObjectsDB.lua",
    "chars": 5931007,
    "preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
  },
  {
    "path": "Guidelime/Data/Internal/ObjectsDB_Locales.lua",
    "chars": 1567025,
    "preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
  },
  {
    "path": "Guidelime/Data/Internal/QuestsDB.lua",
    "chars": 2757625,
    "preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
  },
  {
    "path": "Guidelime/Data/Internal/QuestsDB_Locales.lua",
    "chars": 4234302,
    "preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- source: https://github.com/TyrsDev/WoW-C"
  },
  {
    "path": "Guidelime/Data/Internal/corrections.lua",
    "chars": 9317,
    "preview": "local addonName, addon = ...\naddon.DB = addon.DB or {}; local DB = addon.DB\n\n-- https://github.com/max-ri/Guidelime/issu"
  },
  {
    "path": "Guidelime/Data/MapDB.lua",
    "chars": 14485,
    "preview": "local addonName, addon = ...\n\naddon.DM = addon.DM or {}; local DM = addon.DM\n\n--[[if GetLocale() == \"enUS\" then\n\t-- read"
  },
  {
    "path": "Guidelime/Data/PositionTools.lua",
    "chars": 12825,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.DM = addon.DM or {}; loc"
  },
  {
    "path": "Guidelime/Data/Questie.lua",
    "chars": 117128,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\nlocal QuestieDB = QuestieLoade"
  },
  {
    "path": "Guidelime/Data/QuestieCorrections.lua",
    "chars": 15891,
    "preview": "local addonName, addon = ...\n\naddon.QUESTIE.correctionsObjectiveOrder = {\n\t-- https://tbc.wowhead.com/quest=10503/the-bl"
  },
  {
    "path": "Guidelime/Data/QuestsTools.lua",
    "chars": 47025,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D                              "
  },
  {
    "path": "Guidelime/Data/SkillDB.lua",
    "chars": 5033,
    "preview": "local addonName, addon = ...\n\naddon.SK = addon.SK or {}; local SK = addon.SK     -- Data/SkillDB\n\nSK.skills = {\n\tALCHEMY"
  },
  {
    "path": "Guidelime/Data/SkillDB_Locales.lua",
    "chars": 11035,
    "preview": "local addonName, addon = ...\n\naddon.SK.skillDB_Locales = {\n[\"deDE\"] = {\n  COOKING = \"Kochkunst\",\n  FIRSTAID = \"Erste Hil"
  },
  {
    "path": "Guidelime/Data/SpellDB.lua",
    "chars": 614488,
    "preview": "local addonName, addon = ...\n\naddon.D = addon.D or {}; local D = addon.D         -- Data/Data\naddon.SK = addon.SK or {};"
  },
  {
    "path": "Guidelime/Editor.lua",
    "chars": 47194,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
  },
  {
    "path": "Guidelime/EditorTools.lua",
    "chars": 8108,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D     -- Data/Data\naddon.FM = a"
  },
  {
    "path": "Guidelime/Events.lua",
    "chars": 26335,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
  },
  {
    "path": "Guidelime/Frames.lua",
    "chars": 9917,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.F = addon.F or {}; local F = addon.F\n\nfunction F.setTooltip(frame,"
  },
  {
    "path": "Guidelime/GuideParser.lua",
    "chars": 31409,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
  },
  {
    "path": "Guidelime/Guidelime-Cata.toc",
    "chars": 1581,
    "preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 40402\n## SavedVariables: GuidelimeDa"
  },
  {
    "path": "Guidelime/Guidelime-Mists.toc",
    "chars": 1581,
    "preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 50503\n## SavedVariables: GuidelimeDa"
  },
  {
    "path": "Guidelime/Guidelime-TBC.toc",
    "chars": 1589,
    "preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 20505\n## SavedVariables: GuidelimeDa"
  },
  {
    "path": "Guidelime/Guidelime-Vanilla.toc",
    "chars": 1589,
    "preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 11508\n## SavedVariables: GuidelimeDa"
  },
  {
    "path": "Guidelime/Guidelime-Wrath.toc",
    "chars": 1581,
    "preview": "## Title: Guidelime\n## Author: Borick of Arthas(EU)\n## Version: 5.027\n## Interface: 30404\n## SavedVariables: GuidelimeDa"
  },
  {
    "path": "Guidelime/Guidelime.lua",
    "chars": 19080,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal LibDataBroker = LibStub(\"LibDataBroker-1.1\")\nlocal LibDBIcon = Lib"
  },
  {
    "path": "Guidelime/Guides.lua",
    "chars": 14856,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D     -- Data/Data\naddon.CG = a"
  },
  {
    "path": "Guidelime/Icons/ArrowLicense.txt",
    "chars": 230,
    "preview": "Everyone has full permission to do whatever they want with this model file in any non-commercial manner. Attribution to "
  },
  {
    "path": "Guidelime/Import.lua",
    "chars": 12720,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.D = addon.D or {}; local D = addon.D     -- Data/Data\naddon.QT = a"
  },
  {
    "path": "Guidelime/Libs/CallbackHandler-1.0/CallbackHandler-1.0.lua",
    "chars": 8804,
    "preview": "--[[ $Id: CallbackHandler-1.0.lua 1131 2015-06-04 07:29:24Z nevcairiel $ ]]\nlocal MAJOR, MINOR = \"CallbackHandler-1.0\", "
  },
  {
    "path": "Guidelime/Libs/CallbackHandler-1.0/CallbackHandler-1.0.xml",
    "chars": 219,
    "preview": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"ht"
  },
  {
    "path": "Guidelime/Libs/HereBeDragons/CHANGELOG.md",
    "chars": 393,
    "preview": "# Lib: HereBeDragons\n\n## [2.15-release](https://github.com/Nevcairiel/HereBeDragons/tree/2.15-release) (2025-07-02)\n[Ful"
  },
  {
    "path": "Guidelime/Libs/HereBeDragons/CallbackHandler-1.0/CallbackHandler-1.0.lua",
    "chars": 7759,
    "preview": "--[[ $Id: CallbackHandler-1.0.lua 26 2022-12-12 15:09:39Z nevcairiel $ ]]\nlocal MAJOR, MINOR = \"CallbackHandler-1.0\", 8\n"
  },
  {
    "path": "Guidelime/Libs/HereBeDragons/CallbackHandler-1.0/CallbackHandler-1.0.xml",
    "chars": 218,
    "preview": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"ht"
  },
  {
    "path": "Guidelime/Libs/HereBeDragons/HereBeDragons-2.0.lua",
    "chars": 27019,
    "preview": "-- HereBeDragons is a data API for the World of Warcraft mapping system\n\nlocal MAJOR, MINOR = \"HereBeDragons-2.0\", 30\nas"
  },
  {
    "path": "Guidelime/Libs/HereBeDragons/HereBeDragons-Migrate.lua",
    "chars": 31766,
    "preview": "local MAJOR, MINOR = \"HereBeDragons-Migrate\", 2\nassert(LibStub, MAJOR .. \" requires LibStub\")\n\nlocal HBDMigrate, _oldver"
  },
  {
    "path": "Guidelime/Libs/HereBeDragons/HereBeDragons-Pins-2.0.lua",
    "chars": 27771,
    "preview": "-- HereBeDragons-Pins is a library to show pins/icons on the world map and minimap\n\nlocal MAJOR, MINOR = \"HereBeDragons-"
  },
  {
    "path": "Guidelime/Libs/HereBeDragons/HereBeDragons.toc",
    "chars": 558,
    "preview": "## Interface: 11507,50500,110107,110200\n## Title: Lib: HereBeDragons\n## Notes: HereBeDragons is a data API for the World"
  },
  {
    "path": "Guidelime/Libs/HereBeDragons/LibStub/LibStub.lua",
    "chars": 1367,
    "preview": "-- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info\n-- "
  },
  {
    "path": "Guidelime/Libs/HereBeDragons/LibStub/LibStub.toc",
    "chars": 253,
    "preview": "## Interface: 20400\n## Title: Lib: LibStub\n## Notes: Universal Library Stub\n## Credits: Kaelten, Cladhaire, ckknight, Mi"
  },
  {
    "path": "Guidelime/Libs/LibDBIcon-1.0/LibDBIcon-1.0.lua",
    "chars": 13565,
    "preview": "\n-----------------------------------------------------------------------\n-- LibDBIcon-1.0\n--\n-- Allows addons to easily "
  },
  {
    "path": "Guidelime/Libs/LibDBIcon-1.0/lib.xml",
    "chars": 215,
    "preview": "<Ui xmlns=\"http://www.blizzard.com/wow/ui/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"ht"
  },
  {
    "path": "Guidelime/Libs/LibDataBroker-1.1/LibDataBroker-1.1.lua",
    "chars": 3139,
    "preview": "\nassert(LibStub, \"LibDataBroker-1.1 requires LibStub\")\nassert(LibStub:GetLibrary(\"CallbackHandler-1.0\", true), \"LibDataB"
  },
  {
    "path": "Guidelime/Libs/LibStub/LibStub.lua",
    "chars": 1367,
    "preview": "-- LibStub is a simple versioning stub meant for use in Libraries.  http://www.wowace.com/wiki/LibStub for more info\n-- "
  },
  {
    "path": "Guidelime/Localization.lua",
    "chars": 87295,
    "preview": "local addonName, addon = ...\n\nfunction getLocalizedStrings(locale)\nlocal L = {}\n\nif locale == \"enUS\" then\n\nL.TITLE = add"
  },
  {
    "path": "Guidelime/MainWindow.lua",
    "chars": 21743,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\n\naddon.D = addon.D or {}; local"
  },
  {
    "path": "Guidelime/Map.lua",
    "chars": 20175,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal HBD = LibStub(\"HereBeDragons-2.0\")\nlocal HBDPins = LibStub(\"HereBe"
  },
  {
    "path": "Guidelime/Options.lua",
    "chars": 36521,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\nlocal LibDBIcon = LibStub(\"LibDBIcon-1.0\")\n\naddon.QT = addon.QT or {}; l"
  },
  {
    "path": "Guidelime/QuestLog-Classic.lua",
    "chars": 3631,
    "preview": "\nlocal addonName, addon = ...\nlocal L = addon.L\n\naddon.QT = addon.QT or {}; local QT = addon.QT -- Data/QuestTools\naddon"
  },
  {
    "path": "Guidelime/QuestLog.lua",
    "chars": 3509,
    "preview": "\nlocal addonName, addon = ...\nlocal L = addon.L\n\naddon.QT = addon.QT or {}; local QT = addon.QT -- Data/QuestTools\naddon"
  },
  {
    "path": "Guidelime/QuestScan.lua",
    "chars": 1169,
    "preview": "local addonName, addon = ...\nlocal L = addon.L\n\naddon.QS = addon.QS or {}; local QS = addon.QS\n\nfunction QS.resetScanned"
  },
  {
    "path": "Guidelime_MyGuideExample/Guidelime_MyGuideExample.toc",
    "chars": 169,
    "preview": "\n## Title: Guidelime_MyGuideExample\n## Author: Me\n## Version: 0.001-Beta\n## Interface: 20501\n## Dependencies: Guidelime\n"
  },
  {
    "path": "Guidelime_MyGuideExample/MyGuide.lua",
    "chars": 512,
    "preview": "Guidelime.registerGuide([[\n[D *My* own guide for Guidelime \\\\ http://www.twitch.tv/mytwitch]  \n[GA Alliance]\n[N1-6 My gu"
  },
  {
    "path": "README.md",
    "chars": 4105,
    "preview": "# Guidelime\n\nA WoW Classic addon for leveling guides with automatic progress updates\n\n## What does it do?\n\nGuides are sh"
  }
]

// ... and 19 more files (download for full content)

About this extraction

This page contains the full source code of the max-ri/Guidelime GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 86 files (27.4 MB), approximately 7.2M tokens. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!